이 조각을 보면:
exec 3>f
echo foo >&3
echo bar >&3
cat f # returns foo bar
bash가 f에 콘텐츠를 추가하는 이유는 무엇입니까? 내가 뭐 놓친 거 없니?
답변1
당신이 놓친 것은 f
호출에서 파일을 한 번만 열고 자르는 것입니다 exec
. 이 두 echo
명령은 이미 열려 있는 파일 설명자에 쓰기만 하면 됩니다. 따라서 어떤 호출에서도 파일이 f
잘리지 않습니다 echo
.
표준 출력을 파일 설명자로 리디렉션하기 위한 구문은 파일 설명자를 나타내는 작은 양의 정수입니다(리디렉션 없음 >&n
) . 이 작업을 수행하려면 파일 설명자가 이미 열려 있는 파일과 연결되어 있어야 합니다. 이것은n
>>&n
파일 열기 동작exec 3>f
이를 잘린 파일의 설명자 와 연결합니다 ( exec 3>>f
파일은 잘리지 않고 추가 모드에서 열립니다). 쓰기 전용을 사용하면 >&3
파일이 열리지 않으며 파일이 잘리지도 않습니다.
그랬다면 상황이 달라졌을 텐데
echo foo >f
echo bar >f
cat f
(각각은 echo
열리고 잘립니다 f
.) 또는 더 복잡하게는
exec 3>f; echo foo >&3
exec 3>f; echo bar >&3
exec 3>&- # close fd 3
cat f
(파일은 exec
각 파일 앞에 열리고 잘립니다 echo
.)