2016-07-28 47 views
1

我有一个脚本,dinamically生成另一个bash脚本。在这个heredoc脚本有一个无限循环显示计数器(这工作!):Bash。无限循环显示一个计数器和更多信息

date1=`date +%s` 
while true; do 
    echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r"; 
done 

如果你只把这个循环工作正常。问题是我不仅需要展示柜台。需要更多信息(一些静态数据)。我会把我不工作代码:

#!/bin/bash 
dir="/tmp/" 
my_file="generatedscript.sh" 

rm -rf "$dir$my_file" > /dev/null 2>&1 

exec 3>"$dir$my_file" 

cat >&3 <<-'EOF' 
    #!/bin/bash 
    date1=`date +%s` 
    while true; do 
     echo -ne "Info\n" # this is the damned line, if you remove it the counter works fine 
     echo -ne "Time counter: $(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r"; 
    done 
EOF 

exec 3>&- 

xterm -hold -geometry 78x25+0+0 -T "Testing" -e "bash \"$dir$my_file\"" > /dev/null 2>&1 & 

这说明有很多线和信息线xterm窗口重叠与其他线路的“时间”二字。我想单独显示信息线,从时间计数器行和计数器运行...并且只有一次!

如果你删除行echo -ne“Info \ n”计数器显示正常,运行并且只有一次...如何可以将另一个不同的行(回声与信息)在此之上并且作为固定行重复?有可能吗?任何想法如何达到这一点?谢谢。

+0

不确定为什么你在这里弄乱文件描述符3; 'cat>“$ dir/$ my_file”<<'EOF'...'要简单得多。 – chepner

+0

'echo -ne“INFO \ n”'和'echo INFO'没有区别。 – chepner

+0

是的,是一样的......那是因为我在尝试不同的事情......失败。并且需要cat>“$ dir/$ my_file”<<'EOF'来从该脚本生成单独的脚本。需要......也许与帖子的目标无关......无论如何,你知道如何处理这个问题吗?谢谢您的回答。 – OscarAkaElvis

回答

0

只需将INFO行移出循环即可。我通常更喜欢把回车放在行的开头。 -n-e都不便携,所以我通常更喜欢printf,但最简单的用法是echo

dir="/tmp/" 
my_file="generatedscript.sh" 

script="$tmp/$my_file" 
cat > "$script" <<'EOF' 
echo INFO 
date1=$(date +%s) 
while true; do 
    now=$(date +%s) 
    delta=$((now - date1)) 
    printf '\rTime counter: %s' "$(date -u --date "$delta" +%H:%M:%S)" 
done 
EOF 
chmod +x 500 "$tmp/$my_file" 
xterm -hold -geometry 78x25+0+0 -T "Testing" -e "$script" > /dev/null 
+0

谢谢..信息线出了循环的作品!...但我认为你的柜台有左边的秒o_O我想我会用我的柜台。无论如何thx的想法! – OscarAkaElvis

+0

并且它在secs超过24 ... xd时崩溃 – OscarAkaElvis