sudo-E не может экс-милый некоторые команды, расположенные в домашнем dir?

Существует больше чем один способ сделать это:

perl -nle 'print $1 if /\((.*)\)/' file

или:

awk 'NR > 1 {print $1}' RS='(' FS=')' file
2
07.09.2014, 00:40
2 ответа

Нет, это не так! (/home/usr/opt/android/platform-tools не находится в PATH в среде sudo). ${PATH} вычисляется вашей оболочкой до запуска sudo, таким образом заменяя значение PATH до запуска sudo, а не значение в пределах sudo.

Вы правы, если подозреваете, что PATH. Однако в связи с порядком оценки вы получите неверный ответ.

Вам нужно сделать sudo -E /home/usr/opt/android/platform-tools/adb

3
27.01.2020, 22:00

Как вы обнаружили, sudo сбрасывает $ PATH . Вы можете указать полный путь к утилите, которую хотите запустить, и в большинстве простых случаев это работает нормально. Но могут возникнуть ситуации, когда вам нужно сохранить $ PATH , например, если программе нужно вызвать другие программы, не найденные в $ PATH , которые предоставляет sudo .

Самый простой способ сделать это:

sudo env PATH="$PATH" mycmd

Это использует порядок оценки оболочки. $ PATH раскрывается перед запуском sudo , поэтому фактически он становится:

sudo env PATH="/usr/local/sbin:/usr/local/bin:..." mycmd

sudo , затем просто вызывает env , который устанавливает $ PATH в соответствии с инструкциями, а затем вызывает mycmd .

Обратите внимание, что это работает, только если ваш доступ к sudo не ограничен, и вы можете запускать любую команду (или любую команду env в любом случае).

1
27.01.2020, 22:00

Теги

Похожие вопросы