Come archiviare e accedere rapidamente ai comandi usati spesso?


37

Ho molti comandi che devo eseguire di routine, spesso con la minima variazione.

In questo momento li sto archiviando tutti .bash_historye uso CTRL- Rper accedervi, ma mi chiedo se c'è un modo migliore. Cosa sto cercando:

  • Facile aggiungere un nuovo comando
  • Facile da cercare e rieseguire un comando desiderato
  • Evita comandi indesiderati nei suggerimenti

Sfortunatamente, bash_history non è così forte sulla terza richiesta: se ne faccio alcuni cde lsriempie rapidamente il file della cronologia. Di recente ho appreso HIST_SIZEe che puoi configurare la cronologia per evitare duplicati o determinati comandi, ma prima di configurare tutto ciò, volevo assicurarmi che fosse il modo migliore.


7
per i comandi di tutti i giorni, aliasforse più utile. per esempio. alias gfc="git fetch origin"
numero

Risposte:


20

Trovo molto utili i seguenti comandi readline

history-search-backward,
history-search-forward

(essere consapevoli che sono diversi dal solito reverse-search-history, forward-search-history, legato a Ctrl- R, Ctrl- S).

Ho questi comandi associati a Ctrl- Upe Ctrl- Downinserendo le seguenti righe in ~/.inputrc:

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

Come funzionano: scrivi alcuni caratteri dell'inizio del comando, premi Ctrl- Upe verrà mostrato il prossimo comando più vecchio che inizia con quel prefisso, premi di nuovo per vedere il prossimo, e così via. Quando sei soddisfatto, dopo aver eventualmente modificato il comando, premi Enterper eseguire.


1
+1 per questo, faccio lo stesso anche se li ho associati ai tasti Freccia su e Freccia giù (nessun modificatore CTRL), che funziona per me. Se vuoi fare allo stesso modo le linee che ti servono sono "\e[B": history-search-forwarde"\e[A": history-search-backward
Simon Whitaker l'

Considera anche la crescita HISTFILESIZEe / o HISTSIZE(supporta solo zsh HISTSIZE, bash supporta entrambi) per assicurarti che il tuo buffer sia sufficientemente grande. La domanda SO bash HISTSIZE vs. HISTFILESIZE? può illuminare ulteriormente.
Adam Katz,

56

Un altro consiglio: a volte uso i commenti per aggiungere un segnalibro / tag a un comando:

my_command #bookmark

poi:

[ctrl-r]#bookmark

lo adoro!
Greg,

17
Bashtags! Genio. :-)
Simon Whitaker l'

Molto bella! Lo userò anche per il mio mysql-cli :)
Konerak,

Questo è eccellente! Sfortunatamente, zshell non considera # come l'inizio di un commento in una sessione interattiva. Conosci un trucco simile per questo?
Nathan Long,

1
@NathanLong: $_bookmark. Si potrebbe sostenere che si tratti di un orribile hack che sfrutta il fatto che variabili inesistenti si espandono a nulla, ma sicuramente funziona, con l'avvertenza che gli spazi non sono consentiti (utilizzare invece _).
Kampu,

7

Anche se di portata molto limitata, vorrei sottolineare questi due segnaposto di espansione:

!! 

è un'espansione segnaposto per l'ultimo comando. Utile se hai dimenticato di mettere sudoprima del comando.

!$ 

ripete l'ultimo parametro. Utile se si desidera ripetere un comando diverso cona/very/long/path/name/you/do/not/want/to/type/again


Sì, ottimo consiglio ... se solo mi ricordassi di usarli :)
Jeach

6

Usa 'alias'

alias è un ottimo strumento per questo.

  • Puoi facilmente dichiararne uno sulla riga di comando da utilizzare durante la sessione di shell corrente.
  • Se lo utilizzerai in futuro, puoi aggiungerlo alla configurazione della shell.

Quando usi un alias, è esattamente come se lo avessi digitato, quindi è abbastanza flessibile. Ad esempio, puoi usarlo con le pipe:

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

Dovresti essere in grado di fare "lievi variazioni" passando qualsiasi flag che non hai già specificato.

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

5

Creo script shell minimi per i miei comandi frequenti e do loro nomi brevi. Sono tutti memorizzati nello stesso posto, a cui viene aggiunto PATH.

In questo modo ho accesso rapido a comandi molto complessi e, diversamente da come aliasposso, posso trasformare le parti modificabili del mio compito in argomenti della riga di comando del mio collegamento.


3
Se vuoi solo passare argomenti, considera invece la definizione di funzioni. Se hai bisogno di script completi, questa è una buona soluzione :)
Konerak,

@Konerak Dovrò provarlo. Di solito faccio solo una sceneggiatura, ma definire le funzioni sarebbe molto più pulito, scommetto.
ixtmixilix,

4

Sto conservando una copia di .bash_history in Git . Per semplificare questo, ho impostato

# 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

in .bashrc e i seguenti comandi (modificati per uso generale) in uno script di cleanup

# 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"

che eseguo prima di aggiungere righe git gui. Poiché il file della cronologia viene modificato con ogni comando, ho anche un comando speciale per aggiornare quel repository specifico:

git stash && git pull && git stash pop

+1 principalmente per la menzione HISTCONTROL=ignorespace, che è importante per non ingombrare la storia, a volte.
quodlibetor,

2

Tra tutte le altre risposte qui che coinvolgono la storia.

ho impostato

HISTFILESIZE=2024
HISTSIZE=1024

in ~ / .bash_profile

Oltre agli altri commenti riguardo a: storia

Un'altra utile funzione ...

Iniziando un richiamo alla storia con

!first few letters<ESC>Ctrl-E

ricorderà l'ultimo comando iniziato con le prime lettere

per esempio:

!find<ESC>Ctrl-E

Non hai menzionato se stai utilizzando o meno una GUI o solo la riga di comando. Se stai utilizzando una GUI, puoi utilizzare uno dei gestori di appunti persistenti per copiare / incollare comandi, userid, password, URL, di uso comune, ecc.


Wow, !find<ESC>CTRL-Efunziona, ma dubito che potrò ricordarlo domani. Cos'è l'ESC CTRL-E?
Konerak,

solo un'associazione a una chiave estesa
bsd

0

Imparare a usare Ctrl-Re Ctrl-Spermette di cercare facilmente i comandi che stai cercando nella cronologia e hai già trovato la variabile d'ambiente HISTCONTROL per ignorare i duplicati e cambiare il sito del file della cronologia di bash.

Di solito ne faccio molti Ctrl-Rseguiti Ctrl-Ee cambiando alcuni parametri, se ho saltato un comando trovato premendo Ctrl-Runo troppe volte, Ctrl-Sin soccorso.


2
Spesso tty è configurato in modo tale che Ctrl-S sia la sequenza "stop" e non (direttamente) disponibile per la ricerca in avanti.
enzotib,

In questi casi, la ricerca in avanti può essere rimappata a qualcosa di diverso da <kbd> Ctrl-S </kbd>.
Evgeny,

0

Preferisco sempre memorizzare i comandi utilizzati per ultimi e il loro output.

script filename

0

Oltre alle buone risposte di cui sopra, se ti capita di usare una gui basata su kde o gnome, AutoKey può essere incredibilmente utile.

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

Ti consente di creare frasi che vengono attivate digitando alcuni caratteri o premendo un tasto di scelta rapida. Queste frasi vengono quindi sostituite o aggiunte al tuo input.

Supporta anche script scritti in Python che puoi fare praticamente qualsiasi cosa se conosci Python. Non conosco ancora Python, ma sto già ricevendo alcuni script di base per fare cose pulite.

Tutto sembra provenire dalla tua tastiera, quindi funziona con qualsiasi applicazione che accetta l'input da tastiera e con il desktop stesso.

Ha molte opzioni che controllano come e dove vengono attivate queste cose, quindi puoi avere alcune che funzionano solo nella tua console e altre che funzionano solo in un'altra finestra. È inoltre possibile impostare le frasi da eseguire non appena si digita la stringa che le attiva o attendere fino a quando non si dà loro il OK.


0

Come altri hanno già detto, alias è tuo amico. Per cose un po 'più complicate (quando hai bisogno di argomenti tra le istruzioni) uso le funzioni nel mio .zshrc, come:

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

che funziona come individuare (lo uso quando per qualche motivo db non è disponibile). O

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

per un sostituto di killall.


0

Oltre a usare Cntl-Rper guardare indietro in .bash_history, ho anche un file README nella ~/developdirectory in cui ho messo comandi lunghi come per git/ svn, quindi posso tornare a loro in seguito quando ne ho bisogno. Allo stesso modo, sto pensando di avere un ~/install/READMEfile per mettere tutti i nomi dei pacchetti comuni che di solito installo dopo aver installato una nuova versione di Linux / Ubuntu. Quindi l'idea è di avere un file README all'interno di ogni directory, ad es. Video, Audio, ... e inserire in essi i comandi / suggerimenti comuni, che potresti dover conoscere in un secondo momento.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.