以前に実行したコマンドの出力から文字列を取得する方法

以前に実行したコマンドの出力から文字列を取得する方法

たとえば、複数のコマンドを実行した後、次のようにします。

$ cd /opt/something
$ find . -name *aa | grep 11 
$ clear  
$ <more commands go here>

一部の出力は必要ですが、保存されません。これを生成したコマンドと引数が完全に呼び出されない可能性があります。

検索を実行する方法はありますかstdoutclear複数回呼び出されても)。

答え1

標準出力は一時的または寿命が短いです。保存するためのいくつかの手順を実行しないと、エクスポートはすぐに消えてアクセスできなくなります。

コマンドの出力を複数回再利用するには、スカラー変数(例:コマンドの置き換え)、配列変数(例:readarray/使用mapfile)、またはファイル(例:リダイレクトまたは使用tee)。

ファイル名を使用するときは、次のように常にNULを区切り文字として使用する必要があります。みんな他の文字はパス名の有効な文字です(現在最も一般的なツールは、NULで区切られた入力と出力を処理するための、、-0または-z同様のオプションです)。-Zこれは、コマンド置換を使用することは安全ではないことを意味しますfind(ファイル名ではなくテキストを生成する他のプログラムでは問題ありません)。

例えば

find . name '*aa' -print0 > files.list0
grep -z 11 files.list0

または

readarray -d '' -t files < <(find . -name '*aa' -print0)
printf '%s\0' "${files[@]}" | grep -z 11

BTWは*aaコマンドで引用する必要がありますfind。それ以外の場合、シェルはそれを一致するすべてのファイルに展開します(最初のファイルのみが述語に属し、残りは-nameエラーが発生します)。

関連情報