Что происходит с "$0" при передаче данных в bash

Допустим, у нас есть файл bash следующего вида:

cd $(dirname "$0");

вместо прямого выполнения файла, что произойдет, если мы прочитаем файл, а затем передадим его через bash? Как интерпретируется "$0"?

echo "$(cat <file>)" | bash

Причина, по которой я спрашиваю, в том, что кажется неясным, что означает $0, поскольку файл больше не обязательно выполняется там, где он когда-то находился. Возможно, каким-то образом bash помнит, где он был расположен, и $0 по-прежнему относится к исходному местоположению файла? Кажется маловероятным.

-1
28.06.2017, 05:05
1 ответ

$0тогда будет именем, под которым был вызван bash:

$ printf '%s\n' 'echo $0' | bash
bash
$ printf '%s\n' 'echo $0' | ARGV0=sh bash
sh
$ printf '%s\n' 'echo $0' | ARGV0='blah blah' bash
blah blah

Вторая и третья команды были запущены в zsh, что позволяет вам установить 0-й аргумент с помощью специальной переменной АРГВ0. Но вы можете имитировать это, используя символические ссылки:

$ ln -s "$(command -v bash)" foo
$ printf '%s\n' 'echo $0' | ./foo
./foo

Из руководства по bash:

($0) Заменяется на имя оболочки или сценария оболочки. Это установлено на инициализация оболочки. Если Bash вызывается с файлом команд (см. Сценарии оболочки), $0устанавливается на имя этого файла. Если Баш начинается с опции -c(см. Вызов Bash), затем $0 установить в первый аргумент после строки, которая должна быть выполнена, если он настоящее время. В противном случае устанавливается имя файла, используемое для вызова Bash, как задается нулевым аргументом.

3
28.01.2020, 05:07

Теги

Похожие вопросы