如何通过单个Bash脚本启动两个终端并分别输出到独立文件
解决Bash脚本无法生成输出文件的问题
我之前也碰到过几乎一模一样的情况!手动在两个终端跑能正常生成文件,一放进脚本就不行,大概率是脚本里的命令执行方式和手动操作有差异,咱们一步步来解决:
最常见的问题:命令没有后台运行
手动操作时两个命令是同时并行执行的,但如果直接把两条命令写进脚本,脚本会先执行第一条,等它完全结束才会跑第二条——如果你的executable1是长期运行的进程(比如服务类程序),那第二条永远没机会执行,自然也不会生成output2.txt,甚至第一条的输出也可能因为进程没结束而没写入文件。
解决办法是给每个命令加上&,让它们后台并行运行:
#!/bin/bash # 后台运行第一个程序,同时把错误输出也写入文件(方便排查问题) ./executable1 -param conFile > output1.txt 2>&1 & # 后台运行第二个程序 ./executable2 -param conFile > output2.txt 2>&1 & # 可选:如果需要脚本等待两个进程都完成再退出,加上wait命令 wait
第二个可能:工作目录不对
手动跑的时候你可能在可执行文件所在的目录,但脚本执行时的工作目录可能不一样(比如你从其他目录调用脚本),导致./executable1找不到文件。
解决办法有两个:
- 在脚本开头加上
cd命令,切换到可执行文件所在的绝对路径:#!/bin/bash cd /绝对路径/到/可执行文件目录 ./executable1 -param conFile > output1.txt 2>&1 & ./executable2 -param conFile > output2.txt 2>&1 & wait - 或者直接用可执行文件的绝对路径调用:
#!/bin/bash /绝对路径/到/可执行文件目录/executable1 -param conFile > output1.txt 2>&1 & /绝对路径/到/可执行文件目录/executable2 -param conFile > output2.txt 2>&1 & wait
排查小技巧
如果还是不行,先排查命令是否真的执行了:
- 给脚本加上执行权限:
chmod +x your_script.sh,然后用./your_script.sh执行(不要用sh your_script.sh,避免用错shell) - 把命令的错误输出也重定向到文件(就是上面的
2>&1),打开output1.txt或output2.txt看看有没有报错信息 - 在脚本里加
echo $(pwd),看看执行脚本时的工作目录是不是你预期的
内容的提问来源于stack exchange,提问作者Enjal Parajuli
相关产品推荐
相关产品推荐

