copiar último comando no terminal

22

Eu posso ver o último comando no terminal pressionando up arrowcomo no exemplo a seguir:

Eu digitei cd /:

Makss-Mac:~ maks$ cd /

... pressionado enter, comando cd /executado e agora posso pressionar up arrowe ver o comando cd /novamente:

Makss-Mac:/ maks$ cd /

Quero não apenas ver o último comando, mas copiá-lo para a área de transferência.

Talvez exista um atalho que não apenas mostre o último comando no terminal (como o up arrowfaz), mas ao mesmo tempo copie-o para a área de transferência.

Ou talvez haja um atalho para selecionar todos da linha de terminal atual. E assim, poderei copiar o último comando (depois de pressionar up arrow) pressionando super+c. Claro que posso selecioná-lo com o mouse. Mas quando os comandos são 10 vezes mais longos do cd /que podem consumir muito tempo, especialmente se você fizer isso a cada 30 segundos.

Ou talvez haja uma maneira de escrever um plugin para o Terminal

Maxim Yefremov
fonte
Pode ser mais fácil encontrar uma solução aqui se você puder adicionar alguns detalhes sobre o que pretende fazer com o conteúdo da área de transferência posteriormente. Onde você vai colá-lo?
nohillside
sim para colá-lo em outra guia do terminal
Maxim Yefremov 13/11/2013

Respostas:

17

Coloque isso no seu ~/.bashrc ~/.bash_profileou onde você quiser:

alias copyLastCmd='fc -ln -1 | awk '{$1=$1}1' | pbcopy '

Após abrir uma nova janela (ou em execução source ~/.bash_profile), você poderá executar copyLastCmde ter o comando na área de transferência.

Para explicar o que está acontecendo: você está basicamente usando o "comando de correção" ( fc) para obter o último comando, remova os espaços em branco à esquerda e à direita para obter uma formatação melhor awke copie-o na área de trabalho do Mac com pbcopy.

EDITAR:

Agora que sabemos que você deseja copiar para colar em outra guia do terminal, há outra opção: adicione estas linhas ao seu ~/.bashrc ~/.bash_profileou onde você quiser:

shopt -s histappend
PROMPT_COMMAND='$PROMPT_COMMAND; history -a; history -n'

Então, depois de abrir algumas novas guias (vamos chamá-las de "guia A" e "guia B"):

  1. Execute qualquer comando na guia A
  2. Alterne para a guia B, pressione enter em uma linha vazia , fornecendo uma nova linha "nova" (e reavaliando o histórico)
  3. use a seta para cima uma vez e você deverá ter o comando que acabou de inserir na guia A.

EDIÇÃO 2: Substituí o uso de sedpor awkna resposta original acima, para cuidar dos espaços em branco à esquerda e à direita.

Asmus
fonte
Esse é um ótimo apelido! Para cortar a nova linha de fuga, para que possa editar o comando após a colagem, eu usei awk:alias copyLastCmd='fc -ln -1 | sed '1s/^[[:space:]]*//' | awk 1 ORS="" | pbcopy '
nwinkler
@nwinkler: OH, você está certo, deveria ter usado o awk: fc -ln -1 | awk '{$1=$1}1'removerá os espaços em branco à direita e à esquerda.
Asmus
1
teve que modificar o alias para caracteres especiais alias copyLastCmd="fc -ln -1 | awk '{\$1=\$1}1' | pbcopy". ainda tem o meu upvote
Mike D
1
Eu usei isso até fazer um "git -reset --hard" em um terminal e em outra "pasta desavisada do git" pressionada a seta para cima e entrar às pressas, pois pensei que estava executando um script que estava usando antes. Você pode imaginar o que aconteceu, e essa foi a última vez que usei essa história "global" compartilhada
MrGigu 5/17/17
O @MrGigu me aconteceu com uma história "local", onde eu pressionei a seta "para cima" duas vezes, em vez de uma vez, acidentalmente - as lições aprendidas da maneira mais difícil, eu acho.
Asmus
5

Aqui está outra opinião com base na resposta de @Asmus. Para fazer o alias dele funcionar no meu script bash, eu tive que usar um pouco de citação, pois aspas simples não funcionam em um alias de aspas simples sem algumas citações adicionais:

alias copyLastCmd='fc -ln -1 | awk '\''{$1=$1}1'\'' | pbcopy'

O '\''basicamente fechar a cotação atual, em seguida, adicione uma cotação escapou, e em seguida, abra a citação real novamente.

A versão acima copiará o último comando para sua área de transferência e, depois de colado, ele será executado imediatamente, pois terá uma nova linha no final.

Para se livrar da nova linha no final, para que você possa editar o comando antes de executá-lo, faça o seguinte:

alias copyLastCmd='fc -ln -1 | awk '\''{$1=$1}1'\'' ORS='\'''\'' | pbcopy'

O ORS=''(sem as aspas) retira o caractere de nova linha à direita, para que você possa editar o texto colado antes de executá-lo.

nwinkler
fonte
5

Isso usará a expansão do histórico para pegar o último comando e repeti-lo. Você pode canalizar para pbcopysalvar o último comando na sua área de transferência.

> echo !! | pbcopy

Se você deseja um comando do seu histórico que não seja o último , execute:

> history

E referencie o número de comando desejado como:

> echo !5 | pbcopy
Sam Berry
fonte
Pode ser o seu favorito e pode até funcionar, mas você precisa fornecer uma pequena explicação sobre o que o comando realmente faz e como o OP (que aceitou uma das respostas há cinco anos) pode usá-lo efetivamente.
IconDaemon
@IconDaemon good call. Eu acho que vale a pena adicionar a uma pergunta antiga, porque é mais simples que a resposta aceita, pois não requer nenhuma personalização do perfil.
Sam Berry
4

Eu vim aqui com a mesma resposta exata de Sam Berry, mas não funciona para mim (OSX 10.14.6).

Conseguiu fazê-lo com aspas em torno de !!:

echo "!!" | pbcopy

Chris Gillatt
fonte
3

Você pode configurar seu histórico para ignorar comandos que começam com um espaço:

export HISTIGNORE=' *'

E, em seguida, execute o seguinte comando para atribuir o último comando à área de transferência (verifique se você tem um espaço no início):

history 1 | cut -d " " -f 4- | pbcopy

Você provavelmente desejaria salvar o comando como um alias para facilitar a lembrança.

kidbrax
fonte