GNU/Linux >> Tutoriales Linux >  >> Linux

Sintaxis de declaración de sustitución de comandos en Bash:¿cuál de estos dos es mejor práctica?

Esta pregunta ya tiene respuestas aquí :¿Cuál es la diferencia entre $(cosas) y `cosas`?

(6 respuestas)
Cerrado hace 6 años.

Esto es parte de bash find bucle, y me preguntaba cuál es la sintaxis más correcta y por qué?

filename="$(echo "$i" | cut -c5-)";
filename=`echo "$i" | cut -c5-`;

Ambos funcionan con el propósito de obtener el nombre del archivo.

Respuesta aceptada:

El manual de Bash señala que:

Se implementa la forma POSIX $() de sustitución de comandos (consulte Sustitución de comandos) y se prefiere a la shell Bourne " (que también se implementa para compatibilidad con versiones anteriores).

Entonces $(...) se prefiere a `...` en cualquier cosa nueva y específica de Bash que estés escribiendo¹. La sustitución de backtick no anida bien (tiene que escapar de ellos) y tiene un comportamiento de comillas ligeramente extraño. Puede anidar $(... $(...) ...) arbitrariamente mucho sin problema. El manual describe el comportamiento de los dos como:

Cuando se utiliza la forma de sustitución de comillas inversas al estilo antiguo, la barra invertida conserva su significado literal excepto cuando va seguida de '$', '`' o ''. La primera comilla inversa no precedida por una barra invertida finaliza la sustitución del comando. Al usar la forma $(comando), todos los caracteres entre paréntesis forman el comando; ninguno recibe un trato especial.

Por lo general, se considera una buena práctica citar todas las expansiones de cadenas para evitar problemas de división de palabras, incluso en lugares donde no es estrictamente necesario, por lo que "$(...)" también es una mejor práctica aquí.

Finalmente, dos partes relevantes de esa misma página de wooledge:

  • También es hora de que te olvides de `...` . No es consistente con la sintaxis de Expansion y es terriblemente difícil de anidar sin una dosis de analgésicos. Usa $(...) en su lugar.
  • Y por el amor de Dios, "¡Usa más comillas!" Proteja sus cadenas y expansiones de parámetros de la división de palabras. La división de palabras se comerá a sus bebés si no cita las cosas correctamente.

¹En realidad, incluso en POSIX sh guiones, estos se consideran mejores prácticas. Todavía hay caparazones más débiles, pero sabrás si te los vas a encontrar.


Linux
  1. Dos excelentes usos para el comando cp:accesos directos de Bash

  2. Esta sintaxis de Shell/bash:Somevariable=somevalue Somecommand?

  3. comando de exportación bash

  4. Código de salida de asignación de variables a sustitución de comandos en Bash

  5. Accidentalmente escribí la contraseña en la línea de comandos de bash

bash heredoc

Linux qué comando

Comando de fuente Bash

Comando de historial en Linux (Bash History)

Comando Bash printf

Script Bash (II)