echo um loop com o comando variables

0

Eu tenho várias listas e quero executar alguns comandos sobre elas. Como as listas são longas, eu quero executar esses comandos paralelos uns aos outros, portanto, usando nohup .
Para cada item que eu tentei echo um loop que contém um comando nohup, mas não funciona - cat another_list_of_names lê para stdout, mas não para ./tools . Primeiro cat em for a in $(cat list_of_names) envia lista para loop, mas echo 'ed for b in $(cat another_list_of_names) envia para stdout.
Como posso definir esses comandos nohup em execução em paralelo (é possível executar nohup com 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
    
por PoGibas 28.05.2013 / 13:56

4 respostas

4

Você parece estar confuso sobre o que o echo faz. Você não pode executar qualquer comando usando echo , não especificamente nohup . echo simplesmente exibe o texto, ele não o executa.

Agora, se eu entendi o que você quer fazer corretamente, tudo o que você precisa é o seguinte:

#!/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
    
por 28.05.2013 / 16:06
5

Eu fiz algumas melhorias no seu código:

# 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
    
por 28.05.2013 / 15:08
1

Não tenho certeza se entendi o que você quer. Apenas supondo: um dos seguintes fragmentos de código faz o que se pretende?

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

ou

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
    
por 28.05.2013 / 14:42
0

Você está tentando fazer um eco disso para ver como serão os comandos finais? ou você está tentando realmente executar o comando nohup com esse eco?

Sugiro adicionar a linha ao topo do seu script, set -x , para que você possa ver o que cada linha está fazendo, em vez de tentar aproveitá-la apenas olhando para ela.

Você também pode desativar set -x conforme necessário nos scripts:

set -x

... code to debug ...

set +x
    
por 28.05.2013 / 14:15