Saya ingin memeriksa izin grup file dari skrip bash. Secara khusus, saya perlu memeriksa apakah file memiliki bit yang dapat ditulisi grup.
Itu dia. Sederhana seperti itu. Namun:
- Saya juga perlu ini menjadi portabel.
test -w <file
tidak akan memberi tahu saya apakah itu dapat ditulisi grup.- Outputnya
ls -ld
bagus untuk manusia, tetapi tidak begitu yakin tentang skrip. Secara teknis saya dapat mengurai output sepertidrwxrwxr-x
untuk mengekstrak bit grup, tetapi ini tampaknya rapuh. - Antarmuka untuk
stat
sepenuhnya tidak kompatibel antara OS X dan sistem lainnya. find <file> -perm ...
tidak mungkin jawabannya?
bash
permissions
ls
stat
mislav
sumber
sumber
Jawaban:
Metode # 1 - stat
Anda bisa menggunakan
stat
perintah untuk mendapatkan bit izin.stat
tersedia di sebagian besar Unix (OSX, BSD, bukan AIX dari apa yang dapat saya temukan). Ini seharusnya berfungsi pada sebagian besar Unix, kecuali OSX & BSD dari apa yang dapat saya temukan.Contoh
Gunakan perintah ini:
Dan gunakan sederhana
grep
untuk melihat apakah mode izin grup adalah 6 atau 7.Untuk OSX dan BSD Anda harus menggunakan bentuk
stat
,stat -f
(atau mungkinstat -x
), dan menguraikannya. Karena opsistat
berbeda, Anda dapat membungkus perintah ini dalam sebuahlsb_release -a
perintah dan memanggil versi yang sesuai berdasarkan OS. Tidak ideal tetapi bisa diterapkan. Sadarilah bahwalsb_release
ini hanya tersedia untuk distro Linux sehingga alternatif lain perlu dirancang untuk menguji OS Unix lainnya.Metode # 2 - temukan
Saya pikir perintah ini mungkin melayani Anda dengan lebih baik. Saya menggunakan
find
danprintf
beralih.Contoh
Metode # 3 - Perl
Perl mungkin cara yang lebih portabel untuk melakukan ini tergantung pada OS yang Anda coba untuk menutupi.
CATATAN: Di atas menggunakan
stat()
fungsi Perl untuk meminta bit filesystem.Anda dapat membuat ini lebih kompak dengan tidak menggunakan array
@pv
,, dan berurusan dengan outputstat()
secara langsung:sumber
stat
Perintah sangat bervariasi di antara sistem yang berbeda dan tidak portabel.find . -printf
bisa melakukannya tetapi tidak dapat menentukan apakah itu tersedia di OSX 'find.Salah satu pilihan adalah menggunakan
perl
, yang akan portabel di manaperl
- mana tersedia. Sulit untuk menemukan sistem unix tanpa itu. Berikut adalah contoh bagaimana itu dapat diintegrasikan ke dalam skrip shell:perl
Contoh serupa dapat ditemukan di stat perldoc .sumber
Saya akhirnya
ls
memparsing:Saya bersyukur atas jawaban ekstensif @ slm, tetapi tidak ada metode lain yang semudah ini. The
stat
Metode akan mengharuskan saya untuk menulis setidaknya dua doa yang berbeda untuk menutupi OS X, dan bahkan setelah itu mengembalikan representasi oktal yang saya masih harus menerapkan aritmatika untuk. Metode Perl baik-baik saja tetapi mengharuskan saya untuk memulai juru bahasa untuk tugas yang begitu sederhana, dan saya ingin membuatnya tetap sederhana dan hanya menggunakan utilitas posix.sumber
perms=$(ls -ld -- "$1"); perms=${perms%% *}; case $perms in ?????w????) …
Semua alat Unix / Linux standar.
Saya kira mungkin saja untuk menulis grup, tetapi tidak membaca grup. Dalam kemungkinan itu, itu bisa berupa pernyataan kasus 2 | 3 | 6 | 7) atau grep '[2 | 3 | 6 | 7]'
sumber