Bash: chuyển hướng đến tập tin, luôn luôn tạo mới


8

Trong bash, một liên kết lệnh

echo test > actual.txt

sẽ thay thế nội dung của tệp được gọi actual.txtbằng "test" và tạo tệp nếu nó không tồn tại. Tuy nhiên, nếu tệp tồn tại, bash sẽ chỉ mở nó, cắt bớt nó và ghi nội dung mới vào tệp.

Cụ thể, lệnh redirect không thành công trong kịch bản này:

ln -s /some/illegal/path link.txt
echo test > link.txt

Bash 4.4.12 cho tôi thông báo lỗi khó hiểu link.txt: No such file or directory.

Một cách để tránh điều này là đảm bảo xóa tệp trước khi chạy lệnh chuyển hướng.

rm link.txt && echo test > link.txt

Tuy nhiên, tôi đã tự hỏi nếu có một số tùy chọn bash hoặc toán tử chuyển hướng sẽ ngăn chế độ thất bại này. Có ý kiến ​​gì không?


Điều gì xảy ra nếu link.txtmột liên kết đến /dir/filenơi /dirlà một tệp có thư mục loại mà bạn có quyền viết và tìm kiếm, nhưng /dir/filekhông tồn tại (và chuyển hướng sẽ tạo ra nó mà không có thông báo lỗi)? Điều gì về nếu /dir/filetồn tại nhưng không phải là một tệp thông thường (thiết bị, fifo, thư mục ...) hoặc bạn không có quyền ghi vào nó hoặc cho phép tìm kiếm /dir?
Stéphane Chazelas

Câu trả lời:


7

Cố gắng viết vào một liên kết tượng trưng đã chết tương đương với cố gắng viết vào một con đường không tồn tại. Không có cách nào để "điều chỉnh" chuyển hướng đầu ra để tạo đường dẫn (bao gồm các thư mục trung gian) trong đó bash, và không có tùy chọn shell bashnào làm cho điều này tự động.

Nếu đường dẫn trung gian tồn tại, nhưng điểm cuối của liên kết không có, thì nó sẽ được tạo bởi chuyển hướng.

Bạn có thể làm một cái gì đó như

if [ -h file ] && [ ! -f file ]; then
    rm file
fi

để kiểm tra xem "tệp" có phải là một liên kết tượng trưng ( -h) hay không và liệu nó có đề cập đến một tệp thông thường tồn tại ( -f) không. Nếu đó là một liên kết tượng trưng nhưng không đề cập đến một tập tin, thì bạn xóa nó.


1
Quan điểm của câu hỏi của tôi là tôi không cố viết cho bất cứ điều gì. Tôi muốn tạo một tệp mới được gọi link.txtvà có một liên kết tượng trưng ở cùng một vị trí. Để đặt câu hỏi này dưới dạng câu hỏi: tại sao phải kiểm tra nếu tôi sẽ ghi đè lên tệp trên dòng tiếp theo? Tôi chỉ có thể làm rm -fvà nó sẽ có tác dụng tương tự.
itadok

3
@itsadok À. Đúng. Chỉ cần làm rm -f filenametrước khi viết cho nó với chuyển hướng cũng sẽ giải quyết vấn đề của bạn. Nhưng nó cũng phụ thuộc vào việc bạn muốn nó ở trong thư mục hiện tại hay trong thư mục nơi đặt điểm cuối của liên kết tượng trưng.
Kusalananda

Bạn vẫn có thể thiếu quyền đối rmvới tệp hoặc ghi vào tệp. Như trong nhiều trường hợp, bạn không thể chuẩn bị cho mọi thứ. Bạn cần đánh giá những trường hợp nào bạn thực sự mong đợi (thậm chí là những trường hợp hiếm gặp) và do đó xử lý, những trường hợp bạn cho là không chắc chắn rằng bạn cố tình không xử lý chúng, và chấp nhận rằng sẽ có một số trường hợp nhất định bạn không xem xét và do đó không thể xử lý.
Alfe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.