Eu queria saber se havia uma maneira rápida de salvar um comando no terminal do Ubuntu. O cenário é:
Problema:
- Digitei um [comando longo]
- Esqueci que precisava executar [outro comando] antes de poder executar o [comando longo]
Eu quero ser capaz de salvar o comando para uso posterior de uma maneira fácil, não apenas colocando um #
antes dele e colocando-o no histórico de teclas para cima e para baixo. Otimamente salvando-o diretamente em um registro ou na área de transferência.
Esqueci de mencionar que também não queria ecoar.
Este não é o seu terminal , este é o seu shell .
O nome do mecanismo de shell que você está procurando é kill buffer . As pessoas esquecem que os editores de linha de comando do shell têm isso. O ZLE no shell Z os possui, assim como o GNU Readline no shell Bourne Again, o libedit no shell Almquist (FreeBSD), o editor de linha do shell Korn e o editor de linha do shell TENEX C.
Em todos esses shells no
emacs
modo, simplesmente vá até o final da linha a ser salva, mate-o no head kill buffer com ⎈ Control+ U, digite e execute o comando intermediário e, em seguida, puxe o conteúdo do buffer kill com ⎈ Control+ Y. Certifique-se de não fazer nada com o buffer de eliminação ao inserir o comando intermediário.No
vi
modo Z shell in, você tem asvi
sequências de prefixo para especificar umvi
buffer de estilo nomeado para matar a linha. Você pode usar um dos outros buffers em vez do buffer padrão. Simplesmente use algo como " a d d(novicmd
modo) para excluir toda a linha no buffer "a", digite e execute o comando intermediário e, em seguida, coloque o conteúdo desse buffer com " a p.Em seus
vi
modos, o shell Korn, GNU Readline no shell Bourne Again e libedit no shell Almquist (FreeBSD) não possuemvi
buffers de estilo nomeado, apenas um buffer de corte. d dpara excluir a linha nesse buffer, seguido de colocar o conteúdo do buffer com p, funcionará. Mas ele usa o mesmovi
buffer de estilo que matar e puxar ao inserir o comando intermediário.Você não deseja anexar
echo
(ou qualquer outro comando do tipo no-op) à sua linha, pois você pode ter redirecionamento de E/S e eles ainda seriam executados, substituindo potencialmente qualquer arquivo que você precise acessar (até você está pronto para executar seu comando).Em vez disso, vá para o início da linha e insira o caractere de comentário,
#
. Então você pode pressionar Entere a linha será salva em seu histórico.Se você estiver no modo vi, ksh e bash (pelo menos) têm um comando específico para isso: entre no modo de comando (pressione Esc) e pressione o #caractere.
Isto é especificamente para este caso de uso. A descrição deste comando no livro O'Reilly Learning the Korn Shell diz:
Se estiver executando
zsh
, você pode usar Ctrl-Q, que executa o comandopush-line
. Ele salvará o que você digitou atualmente em uma pilha, limpará o prompt e, em seguida, exibirá a pilha depois de inserir seu próximo comando. Eu uso isso o tempo todo para exatamente a situação que você descreve.Eu costumo acrescentar "'" (aspas simples) no final da linha e pressionar Enter e Ctrl-C. Mais tarde, lembro-o com Cursor Up ou Ctrl-R. Você tem que ter certeza de que não há citações perdidas antes, no entanto.
Se o seu shell estiver configurado para o modo emacs (padrão usual para bash, acredito):
então você pode:
Isso é muito rápido de fazer e se torna um hábito. ctrl-k também pode ser útil para salvar apenas o "fim" de uma linha (por exemplo: 2 argumentos longos que você sabe que irá reutilizar mais tarde, que você "mata" (+salva) e que você pode "arrancar" volte quantas vezes quiser)
Se o seu shell estiver no modo vi , você pode usar os comandos usuais do vim:
Solução alternativa que pode funcionar dependendo do caso.
Pressione home, digite new command e depois && para executar primeiro e, se for bem-sucedido, execute o segundo.
No entanto, então, não será salvo como etapas separadas.
Alternativamente:
Se você já digitou o primeiro comando (como em enter pressionado) você pode digitar
first_command && !!
o que irá inserir o segundo comando em!!
Você pode selecionar/copiar o texto com a GUI ou as instalações do shell e colá-lo em algum arquivo ou simplesmente não esquecer de não sobrescrevê-lo por uma seleção subsequente (para que você possa colá-lo de volta quando necessário), mas acho tão estranho: o lugar das linhas de comando completas é IMHO no "histórico de teclas para cima e para baixo".
Em vez de adicionar a
#
no início da linha e pressionar<Enter>
, você pode criar uma combinação de teclas que salva a linha de comando atual no histórico sem executá-la.Por exemplo. com bash, vinculando-o a
Meta/Alt-C
ouEsc-C
(geralmente vinculado àscapitalize-word
combinações de teclas do emacs; use outra chave se você já estiver usando):Se você estiver usando o vi-keybindings, você pode agachar o não utilizado
^G
para isso:Isso também limparia a linha depois; se você não quiser isso (e preferir cancelar manualmente a linha com, por exemplo
^C
, ), omita oREADLINE_LINE=
.Em vez de lidar com vários atalhos de teclado de linha de leitura possivelmente esotéricos, você pode editar o arquivo de histórico do seu shell diretamente. Com bash:
history -w
(Limpar o histórico existente)$EDITOR $HISTFILE
(Edite seu arquivo de histórico (~/.bash_history
por padrão) e faça as alterações que desejar)history -c ; history -r
(Limpe o histórico na memória do seu shell e recarregue a partir do arquivo de histórico)Como gosto muito de fazer ajustes no meu histórico do bash, escrevi uma função bash para torná-lo mais conveniente:
Além disso, tenho uma função bash separada para realizar uma pesquisa rápida e substituir no meu histórico do bash para corrigir e executar novamente os comandos digitados.
Se você já digitou o segundo comando, vá para o início da linha, digite o primeiro comando e depois um ponto e vírgula para separar os dois. Isto é, se o sucesso não importa. Se isso importa, o && outra pessoa sugeriu.
Não, ele não será salvo no histórico da linha de comando porque isso só aceita comandos que foram inseridos.
Você pode, no entanto, prefixar "echo" para salvar algo que foi complicado de digitar
Em seguida, recupere o comando echo e edite para remover "echo".
Se você precisar de algo no histórico como preparação para mais tarde, você também pode editar o arquivo de histórico, por exemplo,
~/.bash_history
para o bash ou~/.history
para o tcsh. Edite alterando um comando existente, o que é mais fácil porque você não precisa tentar adivinhar a sintaxe do arquivo. Na próxima vez que o shell for iniciado, ele será lido (se o shell estiver configurado para salvar e ler o histórico, o que acontece por padrão na maioria dos sistemas).Uma terceira maneira de usar um comando complicado sem muita digitação seria definir um alias para o comando. Novamente, a sintaxe varia de acordo com a variante do shell:
bash:
tcsh:
O novo comando
ll
fará o mesmo que digitarls -algF --color=auto
. Você pode ver os aliases existentes (por exemplo) simplesmente executandoalias
sem parâmetros.Essas linhas podem ser inseridas
~/.bashrc
e~/.tcshrc
, respectivamente, para salvá-las para todas as próximas inicialização do shell.