Thiết bị đầu cuối đi vào chế độ nào khi tôi gõ một trích dẫn?


11

Khi tôi nhập một trích dẫn 'trong terminal, nó sẽ chuyển sang một số chế độ khác và các lệnh không được thực thi. Chế độ này là gì và khi nào chúng ta sử dụng nó?

root@sai:~# '
> ls
> '
ls
: command not found
root@sai:~#

30
và tại sao bạn chạy bằng root?
Zanna

13
Thiết bị đầu cuối của bạn ở cùng chế độ như trước - vỏ của bạn ở chế độ khác (chờ hoàn thành chuỗi với chuỗi khác ')
ohno

Câu trả lời:


26

Thực tế, shell yêu cầu một lệnh / biểu thức hoàn chỉnh và vì lý do đó đang hiển thị PS2chuỗi dấu nhắc.

Từ man bash:

KHUYẾN MÃI

Khi thực hiện tương tác, bash hiển thị dấu nhắc chính PS1 khi nó sẵn sàng đọc lệnh và lời nhắc phụ PS2 khi cần thêm đầu vào để hoàn thành lệnh.

Và một chút trước đó:

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

Do đó, như bạn có thể đoán từ việc đọc tài liệu, shell có nhiều lời nhắc với các mục đích khác nhau. Dấu PS1nhắc là root@sai:~#chuỗi của bạn , hiển thị bình thường khi bạn nhập lệnh. >PS2lời nhắc. Cũng có những thứ khác: PS3cho selectkhối lệnh và PS4gỡ lỗi bằng set -xlệnh. Trong trường hợp này, chúng tôi quan tâm nhiều hơn PS2.

Có nhiều cách trong đó shell có thể hiển thị PS2lời nhắc (và khi hoàn thành lệnh trên một dòng mới có thể là cần thiết). Dấu nhắc tương tự được sử dụng khi bạn thực hiện here-docchuyển hướng (trong đó một lệnh được coi là hoàn thành khi bạn thấy chuỗi kết thúc, trong ví dụ này, EOF):

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

Rất thường xuyên tiếp tục một lệnh dài có thể được thực hiện bằng cách thêm \và ngay lập tức (!) Dòng mới, điều này sẽ khiến cùng một dấu nhắc xuất hiện:

$ echo Hello\
> World
HelloWorld

$ echo 'Hello\                                                                                                           
> World'
Hello\
World

Khi đường ống, toán tử logic hoặc từ khóa đặc biệt xuất hiện trên dòng lệnh trước dòng mới, lệnh cũng được coi là không đầy đủ cho đến khi tất cả các câu lệnh cuối cùng được nhập:

$ 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

Trong trường hợp cụ thể của bạn, một trích dẫn duy nhất ngụ ý giải thích theo nghĩa đen về những gì nằm giữa các trích dẫn. Do đó, như Zanna đã chỉ ra, bạn đang nhập một lệnh bao gồm dòng mới + ls+ dòng mới. Không thể tìm thấy tên tệp thực thi như vậy (và thông thường tên tệp chỉ nên bao gồm các ký tự chữ và số, cộng với dấu gạch dưới, dấu gạch ngang và dấu chấm). Mặc dù thực sự có thể có tên tệp chứa các ký tự đặc biệt trong đó, nhưng nó luôn luôn tránh được.

LƯU Ý : hành vi như trong ví dụ của bạn là dành riêng cho các shell giống như Bourne, bao gồm bash, dash(trên Ubuntu, nó được liên kết với nhau /bin/sh) ksh, và mksh. cshvà các dẫn xuất của nó không hành xử theo cách như vậy:

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

Tuy nhiên, trong chế độ tương tác, cshvẫn sẽ tăng ?như prompt2 khi cần thêm đầu vào:

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

Xem thêm:


Liên kết What's the difference between <<, <<< and < < in bash?là ngoại tuyến / sai.
Tico

@Tico Cảm ơn đã sửa. Câu trả lời được viết với tốc độ internet của milli-rùa mỗi giây, kết quả chỉ dẫn đến liên kết được sao chép một phần. Đã sửa ngay bây giờ
Sergiy Kolodyazhnyy

3
Trong khi đó, zsh đủ tốt để thực sự cho bạn biết điều gì đang chờ đợi, điều này đôi khi hữu ích nếu bạn nghĩ rằng lệnh của bạn hợp lệ nhưng quên thoát khỏi một cái gì đó.
Kevin

30

Vỏ chỉ chờ báo giá kết thúc. Khi bạn nhập nó, nó sẽ thực hiện chính xác những gì nó thường làm và cố gắng thực hiện lệnh đã nhập.

Trích dẫn làm cho shell không diễn giải các ký tự đặc biệt, có nghĩa là mở rộng không được thực hiện. Trích dẫn duy nhất triệt tiêu tất cả các giải thích các ký tự đặc biệt hoàn toàn. Thông thường một dòng mới phân tách các lệnh, nhưng ở đây bạn đã bao gồm các dòng mới như một phần của lệnh bằng cách trích dẫn chúng.

Vì không có lệnh như vậy <newline>ls<newline>, nó không được tìm thấy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.