precio para olx moto mercado libre invertidas colombia chinas barras akt bash shell escaping posix alias

bash - para - ¿Por qué las barras invertidas impiden la expansión de alias?



barras invertidas en mercado libre colombia (3)

En la primera parte de mi pregunta, proporcionaré información de antecedentes como un servicio a la comunidad. La segunda parte contiene la pregunta real.

Parte I

Supongamos que he creado el siguiente alias:

alias ls=''ls -r''

Sé cómo unalias temporalmente (es decir, anular este alias) de las siguientes maneras, utilizando:

1) el nombre de ruta completo del comando: /bin/ls

2) sustitución de comandos: $(which ls)

3) el comando incorporado: command ls

4) comillas dobles: "ls"

5) comillas simples: ''ls''

6) un carácter de barra invertida: /ls

El caso 1 es obvio y el caso 2 es simplemente una variación. El comando incorporado en el caso 3 fue diseñado para ignorar las funciones del shell, pero aparentemente también funciona para eludir los alias. Finalmente, los casos 4 y 5 son consistentes con el estándar POSIX (2.3.1) :

"una palabra resultante que se identifica como la palabra de nombre de comando de un comando simple se examinará para determinar si es un nombre de alias válido y sin comillas".

y el manual de referencia de Bash (6.6) :

"La primera palabra de cada comando simple, si no está entre comillas, se verifica para ver si tiene un alias".

Parte II

Aquí está la pregunta: ¿por qué se considera el caso 6 (reemplazar el alias diciendo /ls ) citando la palabra? De acuerdo con el estilo de esta pregunta, busco referencias a la documentación "oficial".

La documentación dice que una barra invertida solo escapa al siguiente carácter , en lugar de comillas simples y dobles, que citan una secuencia de caracteres. Estándar POSIX (2.2.1) :

"Una barra diagonal inversa que no esté entre comillas preservará el valor literal del siguiente carácter, con la excepción de una <nueva línea>"

Manual de referencia de Bash (3.1.2.1) :

"Una barra diagonal inversa no cotizada ''/' es el carácter de escape Bash. Conserva el valor literal del siguiente carácter que sigue, con la excepción de nueva línea".

(Por cierto, ¿no es "el siguiente personaje que sigue" un poco de exageración?)

Una posible respuesta podría ser que esta situación no es tan especial: es similar a algunos casos en las citas de ANSI-C, por ejemplo, /nnn . Sin embargo, todavía se está escapando de un solo carácter (el carácter de ocho bits cuyo valor es el valor octal nnn), no una secuencia de caracteres.


Históricamente, y mantenido por POSIX, la cita de cualquier parte de la palabra hace que la palabra completa se considere entre comillas para los fines de las funciones y la expansión de alias. También se aplica a la cita del token final para un documento aquí:

cat << /EOF this $text is fully quoted EOF


Solo para completar, aquí hay otra forma de suprimir las búsquedas de alias y funciones (borrando todo el entorno de shell para un solo comando):

# cf. http://bashcurescancer.com/temporarily-clearing-environment-variables.html env -i ls


/ ls solo cita el primer carácter en lugar de la palabra completa. Es equivalente a escribir ''l''s.

Puedes verificarlo así:

$ touch /?l $ /?? bash: ?l: command not found

Si /?? citó toda la palabra que diría ?? no encontrado en lugar de? l no encontrado

Es decir, tiene el mismo efecto que:

$ ''?''? bash: ?l: command not found

más bien que:

$ ''??'' bash: ??: command not found