Ocultar a saída de um comando shell geralmente envolve redirecionar stderr e stdout. Existe algum recurso ou comando interno que, por padrão, oculta a saída, mas que, por erro, despeja toda a saída acumulada? Gostaria de executar isso como um invólucro para ssh
comandos remotos . Agora eu os tenho usando o redirecionamento, mas não tenho idéia do que os fez falhar, e eles são muito detalhados.
EDIT: No final, criei o seguinte modelo com base na resposta de @Belmin, que aprimorei um pouco para acumular todos os comandos anteriores do script, use o identificador de processo atual, remova automaticamente o log e adicione um erro vermelho de falha mensagem quando algo der errado. Neste modelo, os silent
wrappers iniciais serão bem-sucedidos e falharão no terceiro comando porque o diretório já existe:
#!/bin/sh
set -e
SILENT_LOG=/tmp/silent_log_$$.txt
trap "/bin/rm -f $SILENT_LOG" EXIT
function report_and_exit {
cat "${SILENT_LOG}";
echo "\033[91mError running command.\033[39m"
exit 1;
}
function silent {
$* 2>>"${SILENT_LOG}" >> "${SILENT_LOG}" || report_and_exit;
}
silent mkdir -v pepe
silent mkdir -v pepe2
silent mkdir -v pepe
silent mkdir -v pepe2
2>&1
, algo como:$* >>"${SILENT_LOG}" 2>&1" || report_and_exit
Respostas:
Eu configuraria uma função bash como esta:
Então, você pode simplesmente executar o comando:
fonte
/etc/passswd
algum outro arquivo crítico e substituiria o conteúdo.$* > /tmp/surpress.out 2>&1
Isso realmente captura o stderr.$*
não é o melhor para lidar com entradas arbitrárias. Especialmente quando contém espaços ou sinalizadores. A maioria dos portáteis está de${1+"$@"}
acordo com stackoverflow.com/questions/743454/…Deve ser fácil escrever um script para esse fim.
Algo como esse script completamente não testado.
Por outro lado, para os comandos executados como parte de um script, geralmente quero algo melhor do que simplesmente imprimir toda a saída. Costumo limitar o que vejo ao desconhecido. Aqui está um roteiro que eu adaptei de algo que li mais de uma década atrás.
fonte
Eu não acho que exista uma maneira limpa de fazer isso, a única coisa que consigo pensar é
Implementar isso pode ser um projeto interessante, mas talvez além das perguntas e respostas.
fonte
indo curto com algo como
tehcommand &>/tmp/$$ || cat /tmp/$$
depende de quanto usabilidade / digitação você deseja / precisa. (por exemplo, usando-o como um canal ou passando o comando por argumento)
O script curto do @zoredache é basicamente um proto-wrapper para isso, o que daria mais robustez, lida com a simultaneidade, etc.
fonte
Tente assim:
fonte
out="$(command args...)" || echo "$out"