问题
我了解到您可以使用 \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 ++ "%"
它带给我的是:
尝试隔离问题
所以总有这个烦人的额外 ![K
部分是从某处生成的。我首先认为它可能是来自其他地方的一些 !
,所以我采用了全新的 GHCi 环境并使用以下方法测试了该功能:
mapM_ (\i -> putStrOver . show $ i) [1..]
它仍然打印![K
:
我在 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/