Saya memiliki masalah di mana jika saya mengetikkan perintah yang sangat panjang di bash terminal tidak akan membuat apa yang saya ketikkan dengan benar. Saya berharap jika saya memiliki perintah seperti berikut:
username@someserver ~/somepath $ ssh -i /path/to/private/key
myusername@something.someserver.com
Perintah harus ditampilkan pada dua baris. Sebaliknya ia akan sering membungkus dan mulai menulis di atas prompt saya, agak seperti ini:
myreallylongusername@something.somelongserver.comh -i /path/to/private/key
Jika saya memutuskan untuk kembali dan mengubah beberapa argumen, tidak ada yang tahu di mana kursor akan muncul, kadang-kadang di tengah prompt, tetapi biasanya pada baris di atas di mana saya mengetik.
Kegembiraan tambahan terjadi ketika ketika saya Upke perintah sebelumnya. Saya sudah mencoba ini di gnome-terminal dan terminator dan di i3 dan Cinnamon. Seseorang menyarankan itu prompt saya, jadi di sini adalah:
\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]
Ctrll,, reset
dan clear
semua melakukan apa yang mereka katakan, tetapi ketika saya mengetik perintah kembali atau Uphal yang sama terjadi.
Saya memeriksa dan checkwinsize
diaktifkan di bash. Ini terjadi pada 80x24 dan ukuran jendela lainnya.
Apakah ini hanya sesuatu yang saya pelajari untuk hidup? Apakah ada sihir yang harus saya ketahui? Saya sudah puas hanya menggunakan prompt yang sangat singkat, tetapi itu tidak memperbaiki masalah.
env -i bash --norc
memperbaikinya. Pertandingan $ COLUMNS dan $ LINES. Apakah itu berarti ada sesuatu yang lucu dengan .bashrc saya?\[\033[01;32m\]\u: \[\033[01;34m\]\W \[\033[01;34m\] \$ \[\033[0m\]
tampaknya menghindari keanehan dalam perilaku - tetapi tidak tahu apakah itu benar-benar menghargai prompt asli Anda ...tput smam
Jawaban:
Urutan yang tidak dapat dicetak harus disertakan dalam
\[
dan\]
. Melihat PS1 Anda memiliki urutan yang tidak tertutup setelah\W
. Tapi, entri kedua berlebihan dan mengulangi pernyataan sebelumnya "1; 34" .Dengan demikian ini seharusnya dimaksudkan pewarnaan:
Menjaga "asli" ini juga berfungsi:
Sunting:
Alasan perilakunya adalah karena
bash
meyakini bahwa dorongan itu lebih lama dari yang sebenarnya. Sebagai contoh sederhana, jika digunakan:Prompt diyakini 8 karakter dan bukan 1. Karena itu jika jendela terminal adalah 20 kolom, setelah mengetik 12 karakter, itu diyakini 20 karakter dan membungkus sekitar. Ini juga terbukti jika seseorang kemudian mencoba melakukan backspace atau Ctrl+u. Itu berhenti di kolom 9.
Namun itu juga tidak memulai baris baru kecuali ada di kolom terakhir, akibatnya baris pertama ditimpa.
Jika seseorang terus mengetik baris harus membungkus ke baris berikutnya setelah 32 karakter.
sumber
Hal ini sebagian besar berkaitan dengan ukuran jendela yang diasumsikan oleh terminal tidak sama dengan ukuran jendela Anda yang sebenarnya. Jika Anda menggunakan bash, Anda dapat mencoba ini.
Jika Anda tidak mengerti
Kemudian aktifkan dengan
Kemudian coba jalankan perintah lain (seperti
ls
) atau mengubah ukuran jendela sekali, di atas berfungsi untuk saya setiap waktu.Untuk sistem Redhat khususnya, masalah ini sering disebabkan oleh konfigurasi yang salah
~/.bashrc
untuk tidak menelepon/etc/bashrc
. Biasanya, bash memuat~/.bashrc
yang diharapkan untuk dipanggil/etc/bashrc
, yang secara default berisishopt -s checkwinsize
.sumber
/etc/bashrc
, segalanya baik untuk pergi ... ternyata ini adalah penyebab masalah pembungkus.shopt -s checkwinsize
di sesi ssh. Tapi bungkusnya tetap ada.Seperti disebutkan dalam jawaban lain, urutan yang tidak dapat dicetak seperti
\e[0;30m
harus dibungkus\[...\]
.Selain itu (dan apa yang saya tidak melihat disebutkan belum) adalah tampaknya
\r\n
harus luar dari\[...\]
jika Anda memiliki prompt multi-line. Butuh beberapa percobaan dan kesalahan untuk akhirnya mengetahui hal itu.sumber
Saya pernah membaca di suatu tempat (tidak tahu lagi di mana) yang menggunakan
\001
dan\002
bukannya\[
dan\]
dapat memecahkan masalah ini. Itu untuk saya.Omong-omong, mendefinisikan PS1 tidak harus terlihat jelek.
sumber
Ini terdengar seperti masalah dengan pengaturan variabel
COLUMNS
&LINES
lingkungan Anda. Ketika Anda mengubah ukuran jendela, mereka biasanya diatur secara otomatis oleh gnome-terminal (saya percaya) Anda bisa memaksa mereka untuk secara manual diatur dengan mengeluarkan perintahresize
.Contoh
Jika saya mengubah ukuran terminal gnome saya menjadi 79x17, variabel saya muncul seperti ini:
Saya bisa memaksanya seperti ini:
sumber
Untuk mencegah pembungkus, Anda juga dapat menambah jumlah kolom menggunakan, mis
sumber
Juga masalah yang sama dapat disebabkan dengan menggunakan simbol unicode lebar (seperti dari https://stackoverflow.com/a/34812608/1657819 ). Berikut ini cuplikan yang menyebabkan masalah (perhatikan
$Green
dan$Red
string warna yang lolos dengan benar):Bash tidak dapat menghitung panjangnya dengan benar, jadi cara termudah adalah melarikan diri 2 dari tiga bagian dari simbol lebar itu.
sumber
\001
dan\002
.