ディレクトリを作成し、次のように所有権を設定する関数をBashで作成しようとしています。
create_dir() {
local PATH=$1
local OWNER=$2
# create log directory
echo -e "\n* Creating directory $PATH"
if [[ -d $PATH ]]
then
echo " * $PATH already exist, no action done"
else
echo " * $PATH does not exist, creating dir"
sudo mkdir $PATH
fi
sudo chown $OWNER $PATH
}
次に、次の同じスクリプトから呼び出します。
# create upload directory, and set owner
create_dir "/www/upload" "deployer"
スクリプトを実行するとき:
sudo ./dir_setup.sh
結果は次のとおりです。
*ログディレクトリの作成/ www/upload * /www/uploadがすでに存在し、操作が実行されていません。/dir_setup.sh:行15:sudo:コマンドが見つかりません。
sudo コマンドがインストールされ、期待どおりに動作します。 dir_setup.sh を呼び出すとき、sudo を使用する場合と使用しない場合は同じことが発生します。
sudo chown $OWNER $PATH
到着
/usr/bin/sudo chown $OWNER $PATH
良い結果。私は777権限を持つdir_setup.shの所有者と同じユーザーであるsudoer権限を使用して作成したユーザー「配布者」としてログインしました。
関数からその行を取り出して他の場所に置いてもうまく機能します。なぜsudoを呼び出すのか知っていますか?/usr/bin/sudosudo
関数内でwhileを使用して呼び出す代わりに?関数の外で動作するのはなぜですか?
答え1
$PATH
検索コマンドに使用される一連の場所を含む予約変数をオーバーライドしましたsudo
。
変数名にはすべて大文字を使用しないでください。すべてが大丈夫でしょう。
create_dir() {
local path="$1"
local owner="$2"
# create log directory
printf "\n* Creating directory %s\n" "$path"
if [[ -d "$path" ]]
then
printf " * %s already exists, no action done\n" "$path"
else
printf " * %s does not exists, creating dir\n" "$path"
sudo mkdir "$path"
fi
sudo chown "$owner" "$path"
}
また、変数の周囲に二重引用符を使用して、その値がシェルから解析されないようにします。
いくつかのロギングを犠牲にしてこれを単純化することもできます。
create_dir() {
local path="$1" owner="$2"
printf "\n* Creating directory %s\n" "$path"
sudo mkdir -p "$path"
sudo chown "$owner" "$path"
}