Sesuatu yang saya perhatikan di Ubuntu untuk waktu yang lama yang membuat saya frustasi adalah ketika saya mengetik perintah di baris perintah yang lebih panjang (lebih lebar) dari lebar terminal, alih-alih membungkus ke baris baru, itu kembali ke kolom 1 pada baris yang sama dan mulai menulis awal baris perintah saya. (Ini sebenarnya tidak menimpa perintah yang sebenarnya, tetapi secara visual, itu menimpa teks yang ditampilkan).
Sulit untuk dijelaskan tanpa melihatnya, tetapi katakanlah terminal saya memiliki lebar 20 karakter (Milik saya lebih seperti 120 karakter - tetapi sebagai contoh), dan saya ingin mengulangi alfabet bahasa Inggris. Apa yang saya ketik adalah ini:
echo abcdefghijklmnopqrstuvwxyz
Tapi seperti apa terminal saya sebelum saya menekan kunci adalah:
pqrstuvwxyzghijklmno
Ketika saya menekan enter, itu bergema
abcdefghijklmnopqrstuvwxyz
jadi saya tahu perintah itu diterima dengan baik. Itu hanya membungkus pengetikan saya setelah "o" dan mulai lagi pada baris yang sama.
Apa yang saya harapkan terjadi, jika saya mengetik perintah ini pada terminal yang lebarnya hanya 20 karakter adalah ini:
echo abcdefghijklmno
pqrstuvwxyz
Latar Belakang: Saya menggunakan bash sebagai shell saya, dan saya memiliki baris ini di ~ / .bashrc saya:
set -o vi
untuk dapat menavigasi baris perintah dengan perintah VI. Saat ini saya menggunakan server Ubuntu 10.10, dan menghubungkan ke server dengan Putty.
Di lingkungan lain yang pernah saya gunakan, jika saya mengetikkan baris perintah yang panjang, itu akan menambah baris baru di bawah baris yang saya kerjakan ketika perintah saya lebih panjang dari lebar terminal dan ketika saya terus mengetik saya bisa melihat perintah saya di 2 garis yang berbeda. Tapi selama saya bisa ingat menggunakan Ubuntu, perintah panjang saya hanya menempati 1 baris.
Ini juga terjadi ketika saya akan kembali ke perintah sebelumnya dalam sejarah (saya menekan Esc, lalu 'K' untuk kembali ke perintah sebelumnya) - ketika saya mendapatkan perintah sebelumnya yang lebih panjang dari lebar terminal, baris perintah mendapat hancur dan saya tidak tahu di mana saya berada di dalam perintah.
Satu-satunya cara yang saya temukan untuk melihat seluruh perintah panjang adalah dengan menekan "Esc-V", yang membuka perintah saat ini dalam editor VI.
Saya rasa saya tidak memiliki sesuatu yang aneh di file .bashrc saya. Saya berkomentar di baris "set -o vi", dan saya masih punya masalah.
Saya mengunduh salinan baru Putty dan tidak membuat perubahan apa pun pada konfigurasi - Saya hanya mengetikkan nama host saya untuk terhubung, dan saya masih memiliki masalah, jadi saya tidak berpikir itu apa-apa dengan Putty (kecuali saya perlu buat beberapa perubahan konfigurasi)
Adakah orang lain yang mengalami masalah ini, dan adakah yang bisa memikirkan cara memperbaikinya?
Sunting
Itu adalah file .bashrc saya. Saya telah menyalin profil yang sama dari mesin ke mesin, dan saya menggunakan karakter khusus di $ PS1 saya yang entah bagaimana membuangnya. Saya sekarang bertahan dengan variabel standar bash untuk $ PS1 saya.
Terima kasih kepada @ ændrük untuk tipnya di .bashrc!
... Akhiri Edit ...
sumber
/etc/skel/.bashrc
. Ingatlah bahwa Anda harus menyambung kembali agar perubahan diterapkan, dan pastikan untuk menyimpan cadangan .bashrc Anda sendiri.tput smam
Jawaban:
Pastikan semua byte yang tidak dapat dicetak di PS1 Anda terkandung di dalamnya
\[ \]
. Jika tidak, bash akan menghitungnya dalam panjang prompt. Ini menggunakan panjang prompt untuk menentukan kapan harus membungkus garis.Sebagai contoh, di sini bash menghitung prompt sebagai lebar 19 kolom, sedangkan prompt yang ditampilkan oleh terminal hanya 10 kolom lebar (
My prompt
ditulis dalam cyan, dan>
ditulis dalam warna default):sementara di sini ia hanya menghitung prompt sebagai lebar 10 kolom karena mengabaikan byte antara spesial
\[
dan\]
lolos:Namun untuk praktik yang baik, gunakan
tput
untuk membuat terminal keluar daripada mengkodekannya dengan keras:Lihat http://mywiki.wooledge.org/BashFAQ/053 , dan juga http://wiki.bash-hackers.org/scripting/terminalcodes untuk informasi lebih lanjut
tput
.sumber
PS1='...'
: mengapa tanda kutip tunggal tidak mencegah$cyan
dan$reset
dari penggantian?$cyan
dan$reset
tidak digantikan, tetapiPS1
dievaluasi setiap kali prompt dicetak. Anda dapat melihat ini dengan mencobaPS1='$var> '
dan kemudian memberikanvar
berbagai nilai dan melihat bagaimana perubahan cepat. Kemudian cobaPS1="$var> "
dan perhatikan bahwa prompt tetap statis;$var
diperluas selama penugasan, tidak setiap waktuPS1
dievaluasi.PS1=${PS1}"\e]2;$@\a"
. Saya mencobaPS1=${PS1}"\[\e]2;\]$@\[\a\]"
Saya kira Anda telah mengkonfigurasi
PS1
warna Anda, bukan?Pastikan Anda memiliki
\[
di dalamPS1
kutipan Anda sebelum set warna AndaSebagai contoh:
sumber
export PS1='^[[96m'$(hostname)'<^[[92m${PWD}^[[96m>^[[97m '
- Saya sudah menggunakan yang itu untuk waktu yang lama - ini kompatibel dengan KSH ...\[
di awal dan\]
di akhir.\\[
adalah kesalahan ketik yang disebabkan oleh sunting. Saya sudah memperbaikinya.Saya memiliki masalah serupa, dan akhirnya menemukan solusi sederhana.
Tambahkan baris berikut di
.bashrc
file Anda :Kemudian ketik
source ~/.bashrc
untuk mendapatkan efek yang diinginkan.sumber
source .bashrc
. Permintaan Anda akan segera diperbaruisetwinsize
set shopt untuk bash saya, jadi itu tidak memperbarui COLUMNS benar, lihat unix.stackexchange.com/a/167911/8337export COLUMNS=250
diikuti olehexport TERM=xterm
dan itu senang.Saya memiliki masalah yang sama dengan prompt berwarna kustom, meskipun saya mengandung kode warna di dalam
\[
dan\]
pembatas. Ternyata bash memiliki masalah untuk menggemakan warna dari dalam suatu fungsi . Saya akhirnya hanya menggunakan variabel untuk prompt saya, dan meskipun .bashrc saya sedikit kurang elegan, semuanya berfungsi dengan baik sekarang.sumber
Hal sederhana yang harus dilakukan adalah menambahkan baris berikut sebelum mengatur PS1:
Sebagai contoh,
Namun ini tidak mempengaruhi perintah unix lainnya seperti ls dan man.
sumber
Saya punya masalah ini ketika terhubung di tmux. Masalahnya adalah bahwa saya memiliki
ipython
sesi di latar belakang (ctrl + z
) dan yang entah bagaimana memecahkan pembungkus baris. Segera setelah saya menghentikannya (fg
,ctrl+d+d
) terminal saya mulai berfungsi dengan baikJadi periksa untuk setiap prompt interaktif yang dihentikan.
sumber
Jadi saya hanya memiliki masalah yang sama dengan sedikit twist di atasnya dan saya pikir saya akan membagikan solusi saya juga, hanya untuk menambahkan nuansa kecil saya: D
PS1 awal saya adalah
Masalah yang saya miliki adalah bahwa saya mencoba untuk mengubah judul terminal saya serta command prompt. Cara saya melakukan ini adalah dengan menambahkan
\[\033]0;\]Title\a
ke variabel PS1 .Jadi sekarang PS1 saya adalah:
Ini mengacaukan garis pembungkus untuk saya. Saya akhirnya menemukan bahwa bash sepertinya tidak suka memiliki
\a
di akhir. Untuk menghindari ini, saya menempatkan judul dalam variabel, yang sepertinya memperbaikinya.sumber
\[
dan\]
tidak bekerja untuk saya. Saya kira ada sesuatu yang berbeda tentang bagaimana saya menghasilkan prompt (dari program eksternal), atau karena prompt saya "dinamis".Setelah membaca ini saya menemukan bahwa Anda benar-benar dapat melarikan diri dari kode warna dengan
0x01
dan0x02
byte.misalnya saya menggunakan versi khusus dari Chalk dan saya membungkus warna menggunakan ini:
sumber