Por defecto, solo STDOUT
es redirigido y/o canalizado. Lo que quieres es dejar STDOUT
solo, y tener todo lo que se pasa a través de STDIN
redirigido.
Si edita the_command
es una opción, puede asegurarse de que la pregunta se envíe a STDERR
en su lugar (eso debería volcarlo en la pantalla independientemente de cualquier redireccionamiento), y luego hacer que repita lo que el usuario escriba en la pantalla a través de STDOUT
.
Su comando funciona y redirige correctamente la salida al archivo abc.txt
.
La pregunta es cómo está solicitando su secuencia de comandos los datos de entrada ¿Y cómo estás ejecutando el script?
Veamos con dos ejemplos:
# Script_1.sh # 1
echo Please, enter your firstname and lastname # 2
read FN LN # 3
echo "Hi! $LN, $FN !" # 4
y
# Script_2.sh # 5
read -p "Enter a comment " CM # 6
echo "You said $CM" # 7
Si ejecuta /bin/bash Script1.sh > abc.txt
no verá la pregunta "Ingrese..." en su tty. Si proporciona la entrada esperada desde el teclado, encontrará la salida de la línea n. ° 2 y n. ° 4 en su abc.txt
archivo.
Si ejecuta /bin/bash Script2.sh > abc.txt
verás la pregunta "Ingresa un comentario", pero lo encontrarás en el abc.txt
archivar solo la salida de la línea #7.
Nota:si ejecuta Script2,sh en una subcapa
(bash Script2.sh 2>&1)> abc.txt
no verá ningún resultado en tty y encontrará todo en el abc.txt
expediente.
Si lo ejecuta con
bash Script2.sh 2>ccc.txt 1>ddd.txt`
encontrará la salida estándar (línea #7) en ddd.txt
y el error estándar (línea #6) en ccc.txt
.
Si desea redirigir solo una parte de la salida de su comando tienes que modificar tu script.
Una de las formas de hacerlo es crear una función en la que mover la parte del script que generará el resultado interesante (ver más abajo). Luego puede llamar a esta función desde la parte principal de su secuencia de comandos (donde originalmente estaba el código que movió a la función) redirigiendo solo esa salida al archivo de registro:
Part_To_Redirect(){
: # all that you want
}
# ... Main part of the script
# point where it was the part that generates the output
Part_to_Redirect "[email protected]" > abc.txt # this to store only that part in the file
# Part_to_Redirect "[email protected]" >> abc.txt # this to append that part in the file
# ...
Incluso debería encontrar útil tee
que
redirige la salida a varios archivos, copia la entrada estándar a la salida estándar y también a cualquier archivo dado como argumento.
the_command | tee abc.txt # To redirect Standard output
or
the_command 2>&1 | tee abc.txt # To redirect err in out and both in the file
En este caso, tendrá las salidas normales de su comando en el tty, pero al mismo tiempo guardará una copia en el archivo de registro abc.txt
. Debería ser cómodo en su caso si usa read -p
como en el script2 la invocación the_command | tee abc.txt
.
Notas y referencias:
Agregando "[email protected]"
puede pasar todos los argumentos de su script a la función.
Puede encontrar interesante leer más sobre bashredirection de muchas fuentes en Internet.
- Como sugirió Scott en su comentario, hay una respuesta wiki de Unix SE:un buen punto de partida.
- Imprescindible el
man bash
o el manual de bash. - Encontré útil el capítulo de redirección de bash-hackers donde también puedes encontrar enlaces a usos obsoletos.
- También puede consultar la Guía avanzada de secuencias de comandos de Bash, capítulo 20.