bash - 尝试跨行打印,在某处得到额外的 "![K"

标签 bash haskell

问题

我了解到您可以使用 \033[K 删除到 bash 行的末尾,并使用 \r 回到行首线。因此,您可以组合它们以用另一行覆盖一行。

我什至尝试了不同的配置和几乎任何安排。

\r\033[K\rString\r

总有一个额外的 ![K 来自某处。

实际的 Haskell 脚本细节

我现在使用的实际脚本是:

putStrOver :: String -> IO ()
putStrOver str = putStr $ "\033[K" ++ str ++ "\r"

并用作:

forM [1..n] $ \i -> do
    -- calc percentage
    putStrOver $ "Generating: " ++ show perc ++ "%"

它带给我的是:

Image showing an extra "![K" is prepended on the printed screen

尝试隔离问题

所以总有这个烦人的额外 ![K 部分是从某处生成的。我首先认为它可能是来自其他地方的一些 !,所以我采用了全新的 GHCi 环境并使用以下方法测试了该功能:

mapM_ (\i -> putStrOver . show $ i) [1..]

它仍然打印![K:

Example of the problem with the GHCi script

我在 Mac OS X Yosemite 上使用 Terminal bash,如果这有什么用的话。

问题

这是怎么回事?我该如何解决这个问题?

最佳答案

Haskell 与我所知道的(或至少现在能想到的)所有其他编程语言不同,它不会将 \033 解释为八进制文字,而是十进制文字。这解释了为什么你得到 !,因为 ! 在 ASCII 中是 33。

解决方法是将\033替换为\o33(或\x1b\27) haskell 代码。或者,也许更漂亮,使用 \ESC。它们的意思都是一样的,所以请选择您认为最易读的那个。

关于bash - 尝试跨行打印,在某处得到额外的 "![K",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27999995/

相关文章:

haskell - Haskell 中的类 OO 接口(interface)实现

linux - 如何检测操作系统并有条件地加载 ZSH 设置?

list - 使用递归将列表分解为子列表

linux - 等待第二个脚本触发直到第二个脚本的所有后台并行进程完成?

bash - 'man'完整函数在哪里?

haskell - 引用存在类型变量

haskell - 将带有 monad 参数的函数提升到 monad 转换器中

scala - 应用风格的实际用途是什么?

bash 脚本并行 ssh 远程命令

linux - 我想让 grep grep 一个有空格的词