фон
Это говорит [ article ]:
Команда подстановки расширяется к выходу команд. Эти команды выполняются в субоболочке ..
Но руководство Баш ничего не говорит о subshell
в своей команды замены секции.
Мой тест ниже
$ ps
PID TTY TIME CMD
26483 pts/25 00:00:00 bash
26866 pts/25 00:00:00 ps
$ hpid="$(ps | grep bash)"
$ echo "$hpid"
26483 pts/25 00:00:00 bash
26899 pts/25 00:00:00 bash
показывает, что новая оболочка с Pid 26899 был порождал во время подстановки команд. В этот момент я изменил переменную среды PATH
.
$ PATH="/some/rogue/path"
сделал ниже материал:
VAR="$(echo "Do|Die" | cut -d"|" -f 2)"
и получил ошибку ниже:
Command 'cut' is available in '/usr/bin/cut'
The command could not be located because '/usr/bin' is not included in the PATH environment variable.
cut: command not found
Я понимаю, что ошибка происходит из-за изменения переменной PATH среды, которая помогает оболочки найдите двоичные файлы. Однако я смущен, читая это вместе с подстановкой команд.
Если по $(..)
Подоболочка порождена, то PATH переменной окружении должна быть неповрежденными и должны указывать на двоичный (cut
в данном случае) и так баш не должен жаловаться, что он не может найти cut
двоичного.
Вопрос
Как модификация PATH
влияет на подстановку команд здесь?
Я думаю, что вы вводите в заблуждение изменения 'PATH' * в * подоболочке с изменениями в' PATH' *, унаследованными * подоболочкой. – chepner
@chepner: На самом деле я упускал из виду тот факт, что PATH является переменной окружения, и ее не нужно экспортировать, чтобы изменения были эффективными. – sjsam
А, ОК. Имейте в виду, что «экспорт» переменной действительно просто означает ее имя, так что * значение *, связанное с этим именем, добавляется в среду любых дочерних процессов. Переменная среды, являющаяся переменной, инициализированной из среды, автоматически экспортируется. – chepner