如何使用 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 个。
我有一个程序,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 个。