grep "hehe" < test.sh
redirección de entrada - que funciona para un solo archivo, por supuesto, mientras cat
funciona para cualquier número de archivos de entrada.
Considerar las notaciones:
grep "hehe" $(cat test.sh)
grep "hehe" `cat test.sh`
Estos son equivalentes en este contexto; es mucho más fácil utilizar el '$(cmd)
' notación en usos anidados, tales como:
x=$(dirname $(dirname $(which gcc)))
x=`dirname \`dirname \\\`which gcc\\\`\``
(Esto le da el directorio base en la que está instalado GCC, en caso de que se está preguntando.)
En el ejemplo grep
, lo que ocurre es que el contenido de test.sh
se lee y se divide en palabras separadas en espacios en blanco, y cada palabra se proporciona como argumento en grep
. Como grep
trata las palabras después de "hehe"
(donde grep
, por supuesto, no ver las comillas dobles - y no son necesarias en este caso; como regla general, utilice comillas simples en lugar de comillas dobles, especialmente en cadenas complejas como expresiones regulares que a menudo usan metacaracteres de shell) ... Como estaba diciendo, grep
trata las palabras después de "hehe"
como nombres de archivo, e intenta abrir cada archivo, generalmente fracasando tristemente porque los archivos no existen. Esta es la razón por la cual la notación no es apropiada en este contexto.
Después de volver a consultar la pregunta, hay más que decir, eso no se ha dicho.
En primer lugar, muchos comandos de Unix están diseñados para funcionar como 'filtros'; leen la entrada de algunos archivos, la transforman de alguna forma y escriben el resultado en la salida estándar. Tales comandos están diseñados para su uso dentro de tuberías de comando. Los ejemplos incluyen:
- gato
- grep
- troff y familiares
- awk (con salvedades)
- sed
- tipo
Todos estos filtros tienen el mismo comportamiento general : toman opciones de línea de comando para controlar su comportamiento, y luego leen el archivo s especificado como argumentos de línea de comando o, si no hay tales argumentos, leen su entrada estándar. Algunos (como sort
) pueden tener opciones para controlar a dónde va su salida en lugar de la salida estándar, pero eso es relativamente poco común.
Hay algunos filtros puros: tr
es uno de esos, que lee estrictamente la entrada estándar y escribe en la salida estándar.
Otros comandos tienen comportamientos diferentes. Eric Raymond proporciona una taxonomía para los tipos de comando en "The Art of UNIX Programming".
Algunos comandos generan listas de nombres de archivo en salida estándar; los dos clásicos son ls
y find
.
A veces, desea aplicar la salida de un generador de nombre de archivo como argumentos de línea de comando para un filtro. Hay un programa que lo hace automáticamente: es xargs
.
Clásicamente, se debería utilizar:
find . -name '*.[chyl]' | xargs grep -n magic_name /dev/null
Esto generaría una lista completa de archivos con '.c
', '.h
', '.y
' y '.l
' (fuente C, encabezados de las extensiones, Yacc y archivos Lex). Como la lista se lee por xargs
, creará líneas de comando con grep -n magic_name /dev/null
al comienzo y cada palabra (separada por espacios en blanco) como argumento.
En los viejos tiempos, los nombres de archivo Unix no incluían espacios. Bajo la influencia de Mac y Windows, estos espacios ahora son un lugar común. Las versiones GNU de find
y xargs
tienen opciones complementarias para hacer frente a este problema:
find . -name '*.[chyl]' -print0 | xargs -0 grep -n magic_name /dev/null
La opción '-print0
' significa "nombres de archivo de impresión terminados por un NUL '\ 0'" (porque los únicos personajes que pueden no aparecer en un nombre de archivo (simple) son '/' y NUL, y obviamente, '/' puede aparecer en nombres de ruta). El '-0
' correspondiente dice xargs
para buscar nombres terminados por NUL en lugar de nombres separados por espacios.
Su pregunta es un poco confusa, con suerte ya sea que ingrese la redirección o simplemente proporcione el nombre de archivo como argumento es lo que quería. Por otro lado, si está preguntando cómo tomar la salida estándar de un comando y darle al stdin de otro comando sin usar un tubo ... esa es la definición de un tubo. – Cascabel