GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo redirigir la salida de un comando a un archivo cuando el comando solicitará las entradas del usuario?

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.

Linux
  1. Cómo redirigir la salida a un archivo y salida estándar en Linux

  2. ¿Cómo asignar la salida de un comando a una variable de shell?

  3. ¿Cómo agregar la salida a un archivo?

  4. ¿Cómo capturar la salida de un comando superior en un archivo en Linux?

  5. Cómo redirigir la salida del servicio systemd a un archivo

Cómo usar el comando usermod en Linux

Cómo usar el comando táctil en Linux

Cómo usar el comando de cabeza de Linux

Cómo usar el comando diff de Linux

Cómo redirigir la salida del comando de shell

Cómo guardar la salida del comando en un archivo usando la terminal de Linux