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.