2017-03-07 23 views
0

我有了一个显示状态的功能的shell脚本,沿东西线控制台的一行:写作的printf从shell脚本

display() { 
    clear 
    echo -e "  Download In Progress\n" 
    echo -e "   Please Wait \n" 
    echo -e " Step: $*" 
} 

shell脚本,然后做它的主工作

display " 1 starting" 
does some work 
display " 2 complete" 
display " 2 starting" 
does some work 
display " 2 complete" 

我的问题是,我的一个“做一些工作”是一个C程序,其中有几个printf语句。目前,我已经有了重定向到一个日志文件,这样我可以看到的地方他们的标准输出:

display " 1 starting" 
/usr/bin/mycprogram >> /tmp/mylogfile.lg 
display " 2 complete" 

但我真正想要的是有写到标准输出“步骤:”行。我可以简单地关闭重定向,并将输出显示在屏幕上,但它会一行一行,并将整齐的“正在下载”屏幕从屏幕上移开,并留下一条难看的消息。

我该如何完成将各个printf消息全部放在同一行并保留头部?

回答

1
/usr/bin/mycprogram | awk '{printf("%s, ",$0)}' 

例如是把它做成一条线 一个方式,如果你想禁用线wrappling的方式,你可以尝试

echo -ne "\x1b[?7l" 

,但可能不会在所有终端工作。禁用换行将肯定会停止垂直滚动,但可能会让您想要换行的其他输出变得混乱。当你想linewrap回

echo -ne "\x1b[?7h" 

如果你不想回声自动把换行符在呼应字符串的结尾(这样那么可执行输出为在同一行:

echo -n "this will not put a newline at the end" 

假如你希望这一切,包括linewrap件事:

echo -ne "Starting Step: $* \x1b[?7l" 
/usr/bin/mycprogram | awk '{printf("%s, ",$0)}' 
echo -ne "\x1b[?7h" 
+0

这几乎就是我认为OP希望。对于GNU awak,你可以从程序中的每一行*覆盖相同的*行'awk'{printf(“\ r%* s \ r%s”,length($ 0),“”,$ 0)}'' – StoryTeller

+0

如果线路太长,它仍然会将东西从屏幕上移开。我不完全确定OP究竟需要什么。也许我应该先问。 – louigi600

+0

我认为OP只是想防止垂直滚动,同时仍然输出每一行输入(可能在同一行) – StoryTeller

0

很难说没有看到你的C代码,但我猜想,您指定换行符:

printf("%s\n", s); 

如果删除从C文件的printf的那么它们将出现在同一行的换行符(你可能要包括一些其他的分隔符,如“\ t”的):

printf("%s\t", s); 

也不想通过控制台输出被赋予了新的线路,echo这是否默认,但如果指定-n也不会:

echo -n "Step:"; ./c_program;