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.


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.


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

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


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

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.


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

+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.


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.


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

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.


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.