đưa ra đoạn trích này:
exec 3>f
echo foo >&3
echo bar >&3
cat f # returns foo bar
Tại sao bash gắn vào f? Tui bỏ lỡ điều gì vậy?
đưa ra đoạn trích này:
exec 3>f
echo foo >&3
echo bar >&3
cat f # returns foo bar
Tại sao bash gắn vào f? Tui bỏ lỡ điều gì vậy?
Câu trả lời:
Điều bạn thiếu là bạn chỉ mở (và cắt) tệp f
một lần, trong exec
cuộc gọi. Hai echo
lệnh chỉ ghi vào một mô tả tập tin đã mở. f
Do đó, tệp sẽ không bị cắt bởi một trong hai echo
cuộc gọi.
Để chuyển hướng đầu ra tiêu chuẩn để một bộ mô tả tập tin, cú pháp là >&n
nơi n
là một số nguyên dương nhỏ biểu thị mô tả tập tin (không có >>&n
chuyển hướng). Bộ mô tả tệp phải được liên kết với một tệp đã mở để nó hoạt động. Đó là hành động mở tệp và liên kết nó với một mô tả với exec 3>f
việc cắt bớt tệp đó ( exec 3>>f
sẽ không cắt bớt tệp và sẽ mở tệp ở chế độ chắp thêm). Chỉ viết với >&3
không mở tập tin cũng không cắt nó.
Nó sẽ khác đi nếu bạn làm
echo foo >f
echo bar >f
cat f
(mỗi cái echo
đang mở và cắt ngắn f
), hoặc, phức tạp hơn,
exec 3>f; echo foo >&3
exec 3>f; echo bar >&3
exec 3>&- # close fd 3
cat f
(tập tin được mở và cắt exec
trước mỗi lần echo
).