Я выполняю на оболочке Ubuntu 12.04 следующую команду:

sudo bash -c "echo $PATH; which python"

который отображает что-то вроде

/home/me/env/develop/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
/usr/bin/python

и следующая команда

ls /home/me/env/develop/bin

диспли (среди других)

python

Согласно man страницам команда which ищет данный исполняемый файл во всех путях, определенных в PATH . Страница man строго не определяет «порядок» поиска, но обычно она проходит от начала до конца переменной среды PATH .

Теперь путь /home/me/env/develop/bin содержит исполняемый файл python (правильно установленные режимы, а не символическую ссылку), который также является первым путем в PATH . Но команда which отображает совершенно другое местоположение!

Это почему? Я делаю что-то глупое? Это волшебным образом связано с sudo? Это ошибка?

1 ответ1

2

Это не ошибка. $PATH в двойных кавычках раскрывается вашей оболочкой еще до того, как bash -c это увидит.

Это означает, что вы действительно запустите:

sudo bash -c "echo /home/me/env/develop/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games; which python"

Небольшой тест:

$ foo="hello"
$ sudo bash -c "echo $foo"
hello

Чтобы добраться до корня вашей проблемы, запустите:

sudo bash -c 'echo $PATH; which python'

Это не расширит $PATH раньше.

Решением проблемы с вашим путем было бы установить путь в вашем .bashrc вместо .bash_profile - то есть, если я предполагаю, что ваш путь указан правильно - так, что он загружается даже для оболочек, не входящих в систему (как в bash -c). Или вы запускаете bash -lc чтобы вместо этого запустить оболочку входа в систему, которая загрузит .bash_profile .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .