2016-06-30 4 views
2

фон

Это говорит [ 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 влияет на подстановку команд здесь?

+1

Я думаю, что вы вводите в заблуждение изменения 'PATH' * в * подоболочке с изменениями в' PATH' *, унаследованными * подоболочкой. – chepner

+0

@chepner: На самом деле я упускал из виду тот факт, что PATH является переменной окружения, и ее не нужно экспортировать, чтобы изменения были эффективными. – sjsam

+2

А, ОК. Имейте в виду, что «экспорт» переменной действительно просто означает ее имя, так что * значение *, связанное с этим именем, добавляется в среду любых дочерних процессов. Переменная среды, являющаяся переменной, инициализированной из среды, автоматически экспортируется. – chepner

ответ

4

Рассмотрим пример ниже:

$ export PS1='\$\$=$$ \$ ' 
$$=30862 $ a=123 # Note: No export a here. 
$$=30862 $ echo $a 
123 
$$=30862 $ bash 
$$=31133 $ echo $a # Subshell explicitly created does not have it. 

$$=31133 $ exit 
$$=30862 $ echo $(eval 'echo $a') # This subshell however does inherit it. The single quote ensures that this is not evaluated by parent shell. 
123        # echo $(echo $a) would probably cause $a to be evaluated by parent shell. 
$$=30862 $ 

Короче говоря, подоболочек порождены $(...) наследуют же среде, как родительской оболочки, даже если переменная не экспортируется. (Даже $$ такой же, как и исходная оболочка.)

+0

Отлично! Не могли бы вы привести «наследовать ту же среду, что и родительская оболочка», из документации. – sjsam

+0

^^ Что я не мог найти ': - /'. Повторяю ... – anishsane

+0

Нет проблем .. Не спешите. – sjsam