Mengapa menyetel bash prompt (PS1) secara manual menyebabkan root memiliki $ bukannya #?

11

Saya menggunakan CentOS 6.4. Secara default, prompt pengguna root memiliki #simbol, yaitu tampilannya mirip [root@myserver ~]# .

echo $PS1mencetak [\u@\h \W]\$; tapi jika saya lakukan PS1="[\u@\h \W]\$"(yang seharusnya tidak mengubah apa pun, AFAICS), saya berakhir dengan prompt yang terlihat seperti ini: [root@myserver ~]$.

Mengapa ketika saya mencoba mengaturnya sendiri (saya akhirnya ingin mengubahnya menjadi sesuatu yang lebih berguna), apakah itu menafsirkan $secara harfiah? Hampir setiap halaman saya dapat menemukan (misalnya, Cara: Ubah / Setup bash custom prompt (PS1) ) mengatakan bahwa \$harus menghasilkan #untuk pengguna root.

stripybadger
sumber
PS1=[\u@\h \W]\$kembali -bash: W]$: command not found.
choroba
@choroba oops, maaf, ketinggalan tanda kutip ganda, seharusnya begitu PS1="[\u@\h \W]\$".
stripybadger

Jawaban:

14

Dalam pertanyaan Anda, Anda menyiratkan bahwa Anda sama sekali tidak mengutip kalimat itu; itu jelas salah, karena dengan begitu ruang akan memisahkan tugas argumen "PS1 = [\ u @ \ h" dari perintah "\ W] \ $". Harap sadari bahwa setiap karakter adalah penting.

Ngomong-ngomong, apa yang mungkin Anda lakukan adalah menggunakan tanda kutip ganda (") daripada tanda kutip tunggal ('). Mereka berperilaku sangat berbeda ketika datang ke shell menafsirkan apa yang Anda ketikkan. Dengan tanda kutip ganda, itu akan mencoba melakukan hal-hal pintar dengan urutan backslash / some-character. Untuk tugas ini, karena tidak ada yang istimewa tentang \ u, \ h, dan \ W, mereka tidak tersentuh; tanda kurung dapat memiliki arti khusus di berbagai tempat, tetapi tidak dalam kasus ini, jadi mereka juga ditinggalkan di tempat, tetapi karena a $memiliki beragam makna, semuanya istimewa, \$urutannya ditafsirkan sebagai "abaikan kekhasan tanda dolar, dan biarkan saja di sana", dan urutan itu diganti dengan tanda dolar tunggal no-selanjutnya diurai. Hasil dari semua itu ditugaskan untukPS1, dan karena ada tanda dolar literal, dan bukan \$urutan ajaib ketika shell membangun prompt aktual, Anda hanya mendapatkan tanda dolar, dan bukan karakter yang bergantung pada pengguna yang efektif. Penguraian sebenarnya sedikit lebih rumit, tetapi itulah intinya untuk contoh khusus ini.

Apa yang Anda ketikkan: PS1="[\u@\h \W]\$ "
Apa yang ditetapkan oleh shell: PS1 <- "[\u@\h \W]$ "
Apa yang Anda inginkan: PS1 <- "[\u@\h \W]\$ "
Apa yang harus Anda ketik:PS1='[\u@\h \W]\$ '

Apa yang harus Anda lakukan selanjutnya: Baca sesuatu seperti tutorial ini untuk mempelajari lebih lanjut tentang penawaran shell.

Gabe
sumber
1
Ya, Anda benar, saya menggunakan tanda kutip ganda (maaf karena melewatkannya dari pertanyaan awal), terima kasih telah menunjukkan kesalahan saya.
stripybadger
Jika Anda memang perlu menggunakan tanda kutip ganda untuk beberapa alasan, gunakan PS1="...\\\$"untuk memastikan bahwa pasangan literal \$disimpan di PS1dalam shell untuk menafsirkan nanti.
chepner
0

Sudahkah Anda beralih ke pengguna root menggunakan sudo su, suatau dengan masuk sebagai root? Gunakan iduntuk memeriksa siapa yang komputer Anda anggap Anda masuki, karena ini dapat memengaruhi profil mana yang sebenarnya Anda sunting.

Lihatlah jawaban untuk /ubuntu/305052/changing-behavior-of-bash-prompt-when-functioning-as-root

dunxd
sumber