797 Stimmen

Wie kann ich die aktuelle interaktive Shell ermitteln, in der ich mich befinde (Befehlszeile)?

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?

4voto

carlo Punkte 41

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}'

2voto

Alex Dupuy Punkte 5764

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.

1voto

theoden8 Punkte 723

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).

1voto

Moisei Punkte 1113
echo $$ # Gives the Parent Process ID 
ps -ef | grep $$ | awk '{print $8}' # Use the PID to see what the process is.

De Woher wissen Sie, was Ihre aktuelle Hülle ist? .

1voto

Shiva Punkte 11

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.com

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.

Powered by:

X