La tua interazione con la shell Bash di Linux diventerà molto piacevole, se usi PS1, PS2, PS3, PS4 e PROMPT_COMMAND in modo efficace. PS sta per dichiarazione rapida. Questo articolo ti darà un inizio sulle variabili di ambiente del prompt dei comandi di Linux usando semplici esempi.
1. PS1 – Richiesta di interazione predefinita
Il prompt interattivo predefinito sul tuo Linux può essere modificato come mostrato di seguito in qualcosa di utile e informativo. Nell'esempio seguente, la PS1 predefinita era "\s-\v\$", che mostra il nome della shell e il numero di versione. Cambiamo questo comportamento predefinito per visualizzare il nome utente, il nome host e il nome della directory di lavoro corrente come mostrato di seguito.
-bash-3.2$ export PS1="\u@\h \w> "
ramesh@dev-db ~> cd /etc/mail
ramesh@dev-db /etc/mail>
[Note: Prompt changed to "username@hostname current-dir>" format]
In questo esempio vengono utilizzati i seguenti codici PS1:
- \u – Nome utente
- \h – Nome host
- \w – Percorso completo della directory corrente. Tieni presente che quando sei nella home directory, questo verrà visualizzato solo ~ come mostrato sopra
- Nota che c'è uno spazio alla fine nel valore di PS1. Personalmente, preferisco uno spazio alla fine del prompt per una migliore leggibilità.
Rendi permanente questa impostazione aggiungendo export PS1=”\u@\h \w>” a .bash_profile (o) .bashrc come mostrato di seguito.
ramesh@dev-db ~> vi ~/.bash_profile (or) ramesh@dev-db ~> vi ~/.bashrc [Note: Add export PS1="\u@\h \w> " to one of the above files]
Nel prossimo post scriverò in dettaglio diversi esempi pratici di utilizzo di PS1.
2. PS2 – Prompt interattivo di continuazione
Un comando unix molto lungo può essere suddiviso in più righe dando \ alla fine della riga. Il prompt interattivo predefinito per un comando su più righe è “>”. Cambiamo questo comportamento predefinito per visualizzare "continua->" utilizzando la variabile di ambiente PS2 come mostrato di seguito.
ramesh@dev-db ~> myisamchk --silent --force --fast --update-state \
> --key_buffer_size=512M --sort_buffer_size=512M \
> --read_buffer_size=4M --write_buffer_size=4M \
> /var/lib/mysql/bugs/*.MYI
[Note: This uses the default ">" for continuation prompt]
ramesh@dev-db ~> export PS2="continue-> "
ramesh@dev-db ~> myisamchk --silent --force --fast --update-state \
continue-> --key_buffer_size=512M --sort_buffer_size=512M \
continue-> --read_buffer_size=4M --write_buffer_size=4M \
continue-> /var/lib/mysql/bugs/*.MYI
[Note: This uses the modified "continue-> " for continuation prompt]
L'ho trovato molto utile e facile da leggere, quando spezzo i miei lunghi comandi in più righe usando \. Ho anche visto altri a cui non piace spezzare i comandi lunghi. Qual è la tua preferenza? Ti piace suddividere i comandi lunghi in più righe?
3. PS3:prompt utilizzato da "select" all'interno dello script della shell
Puoi definire un prompt personalizzato per il ciclo di selezione all'interno di uno script di shell, utilizzando la variabile di ambiente PS3, come spiegato di seguito.
Script e output della shell SENZA PS3:
ramesh@dev-db ~> cat ps3.sh
select i in mon tue wed exit
do
case $i in
mon) echo "Monday";;
tue) echo "Tuesday";;
wed) echo "Wednesday";;
exit) exit;;
esac
done
ramesh@dev-db ~> ./ps3.sh
1) mon
2) tue
3) wed
4) exit
#? 1
Monday
#? 4
[Note: This displays the default "#?" for select command prompt]
Script e output della shell CON PS3:
ramesh@dev-db ~> cat ps3.sh
PS3="Select a day (1-4): "
select i in mon tue wed exit
do
case $i in
mon) echo "Monday";;
tue) echo "Tuesday";;
wed) echo "Wednesday";;
exit) exit;;
esac
done
ramesh@dev-db ~> ./ps3.sh
1) mon
2) tue
3) wed
4) exit
Select a day (1-4): 1
Monday
Select a day (1-4): 4
[Note: This displays the modified "Select a day (1-4): "
for select command prompt]
4. PS4:utilizzato da "set -x" per prefissare l'output di traccia
La variabile della shell PS4 definisce il prompt che viene visualizzato quando esegui uno script della shell in modalità debug come mostrato di seguito.
Script e output della shell SENZA PS4:
ramesh@dev-db ~> cat ps4.sh
set -x
echo "PS4 demo script"
ls -l /etc/ | wc -l
du -sh ~
ramesh@dev-db ~> ./ps4.sh
++ echo 'PS4 demo script'
PS4 demo script
++ ls -l /etc/
++ wc -l
243
++ du -sh /home/ramesh
48K /home/ramesh
[Note: This displays the default "++" while tracing the output using set -x]
Script e output della shell CON PS4:
La PS4 definita di seguito in ps4.sh ha i seguenti due codici:
- $0 – indica il nome dello script
- $LINENO:mostra il numero di riga corrente all'interno dello script
ramesh@dev-db ~> cat ps4.sh
export PS4='$0.$LINENO+ '
set -x
echo "PS4 demo script"
ls -l /etc/ | wc -l
du -sh ~
ramesh@dev-db ~> ./ps4.sh
../ps4.sh.3+ echo 'PS4 demo script'
PS4 demo script
../ps4.sh.4+ ls -l /etc/
../ps4.sh.4+ wc -l
243
../ps4.sh.5+ du -sh /home/ramesh
48K /home/ramesh
[Note: This displays the modified "{script-name}.{line-number}+"
while tracing the output using set -x]
5. PROMPT_COMMAND
La shell Bash esegue il contenuto di PROMPT_COMMAND appena prima di visualizzare la variabile PS1.
ramesh@dev-db ~> export PROMPT_COMMAND="date +%k:%m:%S" 22:08:42 ramesh@dev-db ~> [Note: This displays the PROMPT_COMMAND and PS1 output on different lines]
Se vuoi visualizzare il valore di PROMPT_COMMAND nella stessa riga di PS1, usa echo -n come mostrato di seguito.
ramesh@dev-db ~> export PROMPT_COMMAND="echo -n [$(date +%k:%m:%S)]"
[22:08:51]ramesh@dev-db ~>
[Note: This displays the PROMPT_COMMAND and PS1 output on the same line]
Se ti è piaciuto questo articolo, aggiungilo ai preferiti su del.icio.us e Stumble utilizzando il collegamento fornito di seguito, nella sezione "Cosa succederà?".