El comportamiento de Perl, con el código dado en el OP, puede tomar ninguno o varios argumentos, y si un argumento es un guión simple, -
esto se entiende como stdin. Además, siempre es posible tener el nombre de archivo con $ARGV
. Ninguna de las respuestas dadas hasta ahora realmente imita el comportamiento de Perl en estos aspectos. Aquí hay una posibilidad pura de Bash. El truco es usarlo exec
apropiadamente.
#!/bin/bash
(($#)) || set -- -
while (($#)); do
{ [[ $1 = - ]] || exec < "$1"; } &&
while read -r; do
printf '%s\n' "$REPLY"
done
shift
done
Nombre de archivo disponible en $1
.
Si no se dan argumentos, los establecemos artificialmente -
como el primer parámetro posicional. Luego hacemos un bucle en los parámetros. Si un parámetro no es -
, redirigimos la entrada estándar del nombre del archivo con exec
. Si esta redirección tiene éxito, hacemos un bucle con un while
bucle. Estoy usando la REPLY
variable estándar , y en este caso no es necesario reiniciar IFS
. Si desea otro nombre, debe restablecerlo IFS
así (a menos que, por supuesto, no lo desee y sepa lo que está haciendo):
while IFS= read -r line; do
printf '%s\n' "$line"
done
/proc/$$/fd/0
y/dev/stdin
? Me di cuenta de que este último parece ser más común y parece más sencillo.-r
a suread
comando, para que no coma\
caracteres accidentalmente ; usewhile IFS= read -r line
para preservar los espacios en blanco iniciales y finales./bin/sh
: ¿está utilizando un shell diferente debash
osh
?