终端与 .txt 文档中的不同格式

gel*_*gel 6 shell-script date printf

我有一个跟踪时间的脚本。

当我在控制台中打印输出时,我得到以下信息:

0 Days, 00:00:33
Run Code Online (Sandbox Code Playgroud)

当我将它保存到 txt 文件时,我得到了这个:

^[[2K
  0 Days, 00:00:33
Run Code Online (Sandbox Code Playgroud)

代码:

now=$(date +%s)
diff=$(($now - $begin))
mins=$(($diff / 60))
secs=$(($diff % 60))
hours=$(($diff / 3600))
days=$(($diff / 86400))

printf "\33[2K\r%3d Days, %02d:%02d:%02d" $days $hours $mins $secs
printf "\33[2K\r%3d Days, %02d:%02d:%02d" $days $hours $mins $secs >> test.txt
Run Code Online (Sandbox Code Playgroud)

哪里^[[2K来的?我猜它与 printf 中的格式有关。

我在这里阅读了一些关于 printf 的内容:http : //wiki.bash-hackers.org/commands/builtin/printf。但我没有变得更聪明......

hee*_*ayl 13

您的printf命令中有转义控制序列,即printf "\33[2K.....,(\e[2K清除一行),这必然是终端的控制命令,只能由终端设备理解和执行。

当您在终端内以交互方式运行脚本时,终端会正确解释序列。将命令的输出保存在文件中时,序列被按字面处理,因为那时没有任何东西可以解释序列。

现在如果你这样做:

cat test.txt
Run Code Online (Sandbox Code Playgroud)

您会看到终端在打印输出之前再次正确解释序列。


Tho*_*key 5

线的连续性

printf "\33[2K\r%3d Days, %02d:%02d:%02d" $days $hours $mins $secs
printf "\33[2K\r%3d Days, %02d:%02d:%02d" $days $hours $mins $secs >> test.txt
Run Code Online (Sandbox Code Playgroud)

被定义为在终端的同一行上打印时间信息。这将\33[2K清除整个(当前)行,并将\r光标移动到该行的开头。效果是让改变的时间信息,只是出现改变部分线。

我注意到\n格式中没有换行符 ( )。这个问题显示了换行符(也许是为了清楚起见而添加的)。