GNU/Linux >> Tutoriels Linux >  >> Linux

Comment rediriger la sortie d'une commande vers un fichier lorsque la commande demandera des entrées utilisateur ?

Par défaut, uniquement STDOUT est redirigé et/ou canalisé. Ce que tu veux, c'est partir STDOUT seul, et avoir tout ce qui est passé via STDIN redirigé.

Si vous modifiez the_command est une option, vous pouvez vous assurer que la question est sortie vers STDERR à la place (cela devrait le vider à l'écran indépendamment de toute redirection), puis le faire répercuter tout ce que l'utilisateur tape à l'écran via STDOUT .


Votre commande fonctionne et redirige correctement la sortie vers le fichier abc.txt .
La question est comment votre script demande-t-il les données d'entrée et comment exécutez-vous le script?
Voyons avec deux exemples :

# Script_1.sh                                     # 1
echo Please, enter your firstname and lastname    # 2
read FN LN                                        # 3
echo "Hi! $LN, $FN !"                             # 4

et

# Script_2.sh                                     # 5
read -p "Enter a comment " CM                     # 6
echo  "You said $CM"                              # 7

Si vous exécutez /bin/bash Script1.sh > abc.txt vous ne verrez pas la question "Veuillez entrer..." sur votre tty. Si vous donnez l'entrée attendue du clavier, vous trouverez la sortie des lignes #2 et #4 dans votre abc.txt fichier.

Si vous exécutez /bin/bash Script2.sh > abc.txt vous verrez la question "Saisir un commentaire", mais vous trouverez dans le abc.txt fichier uniquement la sortie de la ligne #7.

Remarque :si vous exécutez le Script2,sh dans un sous-shell

(bash Script2.sh 2>&1)> abc.txt

vous ne verrez aucune sortie sur tty et vous trouverez tout dans le abc.txt dossier.
Si vous l'exécutez avec

bash Script2.sh 2>ccc.txt 1>ddd.txt`

vous trouverez la sortie Standard (ligne #7) dans ddd.txt et l'erreur standard (ligne #6) dans ccc.txt .

Si vous souhaitez ne rediriger qu'une partie de la sortie de votre commande vous devez modifier votre script.
L'une des façons de le faire est de créer une fonction dans laquelle déplacer la partie du script qui générera la sortie intéressante (voir ci-dessous). Ensuite, vous pouvez appeler cette fonction depuis la partie principale de votre script (où c'était à l'origine le code que vous avez déplacé dans la fonction) en redirigeant uniquement cette sortie vers le fichier journal :

 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
 # ...

Vous devriez même trouver utile tee que

redirige la sortie vers plusieurs fichiers, copie l'entrée standard vers la sortie standard ainsi qu'à tous les fichiers donnés en arguments.

 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

Dans ce cas vous aurez les sorties normales de votre commande sur le tty, mais en même temps vous en sauvegarderez une copie dans le fichier journal abc.txt . Cela devrait être confortable dans votre cas si vous utilisez read -p comme dans le script2 l'invocation the_command | tee abc.txt .

Notes et références :

Ajout de "[email protected]" vous pouvez passer tous les arguments de votre script à la fonction.

Vous trouverez peut-être intéressant d'en savoir plus sur la redirection bash à partir de nombreuses sources sur Internet.

  • Comme suggéré par Scott dans son commentaire, il existe une réponse wiki d'Unix SE :un bon point de départ.
  • Un must le man bash ou le manuel bash.
  • J'ai trouvé utile le chapitre sur la redirection de bash-hackers où vous pouvez également trouver des liens vers des utilisations obsolètes.
  • Vous pouvez également vous référer au Guide de script bash avancé, chapitre 20.

Linux
  1. Comment enregistrer la sortie de la commande dans un fichier sous Linux

  2. Comment utiliser la commande Tar sous Linux

  3. Comment rediriger la sortie vers un fichier et Stdout sous Linux

  4. Comment affecter la sortie d'une commande à une variable Shell ?

  5. Comment rediriger la sortie d'un programme vers un fichier Zip ? ?

Comment utiliser la commande usermod sous Linux

Comment utiliser la commande touch sous Linux

Comment utiliser la commande Linux head

Comment utiliser la commande Linux diff

Comment rediriger la sortie de la commande shell

Comment enregistrer la sortie de la commande dans un fichier à l'aide du terminal Linux