Я пытаюсь выполнить неинтерактивную команду в оболочке входа в систему (использование su -
или sudo -i
) но не мог заставить его работать до сих пор.
В ~/.bashrc
Я получил сценарий, который устанавливает все переменные мои потребности приложения. Когда я делаю интерактивный вход в систему su - username
Я вижу все свои переменные там и если я запускаю свое приложение, оно хорошо работает. Однако, когда я пытаюсь выполнить свое приложение при помощи su - username -c 'command'
необходимые переменные не устанавливаются. Другими словами, это кажется su -
является несовместимым с -c
опция. То же происходит с sudo -i -u user command
.
Я искал тонны вопросов, но не мог найти ответ на это определенное поведение.
Согласно страницам справочника удара:
When bash is invoked as an interactive login shell, or as a non-interactive
shell with the `--login` option, it first reads and executes commands from the
file `/etc/profile`, if that file exists. After reading that file, it looks for
`~/.bash_profile`, `~/.bash_login`, and `~/.profile`, in that order, and reads and
executes commands from the first one that exists and is readable. The
`--noprofile` option may be used when the shell is started to inhibit this
behavior.
Вышеупомянутое поведение не работает как ~/.profile
выполняется ~/.bashrc
и это в свою очередь получает сценарий, который устанавливает все переменные.
Как я могу выполнить неинтерактивную оболочку входа в систему?
Спасибо
Можно получить переменный файл в сценарии. В Вашем сценарии включайте следующую строку прежде, чем сослаться на любую из переменных:
source full_path_to_variable_file
Это считает Ваши переменные в сессию сценария. Необходимо использовать весь литеральный путь (никакие псевдонимы), начиная с корневого каталога' / ', так например, если .bash_aliases корневого каталога определяет переменные:
source /home/felima/.bash_aliases
На командной строке '.' имеет тот же эффект
. ~/.bash_aliases
Но в сценариях с помощью 'источника' более ясно.