W mojej kopii conda.sh
skryptu widzę następujące wiersze:
if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then
SYSP=$(\dirname "${CONDA_EXE}")
else
SYSP=$(\dirname "${CONDA_EXE}")
SYSP=$(\dirname "${SYSP}")
fi
Jestem ciekaw, dlaczego istnieje odwrotny ukośnik przed The d
w dirname
. Nie wierzę, że jest to konieczne. Takie użycie odwrotnych ukośników pojawia się również w innych miejscach w pliku źródłowym. Czy brakuje mi takiego powodu?
bash
shell-script
extremeaxe5
źródło
źródło
Odpowiedzi:
Odwrotny ukośnik powstrzyma rozszerzenie aliasu, tj. Wykonuje oryginalne polecenie i upewnia się, że wersja aliasu nie działa. Skrypty mogą nieświadomie działać z rozszerzaniem aliasów, gdy system jest ustawiony
shopt -s expand_aliases
(tylko BASH) lub jeśli jest wykonywany przy użyciusource
.Niektórzy administratorzy lubią wstawiać ukośnik we wszystkim jako środek zapobiegawczy przeciwko efektom ubocznym aliasów, na wypadek, gdyby został przypadkowo aliasowany gdzie indziej, a alias zostanie rozwinięty, jak wyjaśniono wcześniej. Na przykład, jeśli system
alias dirname='dirname -z'
gdzieś to ustawił i warunek pozwala na rozwinięcie aliasu, wówczas skrypt, który próbuje wywołać dirname, niestety zadzwonidirname -z
, co nie było zamierzone.Jeśli istnieje pewność, że taki alias nie istnieje, możemy usunąć cały ukośnik odwrotny i powinien on działać poprawnie.
Alternatywnie można użyć
command
zamiast wersji z odwrotnym ukośnikiem, aby ukryć alias. Zamiast tego\dirname
można użyćcommand dirname
, który może wyglądać na bardziej czytelny. (W przypadku wbudowanych poleceń, takich jakcd
, należy użyćbuiltin
zamiast tego). Wolę to zamiast tego, ponieważ omija również funkcję o tej samej nazwie, a także wszelkie aliasy.źródło
unalias -a
, że usuwa wszystkie aliasy.\unalias -a
stłumić rozszerzenie aliasu/usr/bin/dirname
?/bin/ed
Ubuntu vs./usr/bin/ed
CentOS. Ustawienie pełnej ścieżki powoduje, że skrypt jest mniej przenośny.DIRNAME=$(which dirname)
, skorowhich
nie widzi aliasów?Jeśli
conda.sh
plik ma być pozyskiwany, to odwrotne ukośniki służą do pomijania aliasów. Bash zazwyczaj wyłącza rozszerzenie aliasu dla wykonywania skryptu, ale w przypadku plików źródłowych, które mogą działać w interaktywnych powłokach, tak nie jest.dirname
Może więc po prostu uruchomić alias o nazwiedirname
, ale\dirname
pominie rozwinięcie aliasu i uruchomi funkcję lub polecenie o nazwiedirname
. (Ale nie tylko odwrotne ukośniki, wystarczy cytowanie.)źródło
command dirname
.\command dirname
, na wypadek, gdyby ktoś również stworzył aliascommand
.): |