¿Por qué 'echo $(cat /path/to/fileName)' enumera mis archivos e instrucciones?

¿Por qué 'echo $(cat /path/to/fileName)' enumera mis archivos e instrucciones?

Cuando imprimo el contenido de un archivo con echo $(cat /path/to/filename), también enumera mis archivos y las instrucciones. Pero cuando lo hago printf "$(cat /path/to/filename)\n"funciona bien.

También intenté guardarlo en una variable content='cat /path/to/filename'(también content=$(cat /path/to/filename) y luego imprimirlo echo $content, pero obtuve el mismo resultado (lista de archivos e instrucciones).

Quiero almacenar el contenido del archivo en una variable y pasar la variable a mi script como entrada para el siguiente comando.

Tenga en cuenta que el contenido de mi archivo tiene un carácter especial *.

Respuesta1

Porque después de realizar la sustitución de comandos, el shell realiza la división de palabras (o división de campos) en el resultado si no las comillas.

POSIX definidoexpansión de palabrascomo:

El orden de ampliación de palabras será el siguiente:

  1. La expansión de tilde (ver Expansión de tilde), la expansión de parámetros (ver Expansión de parámetros), la sustitución de comandos (ver Sustitución de comandos) y la expansión aritmética (ver Expansión aritmética) se realizarán de principio a fin. Ver punto 5 en Reconocimiento de Tokens.

  2. La división de campos (ver División de campos) se realizará en las partes de los campos generados en el paso 1, a menos que IFS sea nulo..

  3. Se realizará la expansión del nombre de ruta (consulte Expansión de nombre de ruta), a menos que set -f esté vigente.

  4. La eliminación de cotizaciones (consulte Eliminación de cotizaciones) siempre se realizará en último lugar.

En su caso, *coincidió todo en el directorio de trabajo actual. Debe citar el resultado para obtener el resultado esperado:

echo "$(cat /path/to/fileName)"

Respuesta2

Cítelo:

$ echo "*" >> test
$ echo $(cat test)
bash43-001 bash43-002 bash43-003 bash43-004 bash43-005 test
$ echo "$(cat test)"
*

Como primera regla, cite siempre la sustitución de comandos.

Lo básico *se expandirá en bash, a menos que desactives el globbing ( set -fo setopt noglob) o lo cites o escapes: "*" \*. Para la salida de comandos, siempre es mejor utilizar comillas.

información relacionada