O mais minimalista - as abordagens 4 e 3, ambas poderiam ser convertidas em função; # 2 meu favorito - awk. # 1 usa scriptcomando - ferramenta muito versátil, útil para gravar linha de comando em geral; aplicável em qualquer lugar, para o que você quiser gravar.
Abordagem 1:
Existe um /usr/bin/scriptcomando (que vem com o ubuntu por padrão) para registrar a saída da linha de comando, que captura tudo, junto com o prompt e o comando. Para salvar apenas um comando e sua saída em um arquivo específico, use o -csinalizador e especifique o arquivo de saída. Exemplo
xieerqi:$ script -c 'apt-cache depends gnome-terminal' outputFile.txt
Script started, file is outputFile.txt
gnome-terminal
Depends: gconf-service
gconf-service:i386
Depends: libatk1.0-0
Depends: libc6
Depends: libgconf-2-4
Depends: libgdk-pixbuf2.0-0
(extra output omitted)
Script done, file is outputFile.txt
xieerqi:$ cat outputFile.txt
Script started on 2015年10月22日 星期四 08时58分46秒
gnome-terminal
Depends: gconf-service
gconf-service:i386
Depends: libatk1.0-0
Depends: libc6
Depends: libgconf-2-4
(extra output omitted)
Script done on 2015年10月22日 星期四 08时58分46秒
Abordagem 2: hakery awk
O Awk possui uma system()função que permite executar comandos shell a partir de awkscript ou comando . A saída será exibida na tela, comando primeiro, saída seguinte. Para redirecionar o que você vê para um arquivo, use o >operador.
Isso pode ser feito de duas maneiras - peça ao usuário para inserir itens do stdin ou como argumento da linha de comando. O primeiro é mais fácil de alcançar, portanto, publicando isso.
(1) awk 'BEGIN{ print "Enter command to run: "; getline com < "/dev/stdin"; system(com) }'
awk 'BEGIN{ print "Enter command to run: "; getline com < "/dev/stdin"; system(com) }'
Enter command to run:
apt-cache depends gnome-terminal
gnome-terminal
Depends: gconf-service
gconf-service:i386
Depends: libatk1.0-0
Depends: libc6
Depends: libgconf-2-4
Depends: libgdk-pixbuf2.0-0
Depends: libglib2.0-0
(extra output omitted)
(2) versão da linha de comando args; não incluindo a saída para evitar que a resposta seja longa demais. Novamente, acrescente >para redirecionar para o arquivo
awk 'BEGIN{for (i=1; i<= ARGC; i++) myString = myString" "ARGV[i]; print myString; system(myString) }' apt-cache depends gnome-terminal
Abordagem # 3: peça ao bash para fazer o trabalho por você
xieerqi@eagle:~$ bash -c ' MYCOMMAND="apt-cache depends gnome-terminal"; echo $MYCOMMAND ; $MYCOMMAND '
apt-cache depends gnome-terminal
gnome-terminal
Depends: gconf-service
gconf-service:i386
Depends: libatk1.0-0
Depends: libc6
Depends: libgconf-2-4
Depends: libgdk-pixbuf2.0-0
Depends: libglib2.0-0
Redirecionar para arquivo com o >operador:
bash -c ' MYCOMMAND="apt-cache depends gnome-terminal"; echo $MYCOMMAND ; $MYCOMMAND ' > output.txt
Abordagem # 4: (meu segundo favorito)
Inspirado na publicação de ByteCommander; podemos usar reade depois executar os comandos necessários no subshell
read command && (printf "COMMAND: %s" "$command";printf "\n+++++++\n"; sh -c "$command")
Exemplo de execução:
xieerqi:$ read command && (printf "COMMAND READ: %s" "$command";printf "\n+++++++\nOUTPUT\n"; sh -c "$command")
printf "This was a triumph; I'm making a note here - huge success"
COMMAND READ: printf "This was a triumph; I'm making a note here - huge success"
+++++++
OUTPUT
This was a triumph; I'm making a note here - huge success
Abordagem # 5:
Use echoou here string(aka <<< "string") para fornecer argumentos para sh -catravésxargs
xieerqi:$ echo "apt-cache policy gnome-terminal" | xargs -I {} bash -c 'echo {}; {}'
apt-cache policy gnome-terminal
gnome-terminal:
Installed: 3.6.2-0ubuntu1
Candidate: 3.6.2-0ubuntu1
Version table:
*** 3.6.2-0ubuntu1 0
500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages
100 /var/lib/dpkg/status
E se você quiser, você pode usar esse mesmo truque com um alias:
xieerqi:$ printAndRun <<< "apt-cache policy gnome-terminal"
apt-cache policy gnome-terminal
gnome-terminal:
Installed: 3.6.2-0ubuntu1
Candidate: 3.6.2-0ubuntu1
Version table:
*** 3.6.2-0ubuntu1 0
500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages
100 /var/lib/dpkg/status
xieerqi:$ type printAndRun
printAndRun is an alias for 'xargs -I {} bash -c "echo {}; {}"'