Навіщо запускати команду оболонки із зворотною косою рисою?


Відповіді:


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

Якщо у вас є псевдонім для curlі ви не хочете його використовувати, поклавши зворотну косу рису спереду, вимкніть псевдонім і запустити двійковий файл curl безпосередньо.

Зауважте, що це стосується лише інтерактивної оболонки. Псевдоніми не діють в сценаріях, тому це було б непотрібно.


4
Псевдоніми можна використовувати в сценаріях, використовуючи shopt -s expand_aliasesперед використанням псевдонім
Алекс,

@lbaby Те саме в Kornshell. Ви можете скасувати псевдонім можливої ​​команди, поставивши перед ним зворотний нахил . Це дуже часто в Kornshell, коли люди визначають командні підказки з іменем каталогу в них . Зверніть увагу, що перший рядок цієї функції - \ \ cd "$ @" `.
David W.

1
Варто зазначити, що \curlне обходить жодну функцію оболонки з назвою curl. Для цього ви можете скористатися вбудованою командою bash command:command curl ...
Кіт Томпсон

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, чи не так? :-)


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!x 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)
Адріан Гюнтер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.