다음 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"가 두 개의 파일에 저장됩니다.