Mode apa yang digunakan terminal ketika saya mengetikkan kutipan tunggal?

11

Ketika saya memasukkan tanda kutip tunggal 'di terminal ia pergi ke beberapa mode lain, dan perintah tidak dijalankan. Apa mode ini dan kapan kita menggunakannya?

root@sai:~# '
> ls
> '
ls
: command not found
root@sai:~#
manikanta
sumber
30
dan mengapa Anda menjalankan sebagai root?
Zanna
13
Terminal Anda berada dalam mode yang sama seperti sebelumnya - shell Anda berada dalam mode yang berbeda (menunggu penyelesaian string dengan yang lain ')
ohno

Jawaban:

26

Secara efektif, shell meminta perintah / ekspresi lengkap , dan untuk alasan itu menampilkan PS2string yang cepat.

Dari man bash:

DORONGAN

Ketika mengeksekusi secara interaktif, bash menampilkan PS1 prompt utama ketika siap membaca perintah, dan PS2 prompt sekunder ketika perlu input lebih banyak untuk menyelesaikan perintah.

Dan sedikit sebelum itu:

  PS2    The value of this parameter is  expanded
          as  with  PS1  and used as the secondary
          prompt string.  The default is ``> ''.

Jadi, seperti yang Anda tebak dari membaca dokumentasi, shell memiliki banyak prompt dengan tujuan berbeda. The PS1prompt Anda root@sai:~#string, yang muncul biasanya ketika Anda memasukkan perintah. >adalah PS2prompt. Ada juga yang lain: PS3untuk selectblok perintah dan PS4untuk debugging dengan set -xperintah. Dalam hal ini kami lebih tertarik PS2.

Ada banyak cara di mana shell dapat menampilkan PS2prompt (dan di mana menyelesaikan perintah pada baris baru mungkin diperlukan). Prompt yang sama digunakan ketika Anda melakukan here-docredirection (di mana perintah dianggap selesai ketika Anda melihat string terminating, dalam contoh ini, EOF):

$ cat <<EOF
> line one
> line two
> EOF
line one
line two

Seringkali kelanjutan dari perintah yang panjang dapat dilakukan dengan menambahkan \dan segera (!) Baris baru, yang akan menyebabkan prompt yang sama muncul:

$ echo Hello\
> World
HelloWorld

$ echo 'Hello\                                                                                                           
> World'
Hello\
World

Ketika pipa, operator logika, atau kata kunci khusus muncul di baris perintah sebelum baris baru, perintah juga dianggap tidak lengkap sampai semua pernyataan akhir dimasukkan:

$ echo Hello World | 
> wc -l
1

$ echo Hello World &&                                                                                                    
> echo "!"
Hello World
!

$ for i in $(seq 1 3); do
> echo "$i"
> done
1
2
3 

$ if [ -f /etc/passwd ]
> then
>     echo "YES"
> fi
YES

Dalam kasus khusus Anda, kutipan tunggal menyiratkan interpretasi literal tentang apa yang ada di antara kutipan tunggal. Jadi, seperti yang ditunjukkan Zanna, Anda memasukkan perintah yang terdiri dari baris baru + ls+ baris baru. Nama file yang dapat dieksekusi tersebut tidak dapat ditemukan (dan biasanya nama file perintah harus hanya terdiri dari karakter alfanumerik, ditambah garis bawah, garis putus-putus, dan titik). Meskipun memang mungkin untuk memiliki nama file yang mengandung karakter khusus di dalamnya, selalu dihindari.

CATATAN : perilaku seperti yang diperlihatkan dalam contoh Anda khusus untuk cangkang mirip Bourne, termasuk bash, dash(di Ubuntu disinkronkan dengan /bin/sh) ,,, kshdan mksh. cshdan turunannya tidak berlaku seperti itu:

$ tcsh                                                    
eagle:~> '
Unmatched '.
eagle:~> csh
% '
Unmatched '.
%  

Namun, dalam mode interaktif, cshakan tetap muncul ?sebagai prompt2 ketika lebih banyak input diperlukan:

$ csh
% foreach n ( 1 2 3 )
? echo $n
? end
1
2
3  

Lihat juga:

Sergiy Kolodyazhnyy
sumber
Tautan What's the difference between <<, <<< and < < in bash?offline / salah.
Tico
@Tico Terima kasih sudah diperbaiki. Jawabannya ditulis dengan kecepatan internet mili-turtles per detik, yang hanya menghasilkan tautan yang disalin sebagian. Diperbaiki sekarang
Sergiy Kolodyazhnyy
3
Sementara itu, zsh cukup berbaik hati untuk benar-benar memberi tahu Anda apa yang ditunggu, yang kadang-kadang berguna jika Anda berpikir perintah Anda valid tetapi lupa untuk melarikan diri sesuatu.
Kevin
30

Shell hanya menunggu kutipan penutup. Ketika Anda memasukkannya, ia akan melakukan apa yang biasanya ia lakukan, dan berusaha untuk mengeksekusi perintah yang dimasukkan.

Kutipan menyebabkan shell tidak menafsirkan karakter khusus, yang berarti ekspansi tidak dilakukan. Kutipan tunggal menekan semua interpretasi karakter khusus sepenuhnya. Biasanya baris baru memisahkan perintah, tetapi di sini Anda telah memasukkan baris baru sebagai bagian dari perintah dengan mengutipnya.

Karena tidak ada perintah seperti <newline>ls<newline>itu, tidak ditemukan.

Zanna
sumber