【问题标题】:Bash. infinite loop showing a counter and more info重击。无限循环显示计数器和更多信息
【发布时间】:2016-12-02 19:24:06
【问题描述】:

我有一个脚本可以动态生成另一个 bash 脚本。在这个 heredoc 脚本中,有一个无限循环显示一个计数器(这有效!):

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窗口,并且Info行与另一行的“Time”字重叠。我想将信息线与时间计数器线和计数器分开显示......并且只显示一次!

如果您删除该行 echo -ne "Info\n" 计数器显示正常,正在运行,并且仅运行一次...如何在此上方放置另一条不同的行(带有信息的回显)并作为固定行而不重复?有可能吗?知道如何达到这个目标吗?谢谢。

【问题讨论】:

  • 不知道你为什么在这里搞乱文件描述符 3; cat &gt; "$dir/$my_file" &lt;&lt; 'EOF' ... 要简单得多。
  • echo -ne "INFO\n"echo INFO 没有什么不同。
  • 是的,是一样的……那是因为我尝试了不同的东西……没有成功。并且 cat > "$dir/$my_file"
  • cat 上的重定向不会影响脚本的其余部分;使用 fd 3 只是一个不必要的复杂性。

标签: bash loops eof infinite


【解决方案1】:

只需将 INFO 行移出循环即可。我通常更喜欢将回车放在行首。 -n-e 都不是可移植的,所以除了echo 的最简单用途之外,我通常更喜欢printf

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

【讨论】:

  • 谢谢.. info line out of the loop 有效!...但我认为您的计数器在左侧有几秒钟 o_O 我想我会使用我的计数器。无论如何谢谢你的想法!
  • 当秒数超过 24 秒时它会崩溃... xd
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
  • 1970-01-01
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 2014-01-04
相关资源
最近更新 更多