Zwykle $0w skrypcie ustawiana jest nazwa skryptu lub cokolwiek, co zostało wywołane jako (w tym ścieżka). Jeśli jednak używam bashz tą -copcją, $0jest ustawiony na pierwszy z argumentów przekazanych po ciągu polecenia:
bash -c 'echo $0 ' foo bar
# foo
W efekcie wydaje się, że parametry pozycyjne zostały przesunięte, ale obejmują $0. Jednak shiftw ciągu polecenia nie ma wpływu $0(jak zwykle):
bash -c 'echo $0; shift; echo $0 ' foo bar
# foo
# foo
Dlaczego to pozornie dziwne zachowanie ciągów poleceń? Zauważ, że szukam powodu, uzasadnienia, za wdrożeniem tak dziwnego zachowania.
Można spekulować, że taki ciąg komend nie wymagałby $0parametru jak zwykle zdefiniowano, więc dla oszczędności jest on również używany do zwykłych argumentów. Jednak w takim przypadku zachowanie shiftjest dziwne. Inną możliwością jest $0zdefiniowanie zachowania programów (la bashnazywane jako shlub vimnazywane as vi), ale nie może tak być, ponieważ $0tutaj jest widoczne tylko w ciągu poleceń, a nie przez programy w nim wywołane. Nie mogę wymyślić żadnego innego zastosowania $0, więc nie mogę tego wyjaśnić.
echo 'echo the other side of this pipe globs "$@"' | sh -s -- *, niestety, $0generalnie nie być ustawialnym parametrem z -sopcją tream ... Można go jednak używać na wiele takich samych sposobów xargs. I inne poza tym.
--, to mogłaby mieć zwykłą interpretację „stąd zaczynają się argumenty”, widzianą w niektórych innych programach. Z drugiej strony może to być mylące dla osób, które nie są zaznajomione z -cmyśleniem, że --faktycznie mają taką interpretację.
-dla$0argumentu jako idiomu, jak wsh -c 'foo $1 $2' - a b. W ten sposób wygląda to całkiem normalnie (gdy się dowiesz, co to-znaczy)