将多行shell脚本转换为一行命令

时间:2013-10-28 14:08:30

标签: c++ linux shell ssh

我使用C ++应用程序来计算结果,然后使用echo将结果打印在Fedora linux中名为a的文件中。

#!/bin/bash

cd myapp
out=`time ./cppcode`
cd ..
echo $out >> a

我正在使用ssh,myapp的平均运行时间是2小时,所以ssh连接经常消失,终端停止响应。我仍然可以通过另一个终端ssh并使用top查看我的应用程序正在运行,但2小时后没有结果保存到文件中。

我相信如果我执行单行命令,将打印结果。你能告诉我如何将这个脚本重写为一行吗?

3 个答案:

答案 0 :(得分:0)

相信将脚本更改为单行会对您有所帮助。你可以自己尝试一下:

cd myapp; out=`time ./cppcode`; cd ..; echo $out >> a

或更简单:

(cd myapp; time ./cppcode) >> a

请注意,仅重定向stdout将永远不会捕获time命令的输出。如果您想重定向它,可​​以添加2>> a.time_results或仅添加2>&1以将其重定向到a

我认为您的连接已关闭,因为它的空闲时间太长(十分钟左右没有传输数据)。

解决此类问题的典型方法是实现体面流畅的输出,例如: G。通过打印进度(可能是时不时的进度条或简单的点)。

另一种方法是使用像screen这样的终端多路复用器,以便稍后能够重新连接到正在运行的会话,即使您的ssh连接在此期间发生故障。只需启动ssh,然后在该shell中启动screen,然后在该屏幕内启动您的真实内容。如果您的连接中断,只需启动ssh,然后screen -x重新连接到正在运行的屏幕会话。

答案 1 :(得分:0)

尝试用一个命令执行相同的操作:

#!/bin/bash
time myapp/cppcode 2>> a

应该这样做

(假设cppcode不依赖于CWD是myapp文件夹)

虽然基本上你发现在ssh连接失败后没有执行后续命令

所以

#!/bin/bash

cd myapp
time ./cppcode 2>> ../a
cd ..

至少应该确保输出总是被写入(因为唯一的命令就是cd ..

答案 2 :(得分:-1)

cd myapp
time ./cppcode >> ../a 

或者如果您的应用不依赖于当前目录:

time myapp/cppcode >> a