実際には多くの質問がありますが、それらのどれも私の特定の要件を満たしていないようです。
私はtmux
.soを使用しています。 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
端末タスクを実行します。 (つまり、workと同等のものが欲しいです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
、標準出力(つまり、アプリケーションデータ)。 stdoutにサインアップする必要があります。標準エラーパイプラインを入力します。
nodejs non-existent-file.js 2>&1 | fold -w 45
しかし、追加の問題があります。パイプに書き込まれたデータは通常バッファレッド端末に書き込むとき、データはデフォルトでバッファリングされません。パイプは端子に出力しているため、バッファリングを無効にする必要があります。 GNUユーティリティを使用すると、次のことができます。標準バッファ。
また、パイピングはコマンドから返された状態に関する情報を破壊します。 Bashでは、次のものを使用できます。PIPESTATUS
コマンドの状態を復元すると、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