Wie kann ich die aktuelle Shell, an der ich arbeite, bestimmen?
Würde die Ausgabe des ps
Befehl allein ausreichend sein?
Wie kann dies in verschiedenen Unix-Varianten geschehen?
Wie kann ich die aktuelle Shell, an der ich arbeite, bestimmen?
Würde die Ausgabe des ps
Befehl allein ausreichend sein?
Wie kann dies in verschiedenen Unix-Varianten geschehen?
Vorausgesetzt, dass Ihr /bin/sh
den POSIX-Standard unterstützt und Ihr System über die lsof
Befehl installiert - eine mögliche Alternative zu lsof
könnte in diesem Fall sein [pid2path](http://glowworm.us/pid2path.html)
- können Sie auch das folgende Skript verwenden (oder anpassen), das vollständige Pfade ausgibt:
#!/bin/sh
# cat /usr/local/bin/cursh
set -eu
pid="$$"
set -- sh bash zsh ksh ash dash csh tcsh pdksh mksh fish psh rc scsh bournesh wish Wish login
unset echo env sed ps lsof awk getconf
# getconf _POSIX_VERSION # reliable test for availability of POSIX system?
PATH="`PATH=/usr/bin:/bin:/usr/sbin:/sbin getconf PATH`"
[ $? -ne 0 ] && { echo "'getconf PATH' failed"; exit 1; }
export PATH
cmd="lsof"
env -i PATH="${PATH}" type "$cmd" 1>/dev/null 2>&1 || { echo "$cmd not found"; exit 1; }
awkstr="`echo "$@" | sed 's/\([^ ]\{1,\}\)/|\/\1/g; s/ /$/g' | sed 's/^|//; s/$/$/'`"
ppid="`env -i PATH="${PATH}" ps -p $pid -o ppid=`"
[ "${ppid}"X = ""X ] && { echo "no ppid found"; exit 1; }
lsofstr="`lsof -p $ppid`" ||
{ printf "%s\n" "lsof failed" "try: sudo lsof -p \`ps -p \$\$ -o ppid=\`"; exit 1; }
printf "%s\n" "${lsofstr}" |
LC_ALL=C awk -v var="${awkstr}" '$NF ~ var {print $NF}'
Wenn Sie nur überprüfen wollen, ob Sie (eine bestimmte Version der) Bash ausführen, verwenden Sie am besten die Option $BASH_VERSINFO
Array-Variable. Als (schreibgeschützte) Array-Variable kann sie nicht in der Umgebung gesetzt werden, Sie können also sicher sein, dass sie (wenn überhaupt) von der aktuellen Shell kommt.
Da die Bash jedoch ein anderes Verhalten zeigt, wenn sie als sh
müssen Sie auch die $BASH
Umgebungsvariable endet mit /bash
.
In einem von mir geschriebenen Skript, das Funktionsnamen mit -
(nicht Unterstrich), und hängt von assoziativen Arrays (in Bash 4 hinzugefügt), habe ich die folgende Sanity Check (mit hilfreichen Benutzer Fehlermeldung):
case `eval 'echo $BASH@${BASH_VERSINFO[0]}' 2>/dev/null` in
*/bash@[456789])
# Claims bash version 4+, check for func-names and associative arrays
if ! eval "declare -A _ARRAY && func-name() { :; }" 2>/dev/null; then
echo >&2 "bash $BASH_VERSION is not supported (not really bash?)"
exit 1
fi
;;
*/bash@[123])
echo >&2 "bash $BASH_VERSION is not supported (version 4+ required)"
exit 1
;;
*)
echo >&2 "This script requires BASH (version 4+) - not regular sh"
echo >&2 "Re-run as \"bash $CMD\" for proper operation"
exit 1
;;
esac
Sie könnten die etwas paranoide Funktionsprüfung für Funktionen im ersten Fall weglassen und einfach davon ausgehen, dass zukünftige Bash-Versionen kompatibel sein werden.
Dies ist keine sehr saubere Lösung, aber sie erfüllt die gewünschten Anforderungen.
# MUST BE SOURCED..
getshell() {
local shell="`ps -p $$ | tail -1 | awk '{print $4}'`"
shells_array=(
# It is important that the shells are listed in descending order of their name length.
pdksh
bash dash mksh
zsh ksh
sh
)
local suited=false
for i in ${shells_array[*]}; do
if ! [ -z `printf $shell | grep $i` ] && ! $suited; then
shell=$i
suited=true
fi
done
echo $shell
}
getshell
Jetzt können Sie $(getshell) --version
.
Dies funktioniert allerdings nur bei KornShell -ähnlichen Schalen (ksh).
Gehen Sie wie folgt vor, um festzustellen, ob Ihre Shell Dash/Bash verwendet.
ls –la /bin/sh
:
wenn das Ergebnis lautet /bin/sh -> /bin/bash
==> Dann verwendet Ihre Shell die Bash.
wenn das Ergebnis lautet /bin/sh ->/bin/dash
==> Dann verwendet Ihre Shell Dash.
Wenn Sie von Bash zu Dash oder umgekehrt wechseln möchten, verwenden Sie den folgenden Code:
ln -s /bin/bash /bin/sh
(Shell in Bash ändern)
Hinweis : Wenn der obige Befehl zu der Fehlermeldung führt, dass /bin/sh bereits existiert, entfernen Sie /bin/sh und versuchen Sie es erneut.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.