In meiner Kopie des conda.sh
Skripts sehe ich 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 einen Backslash vor dem d
In gibt dirname
. Ich glaube nicht, dass es notwendig ist. Diese Verwendung von Backslashes wird auch an anderen Stellen in der Quelldatei angezeigt. Gibt es dafür einen Grund, den ich vermisse?
bash
shell-script
extremeaxe5
quelle
quelle
Antworten:
Backslash unterdrückt die Alias-Erweiterung, dh es wird der ursprüngliche Befehl ausgeführt und sichergestellt, dass die Alias-Version nicht ausgeführt wird. Skripte können unwissentlich mit Alias-Erweiterung ausgeführt werden, wenn das System dies eingestellt hat
shopt -s expand_aliases
(nur BASH) oder wenn es mit ausgeführt wirdsource
.Einige Sysadmins setzen gerne einen Backslash in alles ein, um die Nebenwirkungen von Aliasnamen zu verhindern, für den Fall, dass sie ungewollt an einer anderen Stelle als Alias verwendet wurden und der Alias wie oben beschrieben erweitert wird. Wenn das System dies beispielsweise
alias dirname='dirname -z'
irgendwo festgelegt hat und die Bedingung das Erweitern des Alias zulässt, ruft ein Skript, das versucht, dirname aufzurufendirname -z
, leider stattdessen auf, was nicht das beabsichtigte Skript war.Wenn es Gewissheit gibt, dass ein solcher Alias nicht existiert, können wir den gesamten Backslash entfernen und es sollte gut funktionieren.
Alternativ kann
command
anstelle eines Backslashs ein Alias unterdrückt werden. So kann man stattdessen\dirname
verwendencommand dirname
, was lesbarer aussehen könnte. (Für eingebaute Befehle wiecd
sollte manbuiltin
stattdessen verwenden). Ich bevorzuge dies stattdessen, da es auch die Funktion mit dem gleichen Namen sowie alle Aliase umgeht.quelle
unalias -a
, dass alle Aliase entfernt werden.\unalias -a
die Alias-Erweiterung unterdrücken/usr/bin/dirname
?/bin/ed
Ubuntu vs./usr/bin/ed
CentOS. Wenn Sie einen vollständigen Pfad eingeben, ist das Skript weniger portabel.DIRNAME=$(which dirname)
, dawhich
sieht man keine aliasnamen?Wenn
conda.sh
es sich um eine Datei handelt, die als Quelle dient, dienen die umgekehrten Schrägstriche zum Umgehen von Aliasen. Bash deaktiviert normalerweise die Alias-Erweiterung für die Skriptausführung. Bei Quelldateien, die möglicherweise in interaktiven Shells ausgeführt werden, ist dies jedoch nicht der Fall. Es kann also nurdirname
ein Alias mit dem Namen ausgeführt werdendirname
,\dirname
die Aliaserweiterung wird jedoch übersprungen und eine Funktion oder ein Befehl mit dem Namen ausgeführtdirname
. (Nicht nur Backslashes, sondern auch Zitate.)quelle
command dirname
.\command dirname
Nur für den Fall, dass jemand auch einen Alias erstellt hatcommand
.): |