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

\curl -L https://get.rvm.io | bash -s stable

Почему команда начинается с \? Это сайт, на котором я это увидел.


person lbaby    schedule 28.03.2013    source источник


Ответы (2)


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

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

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

person John Kugelman    schedule 28.03.2013
comment
Псевдонимы можно использовать в сценариях, используя shopt -s expand_aliases перед использованием псевдонима. - person Alex; 29.03.2013
comment
@lbaby То же самое в Корншелле. Вы dealias возможный псевдоним команды, поставив перед ним обратную косую черту. Это очень распространено в Kornshell, когда люди определяют командные строки с именем каталога в них. Обратите внимание, что первая строка этой функции — `\cd $@`. - person David W.; 29.03.2013
comment
Стоит отметить, что \curl не обходит никакие функции оболочки с именем curl. Для этого вы можете использовать встроенную команду bash command: command curl ... - person Keith Thompson; 29.03.2013
comment
Более простой для понимания способ написать \curl ... — это command curl .... - person glenn jackman; 29.03.2013
comment
Обратите внимание, что dash (и, возможно, другие оболочки, хотя вы правы для bash без expand_aliases) делает расширение псевдонимов в скриптах. - person Adrian Günter; 12.04.2018
comment
Я вижу команды с обратной косой чертой в сценариях оболочки, которые предназначены для получения - person Kevin Olree; 10.04.2019

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

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

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

\curl немного похоже на команду TeX, не так ли? :-)

person Jens    schedule 12.05.2013
comment
+1 за указание конкретной причины, по которой \curl обходит псевдонимы с таким же именем; обратите внимание, что таким образом игнорируются только псевдонимы, а не функции оболочки; command curl ... обеспечит обход любого. - person mklement0; 22.04.2014
comment
Не вижу смысла в последнем предложении. Кстати, вы упоминаете только об обходе псевдонимов, но любое цитирование также обходит ключевые слова. - person gniourf_gniourf; 27.12.2016
comment
@mklement0 Не совсем уверен… command() { echo "Not command, lol!"; } ; command -V echo ; \command -V echo ; \command command echo "This is command! (masking despair)" печатает Not command, lol! x 3. - person Adrian Günter; 12.04.2018
comment
@AdrianGünter: Да, если вы замените command себя функцией оболочки, вы нарушите механизм. Ваш пример показывает, что \ не обходит функции, как указано. Несаморазрушающий пример: date() { echo 'not date'; }; date; command date. Если вы беспокоитесь о злонамеренном подделке command, см. stackoverflow.com/a/35931876/45375 - person mklement0; 12.04.2018
comment
@ 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) - person Adrian Günter; 12.04.2018
comment
\curl работает как шарм. Я использовал /usr/bin/curl для обхода псевдонима. Спасибо, что сэкономили мне 8 нажатий клавиш! - person exbctel; 20.09.2019
comment
\CurLTeX — это версия TeX, в которой операторы TeX оцениваются путем их перемещения по ледяной сети и изменения настроек предстоящих сетевых узлов перед поступлением оператора с помощью специального редактирования на основе метлы, чтобы изменить сетевой путь... что приводит к великолепному рендерингу математические уравнения. - person xdhmoore; 14.04.2021