1

私はこのサンプルコードを持っています:

find "$1" ! -regex "$regex" 2>/dev/null | while read line ; do
    a="$line"
done

echo ("$a") # prints nothing because of subshell

私は欲しい:

  • サブシェルが$a外側 (グローバル スコープ内) で見えるようにするための回避策
  • bash のプロセス置換を使用しない場合
  • ダッシュ、bash、および korn シェルとの互換性を持たせるため

どうすればこれを達成できますか?簡単な解決策はありますか?

4

3 に答える 3

5

私があなたを正しく理解していれば、あなたを悩ませているのはサブシェルではなく、変数がサブシェルの外でその値を保持していないという事実です。次のようにコードのグループ化を使用できます。

find "$1" ! -regex "$regex" 2>/dev/null | 
{ 
  while read line
  do
    a=$line
  done
  echo "$a"
}

a中括弧内にある限り、変数の値を使用できます。

于 2016-04-09T06:55:46.987 に答える
2

名前付きパイプがなく、サブシェルですべてを実行しなくても、ヒアドキュメント内でコマンド置換を使用してヒアドキュメントを使用できます。

while read line; do
    a=$line
done <<EOF
    $(find "$1" ! -regex "$regex" 2>/dev/null)
EOF

echo "$a"

これは移植可能でなければなりません。

も参照してください。 バッシュFAQ/024 .

ノート。このような出力の解析はfindアンチパターンです。

于 2017-12-19T08:46:24.630 に答える