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

좋은 결과. 나는 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"
}

관련 정보