디렉터리를 생성한 다음 다음과 같이 소유권을 설정하는 함수를 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"
}