私のユースケースは、2つの検索コマンドをファイルの代わりに単一の変数として出力することです。試してみて動作しないことがわかったいくつかの点は次のとおりです。
実際のfind
コマンドは次のとおりです。
find /opt/apps -xdev -type f -name '*vunn*-2*jar'
find /opt/apps -xdev -type f -name '*robj-2*jar'
オプション1:2番目の出力のみを保存します。
temp_jars=$(find /opt/apps -xdev -type f -name '*vunn*-2*jar')
temp_jars=$(find /opt/apps -xdev -type f -name '*robj*-2*jar')
オプション2:基準引用する、以下で試しましたが、最初のコマンドのみが実行されました。
export temp_jars="$(find /opt/apps -xdev -type f -name '*vunn*-2*jar' && find /opt/apps -xdev -type f -name '*robj-2*jar')"
ご協力ありがとうございます。
答え1
これを行う方法はいくつかあります。あなたの場合、最も簡単な方法はコマンドを組み合わせてfind
全体の問題を避けることです。
temp_jars=$(find /opt/apps -xdev -type f \( -name '*vunn*-2*jar' -o -name '*robj-2*jar' \)
実際に複数のコマンドが必要な場合は、コマンドを個別に実行してから追加上書きする代わりに変数として出力します(これは実行してから実行する操作で、foo=bar
最初foo=baz
の変数を上書きするため、最後の変数のみを保持します)。
$ var=$(echo foo)
$ var="$var $(echo bar)"
$ echo "$var"
foo bar
または 1 つの手順で実行します。
$ var="$(echo foo; echo bar)"
$ echo "$var"
foo
bar
&&
(代わりに)を使用した方法は、;
最初のコマンドが成功した場合にのみ2番目のコマンドが実行されることを意味します。したがってfind
、何らかの理由で最初のコマンドが失敗した場合(find
結果がない場合、そのコマンドは失敗し、エラーのみが発生します)、たとえば、存在しないディレクトリから検索するように指示した場合、2番目のディレクトリは実行されません。あなたの場合には&&
失敗した理由はありません。うまくいかないのか?
答え2
複数の値を保存するには、スカラー変数の代わりに配列を使用します。
readarray -td '' temp_jars < <(
find /opt/apps -xdev -type f -name '*vunn*-2*jar' -print0
find /opt/apps -xdev -type f -name '*robj*-2*jar' -print0
)
(-d
ここでNULを区切り文字として指定するには、bash 4.4以降が必要です。)
ただし、@terdonがすでに述べたように、vunn
これらの項目を前にリストすることが重要でない限り、単一のコマンドでこれを実行できます。robj
find
次に、ファイル名をいくつかのコマンドに別々の引数として渡すには"${temp_jars[@]}"
。
たとえば、
printf ' * %s\n' "${temp_jars[@]}"
配列変数は使用できませんexport
。環境変数は単にスカラーです。 bash変数にはNULバイトを含めることができないため、ファイルパスのリスト(それ自体はnull以外のバイトの(null以外)シーケンスで構成できます)、エンコード形式を使用しない限り、確実に保持することはできません。引用する
また、プロセス交換で開始されたサブシェルの終了状態(この場合はfind
2番目のコマンドの終了状態)が失われますが、最新バージョンbash
ではwait "$!"; status=$?
。
readarray
(別名、mapfile
'sとは何の関係もなく、実際にはそうではありませんが、zsh
mapfile
マッピング)bash
具体的である。ここで同等のものは次zsh
のとおりです。
temp_jars=(
${(0)"$(
find /opt/apps -xdev -type f -name '*vunn*-2*jar' -print0
find /opt/apps -xdev -type f -name '*robj*-2*jar' -print0
)"}
)
0
NULを分割するには、パラメータ拡張フラグを使用します。この場合、終了状態は通常$?
どおり直接使用できます。
配列に要素を追加するには、sumで次のことができますzsh
。bash
temp_jars+=(more elements)
Bashでは、このオプションを使用して値を格納する配列のインデックスを指定readarray
できます。-O
以下を使用して、配列の最後の割り当てインデックスを取得できます。
indexes=("${!temp_jars[@]}"); last_index=${indexes[-1]}
次に、次を使用します。
readarray -td '' -O "$((last_index + 1))" temp_jars < <(find ... -print0)
配列が最初に稀でない場合(Straight before以降の場合のようにreadarray
)、次のように単純化できます。
readarray -td '' -O "${#temp_jars[@]}" temp_jars < <(find ... -print0)
これは${#temp_jars[@]}
配列の要素数です(配列インデックスが1ではなく0から始まるため、配列がリーンでない場合は1に最後に割り当てられたインデックスを加えた値に対応します)。
他zsh
のほとんどのシェルと同様に、配列は希薄ではなく、インデックス付けは要素$#temp_jars
数と最後の割り当てインデックスで始まります。