Зачем запускать команду оболочки с обратной косой чертой?

Ответы:

200
alias curl='curl --some --default --options'

Если у вас есть псевдоним для, curlи вы не хотите его использовать, то указание обратной косой черты приводит к отключению псевдонима и непосредственному запуску двоичного файла curl.

Обратите внимание, что это применимо только к интерактивной оболочке. Псевдонимы не действуют в сценариях, поэтому в этом нет необходимости.

Джон Кугельман
источник
4
Псевдонимы могут использоваться в сценариях с использованием shopt -s expand_aliasesперед использованием псевдонима
Alex
@lbaby То же самое в Корншелле. Вы имеете дело с возможным псевдонимом команды, поставив перед ним обратную косую черту. Это очень распространено в Kornshell, когда люди определяют командные приглашения с именем каталога в них . Обратите внимание, что первая строка этой функции - `\ cd" $ @ "`.
Дэвид В.
1
Стоит отметить, что \curlне обходится никакая именованная функция оболочки curl. Для этого вы можете использовать встроенную команду bash command:command curl ...
Keith Thompson
7
Проще для понимания способ записи \curl ...являетсяcommand curl ...
Гленна Джекман
Обратите внимание, что dash(и, возможно, другие оболочки, хотя вы правы для bashбез expand_aliases) действительно расширяет псевдонимы в сценариях.
Адриан Гюнтер
163

Спецификация оболочки (Bourne / POSIX) гласит, что подстановка псевдонимов в интерактивной оболочке подавляется, когда любой символ командного слова указан в кавычках. Обратная косая черта - это один из способов сделать это, но есть и другие хорошо известные способы цитирования: одинарные и двойные кавычки. Все нижеизложенное будет подавлять замену псевдонимов:

 \curl
 cur\l
 \c\u\r\l
 "c"url
 "curl"
 "c""u""r""l"
 'curl'
 'cu'"rl"

Использование \curl- это самый распространенный и читаемый способ. Поскольку это стандартная функция, можно ожидать, что она будет работать во всех оболочках наследия Борна.

\curlвыглядит немного как команда TeX, не так ли? :-)

Jens
источник
14
+1 за конкретную причину, по которой \curlобходит псевдонимы с тем же именем; обратите внимание, что таким образом обходятся только псевдонимы , а не функции оболочки ; command curl ...будет гарантировать обход либо .
mklement0
1
Я не вижу смысла в последнем предложении. Кстати, вы упоминаете только обход псевдонимов , но любой тип цитирования также будет обходить ключевые слова.
gniourf_gniourf
@ mklement0 Не совсем уверен ... command() { echo "Not command, lol!"; } ; command -V echo ; \command -V echo ; \command command echo "This is command! (masking despair)"печатает Not command, lol!х 3.
Адриан Гюнтер
3
@ AdrianGünter: Да, если вы замените command себя функцией оболочки, вы победите механизм. То, что показывает ваш пример, это то, \ что не обходит функции , как указано. Не-пагубным пример: date() { echo 'not date'; }; date; command date. Если вы беспокоитесь о вредоносных фальсификации с command, см stackoverflow.com/a/35931876/45375
mklement0
@ mklement0 Я все это понимаю, но суть в том, что если нельзя гарантировать, что любое другое имя команды не существует как функция (т. е. у вас нет контроля над средой выполнения), то нельзя полагаться и на commandне быть отвергнутым. По вашей собственной ссылке:Thus, with no control over the execution environment, you cannot write shell scripts that are fully immune to tampering, unless you know that your code will be executed by dash, ksh, or bash (with the workaround in place)
Адриан Гюнтер