đư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 fmột lần, trong execcuộc gọi. Hai echolệnh chỉ ghi vào một mô tả tập tin đã mở. fDo đó, tệp sẽ không bị cắt bởi một trong hai echocuộ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à >&nnơi nlà một số nguyên dương nhỏ biểu thị mô tả tập tin (không có >>&nchuyể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>fviệc cắt bớt tệp đó ( exec 3>>fsẽ không cắt bớt tệp và sẽ mở tệp ở chế độ chắp thêm). Chỉ viết với >&3khô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 exectrước mỗi lần echo).