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

おすすめ記事