如何使用 bash 脚本在不同的文件夹中 运行 执行文件?

How can I run executable in a different folder with a bash script?

我有一个程序,a.out,它将在文件夹的某个序列中设置,每个文件夹都有一个 a.out,并且会在每个文件夹中产生一些结果。我正在尝试并行执行这些相同的程序。如果我在文件夹中,我只需执行 ./a.out,它就会 运行。我必须在其文件夹中执行 a.out 因为 a.out 在当前目录中查找文件。所以如果我不在它的文件夹中,它就找不到那个文件。

运行 这些程序是另一个基于 rootDir 的作业的一部分。我正在使用 MATLAB,所以我试图避免在 MATLAB 中使用 cd,因为每次我使用 cd 时都会重新编译 MATLAB 代码并大大降低代码速度。

我用MATLAB代码写了一个CallParallel.sh,里面有这一行:

for i in ${JobsOnThisNode[@]};do echo $i;done | xargs -n1 -P ${SLURM_NTASKS_PER_NODE} sh  -c '""' sh;

$1 基本上为由 jname 和 cname 递增的每批并行作业获取此命令:

cd /mnt/home/thrust2/zf1005/Matlab/GAFit/RunningFolder/$jname/$cname/ && ./a.out

我已经从 rootDir 测试了这段代码,它成功地 运行 将这个程序保存在另一个文件夹中。但是,当我在 bash 脚本中执行它时,出现以下错误:

sh: /mnt/home/thrust2/zf1005/Matlab/GAFit/RunningFolder/1/1/: Is a directory
sh: &&: command not found
sh: ./a.out: No such file or directory

如果我理解正确,不知何故它不识别 && 和 cd 不知何故只检查它是否是一个目录而不是实际更改到该目录,因此,没有 a.out在 rootDir 中找到。

当我尝试这个时:

sh '"cd /mnt/home/thrust2/zf1005/Matlab/GAFit/RunningFolder/1/1"'

我得到:

sh: "cd /mnt/home/thrust2/zf1005/Matlab/GAFit/RunningFolder/1/1": No such file or directory
sh '"cd /mnt/home/thrust2/zf1005/Matlab/GAFit/RunningFolder/1/1"'

表示,使用不存在的sh解释"cd /mnt/home/thrust2/zf1005/Matlab/GAFit/RunningFolder/1/1"

为了简化事情,您可以创建一个将目录作为参数的运行器脚本

#! /bin/bash
cd "" && /path/to/a.out

然后从 xargs.

调用 runner

顺便说一句,您只需要 1 个 a.out,而不是每个目录 1 个。