¿Por qué iniciar un comando de shell con una barra diagonal inversa?

Respuestas:

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

Si tiene un alias para curly no desea usarlo, colocar una barra diagonal inversa al frente deshabilita el alias y ejecuta el binario curl directamente.

Tenga en cuenta que esto solo se aplica en un shell interactivo. Los alias no tienen efecto en los scripts, por lo que sería innecesario allí.

John Kugelman
fuente
44
Los alias se pueden usar en scripts al usar shopt -s expand_aliasesantes del uso del alias
Alex
@lbaby Mismo en Kornshell. Se trata de un posible alias de comando colocando una barra diagonal inversa delante de él. Esto es muy común en Kornshell cuando las personas definen los comandos con el nombre del directorio en ellos . Tenga en cuenta que la primera línea de esta función es `\ cd" $ @ "`.
David W.
1
Vale la pena señalar que \curlno omite ninguna función de shell llamada curl. Para eso, puede usar el comando incorporado bash command:command curl ...
Keith Thompson
77
Una forma de escribir más fácil de entender \curl ...escommand curl ...
Glenn Jackman el
Tenga en cuenta que dash(y posiblemente otros proyectiles, aunque estás en lo correcto para bashsin expand_aliases) no ampliar alias en los scripts.
Adrian Günter
163

La especificación de shell (Bourne / POSIX) dice que la sustitución de alias en un shell interactivo se suprime cuando se cita cualquier carácter de la palabra de comando. Una barra invertida es una forma de hacerlo, pero también hay otras formas conocidas de cotizar: comillas simples y dobles. Todo lo siguiente suprimirá la sustitución de alias:

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

Usar \curles solo la forma más común y legible. Dado que esta es una característica estandarizada, puede esperar que funcione en todos los shells Bourne-heritage.

\curlse parece un poco a un comando TeX, ¿no? :-)

Jens
fuente
14
+1 por dar la razón específica por la cual \curlomite un alias del mismo nombre; tenga en cuenta que solo se omiten los alias de esta manera, no las funciones de shell ; command curl ...aseguraría eludir cualquiera de los dos .
mklement0
1
No veo el punto de la última oración. Por cierto, solo mencionas omitir los alias , pero cualquier tipo de cita también omitirá las palabras clave.
gniourf_gniourf
@ mklement0 No estoy seguro ... command() { echo "Not command, lol!"; } ; command -V echo ; \command -V echo ; \command command echo "This is command! (masking despair)"impresiones Not command, lol!x 3.
Adrian Günter
3
@ AdrianGünter: Sí, si se reemplaza command en sí con una función de shell, que está venciendo el mecanismo. Lo que muestra su ejemplo es que \ no omite las funciones , como se indicó. A no autodestructiva ejemplo: date() { echo 'not date'; }; date; command date. Si usted está preocupado acerca maliciosa manipulación con command, ver stackoverflow.com/a/35931876/45375
mklement0
@ mklement0 Entiendo todo eso, pero mi punto es que si uno no puede garantizar que ningún otro nombre de comando exista como una función (es decir, no tiene control sobre su entorno de ejecución), entonces tampoco se puede confiar en commandpara no ser anulado. Desde su propio enlace: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