我的剧本循环遍历所有子子目录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