shell 如何从我cd到的目录中运行命令

uurv41yg  于 2023-10-23  发布在  Shell
关注(0)|答案(2)|浏览(170)

我试图通过一些目录循环,并从每个运行命令。cd似乎可以工作(当我使用echo $dir检查时),但是myScript.py从父目录执行(好像cd不工作)。

for dir in $DIR_PROJECTS
 do
   cd $dir && /scripts/myScript.py -f $dir.xml
done
xdnvmnnf

xdnvmnnf1#

由于您在循环的每次迭代中循环并执行cd $dir,因此在运行脚本后,您需要返回到cd $dir之前的当前目录,否则下一次迭代将尝试从前一个$dir访问cd,如果您使用相对路径,这很可能会失败。
最方便的解决方案是在子shell中运行它:

(cd "$dir" && /scripts/myScript.py -f "$dir.xml")

这样,当前shell将永远不会cd,下一次迭代将具有与前一次相同的当前目录。

kxxlusnw

kxxlusnw2#

不要使用for dir in $DIR_PROJECTS,因为如果任何项目包含空格,它们将被拆分。
@EdMorton评论道:
[...]DIR_PROJECTS应该是for dir in "${DIR_PROJECTS[@]}"访问的数组,而不是标量变量[...]
如果DIR_PROJECTS中的项不是绝对路径,则脚本将无法工作,正如@TedLyngmo所解释的那样。
在脚本中更改目录通常很麻烦,所以最好尽可能避免。如果myScript.py使用的路径不限于当前工作目录,那么这将只使用find,而不更改目录:

DIR_PROJECTS=(
  "path1"
  "path2"
)

for dir in "${DIR_PROJECTS[@]}"; do
    /scripts/myScript.py -f "$dir.xml"
done

(请注意,我也用双引号将"$dir.xml"括起来,这也是防止$dir中出现空格和特殊字符的重要措施。

相关问题