Veo comandos como este en algunos scripts: /bin/cat somefile | someprogram
. Me gustaría saber cómo leer la tubería completa de la misma manera que lo hace algún programa. Entonces, cuando ejecuto /bin/cat something | myprogram.sh
, myprogram.sh tiene una variable llamada mypipevar igual a lo que se canalizó: todo el texto de la canalización. Si no está claro, hágamelo saber. He leído que la lectura probablemente no funcionará y que bash puede no ser el shell correcto.
Respuesta
La tubería se conecta stdout
de un programa a stdin
de otro, por lo que en su secuencia de comandos simplemente lea desde stdin
y obtendrá lo que imprimió el comando anterior. Una forma sencilla de leer esto en una variable es con cat, por ejemplo, dentro de myprogram.sh
:
mypipevar="$(cat ${1:-/dev/stdin})" echo "Obtained the value: "$mypipevar""
Sin embargo, bastante a menudo desea procesar las cosas línea por línea en lugar de todas a la vez, esto se puede hacer con
while read line do echo "$line" done < "${1:-/dev/stdin}"
Tenga en cuenta que ${1:-/dev/stdin}
le dará el primer argumento, o si no se especifican argumentos, entonces /dev/stdin
que contendrá el contenido de stdin que puede leerse como un archivo. Esto le permite ejecutar el script como command | script
o simplemente como script filename
.