在 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

效果很好。我以我创建的用户“deployer”登录,具有 sudoer 权限,与 dir_setup.sh 的所有者相同的用户,具有 777 权限。

如果我从函数中取出该行并将其放在其他地方,它也可以正常工作。知道为什么我需要调用 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"
}

还要注意,我在使用变量时用双引号括起来,这样它们的值就不会被 shell 解析。

您还可以以牺牲一些日志记录为代价来简化此操作:

create_dir() {
    local path="$1" owner="$2"

    printf "\n* Creating directory %s\n" "$path"
    sudo mkdir -p "$path"
    sudo chown "$owner" "$path"
}

相关内容