A passagem por fold
funciona com qualquer programa que não exija que sua saída seja um terminal. E se o programa exigir que sua saída seja um terminal, é provável que ele faça sua própria formatação.
nodejs non-existent-file.js | fold -w 45
“não funciona” porque você não está canalizando toda a saída para fold
, apenas o saída padrão (ou seja, dados da aplicação). Você precisa unir a saída padrão com o erro padrão no canal:
nodejs non-existent-file.js 2>&1 | fold -w 45
Mas há uma ruga adicional. Os dados gravados em um canal normalmente são bufferred , enquanto os dados não são armazenados em buffer por padrão ao gravar em um terminal. Como o pipe está saindo para um terminal, você deve desabilitar o buffer. Com os utilitários GNU, você pode usar stdbuf .
Além disso, a tubulação destrói as informações do status de retorno do comando. No bash, você pode usar PIPESTATUS
para recuperar o status do comando ; zsh tem pipestatus
para o mesmo efeito. Alternativamente, em ksh93, bash ou zsh, você pode usar uma substituição de processo ; no entanto, o bash não espera que o comando na substituição do processo termine, o que também é um problema.
Além disso, você só deve fazer isso se a saída for um terminal. Quebra automática de logs em arquivos seria muito irritante, pois destrói muita informação (você não pode mais confiar em quebras de linha).
#!/bin/bash
run_with_word_wrap () {
if [ -t 1 ]; then
stdbuf -oL -eL "$@" 2>&1 | fold -w "$COLUMNS"
return ${PIPESTATUS[0]}
else
"$@"
fi
}
run_with_word_wrap nodejs non-existent-file.js