Tại sao echo không được gọi là / bin / sh -c echo foo xuất ra bất cứ thứ gì?


15

Ví dụ, trong khi điều này hoạt động:

$ echo foo
foo

Đây không phải là:

$ / bin / sh -c echo foo

Trong khi điều này không:

$ / bin / sh -c 'echo foo; thanh tiếng vang '
foo
quán ba

Có một lời giải thích?

Câu trả lời:


21

Từ man sh

-c string   If the -c option is present, then commands are read from string. 
            If there are arguments after the string, they are assigned to the
            positional parameters, starting with $0

Nó có nghĩa là lệnh của bạn nên như thế này:

 $ sh -c 'echo "$0"' foo 
 foo

Tương tự:

$ sh -c 'echo "$0 $1"' foo bar
foo bar

Đó là phần đầu tiên để hiểu; trường hợp thứ hai là đơn giản và không cần giải thích, tôi đoán.


2
Một cách tuân thủ tiêu chuẩn chặt chẽ hơn sẽ làsh -c 'echo $1' echo foo
jlliagre

1
sh -c 'echo "$@"' fnord a b c d ...
zwol

3
IMHO giải thích khá tốt, nhưng sh -c 'echo $0' fookhông phải là lựa chọn tốt nhất, có tính đến việc người hỏi đã biết rằng nó /bin/sh -c 'echo foo; echo bar'hoạt động, bạn chỉ cần trả lời trích dẫn lệnh/bin/sh -c 'echo foo'
X3MBoy

1
@ X3MBoy Người hỏi đã biết rằng / bin / sh -c 'echo foo' hoạt động tốt. Anh ấy muốn lặp lại một cái gì đó bên ngoài, mà tôi đã giải thích
Ijaz Ahmad Khan

18
$ echo foo
foo

Cuộc gọi này echovới đối số foofoo được in.

$ /bin/sh -c echo foo

Điều này gọi shell với đối số echovà cung cấp foo làm đối số $0. Đầu echora một dòng mới và bạn loại bỏ foo . Nếu bạn muốn xuất foo , hãy trích dẫn đối số:

sh -c 'echo foo'

hoặc sử dụng đối số được cung cấp:

sh -c 'echo $0' foo

Trong ví dụ này

$ /bin/sh -c 'echo foo; echo bar'
foo
bar

Shell được gọi với đối số echo foo; echo barxuất ra

foo
bar

8

Trong lệnh này:

echo foo

echolà nhị phân (hoặc lệnh tích hợp) và foolà đối số đầu tiên.

Đây:

/bin/sh -c echo foo

/bin/shlà nhị phân, có đối số đầu tiên là -cchính nó chấp nhận "chuỗi lệnh" làm tham số. Đây là echotrong ví dụ trên. Sau đó, có một đối số thứ ba: foođó là một đối số cho /bin/sh, không phải cho echo. Đó là lý do tại sao trong ví dụ thứ ba của bạn:

/bin/sh -c 'echo foo; echo bar'

... cả hai đều được in. Bạn trích dẫn lập luận. Do đó: đối số đầu tiên là -cvà tham số cho đối số này 'echo foo; echo bar'được hiểu toàn bộ là một đối số; là "chuỗi lệnh".


3

Cấu trúc sh -c wordchỉ thực thi từ (trong một vỏ).
Các từ được thêm có nghĩa là những thứ khác, như đối số 0, một, hai, v.v.:

sh -c word zero one two three

để giữ một lệnh có khoảng trắng là một từ, cần trích dẫn:

sh -c 'echo fnord' zero one two three

vì vậy, điều này in tất cả các đối số:

$ sh -c 'echo "args=" "$0" "$@"' zero one two three
args = zero one two three

Ví dụ

Trong ví dụ bạn trình bày: /bin/sh -c echo fooTừ đầu tiên (sau tùy chọn) là echo, đó là những gì được thực thi. Và một tiếng vang không có văn bản sẽ chỉ in một dòng mới, không có gì khác:

$ / bin / sh -c echo foo

Đó là lý do tại sao bạn nhận được một dòng trống.

Nếu bạn trích dẫn khoảng trắng, bạn sẽ thực hiện "một từ" (không có dấu cách), như sau:

$ / bin / sh -c echo \ foo
foo
$ / bin / sh -c "echo foo"
foo
$ / bin / sh -c 'echo foo'
foo

Phần kết luận

Giữ lệnh đã thực hiện dưới dạng một "từ" bằng cách sử dụng trích dẫn.

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.