Bash: 루프에서 현재 작업 디렉터리를 현재 디렉터리로 설정하는 방법은 무엇입니까?

Bash: 루프에서 현재 작업 디렉터리를 현재 디렉터리로 설정하는 방법은 무엇입니까?

내 스크립트모든 하위 하위 디렉터리를 반복합니다.pdflatex그리고 모든 .tex 파일에 대해 명령을 호출합니다.

#!/usr/bin/env bash

shopt -s globstar

for d in ./*/**/*.tex; do
  echo pdflatex "$d"
done

내 질문

루프에서 현재 작업 디렉터리를 현재 하위 디렉터리로 설정하는 방법은 무엇입니까?

유제:현재 작업 디렉토리를 스크립트 디렉토리로 설정하는 방법은 무엇입니까?

내가 왜 물어?

내 .tex 파일에는 상대 경로가 포함되어 있으므로 현재 작업 디렉터리가 파일이 있는 디렉터리인 경우에만 컴파일러가 작동합니다.

답변1

cd루프 안에 명령을 넣어야 합니다 . 문제는 경로가 현재 디렉터리를 기준으로 하므로 cd상대 경로를 사용 하려면 각 반복이 시작될 때 작업 디렉터리를 시작점으로 다시 재설정해야 한다는 것입니다 . 서브셸이 ( ... )이 작업을 수행합니다(디렉터리 변경 사항은 서브셸 범위 내에서만 유지됩니다).

#!/usr/bin/env bash
shopt -s globstar

for d in ./*/**/*.tex
do
    dir="${d%/*}"     # Strip the *.tex pathname back to the containing directory
    tex="${d##*/}"    # Strip the *.tex pathname back to just the filename

    echo "Will process $tex in the subdirectory $dir" >&2
    (
        cd "$dir" || exit
        pdflatex "$tex"
    )
done

관련 정보