我不是程序员,只是化学家。我正在编写一个 bash 脚本,我想在服务器上运行它并期望它执行以下操作:
- 打开终端
- 循环遍历文件夹
slave_1
,,slave_2
...,slave_N
为每个文件夹打开一个选项卡,启动 MATLAB(maltab -nodesktop
),cd 到该文件夹,然后运行脚本slave_process
。
以下是我目前所掌握的信息:
#!/bin/bash
for i in {1..5}
do
gnome-terminal --tab --working-directory="/usr/local/MATLAB/MATLAB_Production_Server/R2015a/bin" --command='./matlab -nodesktop; cd /mnt/projects/slave_$i; -nosplash -r slave_process'
done
exit 0
有人能帮我让脚本运行吗?我不在 sudoers 文件中,因此无法在服务器上更改任何内容。
更新。@muru 的答案确实有效,但它会在每次循环迭代时启动一个新终端,这很麻烦,因为我需要运行大约 200 个 MATLAB 实例。我想在同一个终端中有多个选项卡(或者根本没有终端也可以)。这是我修改后的代码,但它不起作用:
args=()
for i in {1..5}; do
cmd=working-directory='/mnt/projects/slave_$i' --command='/usr/local/MATLAB/MATLAB_Production_Server/R2015a/bin/matlab -nodesktop -nosplash -r slave_process'
args+=(--tab-with-profile=Default -e "sh -c \"$cmd; bash\"")
done
gnome-terminal "${args[@]}"
有人可以帮忙吗?
答案1
笔记:
- 变量扩展在单引号内不起作用
''
- 因此slave_$i
命令的第二部分将保留slave_$i
。 - 由于您知道命令的路径
matlab
,因此请直接使用完整路径运行它,而不是从该目录开始并使用./matlab
。 - 如果
-nosplash -r slave_process
是的参数matlab
,它们应该在同一个命令中。 exit 0
是没有必要的。
考虑一下类似的事情:
#!/bin/bash
for i in {1..5}
do
gnome-terminal --tab --working-directory="/mnt/projects/slave_$i" \
--command='/usr/local/MATLAB/MATLAB_Production_Server/R2015a/bin/matlab -nodesktop -nosplash -r slave_process'
done