Bash
在 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: 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" }