Perché avviare un comando shell con una barra rovesciata?


Risposte:


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

Se hai un alias per curle non vuoi usarlo, mettere una barra rovesciata in primo piano disabilita l'alias ed esegue direttamente il binario del ricciolo.

Si noti che questo vale solo per una shell interattiva. Gli alias non hanno effetto negli script, quindi non sarebbe necessario lì.


4
Gli alias possono essere usati negli script usando shopt -s expand_aliasesprima dell'uso dell'alias
Alex

@lbaby Same in Kornshell. Si ottiene un possibile alias di comando mettendo una barra rovesciata di fronte. Questo è molto comune in Kornshell quando le persone definiscono i prompt dei comandi con il nome della directory in essi contenuta . Nota che la prima riga di questa funzione è `\ cd" $ @ "`.
David W.

1
Vale la pena notare che \curlnon ignora alcuna funzione di shell denominata curl. Per questo, è possibile utilizzare il comando incorporato bash command:command curl ...
Keith Thompson,

7
Un modo di scrivere più semplice \curl ...ècommand curl ...
glenn jackman,

Si noti che dash(e possibilmente altre shell, anche se siete sulla strada giusta per bashsenza expand_aliases) non espandere gli alias negli script.
Adrian Günter,

163

La specifica della shell (Bourne / POSIX) afferma che la sostituzione dell'alias in una shell interattiva viene soppressa quando viene citato qualsiasi carattere della parola di comando. Una barra rovesciata è un modo per farlo, ma ci sono anche altri modi ben noti per citare: virgolette singole e doppie. Tutto ciò che segue sopprimerà la sostituzione alias:

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

L'uso \curlè solo il modo più comune e leggibile. Poiché si tratta di una funzionalità standardizzata, ci si può aspettare che funzioni in tutte le shell Bourne-heritage.

\curlsembra un po 'come un comando TeX, vero? :-)


14
+1 per \curlindicare il motivo specifico per cui ignora un alias con lo stesso nome; si noti che solo gli alias vengono ignorati in questo modo, non le funzioni della shell ; command curl ...garantirebbe bypassando sia .
mklement0

1
Non vedo il punto dell'ultima frase. A proposito, menzioni solo il bypass degli alias , ma qualsiasi tipo di quotazione ignorerà anche le parole chiave.
gniourf_gniourf,

@ mklement0 Non del tutto sicuro ... command() { echo "Not command, lol!"; } ; command -V echo ; \command -V echo ; \command command echo "This is command! (masking despair)"stampe Not command, lol!x 3.
Adrian Günter,

3
@ AdrianGünter: Sì, se si sostituisce command se stesso con una funzione di shell, si sta sconfiggendo il meccanismo. Ciò che mostra il tuo esempio è che \ non ignora le funzioni , come indicato. Un non-autolesionista esempio date() { echo 'not date'; }; date; command date. Se siete preoccupati per maligni manomissioni con command, vedi stackoverflow.com/a/35931876/45375
mklement0

@ mklement0 Capisco tutto ciò, ma il mio punto è che se uno non può garantire che nessun altro nome di comando non esiste come funzione (cioè, non hai il controllo sul tuo ambiente di esecuzione), allora non puoi fare affidamento commandper non essere ignorato. Dal tuo 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,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.