Dalam bash, tautan perintah
echo test > actual.txt
akan mengganti konten file yang disebut actual.txt
dengan "test", dan membuat file jika tidak ada. Namun, jika file itu ada, bash hanya akan membukanya, memotongnya, dan menulis konten baru ke dalam file.
Secara khusus, perintah pengalihan gagal dalam skenario ini:
ln -s /some/illegal/path link.txt
echo test > link.txt
Bash 4.4.12 memberi saya pesan kesalahan yang membingungkan link.txt: No such file or directory
.
Salah satu cara untuk menghindari ini adalah memastikan untuk menghapus file sebelum menjalankan perintah yang diarahkan.
rm link.txt && echo test > link.txt
Saya bertanya-tanya, apakah ada beberapa pilihan tweak bash atau operator redirect yang akan mencegah mode kegagalan ini. Ada ide?
bash
io-redirection
symlink
itsadok
sumber
sumber
link.txt
adalah tautan ke/dir/file
tempat/dir
file bertipe direktori tempat Anda menulis dan mencari izin, tetapi/dir/file
tidak ada (dan pengalihan akan membuatnya tanpa pesan kesalahan)? Bagaimana jika/dir/file
ada tetapi bukan file biasa (perangkat, fifo, direktori ...), atau Anda tidak memiliki izin menulis atau mencari izin/dir
?Jawaban:
Mencoba menulis ke tautan simbol mati sama dengan mencoba menulis ke jalur yang tidak ada. Tidak ada cara untuk "mengubah" pengalihan output untuk membuat jalur (termasuk direktori perantara)
bash
, dan tidak ada opsi shellbash
yang membuat ini otomatis.Jika jalur perantara ada, tetapi titik akhir tautan tidak, maka akan dibuat oleh pengalihan.
Anda dapat melakukan sesuatu seperti
untuk menguji apakah "file" adalah tautan simbolik (
-h
) dan apakah itu merujuk ke file biasa yang ada (-f
). Jika itu adalah tautan simbolis tetapi tidak merujuk ke file, maka Anda menghapusnya.sumber
link.txt
, dan kebetulan ada tautan simbolik di lokasi yang sama. Untuk meletakkan ini dalam bentuk pertanyaan: mengapa repot-repot dengan pengujian jika saya akan menimpa file pada baris berikutnya? Saya hanya bisa melakukanrm -f
dan itu akan memiliki efek yang sama.rm -f filename
sebelum menulis dengan pengalihan juga akan menyelesaikan masalah Anda. Tetapi itu juga tergantung pada apakah Anda ingin berada di direktori saat ini atau di direktori di mana titik akhir dari tautan simbolik berada.rm
file atau menulis ke sana. Seperti dalam banyak kasus, Anda tidak dapat mempersiapkan segalanya. Anda perlu menilai kasus mana yang benar-benar Anda harapkan (meskipun jarang) dan karena itu menangani, kasus mana yang Anda anggap sangat tidak mungkin sehingga Anda sengaja tidak menanganinya, dan menerima bahwa akan ada sejumlah kasus yang tidak Anda pertimbangkan dan dengan demikian tidak bisa menangani.