La sustitución de comandos permite sustituir la salida de un comando en lugar del nombre del comando en sí. La sustitución del comando ocurrirá cuando el comando esté encerrado de la siguiente manera:
$(command)
o (versión con comillas):
`command`
El shell expandirá la sustitución del comando ejecutando el comando
en un entorno de subshell (consulte Entorno de ejecución de Shell ) y reemplazando la sustitución del comando (el texto del comando más el "$ ()" o comillas anexas) con la salida estándar del comando, eliminando secuencias de uno o más <newline>
caracteres al final de la sustitución. Los <newline>
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 campo, según el valor de IFS y las cotizaciones vigentes. Si la salida contiene bytes nulos, el comportamiento no se especifica.
Dentro del estilo de sustitución de comando entre comillas, <backslash>
retendrá su significado literal, excepto cuando sea seguido por: ' $
', ' `
' o
<backslash>
. La búsqueda de la cita inversa coincidente deberá ser satisfecha por la primera cita inversa no escapada sin comillas; durante esta búsqueda, si se encuentra una comilla inversa no escapada dentro de un comentario de shell, un documento aquí, una sustitución de comando incrustada del formulario $ ( comando ) o una cadena entre comillas, se producen resultados indefinidos. Una cadena entre comillas simples o dobles que comienza, pero no termina, dentro de "`...`
secuencia " produce resultados indefinidos.
Con el formulario $ ( comando ), todos los caracteres que siguen el paréntesis abierto al paréntesis de cierre coincidente constituyen el
comando . Se puede usar cualquier script de shell válido para el comando , excepto un script que consista únicamente en redirecciones que produzcan resultados no especificados.
Los resultados de la sustitución de comandos no se procesarán para una mayor expansión de tilde, expansión de parámetros, sustitución de comandos o expansión aritmética. Si se produce una sustitución de comando entre comillas dobles, la división del campo y la expansión del nombre de ruta no se realizarán en los resultados de la sustitución.
La sustitución de comandos puede estar anidada. Para especificar el anidamiento dentro de la versión con comillas invertidas, la aplicación precederá las comillas internas con <backslash>
caracteres; por ejemplo:
\`command\`
La sintaxis del lenguaje de comandos de shell tiene una ambigüedad para las expansiones que comienzan con "$((
", que puede introducir una expansión aritmética o una sustitución de comando que comienza con un subshell. La expansión aritmética tiene prioridad; es decir, el shell primero determinará si puede analizar la expansión como una expansión aritmética y solo analizará la expansión como un comando sustitución si determina que no puede analizar la expansión como una expansión aritmética. El shell no necesita evaluar expansiones anidadas al realizar esta determinación. Si encuentra el final de la entrada sin haber determinado ya que no puede analizar la expansión como una expansión aritmética, el Shell tratará la expansión como una expansión aritmética incompleta e informará un error de sintaxis. Una aplicación conforme se asegurará de que separa el " $(
" y '(
'en dos tokens (es decir, sepárelos con un espacio en blanco) en una sustitución de comando que comienza con una subshell. Por ejemplo, una sustitución de comando que contiene una única subshell podría escribirse como:
$( (command) )
$()
es POSIX y es compatible con todos los shells Bourne modernos, por ejemplo, ksh, bash, ash, dash, zsh, busybox, lo que sea. (Uno no tan moderno es Solaris/bin/sh
, pero en Solaris se aseguraría de usar el moderno en su/usr/xpg4/bin/sh
lugar).