Saya memulai di direktori kosong.
$ touch aFile
$ ls
aFile
Lalu saya ls
dua argumen, salah satunya tidak ada di direktori ini. Saya mengarahkan kedua aliran output ke file bernama output
. Saya menggunakan >>
untuk menghindari menulis secara bersamaan.
$ ls aFile not_exist >>output 2>>output
$ cat output
ls: cannot access 'not_exist': No such file or directory
aFile
Yang sepertinya berhasil. Apakah ada bahaya untuk pendekatan ini?
io-redirection
stdout
stderr
exit_status
sumber
sumber
ls aFile not_exist &>>output
sini? (Catatan, saya berasumsi Anda menggunakan bash .)&>>
BUKAN standar. Ini adalah sintaks yang ambigu dan ambigu yang bekerja secara berbeda di shell yang berbeda. Aku ingin tahu dari mana kalian mendapatkan barang-barangmu.ls &>>foo ...
harus diuraikan sebagai dua perintahls &
dan>>foo ...
, dan ini adalah cara shell lain seperti/bin/sh
dari Ubuntu menguraikannya. Untuk itu menjadi usang, Anda dapat melihat di sini - meskipun saya tidak berpura-pura itu semacam otoritas. Anda dapat bertanya kepadabash
pengelola apakah mereka mempertimbangkan untuk menggunakan ide yang bagus.Jawaban:
Tidak, tidak hanya seaman standar
>>bar 2>&1
.Ketika Anda sedang menulis
Anda membuka
bar
file dua kali denganO_APPEND
, membuat dua objek file yang sepenuhnya independen [1], masing-masing dengan statusnya sendiri (pointer, mode terbuka, dll).Ini sangat berbeda dengan
2>&1
yang hanya memanggildup(2)
panggilan sistem, dan membuat alias stderr dan stdout dipertukarkan untuk objek file yang sama.Sekarang, ada masalah dengan itu:
Anda biasanya dapat mengandalkan probabilitas file seperti
bar
difoo >>bar 2>&1
yang ditulis ke pada saat yang sama dari dua tempat terpisah yang cukup rendah. Tetapi dengan Anda,>>bar 2>>bar
Anda hanya meningkatkannya dengan selusin pesanan besar, tanpa alasan.[1] "Buka Deskripsi File" dalam istilah POSIX.
sumber
O_APPEND
semacam botch toh - cukup berat untuk diimplementasikan dengan benar.O_APPEND
, klien pertama-tama akan mengambil ukuran "nyata" file dari server ("revalidate" inode) dan kemudian melakukan pencarian + tulis + pembaruan inode dalam cache, dan hanya bagian terakhir adalah dilakukan di bawah kunci, yang berarti bahwa bagian pertama masih dapat mengambil ukuran basi dari server dan menimpa yang benar dari inode lokal / cache. Masalah yang sama denganlseek(SEEK_END)
.Apa yang terjadi ketika Anda melakukannya
adalah yang
file
akan dibuka untuk menambahkan dua kali. Ini aman untuk dilakukan pada sistem file POSIX. Tulisan apa pun yang terjadi pada file saat dibuka untuk ditambahkan akan terjadi pada akhir file, terlepas dari apakah data tersebut berasal dari aliran output standar atau aliran kesalahan standar.Ini bergantung pada dukungan untuk operasi penulisan append atom di sistem file yang mendasarinya. Beberapa sistem file, seperti NFS, tidak mendukung penambahan atom. Lihat misalnya pertanyaan "Apakah file append atomic di UNIX?" Pada StackOverflow.
Menggunakan
akan bekerja bahkan pada NFS sekalipun.
Namun, menggunakan
tidak aman, karena shell akan memotong file output (dua kali) dan tulisan apa pun yang terjadi di kedua aliran akan menimpa data yang sudah ditulis oleh aliran lain.
Contoh:
The
hello
string tertulis pertama (dengan baris baru terminating), dan kemudian stringabc
diikuti oleh baris baru ditulis dari standard error, Timpahell
. Hasilnya adalah stringabc
dengan baris baru, diikuti oleh apa yang tersisa dariecho
output pertama ,o
dan baris baru.Menukar keduanya di
echo
sekitar luka menghasilkan hanyahello
dalam file output sebagai string yang ditulis terakhir dan lebih panjang dariabc
string. Urutan pengalihan terjadi tidak masalah.Akan lebih baik dan aman untuk menggunakan yang lebih idiomatis
sumber
>>
berasal), di mana>>
akan terbuka untuk menulis dan mencari sampai akhir (saya kira karena O_APPEND belum ditemukan saat itu). Bahkan pada Solaris 10,/bin/sh -c '(echo a; echo b >&2) >> file 2>> file; cat file'
keluaranb
.sh
, atau dengan sistem berkasnya?>>
awalnya dilakukan, itu bukan pembukaan dengan O_APPEND, itu terbuka tanpa dan berusaha sampai akhir. Ini bukan masalah, itu apa yang dilakukan dan didokumentasikan untuk dilakukan.Itu tergantung apa yang ingin Anda capai. Terserah Anda untuk memutuskan apakah boleh memiliki kesalahan dalam file yang sama dengan output. Ini hanya menyimpan teks dalam file dengan fungsi shell yang memungkinkan Anda mengarahkan ulang seperti yang Anda inginkan. Tidak ada mutlak ya atau tidak. Karena semua yang ada di Linux dapat dilakukan dengan beberapa cara, ini adalah cara saya
ls notExistingFile existingFile >> output 2>&1
Untuk menjawab pertanyaan: Dalam hal pengalihan itu sendiri, ya itu sangat aman.sumber
>
alih - alih>>
akan menimpa beberapa karakter. Jadi bukan hanya shell memungkinkan saya untuk mengarahkan ulang, karena ketika saya mengarahkan ulang>
, hasilnya berbeda. Jadi ada nuansa dengan>
, apakah ada dengan>>
?>
- menimpa.>>
- tambahkan