Por que iniciar um comando shell com uma barra invertida?

Respostas:

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

Se você tem um alias para curle não deseja usá-lo, colocar uma barra invertida na frente desativa o alias e executa o binário de ondulação diretamente.

Observe que isso se aplica apenas a um shell interativo. Os aliases não entram em vigor nos scripts, portanto, seria desnecessário.

John Kugelman
fonte
4
Aliases podem ser usados em scripts usando shopt -s expand_aliasesantes do uso do alias
Alex
@lbaby Mesmo em Kornshell. Você negocia um possível alias de comando colocando uma barra invertida na frente dele. Isso é muito comum no Kornshell quando as pessoas definem prompts de comando com o nome do diretório neles . Observe que a primeira linha desta função é `\ cd" $ @ "`.
David W.
1
Vale ressaltar que \curlnão ignora nenhuma função de shell chamada curl. Para isso, você pode usar o comando interno do bash command:command curl ...
Keith Thompson
7
A maneira mais fácil de entender a escrita \curl ...écommand curl ...
glenn jackman
Note-se que dash(e possivelmente outros conchas, embora você está correto para bashsem expand_aliases) não expandir aliases em scripts.
Adrian Günter
163

A especificação do shell (Bourne / POSIX) diz que a substituição de alias em um shell interativo é suprimida quando qualquer caractere da palavra de comando é citado. Uma barra invertida é uma maneira de fazer isso, mas também existem outras maneiras bem conhecidas de citar: aspas simples e duplas. Todos os itens a seguir suprimirão a substituição do alias:

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

Usar \curlé apenas a maneira mais comum e legível. Como esse é um recurso padronizado, você pode esperar que ele funcione em todos os shells da herança Bourne.

\curlparece um comando TeX, não é? :-)

Jens
fonte
14
+1 por fornecer o motivo específico pelo qual \curlignora um apelido com o mesmo nome; note que apenas aliases são ignorados dessa maneira, não funções de shell ; command curl ...garantiria ignorar também .
usar o seguinte código
1
Não vejo o objetivo da última frase. A propósito, você menciona apenas ignorar aliases , mas qualquer tipo de citação também ignorará palavras-chave.
gniourf_gniourf
@ mklement0 Não é bem assim… command() { echo "Not command, lol!"; } ; command -V echo ; \command -V echo ; \command command echo "This is command! (masking despair)"imprime Not command, lol!x 3. #
Adrian Günter
3
@ AdrianGünter: Sim, se você substituir command -se com uma função de shell, você está derrotando o mecanismo. O que seu exemplo mostra é que \ não ignora as funções , conforme declarado. Um exemplo não-auto-destrutivo: date() { echo 'not date'; }; date; command date. Se você está preocupado com maliciosa adulteração com command, consulte stackoverflow.com/a/35931876/45375
mklement0
@ mklement0 Entendo tudo isso, mas o que quero dizer é que, se não podemos garantir que nenhum outro nome de comando exista como uma função (ou seja, você não tem controle sobre seu ambiente de execução), também não pode confiar commandpara não ser substituído. A partir do seu próprio link: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)
Adrian Günter