Ini mungkin duplikat, tetapi semua pencarian saya memunculkan pertanyaan tentang kesalahan izin ditolak.
Saya menjalankan perintah dalam bash shell. Saya ingin mengarahkan output untuk menambahkan ke file yang mungkin tidak ada pada jalankan pertama. Saya ingin mengatur mode izin file tertentu jika redirection output harus membuat file ini. Apakah ada cara untuk melakukan ini dengan satu perintah?
Sebagai contoh, saya mungkin mencoba
foo >> /tmp/foo.log 0644
di mana 0644
izin yang ingin saya sampaikan foo.log
. Kebanyakan perintah yang saya coba dalam bash akhirnya menafsirkan 0644
sebagai argumen tambahan foo
.
Saya merasa bahwa ini akan mengambil perintah kedua untuk chmod
izin sebelum atau sesudah menulis untuk itu.
Saya menggunakan GNU bash 4.2.25 dan Ubuntu 12.04, jika itu membuat perbedaan - jawaban umum lebih disukai.
sumber
umask
jawabannya lebih baik, dan salah satunya harus diterima.Saya tahu ini pertanyaan lama, tetapi saya ingin menambahkan dua sen saya.
Saya memiliki ide yang sama dan muncul dengan solusi yang mirip dengan BowlesCR . Masalah dengan solusinya adalah bahwa perintah saya (
foo
) tidak akan berfungsi jika saya mengubah umask sebelum menjalankannya, jadi inilah pendapat saya tentang masalahnya:Di sini,
umask
hanya memengaruhi pengalihan kefoo.log
dalam subkulit. Segala sesuatu yang lain tetap tidak terpengaruh.Sedikit berbelit-belit, tetapi berhasil.
sumber
Tanpa skrip yang benar, Anda dapat sedikit berantai:
Secara efektif mirip dengan jawaban Slowki , tetapi terkondensasi menjadi satu-liner.
Satu-satunya hal lain yang bisa saya pikirkan adalah bermain-main dengan umask. Yang terbaik untuk melakukan ini dalam subkulit sehingga tidak mencemari lingkungan saat ini:
Tapi ada dua masalah dengan itu.
creat()
syscall (0666 tampaknya seperti yang digunakan Bash).umask
hanya berlaku untuk pembuatan file ).sumber
cat
. (Meskipun ini tidak mengikuti pola standar penggunaan yang tidak berguna daricat
.) (2) Saya menganggap Anda bermaksud mengatakan bahwa bash default ke mode 0666 saat membuat file, jadi saya mengedit jawaban Anda untuk mengatakannya. (Lihat ini , ini ... (Lanjutkan)umask
nilai 22, 23 atau 32 akan bekerja dengan baik, dalam konteks ini (Anda tidak perlu menggunakan nol di depan; ketika mode danumask
nilai ditentukan secara numerik, mereka selalu diartikan sebagai oktal).22
lebih umum, digunakan secara konvensional.Saat pengalihan menetapkan izin yang salah, misal:
Saya percaya Anda dapat menggunakan sesuatu seperti xynomorf berikan, dan mengatasi masalah stderr dari Orsiris de Jong dengan sedikit modifikasi untuk menggunakan substitusi proses bash .
Secara alami, gunakan
umask 0077
untuk mendapatkan mode600
dan melarang pengguna lain melihat konten.sumber
Jika Anda ingin mengarahkan ulang ke skrip, tidak seperti
umask
, dengan substitusi proses daninstall
Anda juga dapat mengatur bit eksekusi:<()
menempatkan output ke dalam file sementara, lihat Substitusi Prosessumber