특정 파일을 찾을 때까지 현재 디렉터리를 팝합니다.

특정 파일을 찾을 때까지 현재 디렉터리를 팝합니다.

다음 동작을 사용하여 스크립트를 작성하고 싶습니다.

  1. 현재 디렉터리에 build.xml 파일이 있는지 확인하고, 그렇다면 스크립트에 대한 인수를 통해 제공된 명령을 실행하세요.
  2. 그렇지 않은 경우 현재 디렉토리를 팝하고 상위 디렉토리를 살펴보십시오. 1로 이동합니다.

파일을 찾거나 루트에 도달하면 스크립트가 종료됩니다. 또한 스크립트가 완료되고 제어권이 사용자에게 다시 돌아오면 현재 디렉토리를 스크립트가 처음에 있었던 디렉토리로 만들고 싶습니다.

저는 쉘 스크립팅에 익숙하지 않지만 도움이나 안내를 주시면 감사하겠습니다.

답변1

Bash에서는 다음과 같이 이를 달성할 수 있습니다.

mkt.sh

curr=`pwd`
file_name=build.xml
echo "Current directory: $curr"
while [ "$curr" != "/" ]; do
  echo "Processing: $curr"
  file="$curr/$file_name"
  if [ -f "$file" ]; then
    echo "Found at: $file, running command..."
    cd "$curr"
    "$@"
    exit
  fi
  curr="`dirname \"$curr\"`"
done
echo "$file_name not found."

샘플 실행:

~$ cd /tmp
/tmp$ ls mkt.sh
mkt.sh
/tmp$ mkdir -p a/b/c/d
/tmp$ echo hello > a/build.xml
/tmp$ find a
a
a/build.xml
a/b
a/b/c
a/b/c/d
/tmp$ cd a/b/c/d
/tmp/a/b/c/d$ /tmp/mkt.sh cat build.xml
Current directory: /tmp/a/b/c/d
Processing: /tmp/a/b/c/d
Processing: /tmp/a/b/c
Processing: /tmp/a/b
Processing: /tmp/a
Found at: /tmp/a/build.xml, running command...
hello
/tmp/a/b/c/d$ rm /tmp/a/build.xml 
/tmp/a/b/c/d$ r/tmp/mkt.sh cat build.xml
Current directory: /tmp/a/b/c/d
Processing: /tmp/a/b/c/d
Processing: /tmp/a/b/c
Processing: /tmp/a/b
Processing: /tmp/a
Processing: /tmp
build.xml not found.

또한 스크립트가 완료되고 제어권이 사용자에게 다시 돌아오면 현재 디렉토리를 스크립트가 처음에 있었던 디렉토리로 만들고 싶습니다.

Bash에서는 이 작업을 수행할 필요가 없습니다. 하위 스크립트는 상위 bash 프로세스의 현재 비밀번호를 변경할 수 없습니다. 이 시도:

$ cd /tmp
$ echo "cd /usr" > a.sh
$ chmod u+x a.sh
$ pwd
/tmp
$ cat a.sh
cd /usr
$ ./a.sh
$ pwd
/tmp

보시다시피 현재 비밀번호는 스크립트 cd /usr내부에서 변경되었음에도 불구하고 변경되지 않았습니다.

관련 정보