シェルスクリプトから `$SUDO_USER` 環境変数にどのようにアクセスしますか?

シェルスクリプトから `$SUDO_USER` 環境変数にどのようにアクセスしますか?
  • 私の$USER環境$SHELL変数は/bin/zsh
  • ルートの私の$SHELL環境変数は次のとおりです。/bin/bash

私はUnixシェルスクリプトを使って実行していますsudo。このスクリプトでは$SHELLenv 変数$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-envsudoたとえば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
  ...

関連情報