Para fins de documentação, quero redirecionar para o arquivo stdout e stderr de um comando que executo. Por exemplo, eu executaria (meu comando é menos trivial que o alias ll
, mas provavelmente não importa):
$ ll > out-err.dat 2>&1
$ cat out-err.dat
drwxr-xr-x 39 us00001 us00001 4096 jul 31 14:57 ./
drwxr-xr-x 3 root root 4096 feb 2 06:06 ../
-rw------- 1 us00001 us00001 62226 jul 31 11:56 .bash_history
...
Também para fins de documentação, quero armazenar no mesmo arquivo de saída a linha de comando que usei. O comportamento e a saída pretendidos são
$ [NEW COMMAND LINE]?
$ cat out-err.dat
[NEW COMMAND LINE] <- This first line would contain the command line used
drwxr-xr-x 39 us00001 us00001 4096 jul 31 14:57 ./
drwxr-xr-x 3 root root 4096 feb 2 06:06 ../
-rw------- 1 us00001 us00001 62226 jul 31 11:56 .bash_history
...
Como isso pode ser feito? Eu sei que poderia escrever um script bash e executá-lo, para que o comando permanecesse documentado separadamente. Eu poderia escrever ainda mais um script para ecoar a linha de comando para o arquivo e executá-lo com redirecionamento para o mesmo arquivo. Estou procurando uma possível solução sem script.
EDIT : Feedback sobre uma boa resposta. Isso não caberia como um comentário.
Testei com o comando echo_command ll echo_command.sh ../dir > out-err.dat 2>&1
.
Script echo_command.sh
, que I source
, contém as definições das funções.
../dir
é um diretório inexistente, para forçar alguma saída para stderr
.
Método 1 : Funciona bem, exceto por dois problemas:
Ele não entende aliases (
ll
neste caso; ao substituir porls
ele funcionou).Não grava a parte de redirecionamento.
Método 2 : Não funciona muito bem. Agora a parte de redirecionamento também é impressa, mas a linha de comando é impressa na tela em vez de redirecionada para o arquivo.
EDIT : Feedback sobre um comentário postado, sobre um script
utilitário. É bastante versátil, ainda mais com scriptreplay
.
script
pode ser chamado sozinho, o que produz um shell interativo (não manteria o histórico recente do shell pai)
Também pode ser chamado como script -c <command> <logfile>
. Esta última forma corresponde ao objetivo do OP, mas não armazena o comando em si no arquivo de log. Ele produz (pelo menos nos casos base) a mesma saída que o <command> > <logfile> 2>&1
.
Então parece que isso não é útil aqui.
Você poderia usar uma função como esta:
Exemplo:
Como disse Tim Kennedy, há também um
script
comando muito útil:Atualizar
Se você também precisar registrar os redirecionamentos e basicamente todas as sintaxes do shell (observe que adicionei uma pequena
Command line:
mensagem para identificar facilmente o comando que está sendo executado):Apenas leve em consideração que você deve ter muito cuidado com a citação como
eval
é usada:Ele também aceita muitos comandos ao mesmo tempo em vez de apenas um:
Você pode usar o
xtrace
mecanismo em que o shell imprime os comandos que está executando para stdout:Mude
$PS4
do padrão de"+ "
(na maioria dos shells) para qualquer outra coisa se você não gostar (deixe-o vazio se não quiser um prefixo).Como uma função: