Trong bash, tôi nhận thấy rằng nếu một lệnh sử dụng chuyển hướng sẽ thất bại, bất kỳ chương trình nào chạy trước đó sẽ không chạy.
Ví dụ, chương trình này mở tệp "a" và ghi 50 byte vào tệp "a". Tuy nhiên, chạy lệnh này với chuyển hướng đến một tệp không đủ quyền (~ root / log), sẽ không mang lại thay đổi nào về kích thước tệp của "a".
$ ./write_file.py >> ~root/log
-bash: /var/root/log: Permission denied
cdal at Mac in ~/experimental/unix_write
$ ls -lt
total 16
-rw-rw-r-- 1 cdal staff 0 Apr 27 08:54 a <-- SHOULD BE 50 BYTES
Mọi người sẽ nghĩ chương trình sẽ chạy, nắm bắt bất kỳ đầu ra nào (nhưng cũng ghi vào tệp "a"), và sau đó không thể ghi bất kỳ đầu ra nào vào ~ root / log. Thay vào đó chương trình không bao giờ chạy.
Tại sao lại như vậy và làm thế nào để bash chọn thứ tự "kiểm tra" mà nó thực hiện trước khi thực hiện một chương trình? Các kiểm tra khác được thực hiện là tốt?
ps Tôi đang cố xác định xem một chương trình chạy dưới cron có thực sự chạy khi được chuyển hướng đến tệp "bị từ chối cấp phép" hay không.
write_file.py
chương trình và gửi đầu ra của nó tới ~root/log
bash:" Xin lỗi, nhưng bạn không được phép ghi vào tệp đó! "Shell đang làm chính xác những gì nó nên làm. Nếu nó không thể làm những gì bạn yêu cầu làm, nó ngay lập tức thông báo cho bạn tại sao có vấn đề, cho bạn cơ hội quyết định cách xử lý. Nếu nó đủ quan trọng, bạn đã chỉ định một nơi để lưu nó, thì sẽ là sai đối với ASS | U | ME, bạn có thể chạy mà không lưu stdout.
stdout
để làm chính xác điều đó. Vì vậy, bạn sẽ không thấy bất kỳ đầu ra nào, mặc dù chương trình của bạn đã chạy.