GNU/Linux >> Tutoriales Linux >  >> Linux

¿Han quedado obsoletos los acentos graves (es decir, `cmd`) en *sh Shells?

He visto este comentario muchas veces en Unix y Linux, así como en otros sitios que usan la frase "los acentos graves han quedado en desuso", con respecto a shells como Bash y Zsh.

¿Esta afirmación es verdadera o falsa?

Respuesta aceptada:

Hay dos significados diferentes de "obsoleto".

estar obsoleto: (principalmente de una función de software) ser utilizable pero considerado como obsoleto y es mejor evitarlo, generalmente debido a que ha sido reemplazado.

—Nuevo diccionario americano de Oxford

Según esta definición, los acentos graves son en desuso.

El estado obsoleto también puede indica que la función se eliminará en el futuro.

—Wikipedia

Según esta definición, los acentos graves no en desuso.

Aún compatible:

Citando la Especificación de grupo abierto sobre lenguajes de comandos de Shell,
específicamente la sección "2.6.3 Sustitución de comandos", se puede ver que ambas formas de sustitución de comandos, acentos graves (`..cmd..` ) o paréntesis en dólares ($(..cmd..) ) siguen siendo compatibles en la medida en que se especifica.

extracto

La sustitución de comandos permite sustituir la salida de un comando en lugar del propio nombre del comando. La sustitución de comandos se producirá cuando el comando
se incluya de la siguiente manera:

          $(command)

          or (backquoted version):

          `command`

El shell ampliará la sustitución del comando ejecutando el comando en un entorno de subshell
(consulte Entorno de ejecución del shell) y reemplazando la sustitución del comando
(el texto del comando más el $() o
comillas inversas) con la salida estándar del comando, eliminando secuencias de uno
o más caracteres de al final de la sustitución. Los caracteres incrustados antes del final de la salida no se eliminarán; sin embargo,
pueden tratarse como delimitadores de campo y eliminarse durante la división de campos,
según el valor de IFS y cotización que esté vigente. Si la salida
contiene bytes nulos, el comportamiento no se especifica.

Dentro del estilo de comillas inversas de sustitución de comandos, conservará
su significado literal, excepto cuando vaya seguido de:‘$’, ‘` ', o . La
búsqueda de la comilla inversa coincidente se satisfará con la primera comilla inversa sin escape
sin comillas; durante esta búsqueda, si se encuentra una comilla inversa sin escape
dentro de un comentario de shell, un documento aquí, un comando incrustado
sustitución del $(command) formulario, o una cadena entre comillas, se producen resultados indefinidos
. Una cadena entre comillas simples o dobles que comienza, pero no termina,
dentro de “`...` La secuencia ” produce resultados indefinidos.

Con el $(comando) formulario, todos los caracteres que siguen al paréntesis de apertura hasta
el paréntesis de cierre correspondiente constituyen el comando. Se puede usar cualquier secuencia de comandos de shell
válida para el comando, excepto una secuencia de comandos que consta únicamente de
redirecciones que producen resultados no especificados.

Entonces, ¿por qué todo el mundo dice que los acentos graves han quedado obsoletos?

Porque la mayoría de los casos de uso deberían estar haciendo uso de la forma parens dólar en lugar de acentos graves. (Obsoleto en el primer sentido anterior). Muchos de los sitios de mayor reputación (incluido U&L) a menudo también afirman esto, por lo que es un buen consejo. Este consejo no debe confundirse con algún plan inexistente para eliminar la compatibilidad con los acentos graves de las conchas.

  • BashFAQ #082 – ¿Por qué se prefiere $(…) a `…` (comillas invertidas)?

    extracto

    `...` es la sintaxis heredada requerida solo por el más antiguo de
    bourne-shells no compatibles con POSIX. Hay varias razones para
    preferir siempre el $(...) sintaxis:

  • Bash Hackers Wiki:sintaxis obsoleta y en desuso

    extracto

    Esta es la forma más antigua compatible con Bourne de la sustitución de comandos.
    Tanto el `COMMANDS` y $(COMANDOS) las sintaxis están especificadas por POSIX,
    pero este último es muy preferido, aunque el primero es desafortunadamente
    todavía muy frecuente en las secuencias de comandos. Las sustituciones de comandos de nuevo estilo son ampliamente
    implementadas por cada shell moderno (y algo más). La única razón para usar
    acentos graves es la compatibilidad con un shell Bourne real (como Heirloom).
    Las sustituciones de comandos de acento grave requieren un escape especial cuando están anidados, y
    los ejemplos que se encuentran en la naturaleza se citan incorrectamente más a menudo que no. Ver:¿Por qué se prefiere $(…) a `…` (comillas invertidas)?.

  • Justificación del estándar POSIX

    extracto

    Debido a estos comportamientos incoherentes, no se recomienda la variedad de sustitución de comandos con comillas inversas para aplicaciones nuevas que anidan sustituciones de comandos o intentan incrustar secuencias de comandos complejas.

NOTA: Este tercer extracto (arriba) continúa mostrando varias situaciones en las que los acentos graves simplemente no funcionan, pero el nuevo método paréntesis del dólar sí lo hace, comenzando con el siguiente párrafo:

Además, la sintaxis de comillas inversas tiene restricciones históricas sobre el contenido del comando incrustado. Mientras que el formulario "$()" más reciente puede procesar cualquier tipo de secuencia de comandos incrustada válida, el formulario de comillas inversas no puede manejar algunos scripts válidos que incluyen comillas inversas.

Si continúa leyendo esa sección, las fallas se resaltan y muestran cómo fallarían usando acentos graves, pero funcionan usando la nueva notación de paréntesis en dólares.

Relacionado:¿Cómo colocar la mano para presionar las teclas Comando (cmd) + Opción (alt)?

Conclusiones

Por lo tanto, es preferible que use paréntesis de dólar en lugar de acentos graves, pero en realidad no está usando algo que técnicamente ha sido "obsoleto" como "esto dejará de funcionar por completo en algún punto planificado".

Después de leer todo esto, debe saber que se le recomienda enfáticamente usar paréntesis en dólares a menos que específicamente requieren compatibilidad con un shell Bourne original real que no sea POSIX.


Linux
  1. ¿Obtener todos los archivos que han sido modificados en una fecha específica?

  2. ¿Qué shells no admiten la expansión de paréntesis de dólares y exigen backticks?

  3. El comando "java" no ejecuta la JVM que se ha instalado

  4. Cómo hacer que el comando ls de Linux muestre el segundo en la marca de tiempo

  5. ¿Puede un comando de Linux tener letras mayúsculas?

Cómo saber cuánto tiempo ha estado ejecutándose un proceso en Linux

Terminales, shells, consolas y líneas de comando

Truco de terminal de Linux:hackea el comando cd para recordar dónde has estado

3 comandos de Linux que has olvidado

Encuentra los archivos que han sido modificados en las últimas 24 horas

Calcule cuánto espacio en disco se habría utilizado