Thông thường, $0
trong một tập lệnh được đặt thành tên của tập lệnh hoặc theo bất kỳ tập lệnh nào được gọi là (bao gồm cả đường dẫn). Tuy nhiên, nếu tôi sử dụng bash
với -c
tùy chọn, $0
được đặt thành đầu tiên của các đối số được truyền sau chuỗi lệnh:
bash -c 'echo $0 ' foo bar
# foo
Trong thực tế, có vẻ như các tham số vị trí đã được thay đổi, nhưng bao gồm $0
. Tuy nhiên, shift
trong chuỗi lệnh không ảnh hưởng $0
(như bình thường):
bash -c 'echo $0; shift; echo $0 ' foo bar
# foo
# foo
Tại sao điều này rõ ràng hành vi kỳ lạ cho chuỗi lệnh? Lưu ý rằng tôi đang tìm kiếm lý do, lý do, đằng sau việc thực hiện hành vi kỳ quặc như vậy.
Người ta có thể suy đoán rằng một chuỗi lệnh như vậy sẽ không cần $0
tham số như thường được xác định, vì vậy để tiết kiệm, nó cũng được sử dụng cho các đối số bình thường. Tuy nhiên, trong trường hợp đó hành vi của shift
là kỳ quặc. Một khả năng khác là $0
được sử dụng để xác định hành vi của các chương trình (a la bash
được gọi là sh
hoặc vim
được gọi là vi
), nhưng điều đó là không thể, vì $0
ở đây chỉ được nhìn thấy trong chuỗi lệnh chứ không phải bởi các chương trình được gọi trong nó. Tôi không thể nghĩ ra bất kỳ cách sử dụng nào khác $0
, vì vậy tôi không thể giải thích điều này.
echo 'echo the other side of this pipe globs "$@"' | sh -s -- *
Tuy nhiên, bạn cũng có thể , không may, $0
nói chung không phải là một tham số có thể thiết lập được với -s
tùy chọn tream ... Mặc dù vậy, nó có thể được sử dụng theo nhiều cách tương tự xargs
. Và những người khác bên cạnh.
--
, sau đó có thể có cách giải thích thông thường là 'từ đây bắt đầu các cuộc tranh luận', được thấy trong một số chương trình khác. Sau đó, một lần nữa, điều đó có thể gây nhầm lẫn cho những người không quen -c
nghĩ rằng --
thực sự có cách giải thích đó.
-
cho$0
đối số như một thành ngữ, như trongsh -c 'foo $1 $2' - a b
. Cách này trông khá bình thường (một khi bạn phát hiện ra điều đó-
có nghĩa là gì)