BASHスクリプトから関数の内部を呼び出すとSUDOが見つかりません。

BASHスクリプトから関数の内部を呼び出すとSUDOが見つかりません。

ディレクトリを作成し、次のように所有権を設定する関数を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"
}

おすすめ記事