问题描述
这个问题是关于将输入传递给 bash 脚本中的命令。我正在 Ubuntu 18.04 上工作。我在文件夹中多次运行以下命令:
abaqus datacheck job=Job input=inputfile.inp user=umat.f
每次我这样做时都会问我是否要覆盖现有的作业文件 (y/n)?然后我输入 y 并按回车键。我能够使用以下调整和终端提示上的 here 字符串自动执行最后一步:
abaqus datacheck job=Job input=inputfile.inp user=umat.f <<< 'y'
但是当我将它作为更大的自动化文件的一部分包含在 bash 脚本中时,它不起作用。这个使用 here doc 的命令在 bash 脚本中也不起作用:
abaqus datacheck job=Job input=inputfile.inp user=umat.f << EOF
y
EOF
什么起作用了:我将单个字符 y
放在名为 affirmative
的文本文件中,并将其作为此处的文档传递:
abaqus datacheck job=Job input=inputfile.inp user=umat.f << affirmative
当我尝试使用简单的 here doc 或 here 字符串时,有人能告诉我我在 bash 脚本中做错了什么吗?我不想在我的文件夹中只有一个字符的文本文件。
解决方法
受 bash 脚本限制真的很重要吗?如果没有,您可以将此解决方案与 python 脚本结合使用:
1.通过子进程启动 bash 命令
import subprocess
my_cmd = 'abaqus job=Job-1 input=inputfile.inp user=umat.f'
proc = subprocess.Popen(
my_cmd,cwd=my_working_dir,stdout='my_study.log',stderr='my_study.err',shell=True
)
2a。使用不同的作业名称(Job-1
、Job-2
)运行不同的作业
并延迟删除旧的(例如,在“Job-3”开始时删除“Job-1”)
2b。写入命令行
通过在 stdin=subprocess.PIPE
调用中添加选项 subprocess.Popen
并在之后使用 proc.stdin.write("y")
命令
就我个人而言,我更喜欢第一个选项,因为它对我来说似乎更容易预测。