Existem duas coisas separadas acontecendo aqui: as mensagens de erro (que são realmente de python, não awk) e a mensagem de uso do awk. Para isolá-los, apenas redirecione o stderr de ambos os comandos:
$ python -c 'print "hello"' 2>pyerr | awk 2>awkerr
$ cat pyerr
close failed in file object destructor:
Error in sys.excepthook:
Original exception was:
$ cat awkerr
usage: awk [-F fs] [-v var=value] [-f progfile | 'prog'] [file ...]
O AIUI python está recebendo um erro porque o programa está sendo canalizado para saídas (e encerra o canal) antes de ser gravado pelo Python. Aqui está um exemplo usando sleep 0
como um programa que não faz nada e, portanto, sai muito rápido:
$ python -c 'print "hello"' | sleep 0
close failed in file object destructor:
Error in sys.excepthook:
Original exception was:
Mas se eu usar sleep 1
, não há erro porque a suspensão não fecha a extremidade do canal até que o Python tenha terminado de gravar nele. Seus resultados podem ser diferentes, dependendo dos horários exatos envolvidos.
Agora, para o erro awk
. A diferença é que awk
sem um argumento não é válido porque você deve fornecer um programa; desde que você o executou indevidamente, ele tenta ser útil imprimindo uma mensagem de uso para lhe dizer como ela deve ser executada. Por outro lado, awk ''
está realmente dizendo ao awk para executar um script vazio (''), que é perfeitamente válido (embora não seja muito útil), portanto nenhuma mensagem de uso é impressa:
$ awk
usage: awk [-F fs] [-v var=value] [-f progfile | 'prog'] [file ...]
$ awk ''