Desculpe pelo título confuso!
Suponha que eu corra
apt-cache depends kde-window-manager > ~/Desktop/kwin-depends
Vou pegar um arquivo chamado "kwin-depende" na minha pasta da área de trabalho.
Existe algum truque para incluir o comando que eu emiti como parte do arquivo, de preferência no início do arquivo?
Portanto, pelo menos em 14.04 LTS, as primeiras linhas seriam assim:
apt-cache depends kde-window-manager > ~/Desktop/kwin-depends
kde-window-manager
Depends: kde-runtime
Depends: libc6
|Depends: libegl1-mesa
Depends: <libegl1-x11>
Em vez de apenas assim:
kde-window-manager
Depends: kde-runtime
Depends: libc6
|Depends: libegl1-mesa
Depends: <libegl1-x11>
command-line
bash
Justiça para Monica
fonte
fonte
Respostas:
Eu usaria apenas uma função simples. Adicione isso ao seu
~/.bashrc
arquivo:Agora, sempre que quiser executar um comando e imprimi-lo, você pode:
O acima produz este arquivo:
fonte
apt-cache depends
paraacd
, recebo "Nenhum comando 'acd' encontrado, você quis dizer: ..." quando eu executoruncom acd leafpad > out
.ls
é um aliasls --color=auto'
na realidade. O que você poderia fazer (contanto que não há aspas simples ou duplas em seu nome alternativo), é a seguinte:$ terdonsFunction $(alias ls | awk -F '=' '{$1="";print}'| tr "'" " ")
.MYCOMMAND="apt-cache depends"; terdonsFunction $MYCOMMAND leafpad > out.txt
Você pode fazer:
A mesma coisa usando em
echo
vez de Here strings (<<<
):tee
irá gravar em STDOUT e também no arquivofile.txt
O STDOUT de
tee
ieapt-cache depends kde-window-manager
será alimentadobash
para executar o comando e anexar o STDOUT afile.txt
.Exemplo:
fonte
tee
mas o meu continuava falhando. Bom trabalho! +1tee
parece puro :)O mais minimalista - as abordagens 4 e 3, ambas poderiam ser convertidas em função; # 2 meu favorito -
awk
. # 1 usascript
comando - 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/script
comando (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-c
sinalizador e especifique o arquivo de saída. ExemploAbordagem 2: hakery awk
O Awk possui uma
system()
função que permite executar comandos shell a partir deawk
script 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) }'
(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 arquivoAbordagem # 3: peça ao bash para fazer o trabalho por você
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
read
e depois executar os comandos necessários no subshellExemplo de execução:
Abordagem # 5:
Use
echo
ouhere string
(aka<<< "string"
) para fornecer argumentos parash -c
atravésxargs
E se você quiser, você pode usar esse mesmo truque com um alias:
fonte
awk
realmente é um amiguinho muito configurável, não é! O script `parece útil para alguns outros usos também.script -q outputfile
outputfile
Exemplo
Começar
script
Inicie seu comando
Pressione Ctrl-D
Mostre seu comando e saída
e você verá algo assim
fonte
Se você deseja expansão de alias (somente bash), pode fazê-lo desta maneira:
Agora você pode executar
fonte
Pode haver uma maneira mais fácil, mas você pode fazê-lo por um script:
Crie um arquivo
script
com este conteúdo na sua pasta Home e conceda permissão de execuçãoExecute da seguinte maneira:
fonte
script.sh
sempre crie um arquivo chamadoscript.log
com sua saída.Solução extremamente simples usando uma função Bash de uma linha
Preparação:
Essa abordagem usa uma função personalizada do bash para fornecer a funcionalidade desejada. Você o define executando a seguinte linha na sua sessão do terminal. observe que você pode escolher qualquer nome válido de variável bash em vez de
runandlog
:No entanto, isso persiste apenas para a sessão atual do Bash, ou seja, depois de fechar a janela do terminal, a função desaparece.
Se você tentou e gostou, pode disponibilizá-lo sempre editando seu
~/.bashrc
arquivo e anexando esta linha ao final.Como usar:
Depois de definir a função, você pode usá-la para executar comandos enquanto registra o próprio comando e sua saída em um arquivo. Você pode até adicionar mais informações, como o usuário que a executou, que eu já incluí na função, ou a hora exata em que ela foi executada. Solicitações de recursos nos comentários são bem-vindas! :)
A sintaxe é simples:
Exemplo:
Um exemplo de sessão como usuário
bytecommander
, operando a partir do diretório inicial, pode ser assim:O que resultará em um novo arquivo
mylogfile
(se já existir, a função anexará a saída a ele!) No diretório atual com o conteúdo:fonte
Um truque bastante inábil, mas funcional, seria:
Feio, mas funciona!
fonte
Você pode simplesmente passar o comando para uma função que imprime o comando primeiro e a saída do comando posteriormente (os redirecionamentos são mantidos fora do comando impresso intencionalmente, você pode facilmente mudar isso removendo as aspas do comando e imprimindo e executando em
$@
vez disso de$1
na função):Para adicionar o comando posteriormente, você pode executar este comando, que irá inserir o último comando executado na parte superior de um arquivo:
<<<"[...]"
: aqui string;[...]
é redirecionado paracat
'sstdin
;$(<foo)
: substituição de comando; é substituído pelo conteúdo de "foo";cat [...] - >foo
: Concatenastdin
para[...]
e saídas para "foo";<([...])
: substituição de processo: é substituído por um descritor de arquivo contendo a saída de[...]
;history 2 | sed -n '1s/ [0-9][0-9]* \(.*\)/\1\n/p'
: gera os dois últimos comandos, remove dois espaços seguidos por um ou mais dígitos seguidos por dois espaços da primeira linha e os imprime;fonte
$1
? E não há necessidadeeval
.eval
não é necessário, não sei por que o adicionei antes. Obrigado.