Как запустить исполняемый файл в другой папке с помощью скрипта bash? - PullRequest
1 голос
/ 03 июля 2019

У меня есть программа a.out, которая будет настроена в некоторой последовательности папок, каждая папка получит a.out и выдаст некоторые результаты в каждой папке. Я пытаюсь выполнять эти же программы параллельно. Если я в папке, я просто делаю ./a.out, и он будет работать. Я должен выполнить a.out в своей папке, потому что a.out ищет файл в текущем каталоге. Поэтому, если я не в его папке, он не найдет этот файл.

Запуск этих программ является частью другого задания, основанного на rootDir. Я использую MATLAB, поэтому я стараюсь избегать использования cd внутри MATLAB, так как это перекомпилирует код MATLAB каждый раз, когда я использую cd, и значительно замедляет код.

Я использую код 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 каким-то образом только проверяет, является ли он каталогом, а не фактически переключается на этот каталог, и в результате в 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

1 Ответ

2 голосов
/ 03 июля 2019
sh '"cd /mnt/home/thrust2/zf1005/Matlab/GAFit/RunningFolder/1/1"'

означает, интерпретировать "cd /mnt/home/thrust2/zf1005/Matlab/GAFit/RunningFolder/1/1", используя sh, которого не существует.

для упрощения вещей вы можете создать скрипт бегуна, который принимает dir в качестве аргумента

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

, а затем вызвать runner из xargs.

Кстати, вам нужно только 1 a.out, а не 1 за реж.

...