【问题标题】:How can I run executable in a different folder with a bash script?如何使用 bash 脚本在不同的文件夹中运行可执行文件?
【发布时间】:2019-11-13 17:10:30
【问题描述】:

我有一个程序 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 '"$1"' 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 不知何故只检查它是否是一个目录,而不是实际更改到该目录,因此,在根目录。

当我尝试这个时:

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

【问题讨论】:

  • 除了 Diego Torres milano 给出的正确诊断:你说你想用 bash 运行它,但你使用的是sh,而不是 bash。

标签: linux bash matlab executable


【解决方案1】:
sh '"cd /mnt/home/thrust2/zf1005/Matlab/GAFit/RunningFolder/1/1"'

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

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

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

然后从xargs 调用runner

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

【讨论】:

  • 每个 a.out 在几个文本文件中接收一组参数并计算一些结果。制作 a.out 的 Fortran 代码还需要读取调用 a.out 的目录中的文件。确保所有 a.out 都是相同的。由此,您能否详细说明您的评论“每个目录只需要 1 个 a.out 而不是 1 个”?
  • 关键是为每个案例(dir)并行运行所有a.out。我是否需要编写一个新的临时运行脚本,或者我可以在根目录中只使用一个运行脚本,它就可以采用并行参数并并行运行作业?非常感谢!
  • 我不知道a.out 做了什么,但它应该使用getcwd() 获取当前目录,所以a.out 的位置并不重要。
猜你喜欢
  • 2021-09-13
  • 1970-01-01
  • 2017-08-03
  • 2018-07-12
  • 2022-01-23
  • 2021-08-31
  • 2023-01-30
  • 2017-03-08
  • 1970-01-01
相关资源
最近更新 更多