Seu comando funciona e redireciona corretamente a saída para o arquivo abc.txt
.
A questão é como o seu script está pedindo os dados de entrada e como você está executando o script?
Vamos ver com dois exemplos:
# Script_1.sh # 1
echo Please, enter your firstname and lastname # 2
read FN LN # 3
echo "Hi! $LN, $FN !" # 4
e
# Script_2.sh # 5
read -p "Enter a comment " CM # 6
echo "You said $CM" # 7
Se você executar /bin/bash Script1.sh > abc.txt
, não verá a pergunta "Por favor, digite ..." no seu tty. Se você der a entrada esperada do teclado, encontrará a saída das linhas # 2 e # 4 no seu arquivo abc.txt
.
Se você executar /bin/bash Script2.sh > abc.txt
, verá a pergunta "Inserir um comentário", mas você encontrará no arquivo abc.txt
apenas a saída da linha # 7.
Nota: se você executar o Script2, sh em um subshell
(bash Script2.sh 2>&1)> abc.txt
você não verá nenhuma saída em tty e encontrará todos no arquivo abc.txt
.
Se você executá-lo com
bash Script2.sh 2>ccc.txt 1>ddd.txt'
você encontrará a saída Padrão (linha # 7) em ddd.txt
e o erro padrão (linha # 6) em ccc.txt
.
Se você quiser que redirecione apenas parte da saída do seu comando , você terá que modificar seu script.
Uma das maneiras de fazer isso é criar uma função na qual mover a parte do script que gerará a saída interessante (veja abaixo). Então você pode chamar esta função da parte principal do seu script (onde originalmente era o código que você moveu para a função) redirecionando apenas aquela saída para o arquivo de log:
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 "$@" > abc.txt # this to store only that part in the file
# Part_to_Redirect "$@" >> abc.txt # this to append that part in the file
# ...
Você deve até achar útil tee
que
redirects the output to multiple files, copies standard input to standard output and also to any files given as 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
Neste caso, você terá as saídas normais do seu comando no tty, mas ao mesmo tempo salvará uma cópia no arquivo de log abc.txt
. Deve ser aconchegante no seu caso se você usar read -p
como no script2 a invocação the_command | tee abc.txt
.
Notas e referências:
Adicionando "$@"
, você pode passa todo o argumento do seu script para a função.
Você pode achar interessante ler mais sobre bashredirection de várias fontes na internet.
- Como sugerido por Scott em seu comentário, há uma resposta wiki do Unix SE : um bom ponto de partida.
- A deve o
man bash
ou o manual do bash . - Eu achei útil o capítulo de redirecionamento de bash-hackers , onde você pode encontrar links para obsolete usa também.
- Você também pode consultar o Guia avançado de script de script , capítulo 20.