Estou tentando remover arquivos de um diretório colando seus nomes em um loop while que simplesmente executará rm em cada item da lista de arquivos fornecida a ele.
$ sponge | while read file; do echo "rm $file"; rm "$file"; done;
background.bundle.js
964.bundle.js
background.bundle.js.LICENSE.txt
...
META-INF/manifest.mf
META-INF/mozilla.sf
META-INF/mozilla.rsa
^D
rm background.bundle.js
rm: remove regular file ‘background.bundle.js’? $
$
(Observe o ^D no final)
Conforme mostrado, após emitir o ^D (fim-de-arquivo), o comando sponge envia a saída inteira para o loop while, e rm é invocado para cada arquivo separadamente. No entanto, o que acontece é que ele é invocado uma vez para background.bundle.js, pede confirmação e, sem me dar a oportunidade de digitar nada, o loop sai prematuramente. Isso deixa o caractere de prompt ($) sem a nova linha necessária que deveria segui-lo, indicando um fim abrupto do loop.
Estou procurando corrigir esse problema sem recorrer a arquivos temporários. Quero gerenciar a entrada de arquivo usando exec para que o loop leia de um fluxo de entrada diferente, deixando a entrada padrão disponível para rm ler a confirmação do usuário. Como posso redirecionar a saída do sponge e ler a entrada para um descritor de arquivo específico para essa finalidade?
Se a intenção é remover os arquivos sem confirmação quando
rm
na verdade é um alias ou uma função semelhante a esta:Então, usar o utilitário command(1p) ignorará o alias/função:
Se a intenção é forçar a entrada do terminal em um subshell, você pode usar uma solução que parece um pouco "hackeada": reatribuir apenas o stdin de rm(1) de /dev/tty (que é o dispositivo que representa o terminal de controle do processo atual):
Notas:
while
éwhile IFS= read -r ...; do ...; done
.