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?
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:
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.
sh -c 'echo "$@"' fnord a b c d ...
sh -c 'echo $0' foo
khô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'
$ echo foo
foo
Cuộc gọi này echo
với đối số foo và foo được in.
$ /bin/sh -c echo foo
Điều này gọi shell với đối số echo
và cung cấp foo làm đối số
$0
. Đầu echo
ra 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 bar
xuất ra
foo
bar
Trong lệnh này:
echo foo
echo
là nhị phân (hoặc lệnh tích hợp) và foo
là đối số đầu tiên.
Đây:
/bin/sh -c echo foo
/bin/sh
là nhị phân, có đối số đầu tiên là -c
chính nó chấp nhận "chuỗi lệnh" làm tham số. Đây là echo
trong 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à -c
và 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".
Cấu trúc sh -c word
chỉ 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
Trong ví dụ bạn trình bày: /bin/sh -c echo foo
Từ đầ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
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.
sh -c 'echo $1' echo foo