
Имея простой сценарий:
echo "file: $0"
при вызове следующим образом:
bash мойскрипт.sh
или
./myscript.sh
выдает имя файла скрипта ( file: myscript.sh
), как и ожидалось, но при вызове:
исходный файл myscript.sh
или
. ./myscript.sh
указывает имя оболочки ( bash
) вместо имени файла скрипта.
Почему это так?
решение1
Первый вызов запустит новый экземпляр bash для интерпретации скрипта, то есть bash установит $0
свой путь.
Второй вызов будет рассматривать файл как исполняемый и запустит его, поэтому $0
будет указывать на него.
Последние два вызова загрузят файл в текущий экземпляр bash, поэтому $0
будут указывать туда.
Примечание: для пункта 2 необходимо, чтобы файл был исполняемым, а для пунктов 1, 3 и 4 — нет.