6 999
contributi
S3v (discussione | contributi) (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...') |
S3v (discussione | contributi) (+ 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: | |||
<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>. | |||
* 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]] |
contributi