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:~#
')
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:~#
')
Jawaban:
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
What's the difference between <<, <<< and < < in bash?offline / salah.
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.