实际上有很多问题,但似乎没有一个能满足我的特定需求。
我正在使用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