it-swarm.com.de

Warum sind Backslashes in diesem Shell-Skript enthalten?

In meiner Kopie des conda.sh Skript, ich sehe die folgenden Zeilen:

if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then
    SYSP=$(\dirname "${CONDA_EXE}")
else
    SYSP=$(\dirname "${CONDA_EXE}")
    SYSP=$(\dirname "${SYSP}")
fi

Ich bin gespannt, warum es vor dem d in dirname einen Backslash gibt. Ich glaube nicht, dass es notwendig ist. Diese Verwendung von Backslashes wird auch an anderen Stellen in der Quelldatei angezeigt. Gibt es einen Grund dafür, den ich vermisse?

21
extremeaxe5

Backslash unterdrückt die Alias-Erweiterung, dh es führt den ursprünglichen Befehl aus und stellt sicher, dass die Alias-Version nicht ausgeführt wird. Skripte können unwissentlich mit Alias-Erweiterung ausgeführt werden, wenn das System shopt -s expand_aliases Festgelegt hat (nur BASH) oder wenn es mit source ausgeführt wird.

./conda.sh          # usually no alias expansion (unless `shopt -s expand_aliases` in BASH)
source ./conda.sh   # alias expansion
. ./conda.sh        # alias expansion

Einige Systemadministratoren setzen gerne einen Backslash in alles ein, um vorbeugende Maßnahmen gegen Nebenwirkungen von Aliasen zu ergreifen, nur für den Fall, dass es an einer anderen Stelle unbeabsichtigt aliasiert wurde und der Alias ​​wie zuvor erläutert erweitert wird. Wenn das System beispielsweise alias dirname='dirname -z' Irgendwo festgelegt hat und die Bedingung das Erweitern des Alias ​​ermöglicht, ruft ein Skript, das versucht, dirname aufzurufen, leider stattdessen dirname -z Auf, was nicht das Skript war beabsichtigt.

Wenn die Gewissheit besteht, dass ein solcher Alias ​​nicht vorhanden ist, können wir den gesamten Backslash entfernen und er sollte einwandfrei funktionieren.

Alternativ kann man command anstelle der Backslash-Version verwenden, um Alias ​​zu unterdrücken. Daher kann man anstelle von \dirnamecommand dirname Verwenden, was möglicherweise besser lesbar aussieht. (Für eingebaute Befehle wie cd sollte stattdessen builtin verwendet werden). Ich bevorzuge dies stattdessen, da es auch Funktionen mit demselben Namen sowie alle Aliase umgeht.

30
otter.pro

Wenn conda.sh ist eine Datei, die bezogen werden soll, dann dienen die Backslashes zum Umgehen von Aliasen. Bash deaktiviert normalerweise die Aliaserweiterung für die Skriptausführung, aber für Quelldateien, die möglicherweise in interaktiven Shells ausgeführt werden, ist dies nicht der Fall. Nur dirname kann einen Alias ​​mit dem Namen dirname ausführen, aber \dirname überspringt die Alias-Erweiterung und führt eine Funktion oder einen Befehl mit dem Namen dirname aus. (Nicht nur Backslashes, sondern auch Zitate.)

20
muru