Pourquoi lancer une commande shell avec une barre oblique inverse?

Réponses:

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

Si vous avez un alias pour curlet que vous ne voulez pas l'utiliser, mettre une barre oblique inverse devant désactive l'alias et exécute directement le binaire curl.

Notez que cela ne s'applique qu'à un shell interactif. Les alias ne prennent pas effet dans les scripts, ce serait donc inutile là-bas.

John Kugelman
la source
4
Les alias peuvent être utilisés dans les scripts en utilisant shopt -s expand_aliasesavant l'utilisation de l'alias
Alex
@lbaby Idem dans Kornshell. Vous supprimez un alias de commande possible en plaçant une barre oblique inverse devant lui. Ceci est très courant dans Kornshell lorsque les gens y définissent des invites de commande avec le nom du répertoire . Notez que la première ligne de cette fonction est `\ cd" $ @ "`.
David W.
1
Il convient de noter que \curlcela ne contourne aucune fonction de shell nommée curl. Pour cela, vous pouvez utiliser la commande intégrée bash command:command curl ...
Keith Thompson
7
Une façon d'écrire plus facile \curl ...estcommand curl ...
glenn jackman
Notez que dash(et éventuellement d' autres coquilles, bien que vous avez raison pour bashsans expand_aliases) ne développer des alias dans les scripts.
Adrian Günter
163

La spécification du shell (Bourne / POSIX) indique que la substitution d'alias dans un shell interactif est supprimée lorsqu'un caractère du mot de commande est cité. Une barre oblique inversée est une façon de le faire, mais il existe également d'autres façons bien connues de citer: les guillemets simples et doubles. Tous les éléments suivants supprimeront la substitution d'alias:

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

L'utilisation \curlest simplement la manière la plus courante et la plus lisible. Comme il s'agit d'une fonctionnalité standardisée, vous pouvez vous attendre à ce qu'elle fonctionne dans tous les shells Bourne-Heritage.

\curlressemble un peu à une commande TeX, n'est-ce pas? :-)

Jens
la source
14
+1 pour avoir donné la raison précise pour laquelle \curlcontourne les alias du même nom; notez que seuls les alias sont contournés de cette façon, pas les fonctions shell ; command curl ...assurerait le contournement non plus .
mklement0
1
Je ne vois pas l'intérêt de la dernière phrase. Soit dit en passant, vous ne mentionnez que le contournement des alias , mais tout type de citation contournera également les mots clés.
gniourf_gniourf
@ mklement0 Pas tout à fait sûr… 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: Oui, si vous remplacez command lui - même avec une fonction shell, vous battant le mécanisme. Ce que montre votre exemple, c'est qu'il \ ne contourne pas les fonctions , comme indiqué. Un exemple non autodestructrice: date() { echo 'not date'; }; date; command date. Si vous êtes inquiet au sujet malveillant falsification avec command, voir stackoverflow.com/a/35931876/45375
mklement0
@ mklement0 Je comprends tout cela, mais mon point est que si l'on ne peut garantir qu'aucun autre nom de commande n'existe en tant que fonction (c'est-à-dire que vous manquez de contrôle sur votre environnement d'exécution), alors on ne peut pas non plus compter sur commandà ne pas ignorer. De votre propre lien: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