Зазвичай $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
. Таким чином це виглядає досить нормально (як тільки ви дізналися, що це-
означає)