Existe uma maneira de contornar o cano quebrado?

2

Eu tenho um diretório com um grande número de arquivos.

./I_am_a_dir_with_many_subdirs/

Dentro de um script, gostaria de encontrar todos os subdiretórios, classificá-los e gerar uma saída para um array bash. Então, eu faço:

SubdirsArray=('find ./I_am_a_dir_with_many_subdirs/ -maxdepth 2 -mindepth 2 -type d | sort')

Executando o script, recebo as seguintes mensagens de erro:

    sort: write failed: standard output: Broken pipe
    sort: write error

Como explicado neste post : provavelmente sort executa e fecha o pipe, antes que find conclua a gravação. Assim, o comando write () iniciado por find obtém um erro EPIPE "Broken pipe", o SO envia find a SIGPIPE. Antes do SIGPIPE atingir find , ele imprime a mensagem de erro, depois pega o SIGPIPE e morre.

Perguntas:

  1. Então, o que meu SubdirsArray contém? Os subdiretórios, que find encontraram, mas sort não foram classificados?

  2. Se sim, qual seria o caminho para contornar esse problema com canos quebrados? Tornar encontrar escrever seus resultados para um arquivo temporário e, em seguida, fazer a classificação lê-lo?

    Eu não entendo, por que "também não há nada para se preocupar" se isso acontece dentro de um shell não interativo: por quê? Meu SubdirsArray contém algo não classificado e mais adiante no script, eu suponho, que seus elementos estão classificados ??!

  3. Recebo duas mensagens de erro:

    sort: write failed: standard output: Broken pipe
    sort: write error
    

Neste tópico , sugere-se que sort não tem espaço suficiente em um diretório temporário para classificar toda a entrada. Mas, isso não significa que esse tipo tem algo de encontrar? Estou confuso... De qualquer forma, eu tentei usar

SubdirsArray=('find ./I_am_a_dir_with_many_subdirs/ -maxdepth 2 -mindepth 2 -type d | sort -T /home/temp_dir')

mas isso não ajudou.

P.S.

Eu não tenho certeza se é importante, mas eu uso find|sort em um script multiprocessador: vários processadores executam o mesmo comando de uma só vez nas subshells.

    
por user1541776 14.03.2014 / 07:23

1 resposta

2
sort: write failed: standard output: Broken pipe

O problema não está entre find e sort . O sort tem problema com saída , o que significa que o shell não está disposto a ler a lista em uma variável.

Você terá que processar a entrada com while read …, armazenando-a no arquivo temporário se precisar mais de uma vez. Com a vantagem adicional de que isso se divide apenas na nova linha, ele lida corretamente com nomes de arquivos com espaços que a abordagem de backtick não faz.

Infelizmente, você não diz como deseja usar o resultado, não posso dizer exatamente como reescrevê-lo.

Note que os arrays não são parte da especificação do shell POSIX e há shells notavelmente mais rápidos que o bash, mas não os possuem. É por isso que muitas pessoas, inclusive eu, costumam evitar usá-las em scripts.

    
por 14.03.2014 / 07:30