Bash

在 BASH 腳本中的函式內部呼叫時找不到 SUDO

  • February 9, 2020

我正在嘗試在 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: line 15: sudo: command not found**

Sudo 命令已安裝並按預期工作。在呼叫 dir_setup.sh 時使用或不使用 sudo 如果我將行更改為

sudo chown $OWNER $PATH

/usr/bin/sudo chown $OWNER $PATH

它工作正常。我以我創建的使用者“部署者”身份登錄,擁有 sudoer 權限,dir_setup.sh 的所有者是同一使用者,擁有 777 權限。

如果我從函式中取出那條線並將其放在其他地方,它也可以正常工作。知道為什麼我需要使用**/usr/bin/sudo**呼叫 sudo而不是sudo在函式內部使用 when 呼叫它嗎?為什麼它在函式之外起作用?

您重新定義了保留變數$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"
}

引用自:https://unix.stackexchange.com/questions/566652