В моей копии conda.sh
сценария я вижу следующие строки:
if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then
SYSP=$(\dirname "${CONDA_EXE}")
else
SYSP=$(\dirname "${CONDA_EXE}")
SYSP=$(\dirname "${SYSP}")
fi
Мне интересно, почему существует обратная косая черта в фронте d
в dirname
. Я не верю, что это необходимо. Такое использование обратной косой черты также появляется в других местах исходного файла. Есть ли причина для этого, что мне не хватает?
bash
shell-script
extremeaxe5
источник
источник
Ответы:
Обратная косая черта будет подавлять расширение псевдонима, т.е. она выполняет исходную команду и следит за тем, чтобы версия псевдонима не запускалась. Скрипты могут неосознанно запускаться с расширением псевдонимов, когда система установила
shopt -s expand_aliases
(только BASH) или если она выполняется с использованиемsource
.Некоторым системным администраторам нравится ставить обратную косую черту во всем в качестве превентивной меры против побочных эффектов псевдонимов, просто на случай, если они были непреднамеренно псевдонимом где-то еще, и псевдоним расширяется, как объяснено ранее. Например, если система
alias dirname='dirname -z'
где-то установила это и условие позволяет раскрыть псевдоним, то, к сожалению,dirname -z
вместо этого будет вызываться сценарий, который пытается вызвать dirname , что не было предназначено для сценария.Если есть уверенность, что такого псевдонима не существует, мы можем удалить весь обратный слеш, и он должен работать нормально.
В качестве альтернативы можно использовать
command
вместо версии с обратной косой чертой, чтобы подавить псевдоним. Таким образом, вместо\dirname
можно использоватьcommand dirname
, что может выглядеть более читабельным. (Для встроенных команд, таких какcd
, следует использоватьbuiltin
вместо). Я предпочитаю это вместо этого, поскольку он также обходит функцию с тем же именем, что и любые псевдонимы.источник
unalias -a
, что удаляет все псевдонимы.\unalias -a
чтобы подавить расширение псевдонима/usr/bin/dirname
?/bin/ed
Ubuntu против/usr/bin/ed
CentOS. Ввод полного пути делает скрипт менее переносимым.DIRNAME=$(which dirname)
, такwhich
как не видит псевдонимов?Если
conda.sh
это файл, предназначенный для поиска, то обратные косые черты предназначены для обхода псевдонимов. Bash обычно отключает расширение псевдонимов для выполнения скрипта, но для исходных файлов, которые могут работать в интерактивных оболочках, это не так. Так что простоdirname
можете запустить псевдоним с именемdirname
, но\dirname
пропустите расширение псевдонима и запустите функцию или команду с именемdirname
. (Однако, не просто обратная косая черта, подойдет любая цитата.)источник
command dirname
.\command dirname
на тот случай, если кто-то также создал псевдонимcommand
.): |