GNU/Linux >> Znalost Linux >  >> Linux

Bash Shell:Převezměte kontrolu nad PS1, PS2, PS3, PS4 a PROMPT_COMMAND

Vaše interakce s Linux Bash Shell bude velmi příjemná, pokud používáte PS1, PS2, PS3, PS4 a PROMPT_COMMAND efektivně. PS znamená prompt statement. Tento článek vám poskytne rychlý start proměnných prostředí příkazového řádku Linuxu pomocí jednoduchých příkladů.

1. PS1 – Výchozí výzva k interakci

Výchozí interaktivní výzvu na vašem Linuxu lze upravit, jak je uvedeno níže, na něco užitečného a informativního. V následujícím příkladu byl výchozí PS1 „\s-\v\$“, který zobrazuje název shellu a číslo verze. Změňme toto výchozí chování tak, aby se zobrazovalo uživatelské jméno, název hostitele a název aktuálního pracovního adresáře, jak je uvedeno níže.

-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] 

V tomto příkladu jsou použity následující kódy PS1:

  • \u – Uživatelské jméno
  • \h – Název hostitele
  • \w – Úplná cesta k aktuálnímu adresáři. Upozorňujeme, že když jste v domovském adresáři, zobrazí se pouze ~, jak je uvedeno výše
  • Všimněte si, že na konci je v hodnotě PS1 mezera. Osobně preferuji mezeru na konci výzvy pro lepší čitelnost.

Udělejte toto nastavení trvalé přidáním exportu PS1=”\u@\h \w> ” buď do .bash_profile (nebo) .bashrc, jak je uvedeno níže.

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]

V příštím příspěvku podrobně napíšu několik praktických příkladů použití PS1.

2. PS2 – Interaktivní výzva k pokračování

Velmi dlouhý unixový příkaz lze rozdělit na více řádků zadáním \ na konci řádku. Výchozí interaktivní výzva pro víceřádkový příkaz je „>“. Změňme toto výchozí chování tak, aby zobrazovalo „continue->“ pomocí proměnné prostředí PS2, jak je uvedeno níže.

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]

Zjistil jsem, že je velmi užitečné a snadno čitelné, když své dlouhé příkazy rozdělím na více řádků pomocí \. Také jsem viděl jiné, kteří neradi ruší dlouhé příkazy. co preferujete? Rádi rozdělujete dlouhé příkazy do více řádků?

3. PS3 – Výzva používaná „select“ uvnitř skriptu shell

Můžete definovat vlastní výzvu pro výběrovou smyčku uvnitř skriptu prostředí pomocí proměnné prostředí PS3, jak je vysvětleno níže.

Skript a výstup prostředí BEZ 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]


Skript a výstup prostředí S 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 – Používá se „set -x“ pro předponu trasovacího výstupu

Proměnná prostředí PS4 definuje výzvu, která se zobrazí, když spustíte skript prostředí v režimu ladění, jak je uvedeno níže.

Skript a výstup prostředí BEZ 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]


Skript a výstup prostředí S PS4:
PS4 definovaný níže v ps4.sh má následující dva kódy:

  • $0 – označuje název skriptu
  • $LINENO – zobrazí číslo aktuálního řádku ve skriptu
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

Bash shell spustí obsah PROMPT_COMMAND těsně před zobrazením proměnné 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]

Pokud chcete zobrazit hodnotu PROMPT_COMMAND ve stejném řádku jako PS1, použijte echo -n, jak je uvedeno níže.

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]

Pokud se vám tento článek líbil, přidejte si jej do záložek na del.icio.us a Stumble pomocí odkazu uvedeného níže v části „Co dál?“.


Linux
  1. Jak programovat s Bash:Syntaxe a nástroje

  2. Procházení shellu Bash pomocí pushd a popd

  3. Chování polí ve skriptování bash a shellu zsh (počáteční index 0 nebo 1?)

  1. Rozdíl mezi proměnnými Shell, které se exportují, a těmi, které nejsou v Bash?

  2. Účel .bashrc a jak to funguje?

  3. Bash Shell:Převezměte kontrolu nad PS1, PS2, PS3, PS4 a PROMPT_COMMAND

  1. Bash Shell Script - Zkontrolujte, zda nemáte příznak a zjistěte jeho hodnotu

  2. Variabilní rozsah pro skripty bash shell a funkce ve skriptu

  3. Jaký je rozdíl mezi &> a >&v bash?