Olen nyt testaillut ja todennus että dash ja bash toimivat exitin suhteen samalla tavalla, toisin kuin muistin.
Tässä koko skripti:
#!/usr/bin/sh
_the_=$_ # this script, even if sourced
_shell=$(readlink /proc/$$/exe | xargs basename)
# This script is meant to be sourced in a dash/bash script which
# is runnable both via desktop launcher and on command line,
# but also serves as a template for such a script.
# plain notifications without terminal I/O:
self=$(basename $0)
notify () { notify-send -t 10 $self "$1" ; }
notifyW () { notify-send -t 10 -u critical -i dialog-warning $self "$1" ; }
notifyE () { notify-send -t 10 -u critical -i dialog-error $self "$1" ; }
# display error message as notification if terminal is not available:
abort () {
local s=${2:-$?}
[ $s -eq 0 ] && $s=1 # force failure
[ -t 1 ] && echo "$1" || notifyE "$1"
exit $s
}
# user interface with terminal I/O only:
pause () {
read -p "$1" ${2:-any} # requires [ -t 0 ] && [ -t 1 ]
}
# running via desktop launcher or command line?
gui=false
case $_shell in
dash) [ $SHLVL -eq 0 ] && gui=true ;;
bash) [ $SHLVL -eq 1 ] && gui=true ;;
*) abort "$_the_: Päivitä $_shell-tuki." ;;
esac
# optional:
if ${require_terminal:-false}
then
if [ ! -t 1 ] # 0 = stdin, 1 = stdout, 2 = stderr
then
abort "Set Terminal=true in desktop launcher or run in terminal."
fi
fi
if ${run_as_root:-false} # run as root with sudo or pkexec
then
if [ "$EUID" -ne 0 ] || $gui # not root or via desktop launcher?
then
if [ -t 1 ] # terminal?
then
sudo $0 $@
s=$? # cache status
$gui && pause "sulje> " # prompt user before closing window
exit $s
else
pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY $0 $@
exit 1
fi
fi
fi
# if $run_as_root true, $gui is now false and $EUID is 0
# ... commands to run as root ...
ja sen voi tosiaan sourcettaa siinä skriptissä jonka käynnistää .desktop -käynnistimellä. Omat skriptit on pitkiä, joten poimin
palstalta mahdollisimman lyhyen malliksi ja muunsin sen sourcettamaan tämän yllä olevan:
#!/bin/sh
require_terminal=true
run_as_root=true
. $(dirname $0)/.uirc # ~/bin/.uirc
apt update && apt full-upgrade
Tuo on niin lyhyt, ettei siinä käytetä yhtään funktiota joita on tarjolla, mutta uskoisin että jos joku viitsii kokeilla, niille funktioillekin löytyy käyttöä.
Jouduin tuohon keksimään jonkun nimen skriptilleni että siihen voi viitata, mutta nimen voi valita vapaasti toisinkin.