他のユーザーに切り替えたときにスクリプトが正しく機能するようにする

他のユーザーに切り替えたときにスクリプトが正しく機能するようにする

ファイルの各行からフォルダを作成するための以下のスクリプトについていくつかの懸念があります。 Folder.listは/scripts/にあります。最初のスクリプトはスムーズに実行されますが、別のユーザーに切り替えようとすると、2番目のスクリプトは機能しません。

--最初のスクリプト--

#!/bin/ksh
while read line
do
if [ ! -d $line ]
    then
     mkdir -p $line >/dev/null 2>&1 && echo "Directory $line created."
     else
    echo "Error: $line directory exists!"
   fi
done < folder.list

--2番目のスクリプト--

#!/bin/ksh
#Switch user
export SUDO_ASKPASS=/keys/askpass.sh
sudo -A su - appuser<<EOF

#Go to folder.list directory
cd /scripts/


while read line
do
if [ ! -d $line ]
    then
     mkdir -p $line >/dev/null 2>&1 && echo "Directory $line created."
    else
    echo "Error: $line directory exists!"
   fi
done < folder.list
EOF

答え1

より明確にするために

考える

cat <<EOF

foo bar $baz

EOF

fubar="Hello World"

cat <<EOF

echo $fubar
print \$fubar

EOF

実行すると与える

foo bar


echo Hello World
print $fubar

最初の猫では、$baz変数が消えることがわかります(設定されていないと仮定)。

2番目の実行では、その値をエコーするfubar変数をecho $fubarI escapeに設定しました$

2番目のスクリプトは次のようにする必要があります。

#!/bin/ksh
#Switch user
export SUDO_ASKPASS=/keys/askpass.sh
sudo -A su - appuser<<EOF

#Go to folder.list directory
cd /scripts/


while read line
do
if [ ! -d \$line ]
    then
     mkdir -p \$line >/dev/null 2>&1 && echo "Directory \$line created."
    else
    echo "Error: \$line directory exists!"
   fi
done < folder.list
EOF

関連情報