- 私の
$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
基本シェルで直接閲覧できます。
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
...