Допустим, у нас есть файл bash следующего вида:
cd $(dirname "$0");
вместо прямого выполнения файла, что произойдет, если мы прочитаем файл, а затем передадим его через bash? Как интерпретируется "$0"?
echo "$(cat <file>)" | bash
Причина, по которой я спрашиваю, в том, что кажется неясным, что означает $0, поскольку файл больше не обязательно выполняется там, где он когда-то находился. Возможно, каким-то образом bash помнит, где он был расположен, и $0 по-прежнему относится к исходному местоположению файла? Кажется маловероятным.
$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
($0) Заменяется на имя оболочки или сценария оболочки. Это установлено на инициализация оболочки. Если Bash вызывается с файлом команд (см. Сценарии оболочки),
$0
устанавливается на имя этого файла. Если Баш начинается с опции-c
(см. Вызов Bash), затем$0
установить в первый аргумент после строки, которая должна быть выполнена, если он настоящее время. В противном случае устанавливается имя файла, используемое для вызова Bash, как задается нулевым аргументом.