Sustitución de comando: ¿se incluyen los palos de fondo o el signo de dólar / paren?

¿Cuál es la forma preferida de hacer sustitución de comando en bash?

Siempre lo he hecho así:

echo "Hello, `whoami`." 

Pero recientemente, a menudo lo he visto escrito así:

 echo "Hello, $(whoami)." 

¿Cuál es la syntax preferida, y por qué? ¿O son más o menos intercambiables?

Tiendo a favorecer al primero, simplemente porque mi editor de texto parece saber de qué se trata, y resalta correctamente la syntax.

Leí aquí que los personajes escapados actúan de forma un poco diferente en cada caso, pero no tengo claro qué comportamiento es preferible, o si solo depende de la situación.

Pregunta complementaria: ¿es una mala práctica usar ambas formas en una secuencia de comandos, por ejemplo, al anidar sustituciones de comandos?

Aquí hay varias preguntas / problemas, así que repetiré cada sección del texto del póster, citado en bloque y seguido por mi respuesta.

¿Cuál es la syntax preferida, y por qué? ¿O son más o menos intercambiables?

Diría que se prefiere el formulario $(some_command) sobre el formulario `some_command` . La segunda forma, usando un par de comillas inversas (el caracter “` “, también llamado retroceso y acento grave), es la forma histórica de hacerlo. El primer formulario, con signo de dólar y paréntesis, es un formulario POSIX más nuevo, lo que significa que probablemente sea una forma más estándar de hacerlo. A su vez, creo que eso significa que es más probable que funcione correctamente con diferentes shells y con diferentes implementaciones de * nix.

Otra razón dada para preferir la primera forma (POSIX) es que es más fácil de leer, especialmente cuando las anulaciones de comandos están anidadas. Además, con la forma de retroceso, los caracteres de retroceso deben tener una barra invertida escapada en las sustituciones de los comandos nesteds (internos).

Con el formulario POSIX, no necesita hacer eso.

En cuanto a si son intercambiables, bueno, diría que, en general, son intercambiables, aparte de las excepciones que mencionaste para los personajes escapados. Sin embargo, no sé y no puedo decir si todas las conchas modernas y todas las modernas * nix son compatibles con ambas formas. Dudo que lo hagan, especialmente conchas viejas / viejos * nixes. Si yo fuera usted, no dependería de la intercambiabilidad sin antes realizar un par de pruebas rápidas y simples de cada formulario en cualquier implementación shell / * nix en la que planee ejecutar sus scripts terminados.

Tiendo a favorecer al primero, simplemente porque mi editor de texto parece saber de qué se trata, y resalta correctamente la syntax.

Es lamentable que su editor no parezca ser compatible con el formulario POSIX; tal vez deba verificar si hay alguna actualización para su editor que admita la forma POSIX de hacerlo. Posiblemente un tiro lejano, pero ¿quién sabe? O quizás deberías considerar probar un editor diferente.

GGG, ¿qué editor de texto estás usando ???

Leí aquí que los personajes escapados actúan de forma un poco diferente en cada caso, pero no tengo claro qué comportamiento es preferible, o si solo depende de la situación.

Yo diría que depende de lo que estás tratando de lograr; en otras palabras, si está usando caracteres escapados junto con la sustitución de comandos o no.

Pregunta complementaria: ¿es una mala práctica usar ambas formas en una secuencia de comandos, por ejemplo, al anidar sustituciones de comandos?

Bueno, podría hacer que el guión sea ligeramente más fácil de LEER (tipográficamente hablando), ¡pero más difícil de ENTENDER! Alguien que lea su guión (¡o USTED, leyéndolo seis meses después!) Probablemente se pregunte por qué no se limitó a apegarse a una u otra forma, a menos que ponga algún tipo de nota sobre por qué lo hizo en los comentarios. Además, mezclar ambas formas en una secuencia de comandos haría que esa secuencia de comandos sea menos portátil: para que la secuencia de comandos funcione correctamente, el intérprete de comandos que la ejecuta debe admitir AMBOS formularios, no solo una forma u otra.

Para hacer comprensible un guión del intérprete de órdenes, personalmente prefiero apegarme a una forma u otra a lo largo de cualquier guión, a menos que haya una buena razón técnica para hacer lo contrario. Además, preferiría el formulario POSIX sobre el formulario anterior; nuevamente, a menos que haya una buena razón técnica para hacer lo contrario.

Para obtener más información sobre el tema de la sustitución de comandos y las dos formas diferentes de hacerlo, le sugiero que consulte la sección sobre sustitución de comandos en el libro O’Reilly “Classic Shell Scripting”, segunda edición, de Robbins y Beebe. En esa sección, los autores afirman que el formulario POSIX para la sustitución de comandos “se recomienda para todos los nuevos desarrollos”. No tengo ningún interés financiero en este libro; es solo una que tengo (y amo) en las secuencias de comandos del shell, aunque es más para scripts de shell intermedio o avanzado, y no realmente para el inicio de scripts de shell.

-SEGUNDO.

Puedes leer las diferencias del manual bash . En la mayoría de los casos, son intercambiables.


Una cosa para mencionar es que debes escapar de la backquote para backquote comandos:

 $ echo $(echo hello $(echo word)) hello word $ echo `echo hello \`echo word\`` hello word 

Los backticks son compatibles con shells antiguos, por lo que los scripts que deben ser portátiles (como los fragmentos de autoconf de GNU) deberían preferirlos.

El formulario $() es un poco más fácil para los ojos, esp. después de algunos niveles de escape.