Почему echo $0 не печатает имя скрипта в bash?

В школе я узнал, что "$0" будет именем скрипта в bash, но когда я пытаюсь напечатать его, он на самом деле печатает -bash вместо имени скрипта.

#!/bin/bash
echo "$0"

Вывод: -баш

Я что-то пропустил, или есть другая команда, чтобы получить имя скрипта?


person Stefan    schedule 16.04.2018    source источник
comment
Используйте $BASH_SOURCE, а не $0. $0 обычно ненадежен, как описано в BashFAQ #28.   -  person Charles Duffy    schedule 16.04.2018


Ответы (2)


Вы запускаете echo "$0" из интерактивной оболочки, а не из скрипта. Может быть, вы поместили его в скрипт, но затем использовали скрипт вместо того, чтобы вызывать его?

$ cat > 1.sh
#!/bin/bash
echo "$0"
$ chmod u+x 1.sh
$ ./1.sh
./1.sh

Но

$ echo "$0"
bash
$ . ./1.sh
bash
person choroba    schedule 16.04.2018
comment
Хорошо спасибо. я попробую - person Stefan; 16.04.2018

Используйте $BASH_SOURCE, а не $0, как описано в BashFAQ #28, или, что еще лучше, < em>не полагайтесь на возможность точного определения местонахождения вашего скрипта.

  • $0 устанавливается вызывающей стороной и может быть любой произвольной строкой — нет гарантии, что она имеет какое-либо отношение к месту, из которого читается скрипт.

    Чтобы продемонстрировать это, попробуйте запустить (exec -a arbitrary-name ./your-script), который выполнит your-script с $0 установленным на arbitrary-name.

  • $0 не обновляется должным образом, когда скрипт имеет значение sourced или когда функция, считанная из файла, выполняется откуда-то еще; тогда как $BASH_SOURCE обновляется в этих случаях.

  • Локальное имя файла может вообще не существовать. Рассмотрим случай, когда ваш скрипт запускается с ssh remotehost 'bash -s' <./scriptname: нет локального имени файла, соответствующего исходному коду вашего скрипта.

person Community    schedule 16.04.2018