PROMPT_COMMAND dapat berisi pernyataan bash biasa sedangkan variabel PS1 juga dapat berisi karakter khusus, seperti '\ h' untuk nama host, dalam variabel.
Misalnya di sini adalah prompt bash saya yang menggunakan PROMPT_COMMAND dan PS1. Kode bash di PROMPT_COMMAND menentukan cabang git apa yang mungkin Anda masuki dan menampilkannya pada prompt, bersama dengan status keluar dari proses yang terakhir dijalankan, nama host dan nama dasar pwd. Variabel RET menyimpan nilai kembali dari program yang terakhir dieksekusi. Ini memudahkan untuk melihat apakah ada kesalahan dan kode kesalahan dari program terakhir yang saya jalankan di terminal. Perhatikan bagian luar 'yang mengelilingi seluruh ekspresi PROMPT_COMMAND. Ini menyertakan PS1 sehingga variabel ini dievaluasi ulang setiap kali variabel PROMPT_COMMAND dievaluasi.
PROMPT_COMMAND='RET=$?;\
BRANCH="";\
ERRMSG="";\
if [[ $RET != 0 ]]; then\
ERRMSG=" $RET";\
fi;\
if git branch &>/dev/null; then\
BRANCH=$(git branch 2>/dev/null | grep \* | cut -d " " -f 2);\
fi;
PS1="$GREEN\u@\h $BLUE\W $CYAN$BRANCH$RED$ERRMSG \$ $LIGHT_GRAY";'
Contoh keluarannya terlihat seperti ini di direktori non-git:
sashan@dhcp-au-122 Documents $ false
sashan@dhcp-au-122 Documents 1 $
dan di direktori git Anda melihat nama cabang:
sashan@dhcp-au-122 rework mybranch $
Memperbarui
Setelah membaca komentar dan jawaban Bob saya rasa menulis seperti yang dia gambarkan lebih baik. Ini lebih bisa dipelihara daripada yang saya tulis di atas, di mana variabel PS1 diatur di dalam PROMPT_COMMAND, yang dengan sendirinya merupakan string super rumit yang dievaluasi saat runtime oleh bash. Itu berhasil, tetapi itu lebih rumit dari yang seharusnya. Agar adil saya menulis bahwa PROMPT_COMMAND untuk diri saya sendiri sekitar 10 tahun yang lalu dan itu berhasil dan tidak terlalu memikirkannya.
Bagi mereka yang penasaran tentang bagaimana saya mengubah barang-barang saya, pada dasarnya saya meletakkan kode untuk PROMPT_COMMAND di file terpisah (seperti yang dijelaskan Bob) dan kemudian menggemakan string yang saya maksudkan menjadi PS1:
GREEN="\[\033[0;32m\]"
CYAN="\[\033[0;36m\]"
RED="\[\033[0;31m\]"
PURPLE="\[\033[0;35m\]"
BROWN="\[\033[0;33m\]"
LIGHT_GRAY="\[\033[0;37m\]"
LIGHT_BLUE="\[\033[1;34m\]"
LIGHT_GREEN="\[\033[1;32m\]"
LIGHT_CYAN="\[\033[1;36m\]"
LIGHT_RED="\[\033[1;31m\]"
LIGHT_PURPLE="\[\033[1;35m\]"
YELLOW="\[\033[1;33m\]"
WHITE="\[\033[1;37m\]"
RESTORE="\[\033[0m\]" #0m restores to the terminal's default colour
if [ -z $SCHROOT_CHROOT_NAME ]; then
SCHROOT_CHROOT_NAME=" "
fi
BRANCH=""
ERRMSG=""
RET=$1
if [[ $RET != 0 ]]; then
ERRMSG=" $RET"
fi
if which git &>/dev/null; then
BRANCH=$(git branch 2>/dev/null | grep \* | cut -d " " -f 2)
else
BRANCH="(git not installed)"
fi
echo "${GREEN}\u@\h${SCHROOT_CHROOT_NAME}${BLUE}\w \
${CYAN}${BRANCH}${RED}${ERRMSG} \$ $RESTORE"
dan di .bashrc saya
function prompt_command {
RET=$?
export PS1=$(~/.bash_prompt_command $RET)
}
PROMPT_DIRTRIM=3
export PROMPT_COMMAND=prompt_command
if git branch &>/dev/null ; then\
. Ini mengalihkan stdout dan stderr ke / dev / null. tldp.org/LDP/abs/html/io-redirection.htmlPROMPT_COMMAND
.Don't set PS1 in PROMPT_COMMAND! Set variables in PROMPT_COMMAND and use them in PS1
PS1
online dalamPROMPT_COMMAND
tidak menguntungkan. Ini adalah kode yang sangat berguna. Berbeda dengan jawaban Bob ke bawah,PS1
variabel itu dibangun dengan benar. Ini memungkinkan prompt bash yang jauh lebih canggih tergantung pada situasi Anda yang sebenarnya.PS1
dalamPROMPT_COMMAND
@ChristianWolf tidak memiliki tujuan. ini adalah contoh bagaimana tidak melakukannya. membangunPS1
sekali.bash_profile
, cukup gunakan tanda kutip tunggal daripada tanda kutip ganda, sehingga penggantian variabel akan dievaluasi selama setiap prompt.Perbedaannya adalah PS1 adalah string prompt sebenarnya yang digunakan, dan PROMPT_COMMAND adalah perintah yang dijalankan tepat sebelum prompt. Jika Anda menginginkan cara yang paling sederhana dan fleksibel untuk membuat prompt, coba ini:
Taruh ini di .bashrc Anda:
Kemudian tulis skrip (bash, perl, ruby: pilihan Anda), dan letakkan di ~ / bin / bash_prompt.
Skrip dapat menggunakan informasi apa pun yang disukainya untuk membuat prompt. Ini adalah IMO yang jauh lebih sederhana karena Anda tidak perlu mempelajari bahasa substitusi yang agak barok yang dikembangkan hanya untuk variabel PS1.
Anda mungkin berpikir bahwa Anda dapat melakukan hal yang sama hanya dengan menyetel PROMPT_COMMAND langsung ke ~ / bin / bash_prompt, dan menyetel PS1 ke string kosong. Ini pada awalnya tampaknya berfungsi, tetapi Anda segera menemukan bahwa kode readline mengharapkan PS1 diatur ke prompt sebenarnya, dan ketika Anda menggulir kata kunci dalam sejarah, hal-hal menjadi kacau sebagai hasilnya. Solusi ini menyebabkan PS1 selalu mencerminkan prompt terbaru (karena fungsi menyetel PS1 aktual yang digunakan oleh instance pemanggilan shell), dan ini membuat riwayat baris baca dan perintah berfungsi dengan baik.
sumber
PS1
diPROMPT_COMMAND
! Tetapkan variabelPROMPT_COMMAND
dan gunakan dalamPS1
. Jika tidak, Anda akan kehilangan kemampuan untuk menggunakanPS1
urutan pelarian seperti\u
atau\h
. Anda harus menemukannya kembaliPROMPT_COMMAND
. Itu mungkin mungkin tetapi tidak mungkin untuk mengatasi kehilangan\[
dan\]
yang menandai awal dan akhir karakter yang tidak dapat dicetak. Ini berarti Anda tidak dapat menggunakan warna tanpa membingungkan terminal tentang panjang prompt. Dan ini membingungkanreadline
saat mengedit perintah yang menghasilkan dua baris. Pada akhirnya Anda memiliki kekacauan besar di layar.PROMPT_COMMAND
dijalankan sebelum mencetakPS1
. Saya tidak melihat ada masalah pengaturanPS1
dari dalamPROMPT_COMMAND
, karena setelahPROMPT_COMMAND
selesai, shell akan mencetakPS1
, yang dimodifikasi dariPROMPT_COMMAND
(atau dalam hal ini, di dalamprompt_command
)?export PS1='$(~/bin/bash_prompt)'
melakukan hal yang sama bug terlihat warasDari
man bash
:Jika Anda hanya ingin menyetel string prompt, menggunakan
PS1
saja sudah cukup:Jika Anda ingin melakukan sesuatu yang lain sebelum mencetak prompt, gunakan
PROMPT_COMMAND
. Misalnya, jika Anda ingin menyinkronkan penulisan cache ke disk, Anda dapat menulis:sumber
PS1
tanpa perluPROMPT_COMMAND
, karena urutan yang menyetel judul dapat disertakan dalamPS1
dibungkus dengan\[
dan\]
.PS1
, itu hanya akan diatur di subkulit, jadi Anda tidak bisa mendapatkan nilainya kembali. tapiPS1='$(sync)user \u on host \h$ '
perbedaannya adalah itu
PROMPT_COMMAND
, itu akan mengacaukan prompt bash AndaPS1
pengganti\H
dan temanPROMPT_COMMAND
menjalankan isinya,PS1
menggunakan isinya sebagai prompt.PS1
melakukan ekspansi variabel dan substitusi perintah pada setiap prompt, tidak perlu menggunakanPROMPT_COMMAND
untuk menetapkan nilaiPS1
atau menjalankan kode arbitrer. Anda dapat dengan mudah melakukannyaexport PS1='$(uuidgen) $RANDOM'
sekali.bash_profile
, cukup gunakan tanda kutip tunggalsumber
Ya, jadi untuk mencoba benar-benar memahaminya:
PROMPT_COMMAND
adalah variabel / fungsi kenyamanan bash yang berguna , tetapi sebenarnya tidak ada yang juga tidak dapat dilakukan dengan menggunakanPS1
sendiri, bukan?Maksud saya, jika seseorang ingin mengatur variabel lain dengan ruang lingkup di luar prompt: tergantung pada shell, variabel itu mungkin perlu dideklarasikan terlebih dahulu di luar
$PS1
atau (kasus terburuk) seseorang mungkin harus menyukai sesuatu yang menunggu di FIFO sebelum memanggil$PS1
(dan dipersenjatai lagi di akhir$PS1
); yang\u
\h
mungkin menyebabkan masalah, terutama jika Anda menggunakan ekspresi reguler; tetapi sebaliknya: seseorang dapat mencapai apa sajaPROMPT_COMMAND
dengan menggunakan substitusi perintah di dalam$PS1
(dan, mungkin dalam kasus sudut, subkulit eksplisit)?Baik?
sumber