읽기 루프 동안 대화형 입력을 얻는 데 문제가 있습니다.

읽기 루프 동안 대화형 입력을 얻는 데 문제가 있습니다.

나는 다음과 같은 최소한의 예제를 수행하고 있습니다.

#! /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

나는 그것이 cp -i내 입력을 전혀 기다리지 않고 루프가 끝까지 실행되었음을 발견했습니다. 왜? 이 상황을 해결하려면 어떤 조치를 취할 수 있습니까?

답변1

여기까지 파헤쳐보니 알겠다https://unix.stackexchange.com/a/56877/54067(질문과 답변의 표현이 다르며 질문은 대화형 입력과 관련이 없습니다.) 문제의 원인은 cp -i사용자가 파이프를 통해 대화형 입력 확인을 제공해야 하지만 루프가 stdin파이프로 인해 사용 중이기 때문입니다. 입력 파일의 다음 줄은 사용자 입력으로 간주됩니다.cat | while readstdin

따라서 이 솔루션은 다른 질문에서 제안된 것과 유사합니다. 다음과 다른 파일 설명자를 통해 콘텐츠를 전송합니다 stdin.

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

루프의 상단과 하단에 및 가 표시되어 있습니다 <&3.3< "$1"

다른 질문에 대한 답변을 주신 @StéphaneChazelas에게 감사드립니다. (저는 찬성에 투표했습니다.)

또한 분명히 여기에 이것을 게시하면 이 외에 다른 대화형 입력 솔루션이 있는지 궁금합니다.

또한 for다른 q와 마찬가지로 루프를 사용할 수 있지만 파일이 매우 큰 경우 파일을 내부에서 확장하여 불필요한 메모리를 소비할 것이 $(cat "$1")걱정 됩니다. for f in "$(cat "$1")"OTOH 파이프라인은 IIUC 한 줄씩 읽기를 처리해야 합니다. 그래서 나는 사용하는 for것이 유효한 해결책이라고 생각하지 않습니다 . 나도 이것에 대해 논평하고 싶다.

관련 정보