Überprüfen Sie, ob die Umgebungsvariable für einen Benutzer mit „su“ vorhanden ist.

Überprüfen Sie, ob die Umgebungsvariable für einen Benutzer mit „su“ vorhanden ist.

Ich beschäftige mich seit Tagen damit. Ich muss für einen Benutzer $1 prüfen, ob eine Umgebungsvariable $2 vorhanden ist.

Ich habe einige Fälle ausprobiert:

 $ [[ -v a ]] && echo "a ok" || echo "a no"
 a no
 $ [[ -v $HOME ]] && echo "a ok" || echo "a no"
 a no 

(Also nein (ich habe es mit Bash > 4.2 versucht))

if [ su - ${1} -c "[ -z "${2}" ]" ]

Jetzt versuche ich diesen Ansatz, weil ich nicht finde, was falsch ist :/!

su - root -c "echo "$HOME" | wc | cut -d' ' -f2"
su - root -c "echo "$HOME" | wc | sed 's/ //g'"

Antwort1

Die Syntax in Ihren ersten Beispielen ist falsch. Wenn Sie schreiben:

[[ -v $HOME ]]

Dann führen Sie tatsächlich den Befehl aus:

[[ -v /home/yourusername ]]

Was natürlich scheitern wird. Sie wollen:

[[ -v HOME ]] && echo ok || echo no

Sie können dies kombinieren, um suFolgendes zu erhalten:

su - root -c "[[ -v HOME ]]" && echo ok || echo no

Ihre letzten Beispiele funktionieren nicht, da Sie Anführungszeichen nicht verschachteln können und die Shell-Variablenerweiterung vor der Befehlsausführung erfolgt. Das heißt:

su - root -c "echo "$HOME" | wc | cut -d' ' -f2"

Der Befehl, den Sie ausführen, lautet tatsächlich:

su - root -c 'echo /home/somesuser | ...'

Wenn Sie den Wert von $HOMEaus der Perspektive von möchten root, müssen Sie die Variablenerweiterung in der lokalen Shell verhindern, beispielsweise durch die Verwendung von einfachen Anführungszeichen:

su - root -c 'echo $HOME | ...'

Mir ist nicht klar, warum Sie die Ausgabe an übergeben wc, da die Wortanzahl von $HOMEfast immer sein wird . Anstatt die Ausgabe von mit oder 1nachzubearbeiten , können Sie einfach die Option verwenden, um die Wortanzahl abzurufen:wcsedcut-w

su - root -c 'echo $HOME | wc -w'

verwandte Informationen