我正在尝试在 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"
}