GNU/Linux >> Znalost Linux >  >> Linux

Jak přesměrovat výstup příkazu do souboru, když příkaz vyzve uživatele k zadání?

Ve výchozím nastavení pouze STDOUT je přesměrován a/nebo přesměrován. Co chcete, je nechat STDOUT sám a mít vše, co se předává přes STDIN přesměrováno.

Pokud upravujete the_command je možnost, můžete se ujistit, že otázka bude odeslána do STDERR místo toho (to by to mělo vypsat na obrazovku bez ohledu na jakákoli přesměrování) a pak nechat ozvat, co uživatel zadá zpět na obrazovku přes STDOUT .


Váš příkaz funguje a správně přesměruje výstup do souboru abc.txt .
Otázkou je, jak se váš skript ptá na vstupní data a jak spouštíš skript?
Podívejme se na dva příklady:

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

a

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

Pokud spustíte /bin/bash Script1.sh > abc.txt na svém tty neuvidíte otázku „Zadejte prosím...“. Pokud zadáte očekávaný vstup z klávesnice, najdete výstup řádku #2 a #4 ve vašem abc.txt soubor.

Pokud spustíte /bin/bash Script2.sh > abc.txt uvidíte otázku "Zadejte komentář", ale najdete ji v abc.txt soubor pouze výstup řádku #7.

Poznámka:Pokud spustíte Script2,sh v subshell

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

na tty neuvidíte žádný výstup a vše najdete v abc.txt soubor.
Pokud jej spustíte pomocí

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

standardní výstup (řádek č. 7) najdete v ddd.txt a standardní chyba (řádek #6) vccc.txt .

Pokud chcete přesměrovat pouze část výstupu příkazu musíte upravit svůj skript.
Jedním ze způsobů, jak to udělat, je vytvořit funkci, ve které přesunete část skriptu, která bude generovat zajímavý výstup (viz níže). Poté můžete tuto funkci volat z hlavní části vašeho skriptu (kde to byl původně kód, který jste přesunuli do funkce) přesměrování pouze tohoto výstupu do souboru protokolu:

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

Měli byste dokonce najít užitečné tee to

přesměruje výstup do více souborů, zkopíruje standardní vstup do standardního výstupu a také na všechny soubory zadané jako argumenty.

 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

V tomto případě budete mít normální výstupy svého příkazu na tty, ale zároveň uložíte kopii do souboru protokolu abc.txt . Pokud použijete read -p, ve vašem případě by to mělo být útulné jako ve skriptu2 vyvolání the_command | tee abc.txt .

Poznámky a odkazy:

Přidání "[email protected]" můžete funkci předat všechny argumenty vašeho skriptu.

Možná pro vás bude zajímavé přečíst si více o bashredirection z mnoha zdrojů na internetu.

  • Jak navrhl Scott ve svém komentáři, existuje wiki odpověď Unix SE:dobrý výchozí bod.
  • A musí být man bash nebo bash manuál.
  • Považoval jsem za užitečnou kapitolu o přesměrování bash-hackerů, kde také najdete odkazy na zastaralá použití.
  • Můžete se také podívat na Advanced Bash-Scripting Guide, kapitola 20.

Linux
  1. Jak přesměrovat výstup do souboru a Stdout v Linuxu

  2. Jak přiřadit výstup příkazu proměnné shellu?

  3. Jak připojit výstup do souboru?

  1. Jak přesměrovat výstup system() do souboru?

  2. Jak zachytit výstup top příkazu do souboru v linuxu?

  3. Jak uložit výstup tohoto příkazu awk do souboru?

  1. Jak uložit výstup příkazu do souboru v Linuxu

  2. Jak používat příkaz Tar v Linuxu

  3. Jak přesměrovat výstup programu do souboru ZIP?