Documentando comandos Unix na linha de comando

7

Eu gostaria de acrescentar o último comando e a saída do último comando a um arquivo de texto com o propósito de um tutorial.

Por exemplo: depois de fazer um ls no meu diretório pessoal, vejo isso na tela

bguiz@sheen:~$ ls
Desktop     Music    Documents

Eu quero poder inserir um único comando que anexará o seguinte a um arquivo de texto denominado cmd.txt

$ ls
Desktop     Music    Documents

A idéia é que toda vez que eu insiro um comando, eu posso registrar o próprio comando e sua saída no mesmo arquivo, e depois de vários comandos, ele irá demonstrar uma série particular de comandos. Eu sei que isso pode ser feito manualmente - mas por que fazer isso se houver uma alternativa fácil, certo?

Isso é o que eu tenho feito até agora:

echo -n "\$ " >> cmd.txt; echo !-1:p >> cmd.txt; !-1 >> cmd.txt

Funciona, mas é desajeitado e tem vários truques, como não conseguir preservar a formatação exata da tela.

A solução é mais elegante?

Obrigado pelas respostas até agora, mas eu tenho um requisito que precisa trabalhar com pipe, por exemplo:

ls -lart | grep ^d

Precisa obter isso anexado no arquivo:

$ ls -lart | grep ^d
drwx------ 14 bguiz staff   4096 2010-03-03 15:52 .cache
drwx------  5 bguiz staff   4096 2010-03-03 09:38 .ssh
    
por bguiz 25.02.2010 / 05:58

4 respostas

3

[script.ksh] é executado com "script.ksh ls"

#!/bin/ksh

OUTPUT="cmd.txt"

if [[ $# -eq 0 ]];then
  print "no command to run"
  exit
fi

# dump command being run to file
echo $@ >> $OUTPUT

# run command and output stdout to the screen and file
$@ | tee -a $OUTPUT
    
por 27.02.2010 / 15:26
10

Mais simples do que a esperteza que você tem tentado:

$ script cmd.txt

faça o que você deseja documentar aqui

depois pressione Control-d.

Você pode editar o arquivo em uma data posterior para adicionar anotações, se desejar, e você pode usar

$ script -a cmd.txt

para adicionar mais texto a um arquivo existente.

As opções disponíveis parecem variar consideravelmente entre a implementação.

  • O script do Mac OS X (ou seja, o BSD) suporta -k , que registra a entrada do teclado no comando
  • A versão GNU (encontrada nos sistemas linux) suporta -c , o que permite que você especifique o comando na linha de comando original, permitindo que você pule o "digite sua demonstração aqui e pressione control-d" bit
  • A versão do BSD pode também especificar o comando na linha de comando, mas não aceita um sinalizador para isso, em vez disso, deve seguir o nome do arquivo de saída (que é necessário neste caso).

Finalmente, a versão GNU avisa que o vi não é bem representado em scripts de tipos (e imagino que este aviso se aplica igualmente bem a todos os outros comandos que fazem uso de curses).

    
por 25.02.2010 / 06:05
4

Escreva um script script.sh como o seguinte, se você inserir uma anotação na forma de comentários:

#!/bin/sh -v

# Annotating the behaviour of the ls command
ls -l

# Other comments on the next command
cmd

Observe a opção -v na primeira linha:

-v verbose       The shell writes its input to standard error as it is read.

Em seguida, execute o script redirecionando stdout e stderr para o arquivo cmd.txt usando:

$ ./script.sh > cmd.txt 2>&1

O arquivo cmd.txt conterá as anotações, os comandos e suas saídas relativas, como:

# Annotating the behaviour of the ls command
ls -l
total 1824
drwxr-xr-x 11 mrucci mrucci    4096 2010-02-14 18:16 apps
drwxr-xr-x  2 mrucci mrucci    4096 2010-02-20 12:54 bin
-rw-------  1 mrucci mrucci  117469 2010-02-25 11:02 todo.txt

# Other comments on the next command
cmd
./testscript.sh: 7: cmd: not foun

PS: lembre-se de dar permissão de execução ao script com:

$ chmod +x script.sh
    
por 25.02.2010 / 11:23
1

Nas circunstâncias, geralmente uso uma das duas técnicas:

sh -x script

Ou simplesmente execute os comandos e use copy'n'paste para salvar o material em um arquivo.

A saída 'sh -x' não inclui o prompt normal do PS1 - ele usa o PS3 cujo padrão é '+', IIRC. E isso modifica um pouco a saída - os detalhes variam um pouco dependendo do shell que você está usando (então o 'bash' faz mais bagunça do que o 'ksh' ou o Bourne shell). Eu raramente preciso de mais material do que o copy'n'paste pode gerenciar, então é meu modus operandi predominante para StackOverflow e SuperUser, etc.

    
por 25.02.2010 / 07:15