複数のリストがあり、リストに対していくつかのコマンドを実行したいと思います。リストが非常に長いので、コマンドを並列に実行したいので、nohup
各項目に対してnohupコマンドを含むループを
試しましたが、うまくecho
いきませcat another_list_of_names
ん./tools
。ループですが、'edはそれをstdoutに送ります。 nohupコマンドが並列に実行されるようにどのように設定しますか? (runを使用できますか?)cat
for a in $(cat list_of_names)
echo
for b in $(cat another_list_of_names)
nohup
echo
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
具体的ではありませんnohup
。echo
テキストだけを表示して実行するわけではありません。
今、あなたが正しくやろうとしていることを理解したら、必要なものは次のとおりです。
#!/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