Зазвичай $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як правило, не -sзадавати параметр з опцією трем ... Він , однак, може використовуватися багатьма тими ж способами xargs. І інші крім того.
--, тоді це могло б мати звичайне тлумачення "звідси починає аргументи", що спостерігається в деяких інших програмах. Знову ж таки, це може збити з пантелику тих, хто не знає, -cдумати, що --насправді має таке тлумачення.
-для$0аргументу як ідіоми, як і вsh -c 'foo $1 $2' - a b. Таким чином це виглядає досить нормально (як тільки ви дізналися, що це-означає)