Bash 스크립트에서는 파일 이름 인수로 프로세스 stdout을 여러 번 열면 실패합니다.

Bash 스크립트에서는 파일 이름 인수로 프로세스 stdout을 여러 번 열면 실패합니다.

다음 bash 스크립트 코드를 고려해보세요.

#!/bin/bash

function bug_part() {
    cat $1 > sample.first
    cat $1 > sample.second #second time you open file $1, it contains no data
}

bug_part <(echo "TEST")
[ "$(cat sample.first)" != "$(cat sample.second)" ] && echo "THIS IS A BUG" 1>&2 && exit 1
rm sample.first sample.second

이 문제가 bash 버그라는 것에 동의하십니까? 아니면 리눅스 버그인가요?

뒤에서 무슨 일이 일어나고 있는지 아는 사람이 있습니까?

답변1

나는 이것이 실수라고 생각하지 않습니다. 다음에 의해 준비된 명령에 연결된 명명된 파이프를 읽고 쓸 수 있습니다.프로세스 교체한번만.

답변2

이것은 스크립트의 버그입니다. tee한 번만 읽을 수 있는 데이터를 복사하려면 이 옵션을 사용하십시오. 다른 답변에서 설명하듯이 <(cmd)는 파이프를 생성하고 /dev/fd/62명령줄에 다음과 같은 내용을 입력합니다.

echo <(true)
  /dev/fd/63

또 다른 대안 tee은 다음 문자열입니다.

cmd <<<"$text"

Bash가 검색 가능한 tmp 파일을 생성하고 그 파일에서 입력을 리디렉션하도록 하려는 경우. (하지만 함수 내에서 stdin을 파일의 시작 부분으로 되감는 방법을 잘 모르겠습니다. cat /dev/stdin동일한 파일 위치를 얻는 것이 가능하다고 생각합니다.)

답변3

tee파일(/pipe)을 두 번 읽는 대신 사용하라는 @Peter Cordes의 제안을 확장하면 다음과 같이 함수를 다시 작성할 수 있습니다.

bugless_part() {
    tee sample.first >sample.second <"$1"
}

로 실행하면 bugless_part <(echo "TEST")"TEST"가 두 개의 파일에 저장됩니다.

관련 정보