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:~#
'
)
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:~#
'
)
Câu trả lời:
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ị PS2
chuỗ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 PS1
nhắc là root@sai:~#
chuỗi của bạn , hiển thị bình thường khi bạn nhập lệnh. >
là PS2
lời nhắc. Cũng có những thứ khác: PS3
cho select
khối lệnh và PS4
gỡ lỗi bằng set -x
lệ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ị PS2
lờ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-doc
chuyể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
. csh
và 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, csh
vẫ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
What's the difference between <<, <<< and < < in bash?
là ngoại tuyến / sai.
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.