Input baris perintah saat skrip yang berjalan menampilkan simbol aneh

8

Jika saya menggunakan bash shell cli dan menjalankan beberapa program yang tidak segera kembali, maka saya memasukkan beberapa huruf (pada dasarnya mengetik perintah berikutnya sebelum memperhatikan yang sebelumnya tidak selesai) dan input selalu terlihat seperti ini (terutama ketika menggunakan tombol panah atas dan bawah :)

]]A^ or ]]B^

Dan saya bertanya-tanya, apakah input prematur seperti ini 'berbahaya', atau apa arti string yang dikembalikan?

U2ros
sumber
1
Ini bukan khusus untuk bash, saya akan menghapus tag itu.
Didi Kohen

Jawaban:

8

String ini adalah representasi mentah dari karakter khusus yang Anda ketikkan (seperti rumah, akhir, panah, tab dll ...).
Efek berbahaya mereka dikendalikan oleh perintah yang Anda jalankan, jika menerima input dari terminal, karakter ini akan menjadi bagian dari inputnya.
Jika tidak mengambil input dari terminal, itu seharusnya tidak memiliki efek buruk pada rasa Unix yang saya tahu.

Didi Kohen
sumber
13

Beberapa tombol pada keyboard Anda tidak sesuai dengan karakter yang sebenarnya. Misalnya, Asesuai dengan karakter atetapi tombol Updan F1tidak memiliki karakter khusus mereka sendiri. Ketika tombol khusus ditekan, alih-alih mendapatkan satu karakter yang sesuai dengan tombol, terminal menerjemahkan penekanan tombol ke urutan khusus beberapa karakter yang biasanya dimulai dengan karakter pelarian (biasanya ditampilkan sebagai ^[). Misalnya, Upbiasanya menghasilkan urutan ^[[A(yaitu 3 karakter dari satu kunci: escape [,, dan A).

Alasan yang biasanya tidak Anda lihat ^[[Aadalah karena sebagian besar aplikasi konsol cukup pintar untuk menerjemahkan urutan khusus ke dalam perintah yang berguna alih-alih hanya menggemakannya ke konsol. Untuk melakukan ini, mereka mematikan gema bawaan terminal dan melakukan pemrosesan tingkat rendah mereka sendiri. Misalnya, ketika bashdilihat ^[[A, ¹ menyadari bahwa itu berarti Anda menekan Updan alih-alih menggema ^[[Akembali, ia melakukan banyak hal untuk menghapus apa pun yang Anda ketikkan sejauh ini, ambil perintah sebelumnya yang disimpan dalam riwayat, dan cetaklah sebagai gantinya.

Jika Anda melihat ^[[Aketika Anda menekan Up, itu biasanya berarti bahwa gema terminal dihidupkan dan proses latar depan (yang mengendalikan terminal) tidak melakukan proses khusus yang disebutkan di atas. Ini mungkin karena aplikasi mengabaikan terminal (seperti kebanyakan perintah non-interaktif). Perhatikan bahwa biasanya, shell menempatkan terminal ke mode kanonik dan menyala bergema sebelum menjalankan proses foreground, dan mengembalikan pengaturannya sendiri setelah ia mendapatkan kembali kendali terminal setelah perintah keluar.

Gema itu tampaknya tidak berbahaya. Hanya ingat bahwa jika perintah yang berjalan tidak membaca dari terminal, karakter yang Anda hasilkan melalui keyboard mungkin akan berakhir di bashantrian input, jadi berhati-hatilah apa yang Anda ketik karena mereka mungkin akan ditafsirkan sebagai perintah normal setelah bashmelanjutkan membaca dari terminal.

¹ Ini sebenarnya penyederhanaan berlebihan. Karena urutan spesifik dapat bervariasi berdasarkan jenis terminal, biasanya ada beberapa lapisan perpustakaan abstraksi di antara aplikasi konsol dan terminal itu sendiri. Misalnya, bashgunakan readlineperpustakaan untuk melakukan sebagian besar inputnya.

jw013
sumber
1
Dari apa yang saya mengerti dari pertanyaan, kasus di sini adalah selama pelaksanaan perintah lain dan tidak dalam waktu antara proses keluar dan sebelum bash mengembalikan pengaturan terminal. Saya memang memilih jawaban Anda, karena ini menjelaskan kasus secara rinci, tidak seperti jawaban saya yang merupakan minimum mutlak yang diperlukan untuk menjawab.
Didi Kohen
@ DavidVohen Saya pikir Anda benar tentang pertanyaan aslinya. Saya menyesuaikan jawaban saya sedikit ke akun ketika perintah masih berjalan.
jw013