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.