목록이 여러 개 있고 목록에 대해 몇 가지 명령을 실행하고 싶습니다. 목록이 매우 길기 때문에 명령을 병렬로 실행하고 싶기 때문에 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