변수 명령을 사용한 에코 루프

변수 명령을 사용한 에코 루프

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

관련 정보