12

別の引数を使用してコマンドを複数回実行する必要がある場合は、このアプローチを使用しました(完全に理解することなく)。

touch {a,b,c}

これは次と同等です:

touch a
touch b
touch c

次のループでも同じことができると思います。

for file in {a,b,c}; do touch $file; done

しかし、これが機能しない場合に遭遇しました。

pear channel-discover {"pear.phpunit.de","pear.symfony-project.com"}

少し質問があります:

  1. 最初の例で何が起こっているのか、そして正確には何が起こっているのかという名前は何ですか?
  2. for-inループではなく、単純なものにこのアプローチを使用する方がよいでしょうか。
  3. なぜ梨コマンドがそのように機能しないのですか?コマンドスクリプトは、そのような引数を処理するためのいくつかの手法を実装する必要がありますか、それともシェルがそれを担当しますか?
4

3 に答える 3

13

これはBraceExpansionと呼ばれ、指定された文字列のスペースで区切られたリストに展開されます。

したがってtouch {a,b,c}

touch a b c

touch {a,b,c}xと同等ですが:

touch ax bx cx

pearコマンドは基本的に次のように実行されます。

pear channel-discover pear.phpunit.de pear.symfony-project.com

これはあなたが期待したものではないかもしれません。コマンドを文字列ごとに1回実行する場合は、forループ(2番目の質問に答える)を使用するか、中括弧の展開とxargsを組み合わせて使用​​します。

于 2012-12-20T12:19:28.383 に答える
6

問題は、あなたの期待に反し

touch {a,b,c}

と同等です

touch a b c   # NOT 3 separate invocations.

echo {a,b,c}確認に使用)。2つの引数pear channel-discoverを受け入れないようです。おそらく同じエラーが表示されます

pear channel-discover pear.phpunit.de pear.symfony-project.com
于 2012-12-20T12:19:44.747 に答える
0

ええと、2つのオプションがあります:

for i in "pear.phpunit.de" "pear.symfony-project.com"
do
  pear channel-discover "$i"
done

またはワンライナー(ただし、xargsbashの内部を使用する代わりに呼び出す):

echo "pear.phpunit.de" "pear.symfony-project.com" | xargs -n1 pear channel-discover

前者は確かに人間が読みやすく、時間効率は基本的に同じです。

于 2014-09-09T14:29:11.883 に答える