Navigazione veloce tra directory: pushd, popd e dirs: differenze tra le versioni

Vai alla navigazione Vai alla ricerca
(Creata pagina con '{{versioni compatibili}} == Introduzione e funzionamento == Uno degli aspetti più ripetitivi e noiosi quando si lavora spesso su un terminale è quello di doversi spostare con u...')
 
(+ reverse pushd)
Riga 46: Riga 46:
  4  /etc/default
  4  /etc/default
</pre>
</pre>
Possiamo notare come esista un elemento "zero" dello stack in cui è contenuta la directory corrente (nell'esempio precedente è visualizzata tramite il comando ''<code>pwd</code>''). Questo elemento non viene memorizzato permanentemente sullo stack ma cambia ogni volta che ci si sposta in una nuova directory. Esempio:
possiamo notare come esista un elemento "zero" dello stack in cui è contenuta la directory corrente (nell'esempio precedente è visualizzata tramite il comando ''<code>pwd</code>''); questo elemento non viene memorizzato permanentemente sullo stack ma cambia ogni volta che ci si sposta in una nuova directory. Esempio:
<pre>
<pre>
$ cd /lib
$ cd /lib
Riga 110: Riga 110:
<pre>
<pre>
$ cd ~4
$ cd ~4
</pre>
mentre per editare il file <code>/etc/default/grub</code>:
<pre>
$ vim ~4/grub
</pre>
</pre>
cioè specificando il numero corrispondente ottenuto con il comando "<code>dirs -v</code>".
cioè specificando il numero corrispondente ottenuto con il comando "<code>dirs -v</code>".


== Pushd ==
== Pushd ==
Riga 379: Riga 384:
* dirs +num
* dirs +num
* dirs -num
* dirs -num
Mostra semplicemente il nome della directory contenuta nello stack e trovata in base all'intero <code>num</code>. Il significato di <code>num</code> è lo stesso dei comandi <code>pushd</code> e <code>popd</code>.
mostra semplicemente il nome della directory contenuta nello stack e trovata in base all'intero <code>num</code>. Il significato di <code>num</code> è lo stesso dei comandi <code>pushd</code> e <code>popd</code>.
* dirs -c
* dirs -c
svuota lo stack delle directory.
svuota lo stack delle directory.
Riga 416: Riga 421:
$ dirs -p -l | tac > ~/dirstack
$ dirs -p -l | tac > ~/dirstack
</pre>
</pre>
== Directory alla base dello stack ==
Un caso non tanto raro è quello di avere una lista fissa di directory tra cui muoverci e di aver memorizzato i rispettivi indici sullo stack senza far ricorso al comando <code>dirs</code>; cosa succede, però, se capita di doversi spostare, magari temporaneamente, tra un certo numero di directory diverse?
Succede qualcosa di abbastanza fastidioso: l'inserimento con <code>pushd</code> delle nuove directory in cima allo stack modifica l'ordine delle directory salvate; questo fa perdere il vantaggio di ricordare l'indice consueto rallentando, quindi, il lavoro.
Qui di seguito viene proposta una semplice funzione, chiamata <code>pushd_rev</code> che ha il compito di inserire una directory alla base dello stack anziché in cima. Il vantaggio è quello di non modificare gli indici delle directory precedentemente salvate e ricordate.<br/>
<pre>
pushd_rev() {
[ $# -eq 1 -a ${#DIRSTACK[@]} -ne 1 ] || return 1
local tmp i
if [ $1 == "." ]; then pushd -n $PWD
else pushd -n $1
fi
for ((i=1; i<${#DIRSTACK[@]}-1; i++)); do
tmp=${DIRSTACK[i]}
DIRSTACK[i]=${DIRSTACK[i+1]}
DIRSTACK[i+1]=$tmp
done
return 0
}
</pre>
la funzione accetta un unico argomento (la directory da inserire alla base dello stack) e controlla che lo stack non contenga una sola directory, inoltre, al termine del comando, la directory corrente di lavoro resta invariata.<br/>
È possibile inserire queste righe in <code>.bashrc</code> e poi eseguire un:
<pre>
$ . .bashrc
</pre>
per rendere effettive le modifiche al file.
Esempio:
<pre>
$ dirs -v
0 ~
1 /etc
2 /var
3 /usr
4 /boot
$ pushd_rev /home/pippo
$ pushd_rev /home/pluto
$ pushd_rev /home/paperino
$ dirs -v
0 ~
1 /etc
2 /var
3 /usr
4 /boot
5 /home/pippo
6 /home/pluto
7 /home/paperino
</pre>
si può vedere come le directory <code>/etc</code>, <code>/var</code>, <code>/usr</code> e <code>/boot</code> mantengano il loro indice nello stack.
[[Categoria:Bash]]
[[Categoria:Bash]]
----
----
:[[Utente:S3v|S3v]]
:[[Utente:S3v|S3v]]