Обычно $0в сценарии задается имя сценария или как он был вызван (включая путь). Однако, если я использую bashэту -cопцию, $0устанавливается первый из аргументов, переданных после командной строки:
bash -c 'echo $0 ' foo bar
# foo
По сути, кажется, что позиционные параметры были смещены, но в том числе $0. Однако shiftв командной строке не влияет $0(как обычно):
bash -c 'echo $0; shift; echo $0 ' foo bar
# foo
# foo
Почему это явно странное поведение для командных строк? Обратите внимание, что я ищу причину, обоснование для реализации такого странного поведения.
Можно предположить, что такой командной строке не понадобится $0параметр, как обычно определяется, поэтому для экономии он также используется для обычных аргументов. Однако в этом случае поведение shiftстранно. Другая возможность заключается в том, что $0она используется для определения поведения программ (а-ля, bashназываемых shили vimназываемых как vi), но этого не может быть, поскольку $0здесь это видно только в командной строке, а не в программах, вызываемых внутри нее. Я не могу думать ни о каком другом использовании для $0, поэтому я затрудняюсь объяснить это.
echo 'echo the other side of this pipe globs "$@"' | sh -s -- *, хотя, к сожалению, $0обычно это не настраиваемый параметр с параметром -stream ... Хотя, в общем, его можно использовать многими из тех же способов xargs. И другие, кроме того.
--то, что могло бы иметь обычную интерпретацию «отсюда начинаются аргументы», что можно увидеть в некоторых других программах. Опять же, это может сбить с толку тех, с кем мы не знаем, -cчто на --самом деле такое толкование есть.
-для$0аргумента как идиомы, как и вsh -c 'foo $1 $2' - a b. Таким образом, это выглядит довольно нормально (как только вы узнали, что это-значит, то есть)