Terminal menunjukkan> setelah masuk \

Jawaban:

35

Setiap kali Anda menggunakan baris perintah, mungkin ada contoh ketika Anda harus menjalankan perintah yang sangat panjang. Jadi, Anda ingin membagi perintah menjadi beberapa baris untuk keterbacaan dan pemahaman yang lebih baik. Tetapi jika Anda menggunakan karakter baris baru yang diketik oleh Enter, shell akan berpikir bahwa itu adalah perintah baru. Jadi, Anda menggunakan \diikuti oleh karakter baris baru.

Pada dasarnya, perintah atau skrip bash "ditafsirkan", yaitu dieksekusi baris demi baris. Setiap baris baru berarti awal dari sebuah perintah baru. Di terminal, ketika Anda menekan Enter, Anda mendapatkan prompt untuk menjalankan perintah baru. Jadi, baris baru perlu "melarikan diri". Mengetik \diikuti oleh Entermemungkinkan Anda untuk membagi perintah saat ini menjadi beberapa baris sehingga shell tidak berpikir bahwa itu adalah perintah baru tetapi kelanjutan dari perintah sebelumnya.

> tidak lain adalah prompt untuk baris berikutnya dari perintah yang dimasukkan.

Sebagai contoh:
Jika kita ingin menginstal beberapa paket, perintahnya akan seperti

$ sudo apt install [package1] [package2] [package3] ...

Namun terkadang, itu membuat perintah berantakan. Jadi kita bisa menggunakan \diikuti oleh Enter(karakter baris baru)

$ sudo apt install [package1]\
> [package2]\
> [package3]\
> ...
Kulfy
sumber
4
@Curiouskangaroo BTW, Anda dapat mengontrol bagaimana perintah baru dan kelanjutan baris diminta bekerja, dengan menetapkan nilai ke variabel $PS1dan $PS2. Lihat halaman bash man untuk mempelajari formatnya, dan gunakan echo "'$PS2'"untuk melihat pengaturan saat ini.
jpaugh
14

Karakter backslash ( \) digunakan sebagai karakter pelarian di shell. Jika Anda menggunakannya sebagai karakter terakhir pada baris, ia akan keluar dari baris baru, sehingga Anda dapat melanjutkan perintah pada baris berikutnya alih-alih menyelesaikannya. Ini ditunjukkan oleh >prompt di Bash.

Contoh:

$ echo A\
> B
AB
$

Untuk menempatkan literal \ke perintah Anda, Anda harus menghindarinya menggunakan backslash lain:

$ echo \\
\
$
Melebius
sumber
7

[menambahkan jawaban (terlalu panjang / rumit) karena 2 lainnya tidak menyebutkan bagaimana ">" muncul ... yaitu, jangan menyebutkan PS2]

Anda mengetik: \Enter: yang \mengatakan untuk shell hanya keluaran yang Entersebagai karakter literral bukan menafsirkan seperti biasa (Oleh karena itu shell "pergi ke baris berikutnya" bukannya mengakhiri baris perintah saat ini dan menafsirkannya Kecuali Anda berada di beberapa. konstruksi lain seperti heredoc, a for loop, dll).

Terminal Anda karenanya menafsirkan \Entersebagai: "pergi ke baris berikutnya" (tanpa mulai menafsirkan perintah) dan dengan demikian terminal sekarang membiarkan Anda memasukkan baris ke-2 dari perintah multi-baris, dan untuk membuatnya lebih terlihat menampilkan $PS2konten ( disebut prompt PS2 ) pada setiap baris berikutnya.

The PS2 variabel biasanya didefinisikan secara default sebagai: PS2="> "dan Anda bisa untuk contoh mengedit ~ / .bashrc untuk mendefinisikan kembali itu seperti yang anda inginkan (dengan mempertimbangkan bahwa itu harus, imo, menghindari mengandung karakter berbahaya, seperti >atau ;, dan akan membantu Anda baik jelas melihat itu adalah perintah multiline tapi menonaktifkan itu konten multiline (ex: PS2="#cont#") atau membiarkan Anda dengan mudah copy / paste mereka dengan sebagai dampak kecil pada garis yang mungkin (ex: PS2=" ")

Omong-omong, ini merupakan standar yang buruk, karena bisa menyebabkan seseorang menghapus beberapa perintah biner penting dalam beberapa kasus.

Anda dapat mendefinisikan kembali PS2 menjadi sesuatu yang lain (saya suka: PS2 = "", sebagai contoh) sehingga perintah multiline dapat dengan mudah disalin / ditempelkan tanpa takut akan hal-hal berikut:

Sebagai contoh, katakanlah Anda memiliki perintah yang mulai cukup panjang (dan mungkin terlipat di layar Anda jika terminal Anda tidak cukup lebar):

grep -i "something"  /some/file  /another/file /3rd/file /etc/someimportantfile 

Jika perintah terlihat terlalu panjang (dan membungkus), Anda mungkin ingin membaginya secara visual menjadi 2 baris, dengan memilih di mana (kapan) Anda ingin ke baris berikutnya dengan memasukkan: \Enterdi tempat yang sesuai:

grep -i "something"  /some/file  /another/file /3rd/file \
> /etc/someimportantfile #warning, "> " was inserted by the shell and this changes everything !

Menggunakan PS2 default, shell menambahkan ">" sebelum "/ etc / someimportantfile" .. jadi jika Anda menyalin / menempelkan 2 baris tersebut di terminal lain, tindakan mereka akan sangat berbeda: alih-alih mem-grep ke 4 file, grep adalah hanya masuk ke 3 file pertama, dan output grep menggantikan konten file ke-4 (/ etc / someimportantfile)!

Untuk menghindari masalah ini (dan banyak masalah lainnya): Anda bisa untuk contoh: PS2=" "untuk membuat perintah multi-line lebih bersih dan lebih mudah untuk menyalin / menempel:

grep -i "something"  /some/file  /another/file /3rd/file \
  /etc/someimportantfile #now only 2 spaces were inserted, without changing the grep's actions!

Perhatikan bagaimana kali ini / bin / somecommand hanya menggeser 2 spasi ke kanan, dan tidak ada ">" yang dimasukkan, sehingga Anda dapat dengan aman menyalin / menempelkan perintah 2-baris ini.

PS2 juga digunakan dalam "for" "while" loop dll, dan mendefinisikannya sebagai "" bagi saya juga lebih baik.

Olivier Dulac
sumber