変数コマンドを使用したエコーループ

変数コマンドを使用したエコーループ

複数のリストがあり、リストに対していくつかのコマンドを実行したいと思います。リストが非常に長いので、コマンドを並列に実行したいので、nohup各項目に対してnohupコマンドを含むループを
試しましたが、うまくechoいきませcat another_list_of_names./tools。ループですが、'edはそれをstdoutに送ります。 nohupコマンドが並列に実行されるようにどのように設定しますか? (runを使用できますか?)catfor a in $(cat list_of_names)echofor b in $(cat another_list_of_names)
nohupecho

for a in $(cat list_of_names)
      do              
          ID=`echo $a`
          mkdir ${ID}
          echo " 
             nohup sh -c '
             for b in $(cat another_list_of_names)
               do 
                  ./tools $b $a >> ${ID}/output
               done' &
           "

      done

答え1

あなたのコードをいくつか改善しました。

# This sort of loop is generally preferable to the one you had.
# This will handle spaces correctly.
while read a
do
   # There's no need for the extra 'echo'
   ID="$a"
   # Quote variables that may contain spaces
   mkdir "$ID"
   # This is a matter of taste, but I generally find heredocs to be more
   #  readable than long echo commands
   cat <<EOF
   nohup sh -c '
   while read b
   do
      # Quotation marks
      ./tools \$b $a >> "${ID}/output"
   done < another_list_of_names' &
EOF
done < list_of_names

答え2

何か混乱しているようですecho。君は走れないどのコマンドの使用法はecho具体的ではありませんnohupechoテキストだけを表示して実行するわけではありません。

今、あなたが正しくやろうとしていることを理解したら、必要なものは次のとおりです。

#!/usr/bin/env bash
## As others have said, this is a better loop for your purposes
## and it avoids both useless uses of cat.
while read a
do         
    ## you don't need to copy the variable; you need the
    ## quotes to cope with names with spaces.    
    mkdir "$a"
    while read b
    do
      nohup ./tools $b $a >> "$a"/output &
    done < another_list_of_names
done < list_of_names

答え3

何が欲しいのか分からない。推測してみてください。次のコードスニペットのいずれかが期待どおりに機能しますか?

for a in $(cat list_of_names)
do
    ID=`echo $a`
    mkdir ${ID}
    echo '
        nohup sh -c '\''
        for b in $(cat another_list_of_names)
        do
            ./tools $b $a >> ${ID}/output
        done'\'' &
    '
done

または

for a in $(cat list_of_names)
do
    ID=`echo $a`
    mkdir ${ID}
    echo "
        nohup sh -c '
        for b in $(cat another_list_of_names)
        do
            ./tools \$b $a >> ${ID}/output
        done' &
    "
done

答え4

最後のコマンドがどのように表示されるかを確認するためにこれをエコーし​​ますか?それとも実際にnohupエコーを使ってコマンドを実行してみましたか?

この行をスクリプトの上部に追加するset -xと、理解しようとするのではなく、各行が何をしているのかを確認できます。

set -x必要に応じてスクリプトで開くこともできます。

set -x

... code to debug ...

set +x

関連情報