Расширение переменной оболочки - косвенное обращение при вызове утилиты с env - PullRequest
2 голосов
/ 09 января 2010

Я пытался выяснить env, (то есть вызов утилиты в новой среде).

Просто в качестве примера моя переменная окружения KDEDIRS = / usr в моей текущей среде и, скажем, я набираю:

env -i KDEDIRS=/home/newkdedir env

Это выводит KDEDIRS = / home / newkdedir , как и ожидалось. (то есть вызов второго env с новой средой)

Теперь я хочу позвонить, сказать, утилита эхо так же

env -i KDEDIRS=/home/new_kdedir echo ${KDEDIRS}

Это явно не сработает, потому что. Оболочка расширяет KDEDIRS, прежде чем она получит эхо. Таким образом, вывод составляет / usr (т.е. значение в текущей среде)

Тогда я попробую косвенное обращение и наберу

env -i KDEDIRS=/home/newkdedir echo ${!KDEDIRS} 

Это ничего не выводит.

Я могу быть немного озадачен этим, но как мне заставить оболочку расширить эту переменную KDEDIRS в соответствии с недавно созданной средой для echo ?

Ответы [ 2 ]

5 голосов
/ 09 января 2010

Расширение происходит как часть построения командной строки env, которая также устанавливает переменную. При выполнении этой команды расширение не выполняется. Таким образом, вы должны добавить другой расширитель командной строки как часть этой команды. Э.Г.

env -i KDEDIRS=/home/newkdedir /bin/sh -c 'echo $KDEDIRS'
KDEDIRS=/home/newkdedir eval 'echo $KDEDIRS'

Косвенное отношение не имеет к этому никакого отношения.

0 голосов
/ 09 января 2010

Обычно вы используете `env ', чтобы дать окружение команде, которую она породила (например, как вы делали в своем первом фрагменте). Печать переменной обратно (которая тоже использует встроенную оболочку) может быть возможна с помощью некоторых извращенных экранировок и уловок подоболочек, но это не очень распространенный вариант использования (по крайней мере, по моему опыту).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...