1

スクリプトが多くのループで使用するコマンドがあり、それをエクスポートしたいと思います。

#!/bin/bash
export COMMAND=$(many programs $FILE)
# And use this command latter like this:
for FILE in ./*; 
do 
eval $"COMMAND"
done

また、このコマンドのプログラムからエラーが発生したため、このコマンドをエクスポートできません(入力を入力してください)。

変数を含むCOMMANDをエクスポートするにはどうすればよいですか?

編集

@Charles Duffyの回答を使用しましたが、追加の問題があります。

your_command() {
do_something_with "$1"
do_something_else_with "$1"
}
export -f your_command


for i in $(seq 1 $Times); do 
  for file in ./*; do
     your_command "$file"
  done 
done

= 1の場合Times、ループは正常に機能しますが、Times= 2の場合your_command、出力は保存されません(最初のループには出力がありますが、2番目のループには出力がありません)。

4

2 に答える 2

4

あなたcommandは変数ではなく関数でなければなりません。

your_command() {
  do_something_with "$1"
  do_something_else_with "$1"
}

for file in ./*; do
  your_command "$file"
done

これを本当にエクスポートする必要がある場合(サブプロセスで使用可能)、次の方法で行うことができます。

export -f your_command
于 2013-02-19T19:45:00.227 に答える
1

まず最初に、他の回答で説明されているように、関数を使用する必要があります。そうは言っても、あなたが持っているものを修正することも可能です。おそらく使用すべきではありません$()。あなたがそれを持っているように、あなたの「多くのプログラム」は初期化するCOMMANDとすぐに実行され、あなたはそれらの出力を保存しますが、コマンドライン自体ではありません。その上、$FILEその時点ではまだ設定されていません。動作するはずのスクリプトの修正バージョンは次のとおりです。

#!/bin/bash

COMMAND='many programs "${FILE}"'
# And use this command later like this:
for FILE in *
do 
  eval ${COMMAND}
done

スクリプトに加えた変更:

  1. 不要な削除export
  2. {}変数名を配置する
  3. ${FILE}名前にスペースが含まれるファイルがある場合は、二重引用符で囲みます
  4. を取り除き、$()それをに置き換えました''
  5. 読みやすくするためにインデントを修正
  6. タイピングを減らすためにforループリストを*からに変更しました./*
于 2013-02-19T19:47:53.787 に答える