Problema ao obter entrada interativa durante o loop de leitura

4

Eu estava fazendo algo como o seguinte exemplo mínimo:

#! /bin/sh

# $1 = file containing list of files to sync
# $2 = source dir ; $3 = target dir

cat "$1" | while read f
do
    cp -i "$2"/"$f" "$3"/"$f"
done

Eu acho que cp -i não aguenta minha entrada e o loop apenas corre para o final. Por que e o que pode ser feito para consertar a situação?

    
por jamadagni 27.11.2014 / 16:15

1 resposta

5

Por aqui, eu entendi pelo link (onde tanto a pergunta quanto a resposta são redigidas de forma diferente e o problema não está relacionado à entrada interativa) que o motivo do problema é que o cp -i espera que o usuário forneça a confirmação da entrada interativa via stdin , mas no cat | while read loop stdin está ocupado com o pipe e, portanto, a seguinte linha (s) do arquivo de entrada é / são mastigada como entrada do usuário.

Portanto, a solução também é semelhante àquela aconselhada na outra pergunta - para canalizar o conteúdo por meio de um descritor de arquivo diferente de stdin :

while read f <&3
do
    cp -i "$2"/"$f" "$3"/"$f"
done 3< "$1"

Observe o <&3 e 3< "$1" na parte superior e inferior do loop.

Obrigado a @ StéphaneChazelas pela resposta no outro q. (Eu inventei isso.)

Além disso, postar isso aqui, obviamente, eu gostaria de saber se existem outras soluções para a entrada interativa que não seja isso.

Observe também que, embora seja possível usar um for loop como no outro q, estou preocupado que $(cat "$1") in for f in "$(cat "$1")" consuma memória desnecessária expandindo o arquivo se for um muito grande. OTOH o tubo deve manipular a leitura linha por linha IIUC. Então eu não acho que usar for seja uma solução eficiente. Eu gostaria de comentários sobre isso também.

    
por 27.11.2014 / 16:15