Bash:如何循环设置当前工作目录为当前目录?

Bash:如何循环设置当前工作目录为当前目录?

我的剧本循环遍历所有子子目录pdflatex并对所有 .tex 文件调用命令:

#!/usr/bin/env bash

shopt -s globstar

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

我的问题

如何在循环中将当前工作目录设置为当前子子目录?

类似问题:如何将当前工作目录设置为脚本目录?

我为什么问

我的 .tex 文件包含相对路径,这就是为什么编译器仅在当前工作目录是文件所在目录时才起作用。

答案1

您需要将cd命令放入循环内。问题是您的路径是相对于当前目录的,因此工作目录必须在每次迭代开始时重置回起点,以便cd使用相对路径。子( ... )shell 为我们执行此操作(目录更改仅在子 shell 范围内持续)。

#!/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

相关内容