Почему `sudo su -l -c" java "` работает, даже если `sudo su -l -c 'echo $ PATH" `отображает местоположение двоичного файла java?

У меня есть сервер с двоичными файлами Java из tarball в настраиваемом месте, а в /etc/bash.bashrc :

 export JAVA_HOME=/path/to/java/home export PATH=$JAVA_HOME/bin:$PATH 

Когда я запускаю sudo su -l -c "java" , я получаю -su: java: command not found . Однако, когда я sudo su -l напрямую, я могу запускать java без ошибок.

Кроме того, sudo su -l -c "echo $PATH включает в себя местоположение java .

Почему sudo su -l -c "java" не запускается?

EDIT: Несмотря на то, что это /etc/bash.bashrc а не ~/.bashrc , те же рассуждения применяются в связанном вопросе / ответе.

  • Как я могу работать как другой пользователь?
  • В чем разница между 'sudo' и 'su -c'
  • В чем разница между «su -» и «su root»?
  • «PermitRootLogin no» в конфигурации sshd не предотвращает `su``
  • Автоматизация su login без запроса пароля
  • Почему утилита-linux runuser (su) вилка?
  • В команде `sudo find`, как я могу убедиться, что команда` -exec` запускается как обычный пользователь?
  • Аутентификация ключа ssh не работает из сети / if-up.d / scripts
  • 2 Solutions collect form web for “Почему `sudo su -l -c" java "` работает, даже если `sudo su -l -c 'echo $ PATH" `отображает местоположение двоичного файла java?”

    dhag объяснил, почему $PATH кажется правильным, хотя это не так.

    Причина, по которой путь не изменяется, скорее всего, что su не запускает оболочку в интерактивном режиме, что означает, что либо bash.bashrc не выполняется в первую очередь, либо что он уходит, прежде чем что-либо делать, потому что обнаруживает, что он не работает в интерактивном режиме.

    Вам нужно либо указать полный путь вместо имени команды, либо узнать, где установлен путь по умолчанию, и изменить его там.

    Когда вы запускаете sudo su -l -c "echo $PATH" , $PATH расширяется в исходной оболочке, потому что двойные кавычки не предотвращают это расширение. Вы хотите, чтобы sudo su -l -c 'echo $PATH' расширялся в оболочке su .

    Я предполагаю, что последующий вопрос будет «тогда как я могу запустить java »? Я предлагаю либо вызывать java с полным путем, либо, и это может работать или не работать, вручную пытаясь загрузить надлежащий файл rc, что-то вроде su -c '. /etc/bash.bashrc; java ...' su -c '. /etc/bash.bashrc; java ...' su -c '. /etc/bash.bashrc; java ...' .

    Interesting Posts

    Я хочу использовать «sed» для вставки новых строк (одна строка превращается в сотни)

    Существуют ли какие-либо файлы конфигурации editline, чтобы заставить его действовать больше как readline?

    Можно ли запустить фоновый процесс с определенным рабочим каталогом?

    Динамическая конфигурация мониторов (Debian, Intel i915)

    Является ли защита информации менее жесткой в ​​системе с открытым исходным кодом?

    Как я могу использовать awk для извлечения URL из HTML-файла?

    Как удалить набор из portage

    Почему голова; хвост в большом файле иногда занимает много времени, а иногда нет?

    chromeos – не удалось прочитать таблицу разделов

    Postfix: запретить пользователям изменять реальный адрес электронной почты

    Какова цель настроек по умолчанию / etc / securetty в Debian?

    Вызов сценария с помощью ld-linux.so?

    Аутентификация, не работающая в Dovecot и PostgreSQL

    Ошибка Preseed с выходом 2

    Что делает systemctl enable netctl.service

    Linux и Unix - лучшая ОС в мире.