2012-11-15 5 views
9

Non c'è un modo più intuitivo di gestire lo stack di directory rispetto a ciò che è possibile con pushd e popd?Come sfruttare il goffo pushd e popd con il comando incorporato awsome di Bash

Trovo i CLI dei comandi incorporati pushd e popd presentati al tipo di sbalorditivo utente. Ma allo stesso tempo mi piacerebbe fare un uso frequente dello stack di directory presentato dal comando integrato dirs.

Quindi mi c'è voluto molto tempo per capire i casi d'uso e quindi di memorizzare i seguenti:

  1. pushd - attiva le due directory dall'alto.
  2. pushd +1 - passare al secondo dalla directory principale.
  3. pushd -0 - passare in basso dalla directory superiore.
  4. popd +0 - inserire la parte superiore nella seconda directory superiore.
  5. pushd -0; popd +1 - passare in basso dalla directory superiore e inserire il primo in alto.

Ancora doverli digitare ogni volta solo per destreggiarsi con lo stack di directory sembra molto pesante per me. Non riesco nemmeno a inventare nomi mnemonici per indicare quei cinque casi d'uso.

Eventuali approfondimenti?

risposta

7

Recentemente ho scoperto la potenza della libreria di letture GNU e le scorciatoie in termini di colpi di tasti che può fornire all'utente sulla riga di comando di Bash.

Ho quindi definito i seguenti tasti di scelta rapida nel file ~/.inputrc. file di configurazione di GNU readline:

# "pushd" use case. 
"\C-^": "\C-a\C-kpushd\C-m" 

# "pushd +1" use case. 
"\e<": "\C-a\C-kpushd +1\C-m" 

# "popd +0" use case. 
"\ex\e<": "\C-a\C-kpopd +0\C-m" 

# "pushd -0" use case. 
"\e>": "\C-a\C-kpushd -0\C-m" 

# "pushd -0; popd +1" use case. 
"\ex\e>": "\C-a\C-kpushd -0; popd +1\C-m" 

associo i tasti di scelta rapida dall'alto come segue:

  1. <ctrl>-^ - vim tasto di scelta rapida per passare la corrente con il buffer precedente.
  2. <alt>-< - Spostare a sinistra e trasportare.
  3. <alt>-x< - Spostare a sinistra e ritagliare.
  4. <alt>-> - spostare a destra e trasportare.
  5. <alt>-x> - spostare a destra e ritagliare.

I tratti dei tasti <ctrl>-ak posizionano il cursore all'inizio della riga (a) e lo eliminano (k). Questo è importante perché quando si preme il numero <ctrl-m> (invio) è probabile che l'utente prenda il tasto di scelta rapida mentre è nel mezzo di una frase. Il valore della chiave di scelta rapida sarebbe confuso con l'input dell'utente corrente e bash non poteva eseguirlo.

0

Per il mio uso personale, ho diverse directory che uso comunemente, e vorrei poter passare dall'uso di pushd.Sono venuto con la seguente funzione per il mio .bashrc:

p() { 
    pushd +"$(($(dirs -p | sed -n '1d;s,.*/,,;/^'"$1"'/{=;q;}')-1))" >/dev/null 
} 

Diciamo che ho una pila di directory in questo modo:

$ dirs -v 
0 ~/repos/local_only/configs 
1 ~/repos/virtualization 
2 ~/repos/local_only/work 
3 ~/repos/core 
4 ~/repos/local_only/my_test_repo 

posso passare dalla directory corrente a qualsiasi altro utilizzando solo p <letter>, dove <letter> è l'inizio del nome della directory. (Può essere più di una lettera, ovviamente.) Ad esempio, p m passerà a my_test_repo; p w passerà a work.

Se uso p c dal mio work dir, passerà alla directory successiva nello stack che inizia con c, che in questo caso sarebbe core. (La parte del comando sed impedisce di restituire più del primo risultato.) Per passare in modo specifico alla dir configs, potrei usare p con o solo p c e poi p c di nuovo.

Il comando sedsed è in modo tale che non si passa mai alla directory corrente. Così posso passare tra la mia dir configs e la mia dir core usando solo p c.

il reindirizzamento dei stdout-/dev/null impedisce l'esecuzione fastidioso (per me) di dirs dopo ogni esecuzione di pushd. (Ho la directory corrente elencato nel mio sollecito in ogni modo.) Comunque non tacere stderr -quindi se corro p q, per esempio, ci vediamo:

$ p q 
-bash: pushd: +-1: directory stack index out of range 

complementare con builtins

Questo non sostituisce pushd e popd; è inteso per la commutazione veloce. Per aggiungere allo stack delle directory uso ancora pushd <directory_name>. E se ho finito in una directory specifica (per esempio, virtualization) posso solo p v e poi popd.


errori improbabili:

Questo probabilmente non funzionerà scorretto con nomi di directory che contengono nuove righe, ma questo non ha importanza per i miei scopi. In ogni caso il peggio che potrebbe fare è pushd nella directory sbagliata.

0

Ecco il mio flusso di lavoro:

0. CONF (DATI FALSI)

cd /tmp 
mkdir -p foo/bar baz qux 

1. CONF

dirs -v 
cd foo/bar; pushd .; cd ../.. 
cd baz; pushd .; cd .. 
cd qux; pushd .; cd .. 

2.RUN

dirs -v 
cd $(dirs +1) # switch to dir 1 
cd $(dirs +2) # switch to dir 2 
cd $(dirs +3) # switch to dir 3 

può essere meglio spiegato con una rapida registrazione di questo c'è: https://asciinema.org/a/148441

PRO

  • in conf: insieme minimo di primitivo e collegamento
  • in fase di esecuzione: idem. utilizzare solo indici. per lo più in sola lettura, non cambiano mai nemmeno.