Inserindo o texto da linha de comando antes da saída no stdout (para pipe / redirecionamento)

1

Considere as seguintes construções bash :

ls /usr/include/asm > list-redir.txt
ls /usr/include/asm | tee list-tee.txt

Nesse caso, list-redir.txt e list-tee.txt serão idênticos e conterão a listagem de arquivos conforme o esperado. por exemplo,

$ head -5 list-redir.txt
a.out.h
auxvec.h
bitsperlong.h
boot.h
bootparam.h [...]

A minha pergunta é - como eu poderia escrever um comando desse tipo e ter o texto da linha de comando inserido como a primeira coisa na saída padrão - de tal forma que o arquivo eventualmente comece com a linha de comando como primeiro? Por exemplo, o arquivo list-redir.txt se pareceria com:

$ head -5 list-redir.txt
# ls /usr/include/asm
a.out.h
auxvec.h
bitsperlong.h
boot.h [...]

... o que também implica que o caractere # pode ser anexado à linha de comando inserida.

Existe algo que eu possa usar para isso - mas com o mínimo de alterações na digitação em relação às linhas de comando originais ( ls /usr/include/asm > list-redir.txt ...)?

    
por sdaau 23.06.2014 / 17:37

4 respostas

2

Um simples (e feio) truque seria adicionar isso ao seu ~/.bashrc :

echorun(){
    echo "# $@";
    "$@"
}

Você então executaria seu comando como

echorun ls /usr > list-redir.txt

Isso não permitirá que você diferencie entre ls /usr >foo e ls /usr | tee foo , mas adicionará # ls /usr ao início de foo .

    
por 23.06.2014 / 17:57
2

Você pode fazer isso:

{   cmd="ls /usr/include/asm"
    echo "$cmd" ; $cmd
} >./list-redir.txt

Pelo menos eu acho que isso é o que você quer fazer. Isso produziria resultados como:

 $ cat <./list-redir.txt

 ###OUTPUT###

   ls /usr/include/asm
 #output of above command#
   ...
    
por 23.06.2014 / 18:09
0

Na verdade, acabamos de perceber que a resposta do @terdon pode não funcionar com um pipeline de comando mais complicado; então eu criei o seguinte alias (chamado er como abreviação de @contin echorun ):

#alias er=' cat <(echo "# cmd: $(history 1)") - | tee' # last tee is not needed, so:
alias er=' cat <(echo "# cmd: $(history 1)") -'

A idéia é, basicamente, que |er deve ser inserido antes do último canal ou redirecionamento em uma linha de comando; então, é uma coincidência de sorte, de fato, que nesse ponto, history 1 refere-se exatamente à linha de comando atual! Assim, ele pode ser ecoado primeiro, antes do resto da entrada padrão (o que é nesse ponto), por cat . E agora podemos fazer coisas como:

$ ls /usr/include/asm | grep 'p*.h' | grep 'osix' |er | tee mylist.txt
# cmd:   125  ls /usr/include/asm | grep 'p*.h' | grep 'osix' |er | tee mylist.txt
posix_types_32.h
posix_types_64.h
posix_types.h
$ ls /usr/include/asm | grep 's*.h' | grep 'ig' |er >> mylist.txt
$ cat mylist.txt 
# cmd:   125  ls /usr/include/asm | grep 'p*.h' | grep 'osix' |er | tee mylist.txt
posix_types_32.h
posix_types_64.h
posix_types.h
# cmd:   126  ls /usr/include/asm | grep 's*.h' | grep 'ig' |er >> mylist.txt
sigcontext32.h
sigcontext.h
siginfo.h
signal.h

Assim, temos a linha de comando completa de vários canais - e não precisamos nos preocupar em escapar de nada - basicamente, basta adicionar er ao último canal. O único problema é o número da história (não me incomoda muito, senão adicionaria um awk adicional no alias).

Bem, espero que isso ajude alguém,
Felicidades!

    
por 24.06.2014 / 00:35
0

Você também pode ver o comando script , que registrará sua sessão de terminal, incluindo o que você digita e toda a saída. Pode ficar um pouco confuso, embora às vezes, como ele irá gravar tudo o que você digita, incluindo todos os backspaces, etc.

$ script
Script started, file is typescript
$ ls /usr/include/asm
a.out.h          ioctl.h      mtrr.h             setup.h         termios.h
auxvec.h         ioctls.h     param.h            shmbuf.h        types.h
bitsperlong.h    ipcbuf.h     poll.h             sigcontext32.h  ucontext.h
boot.h           ist.h        posix_types_32.h   sigcontext.h    unistd_32.h
bootparam.h      kvm.h        posix_types_64.h   siginfo.h       unistd_64.h
byteorder.h      kvm_para.h   posix_types.h      signal.h        unistd.h
debugreg.h       ldt.h        prctl.h            socket.h        vm86.h
e820.h           mce.h        processor-flags.h  sockios.h       vsyscall.h
errno.h          mman.h       ptrace-abi.h       statfs.h
fcntl.h          msgbuf.h     ptrace.h           stat.h
hw_breakpoint.h  msr.h        resource.h         swab.h
hyperv.h         msr-index.h  sembuf.h           termbits.h
$ exit
exit
Script done, file is typescript
$ cat typescript
Script started on Sat 29 Aug 2015 10:32:52 AM EDT
$ ls /usr/include/asm
a.out.h          ioctl.h      mtrr.h             setup.h         termios.h
auxvec.h         ioctls.h     param.h            shmbuf.h        types.h
bitsperlong.h    ipcbuf.h     poll.h             sigcontext32.h  ucontext.h
boot.h           ist.h        posix_types_32.h   sigcontext.h    unistd_32.h
bootparam.h      kvm.h        posix_types_64.h   siginfo.h       unistd_64.h
byteorder.h      kvm_para.h   posix_types.h      signal.h        unistd.h
debugreg.h       ldt.h        prctl.h            socket.h        vm86.h
e820.h           mce.h        processor-flags.h  sockios.h       vsyscall.h
errno.h          mman.h       ptrace-abi.h       statfs.h
fcntl.h          msgbuf.h     ptrace.h           stat.h
hw_breakpoint.h  msr.h        resource.h         swab.h
hyperv.h         msr-index.h  sembuf.h           termbits.h
$ exit
exit

Script done on Sat 29 Aug 2015 10:33:00 AM EDT
    
por 29.08.2015 / 16:35