Se eu estiver tentando executar o mesmo script em dez diretórios diferentes seguidos, isso funcionará e haverá uma sequência de comandos mais concisa?

0

Desculpe se este é noobish, eu tive que pegar o Ubuntu para um trabalho e não sou super bem versado nas complexidades de entrada e saída ainda. Basicamente, eu tenho um monte de diretórios que cada um tem uma cópia do mesmo script, e normalmente eu teria que entrar em cada diretório, ./ cada script separadamente, esperar dois minutos e digitar “2” para selecionar um script. opção a meio do script, depois recue e vá para a próxima pasta. Um dos caras com quem estou trabalhando disse que eu poderia usar o comando cat e um pipe para digitar o que eu quero colocar no script automaticamente, em vez de ficar sentado e aguardando o prompt, mas ele não me mostrou como. Desde que eu tenho dez deles, eu estava pensando que deveria estar fazendo basicamente o seguinte:

for i in $(ls -d [each of the folders]);
    do 
       cd $i;
       echo “2” > input.txt; 
       cat input.txt | ./scriptname.sh;
       rm input.txt;
       cd ..;
    done

Então minhas perguntas são: 1. Isso deve / deve funcionar e 2. Existe uma maneira menos desajeitada de fazer isso?

    
por Tyler Ruck 07.06.2018 / 20:51

1 resposta

5

Algumas notas:

  1. Não analise ls . Supondo que você queira usar todos os diretórios na pasta atual, então

    for dir in */        # note the trailing slash
    

    IMO "dir" é um nome melhor que "i".

  2. se nem todo diretório é desejado, você pode soletrá-los

    for dir in dir1 dir2 dir4 ...; do ...
    

    ou use um padrão glob que corresponda aos diretórios desejados

    for dir in dir[1-46-9] ...; do ...
    

    ou use uma matriz para mantê-los e iterar sobre a matriz

    dirs=(dirA dirB dirE dirG)
    for dir in "${dirs[@]}"; do ...      # those quotes are required.
    
  3. Cite suas variáveis

  4. Esse padrão é bom: cd dir; do stuff ...; cd .. . Você também pode criar um subshell para que os efeitos de cd desapareçam quando a subshell sair.
  5. É possível que cd falhe.

Então, aqui está um pequeno take alternativo

for dir in */; do
    ( cd "$dir" && echo 2 | ./scriptname.sh )
done
    
por glenn jackman 07.06.2018 / 22:14