强制 bash 将输出换行到空格处

强制 bash 将输出换行到空格处

实际上有很多问题,但似乎没有一个能满足我的特定需求。

我正在使用tmux,因此我的 bash 窗口非常小 ( $COLUMNS = 45)。这意味着几乎任何输出都会以其最大宽度换行,这看起来非常恶心,因为长单词被换行在中间。

虽然许多解决方案(例如fold -w 30 -s $FILE)可以很好地处理文件,但我似乎无法通过运行python或 之类的程序来传输输出nodejs。为了便于阅读,我希望将它们的输出用空格括起来。

例如,当我故意通过nodejs asdgasgsdg传递不存在的文件来生成错误时,我希望输出为:

Error: Cannot find module '/home/User/
Documents/cwd/asdgasdg'
    at Function.Module._resolveFilename (
module.js:326:15)
    at Function.Module._load (module.js:277:
25)
    at Function.Module.runMain (module.js:442
:10)
    at startup (node.js:136:18)
    at node.js:966:3

代替:

Error: Cannot find module '/home/User/Docume
nts/cwd/asdgasdg'
    at Function.Module._resolveFilename (modu
le.js:326:15)
...

我想要一个简单的命令来强制这种包装。我正在考虑类似的事情nodejs non-existent-file.js | fold -w 45,但这是行不通的。

我还尝试将输出通过管道传输到文件,然后使用 打开该文件fold,但我无法将nodejs其错误消息通过管道传输到output.txt。我不想手动强制脚本记录到文件,而是强制终端做这项工作。 (即我想要一个相当于 的工作nodejs non-existent-file.js > output.txt; fold -w 45 -s output.txt。当我尝试它时,output.txt它是空的。)

这可能吗?

答案1

管道传输fold确实适用于任何不需要其输出为终端的程序。如果程序要求其输出是终端,很可能是因为它有自己的格式。

nodejs non-existent-file.js | fold -w 45“不起作用”,因为您没有将所有输出通过管道传输到fold,而只是将标准输出(即应用程序数据)。您需要加入标准输出标准误进入管道:

nodejs non-existent-file.js 2>&1 | fold -w 45

但还有一个额外的问题。写入管道的数据通常是缓冲红而写入终端时,默认情况下不会缓冲数据。由于管道正在输出到终端,因此您应该禁用缓冲。通过 GNU 实用程序,您可以使用标准缓冲区

此外,管道还会破坏命令返回状态的信息。在 bash 中,您可以使用PIPESTATUS恢复命令的状态; zsh 也有pipestatus同样的效果。或者,在 ksh93、bash 或 zsh 中,您可以使用流程替代;但是 bash 不会等待进程替换中的命令完成,这也是一个问题。

此外,只有当输出是终端时才应该进行这种包装。将日志包装在文件中会非常烦人,因为它会破坏大量信息(您不能再依赖换行符)。

#!/bin/bash
run_with_word_wrap () {
  if [ -t 1 ]; then
    stdbuf -oL -eL "$@" 2>&1 | fold -w "$COLUMNS"
    return ${PIPESTATUS[0]}
  else
    "$@"
  fi
}

run_with_word_wrap nodejs non-existent-file.js

相关内容