bashが出力を空白に包むように強制する

bashが出力を空白に包むように強制する

実際には多くの質問がありますが、それらのどれも私の特定の要件を満たしていないようです。

私は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できません。スクリプトをファイルに書き込むように手動で強制するのではなく、強制的にnodejsoutput.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

おすすめ記事