- 내
$USER
환경$SHELL
변수는/bin/zsh
- 루트에 대한 내
$SHELL
환경 변수는 다음과 같습니다./bin/bash
저는 Unix 쉘 스크립트를 로 실행하고 있습니다 sudo
. 이 스크립트에서는 $SHELL
env 변수 $SUDO_USER
가 /bin/zsh
. 그러나 이 명령에서는 다음을 수행합니다.
if [ $SHELL != "/bin/zsh" ]; then
pacman -S --needed --no-confirm zsh
sudo -u $SUDO_USER chsh -s /usr/bin/zsh
fi
$SHELL
실제로 루트의 환경은 가능합니다. 어떻게 가나 $SHELL
요 $SUDO_USER
?
감사해요.
편집하다
가장 좋은 방법은 $SHELL
이 변수 외에 다른 환경 변수를 갖는 것입니다.
답변1
옵션을 사용하여 환경을 호스팅합니다 -E, --preserve-env
. sudo
예를 들어 sudo -E ./test.sh
.
어떠한 환경도 허용하는 것은 권장되지 않습니다. 보다명령 환경에 참여 man sudoers
.
답변2
일반적으로 환경 $SHELL
변수는 /etc/passwd
사용자가 입력한 7번째 필드를 기준으로 설정되므로,$SUDO_USER
기본shell에서 직접 찾아볼 수 있습니다.
if [ $(getent passwd $SUDO_USER | cut -d: -f 7) != "/bin/zsh" ]; then
...
그러나 명령이 실행된 정확한 쉘의 값을 원한다면 sudo
상위 프로세스의 환경을 살펴봐야 합니다.
get_ppid() {
ps -ho ppid -p "$1" | tr -d " "
}
SUDO_USERS_SHELLPID=$(get_ppid $( get_ppid $$ )) # get the PID of this shell's grandparent
# if you want the actual pathname of the shell used as the grandparent process:
if [ $(readlink /proc/$SUDO_USERS_SHELLPID/exe) != "/bin/zsh" ]; then
...
# or if you want the $SHELL environment value from the grandparent process:
if [ $(strings /proc/$SUDO_USERS_SHELLPID/environ | awk -F= '/^SHELL=/{ print $2; }') != "/bin/zsh" ]; then
...