- 我
$USER
的$SHELL
环境变量是/bin/zsh
- 我的根的
$SHELL
环境变量是/bin/bash
我正在运行 Unix shell 脚本作为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
实际上 root 的 env 是可行的。如何获取$SHELL
of$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
...
但是,如果您想要发出命令的确切 shell 的值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
...