- how to just output stdout and catch stderr into file?(I tried ./test|tee 2>log, but doesn't work)
$ ./test 2>log
OUT!
$ cat log
ERR!
- how to just output both and catch stderr into file?
$ ./test 2>&1 >/dev/tty | tee log
OUT!
ERR!
$ cat log
ERR!
Se essa expressão fosse parte de um pipeline maior, convém evitar o uso de /dev/tty
. Uma maneira de fazer isso é trocar stdout e stderr. Para fazer essa troca, precisamos criar um terceiro identificador de arquivo da seguinte forma:
$ exec 3>&1; ./test 2>&1 1>&3 | tee log; exec 3>&-
OUT!
ERR!
$ cat log
ERR!
A primeira instrução, exec 3>&1
, atribui o identificador de arquivo 3 ao stdout atual (o que quer que seja). Em seguida, ./test 2>&1 1>&3 | tee log
canaliza o stderr para o comando tee
enquanto envia stdout para o identificador de arquivo 3. Por fim, para uma boa limpeza, exec 3>&-
fecha o identificador de arquivo 3.
Notas e comentários adicionais
Em relação a:
I can output stderr and catch stdout into log file by:
$./test | tee 1>log ERR! $cat log OUT!
Isso pode ser simplificado para:
$ ./test >log
ERR!
$ cat log
OUT!
Além disso, em relação a:
I can output nothing but catch all stdout and stderro into log file by:
$ ./test 2>&1| tee 1>log $ cat log OUT! ERR!
Isso pode ser simplificado para:
$ ./test >log 2>&1
$ cat log
OUT!
ERR!
Ou, com bash
, mas não o shell POSIX, uma forma ainda mais simples é possível:
$ ./test &>log
$ cat log
OUT!
ERR!