Como armazenar e acessar rapidamente comandos usados ​​com freqüência?

37

Eu tenho muitos comandos que eu preciso executar rotineiramente, geralmente com a menor variação.

No momento, estou armazenando todos eles em .bash_historyuso CTRL- Rpara acessá-los, mas me pergunto se há uma maneira melhor. O que estou olhando:

  • Fácil de adicionar um novo comando
  • Fácil de pesquisar e reexecutar um comando desejado
  • Evite comandos indesejados nas sugestões

Infelizmente, bash_history não é tão forte na terceira demanda: se eu fizer alguns cde ls, ele preenche o arquivo de histórico rapidamente. Eu aprendi recentemente HIST_SIZEe que você pode configurar o histórico para evitar duplicatas ou determinados comandos, mas antes de configurar tudo isso, eu queria ter certeza de que é o melhor caminho.

Konerak
fonte
7
para comandos do dia a dia, aliastalvez mais útil. por exemplo. alias gfc="git fetch origin"
Number5

Respostas:

20

Acho muito úteis os seguintes comandos readline

history-search-backward,
history-search-forward

(atenção: eles são diferentes do habitual reverse-search-history, forward-search-history, amarrado a Ctrl- R, Ctrl- S).

Eu tenho esses comandos associados Ctrl- Upe Ctrl- Downcolocando as seguintes linhas em ~/.inputrc:

"\e[1;5A": history-search-backward
"\e[1;5B": history-search-forward

Como eles funcionam: escreva alguns caracteres do início do comando, pressione Ctrl- Upe o próximo comando antigo começando com esse prefixo será exibido, pressione novamente para ver o próximo e assim por diante. Quando estiver satisfeito, depois de modificar o comando, pressione Enterpara executar.

enzotib
fonte
11
+1 para isso, faço o mesmo, embora apenas as vincule às teclas de seta para cima e seta para baixo (sem modificador CTRL), que funcionam para mim. Se você quiser fazer o mesmo as linhas que você precisa são "\e[B": history-search-forwarde"\e[A": history-search-backward
Simon Whitaker
Considere também aumentar HISTFILESIZEe / ou HISTSIZE(o zsh suporta apenas HISTSIZE, o bash suporta os dois) para garantir que seu buffer seja suficientemente grande. A questão SO bash HISTSIZE vs. HISTFILESIZE? pode iluminar ainda mais.
Adam Katz
56

Outra dica: às vezes uso comentários para marcar / marcar um comando:

my_command #bookmark

então:

[ctrl-r]#bookmark
Chris J
fonte
adoro! - legal.
Greg
17
Bashtags! Gênio. :-)
Simon Whitaker
Muito agradável! Vou usar isso para o meu mysql-cli também :)
Konerak
Isso é excelente! Infelizmente, o zshell não trata # como o início de um comentário em uma sessão interativa. Sabe de um truque semelhante para isso?
Nathan Long
11
@NathanLong: $_bookmark. Pode-se argumentar que este é um truque horrível que explora o fato de que variáveis ​​inexistentes se expandem para nada, mas certamente funciona, com a ressalva de que espaços não são permitidos (use _'s).
Kampu 27/05
7

Embora de escopo muito limitado, gostaria de destacar esses dois espaços reservados de expansão:

!! 

é uma expansão de espaço reservado para o último comando. Útil se você esqueceu de colocar sudoantes do comando.

!$ 

repete o último parâmetro. Útil se você deseja repetir um comando diferente coma/very/long/path/name/you/do/not/want/to/type/again

Chiborg
fonte
Sim, ótima dica ... se eu me lembrava de usá-los :)
Jeach
6

Use 'alias'

alias é uma ótima ferramenta para isso.

  • Você pode facilmente declarar um na linha de comando para ser usado durante a sessão atual do shell.
  • Se você o usar no futuro, poderá adicioná-lo à sua configuração de shell.

Quando você usa um alias, é exatamente como se você o tivesse digitado, por isso é bastante flexível. Por exemplo, você pode usá-lo com pipes:

alias findfoo="grep 'foo'"
echo 'foo1 \n foo2 \n bar1 \n bar2 \n foo3' | findfoo # Does your custom grep

Você deve conseguir "pequenas variações" passando os sinalizadores que ainda não especificou.

echo 'foo1 \n foo2 \n bar1 \n bar2 \n foo3' | findfoo -v # finds non-matches
Nathan Long
fonte
5

Eu crio scripts shell mínimos para meus comandos freqüentes e dou nomes abreviados. Todos eles são armazenados no mesmo local ao qual é adicionado PATH.

Dessa forma, tenho acesso de atalho a comandos muito complexos e, ao contrário de aliaseu, posso transformar as partes alteráveis ​​da minha tarefa em argumentos de linha de comando do meu atalho.

David Grellscheid
fonte
3
Se você deseja apenas passar argumentos, considere definir funções. Se você precisar de roteiros completos, esta é uma boa solução :)
Konerak
@ Konerak eu vou ter que tentar isso. Eu costumo fazer apenas um script, mas definir funções seria muito mais limpo, aposto.
ixtmixilix
4

Estou mantendo uma cópia do .bash_history no Git . Para simplificar isso, eu configurei

# don't put duplicate lines in the history
# don't save commands which start with a space
HISTCONTROL=ignoredups:erasedups:ignorespace

# append to the history file, don't overwrite it
shopt -s histappend

em .bashrc e os seguintes comandos (modificados para uso geral) em um script de limpeza

# Ensure a single space at the end of each line to easier add more parameters
sed -i -e 's/ *$/ /' "~/.bash_history"

sort --unique --output="~/.bash_history" "~/.bash_history"

que eu corro antes de adicionar linhas git gui. Como o arquivo de histórico é modificado com todos os comandos, também tenho um comando especial para atualizar esse repositório específico:

git stash && git pull && git stash pop
l0b0
fonte
+1 principalmente para mencionar HISTCONTROL=ignorespace, o que é importante para não entupir a história, às vezes.
quodlibetor
2

Entre todas as outras respostas aqui envolvendo história.

eu coloco

HISTFILESIZE=2024
HISTSIZE=1024

em ~ / .bash_profile

Além dos outros comentários, re: history

Outro recurso útil ...

Iniciando um recall de história com

!first few letters<ESC>Ctrl-E

lembrará o último comando que começou com as primeiras letras

por exemplo:

!find<ESC>Ctrl-E

Você não mencionou se está usando ou não uma GUI ou apenas uma linha de comando. Se você estiver usando uma GUI, poderá usar um dos gerenciadores de área de transferência persistentes para copiar / colar comandos, IDs de usuário, senhas, URLs, etc.

bsd
fonte
Uau, !find<ESC>CTRL-Efunciona, mas duvido que consiga me lembrar disso amanhã. O que é esse ESC CTRL-E?
Konerak
apenas uma ligação a uma chave estendida
BSD
0

Aprendendo a usar Ctrl-Re Ctrl-Spermite pesquisar facilmente os comandos que você está procurando no histórico, e você já encontrou a variável de ambiente HISTCONTROL para ignorar duplicatas e alterar o site do arquivo de histórico do bash.

Normalmente, faço muitos Ctrl-Rseguidos Ctrl-Ee altero alguns parâmetros, se pulei um comando encontrado pressionando Ctrl-Rmuitas vezes, Ctrl-Spara o resgate.

Evgeny
fonte
2
Geralmente, o tty é configurado de forma que Ctrl-S é a sequência "stop" e não está (diretamente) disponível para pesquisa direta.
enzotib 7/11
Nesses casos, a pesquisa direta pode ser remapeada para algo diferente de <kbd> Ctrl-S </kbd>.
Evgeny
0

Eu sempre prefiro armazenar os últimos comandos usados ​​e sua saída.

script filename
Balaswamy vaddeman
fonte
0

Além das boas respostas acima, se você estiver usando um gui baseado no kde ou no gnome, o AutoKey pode ser incrivelmente útil.

https://code.google.com/p/autokey/

Ele permite que você crie frases que são acionadas digitando alguns caracteres ou pressionando uma tecla de atalho. Essas frases são substituídas ou adicionadas à sua entrada.

Ele também suporta scripts escritos em python que você pode fazer quase tudo se souber python. Ainda não conheço python, mas já estou recebendo alguns scripts muito básicos para fazer coisas legais.

Tudo parece vir do seu teclado, portanto funciona com qualquer aplicativo que aceite entrada do teclado - e com a sua área de trabalho.

Ele tem muitas opções para controlar como e onde essas coisas são ativadas, para que você possa ter algumas que funcionam apenas no console e outras que funcionam apenas em outra janela. Você também pode definir frases para serem executadas assim que digitar a sequência que as aciona ou esperar até que você dê OK.

Joe
fonte
0

Como outros já disseram, o apelido é seu amigo. Para coisas um pouco mais complicadas (quando você precisa de argumentos em algum lugar entre as instruções), eu uso funções no meu .zshrc, como:

function ff() { find . -iname "*$**" }

que funciona como localizar (eu o uso quando por algum motivo o db não está disponível). Ou

function chuck() { ps aux | grep $1 | tr -s '\t' ' ' | cut -f2 -d' ' | xargs kill $2 }

por um substituto de killall.

rkj
fonte
0

Além de usar Cntl-Rpara olhar para trás .bash_history, também tenho um arquivo README no ~/developdiretório em que coloco comandos longos como para git/ svn, para que eu possa voltar mais tarde quando precisar. Da mesma forma, estou planejando ter um ~/install/READMEarquivo para colocar todos os nomes de pacotes comuns que geralmente instalo após a instalação de uma nova versão do Linux / Ubuntu. Portanto, a idéia é ter um arquivo LEIA-ME dentro de cada diretório, por exemplo, Vídeo, Áudio, ... e coloque neles os comandos / dicas comuns que você precisará conhecer posteriormente.

Amr
fonte