[英]Call a bash scripts with a bash script. Check the exit code and ignore the output of the called bash script
[英]MATLAB scripts and fortran scripts are used in a for loop of a bash script. Can I avoid call MATLAB multiple times?
我有一個 bash shell 腳本,它在 for 循環中運行多個 MATLAB 和 fortran 代碼。
在循環中,bash 腳本一遍又一遍地調用 MATLAB。 這使腳本效率低下。
我使用 MATLAB 2017b 和 Mac OS X Catalina(10.15.7)。
有什么建議?
#!/bin/bash
for i in {1..10}
do
cp initial_input_$i initial_input
matlab -nodesktop -nosplash -r "matlab1; exit;"
cp matlat1.output fortran1.input
gfortran fortran1.f
./a.out
cp fortran1.output matlab2.input
matlab -nodesktop -nosplash -r "matlab2; exit;"
cp matlab2.output fortran2.input
gfortran fortran2.f
./a.out
cp fortran2.output matlab3.input
matlab -nodesktop -nosplash -r "matlab3; exit;"
cp matlab3.output fortran3.input
gfortran fortran3.f
./a.out
cp fortran3.output final_output_$i
done
在 Mac 或 Linux 上沒有內置的普通 Matlab 方法來執行此操作; 它不會在“客戶端/服務器”模式下運行,在這種模式下,有一個持續的 Matlab 進程需要多個命令。 (如果您使用的是 Windows,則可以使用 Matlab 的“COM 自動化服務器”模式來執行此操作。)
MathWorks 的官方方法可能是使用他們的Matlab Production Server產品,該產品是一個運行 Matlab 工作池的服務器,您可以通過 JSON API 將調用分派到該池。 但這對於您的環境來說是相當重量級和企業級的,根本不能在 Mac 上運行,並且將花費您 20,000 美元。
如果您真的想以客戶端 - 服務器的方式使用 Matlab 執行此操作,您可以編寫一個 Matlab 程序,使 Matlab 作為服務器運行:讓它運行一個循環,通過檢查目錄中的新文件或偵聽來等待輸入一個套接字,然后當新輸入到達時,使用eval()
運行它,然后返回循環等待更多輸入。 完成后,向它發送exit
命令。
但這需要大量的工作,而且調試這樣的多進程通信很困難。 因此,在您的情況下,我實際上要做的只是將 bash 腳本內容推送到 Matlab M 代碼中,就像 Cris Luengo 建議的那樣,以便您的 Matlab 腳本控制整個過程。 這個 bash 腳本的功能可以使用system()
函數和/或!
構造。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.