Forçar o bash a finalizar a saída no espaço em branco

2

Existem muitas perguntas para isso, mas nenhuma delas parece funcionar para minhas necessidades específicas.

Estou usando tmux e, portanto, minha janela do bash é bem pequena ( $COLUMNS = 45 ). Isso significa que praticamente qualquer saída será envolvida em sua largura máxima, o que pode parecer muito pesado, porque as palavras longas estão ficando no meio.

Embora muitas soluções (por exemplo, fold -w 30 -s $FILE ) funcionem bem com arquivos, não consigo canalizar a saída da execução de um programa como python ou nodejs . Por questões de legibilidade, gostaria de ter seus resultados envolvidos em espaço em branco.

Por exemplo, quando eu intencionalmente gerar um erro com nodejs asdgasgsdg passando um arquivo inexistente, quero que a saída seja:

Error: Cannot find module '/home/User/
Documents/cwd/asdgasdg'
    at Function.Module._resolveFilename (
module.js:326:15)
    at Function.Module._load (module.js:277:
25)
    at Function.Module.runMain (module.js:442
:10)
    at startup (node.js:136:18)
    at node.js:966:3

Em vez de:

Error: Cannot find module '/home/User/Docume
nts/cwd/asdgasdg'
    at Function.Module._resolveFilename (modu
le.js:326:15)
...

Eu gostaria de um comando simples que possa forçar esse tipo de quebra automática. Eu estava pensando em algo como nodejs non-existent-file.js | fold -w 45 , o que não funciona.

Eu também tentei canalizar a saída para um arquivo e, em seguida, abrir o arquivo com fold , mas não consegui obter nodejs para canalizar sua mensagem de erro para output.txt . Eu não quero forçar manualmente o script para logar em um arquivo, mas forçar o terminal para fazer o trabalho. (ou seja, eu quero um equivalente funcional de nodejs non-existent-file.js > output.txt; fold -w 45 -s output.txt . Quando eu tentei, output.txt estava vazio.)

Isso é possível?

    
por spicypumpkin 04.04.2017 / 06:17

1 resposta

2

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
    
por 05.04.2017 / 03:34

Tags