Bash: redirect ke file, selalu buat yang baru

8

Dalam bash, tautan perintah

echo test > actual.txt

akan mengganti konten file yang disebut actual.txtdengan "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?

itsadok
sumber
Bagaimana jika link.txtadalah tautan ke /dir/filetempat /dirfile bertipe direktori tempat Anda menulis dan mencari izin, tetapi /dir/filetidak ada (dan pengalihan akan membuatnya tanpa pesan kesalahan)? Bagaimana jika /dir/fileada tetapi bukan file biasa (perangkat, fifo, direktori ...), atau Anda tidak memiliki izin menulis atau mencari izin /dir?
Stéphane Chazelas

Jawaban:

7

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 shell bashyang membuat ini otomatis.

Jika jalur perantara ada, tetapi titik akhir tautan tidak, maka akan dibuat oleh pengalihan.

Anda dapat melakukan sesuatu seperti

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

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.

Kusalananda
sumber
1
Titik pertanyaan saya adalah bahwa saya tidak mencoba menulis untuk apa-apa. Saya ingin membuat file baru bernama 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 melakukan rm -fdan itu akan memiliki efek yang sama.
itsadok
3
@itsadok Ah. Iya. Hanya melakukan rm -f filenamesebelum 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.
Kusalananda
Anda masih bisa kekurangan izin ke rmfile 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.
Alfe