Apa yang menyebabkan copy / paste di terminal terkadang mengeksekusi perintah?

24

Ketika Anda menempelkan beberapa perintah di terminal, terkadang perintah itu akan secara otomatis menjalankan perintah (seperti jika tombol "Enter" ditekan), terkadang tidak.

Saya telah menggunakan Linux sejak lama, menyisipkan ribuan perintah di berbagai konsol di banyak distro, dan saya masih tidak dapat memastikan apakah perintah yang akan saya tempel akan dieksekusi secara otomatis atau tidak.

Apa yang memicu perilaku ini?

kursus
sumber
5
Jika Anda ingin menghindari kekhawatiran tentang hal ini, ketikkan { (dengan spasi) sebelum menempel, lalu akhiri dengan }. Ini tidak berpengaruh pada cara kerja perintah yang ditempelkan, tetapi mencegah shell dari mengeksekusinya sampai Anda menutup blok. Dijelaskan di sini [ gnu.org/software/bash/manual/html_node/Command-Grouping.html]
loa_in_

Jawaban:

37

Ini adalah karakter kembali dalam teks yang Anda salin yang memicu eksekusi otomatis.

Mari kita ambil contoh lain, salin semua baris ini sekaligus dan tempel ke terminal Anda:

echo "Hello";
echo "World";

Jika Anda melihat di terminal Anda, Anda tidak akan melihat ini:

$ echo "Hello";
echo "World";

Anda akan melihat ini (mungkin juga ada baris yang mengatakan World):

$ echo "Hello";
Hello
$ echo "World";

Alih-alih menunggu semua input untuk ditempelkan, baris pertama dijalankan (dan untuk alasan yang sama, baris kedua mungkin atau mungkin tidak melakukannya juga). Ini karena ada RETURNkarakter antara dua garis.

Ketika Anda menekan ENTERtombol pada keyboard Anda, semua yang Anda lakukan adalah mengirim karakter dengan nilai ASCII 13. Karakter itu terdeteksi segera oleh terminal Anda, dan tahu itu memiliki instruksi khusus untuk mengeksekusi apa yang Anda ketikkan sejauh ini.

Ketika disimpan di komputer Anda atau dicetak di layar Anda, RETURNkarakternya sama seperti huruf lain dari alfabet, angka, atau simbol. Karakter ini dapat dihapus dengan backspace, atau disalin ke clipboard sama seperti karakter biasa lainnya.

Satu-satunya perbedaan adalah, ketika browser Anda melihat karakter, ia tahu bahwa alih-alih mencetak karakter yang terlihat, ia harus memperlakukannya secara berbeda, dan memiliki instruksi khusus untuk memindahkan set teks berikutnya ke baris berikutnya. The RETURNkarakter dan SPACEkarakter (ascii 32), bersama dengan beberapa karakter lain jarang digunakan, dikenal sebagai "non-cetak karakter" untuk alasan ini.

Terkadang ketika Anda menyalin teks dari situs web, sulit untuk menyalin hanya teks dan bukan pengembalian di akhir (dan sering menjadi lebih sulit dengan gaya pada halaman).


Waktu percobaan!

Di bawah ini Anda akan menemukan dua perintah yang akan menggambarkan masalah, dan Anda dapat "berlatih". Mulai kursor tepat sebelum echodan seret sampai sorotan tepat sebelum panah:

echo "Wait for my signal...";<- End cursor here right after the semicolon

Dan sekarang coba perintah kedua. Mulai kursor Anda tepat sebelum echodan seret ke bawah hingga kursor berada di baris kedua, tetapi tepat di depan <-panah. Salin, lalu tempel ke terminal Anda:

echo 'Go go go!';
<- End cursor here right before the arrow

Bergantung pada browser Anda, bahkan mungkin tidak terlihat bahwa teks yang Anda pilih melewati dua baris. Tetapi ketika Anda menempelkannya ke terminal, Anda akan menemukan bahwa itu mengeksekusi baris, karena itu menemukan RETURNkarakter dalam teks yang disalin.

IQAndreas
sumber
5
Untuk mengurangi kerumitan, saya sepenuhnya mengabaikan menyebutkan bahwa Windows menggunakan dua kunci berbeda untuk pengembalian. Ketahuilah bahwa itu adalah kesengsaraan sehari-hari dan perjuangan yang harus kita hadapi.
IQAndreas
space adalah karakter pencetakan
mikeserv
1
Mungkin. Namun, ketika saya menguji tempel dari Firefox ke dalam shell (dengan stty diatur ke "raw"), baris diakhiri dengan baris baru - bukan carriage return.
Thomas Dickey
1
Anda tidak perlu pindah ke baris berikutnya, jika Anda memilih dan melewati titik koma dalam jumlah yang cukup (2-3 karakter), itu akan memilih seluruh baris, yang berarti Anda mendapatkan sendiri baris baru.
@ThomasDickey Apakah Anda menggunakan Windows atau sistem berbasis Unix?
IQAndreas
10

Saat Anda memilih teks, jika Anda memasukkan baris (tidak terlihat) di akhir baris, itu akan menjadi teks yang ditempel. Itu konsisten di semua emulator terminal yang saya tahu. Baris baru melakukan apa yang Anda sebut "validasi".

Pada beberapa sistem (seperti yang menggunakan terminal sinkron seperti IBM 3270), Enterkuncinya akan "memvalidasi" layar dengan menyalin semua perubahan ke host.

Thomas Dickey
sumber
2

Apa yang memicu perilaku ini?

Karakter baris baru.

PSkocik
sumber