스크립트의 cd 기능이 작동하지 않는 이유는 무엇입니까?

스크립트의 cd 기능이 작동하지 않는 이유는 무엇입니까?

디렉터리를 변경한 다음 파일을 검색하는 스크립트를 작성했습니다.

#!/bin/bash
model_dir=/mypath

function chdir () {
  cd $1
}
chdir ${model_dir}/config
if [[ ! -s *.cfg ]]
then
  echo `date` "configure file does not exist"
  exit 1
fi

.source myscript.sh

답변1

귀하의 스크립트(특히 내부 cd명령)는 또는 이와 동등한 기능을 사용하여 호출하면 제대로 작동합니다.bashsource.

주요 문제는 @adonis가 이미 주석에서 지적했듯이 "*.cfg"라는 파일이 실제로 존재하지 않는 한 디렉토리를 올바르게 변경한 후 쉘이 종료된다는 것입니다. 이는 매우 의심스럽습니다.

*.cfg를 패턴으로 사용하려는 것 같습니다. 예상대로 작동하도록 스크립트를 약간 수정하는 방법은 다음과 같습니다.

#!/bin/bash # Note that the shebang is useless for a sourced script

model_dir=/mypath

chdir() { # use either function or (), both is a non portable syntax
  cd $1
}

chdir ${model_dir}/config
if [ ! -s *.cfg ]; then # Single brackets here for the shell to expand *.cfg
  echo $(date) "configure file does not exist"
  exit 1  # dubious in a sourced script, it will end the main and only shell interpreter
fi

답변2

cd현재 쉘 환경이 아닌 스크립트 내부에서 명령이 실행되기 때문이다 . 현재 쉘 환경에서 스크립트를 실행하려면 다음과 같이 실행하십시오.

. /path/to/script.sh

pwd귀하의 명령문이 대체된 내 스크립트의 실제 예제 출력 if:

Jamey@CNU326BXDX ~
$ /usr/local/bin/this.sh
/cygdrive/c/users/jamey/downloads

Jamey@CNU326BXDX ~
$ . /usr/local/bin/this.sh
/cygdrive/c/users/jamey/downloads

Jamey@CNU326BXDX /cygdrive/c/users/jamey/downloads
$

스크립트를 두 번째 실행한 후 현재 작업 디렉터리를 기록해 둡니다.

관련 정보