Ini adalah kekhasan dari bagaimana chmod GNU menangani input, dan tidak portabel untuk semua implementasi chmod yang kompatibel dengan POSIX.
Perhatikan bahwa POSIXchmod
coomand-line sintaks membutuhkan modus untuk datang pertama, seperti halnya GNUchmod
(pilihan harus datang sebelum mode, juga). Yang lainnya adalah kekhilafan implementasi yang tidak berdokumen.
Sekarang, mengapa hal itu terjadi dalam implementasi khusus ini:
Diisyaratkan di dalam manual :
Namun, biasanya, ' chmod a-w file
' lebih disukai, dan chmod -w file
(tanpa --
) mengeluh jika berperilaku berbeda dari apa yang chmod a-w file
akan dilakukan.
Secara singkat, opsi yang diuraikan oleh getopt
diawali dengan a -
. Seperti dalam ls -a
, a
adalah opsi. Bentuk panjang ls --all
memiliki all
opsi. rm -rf
(setara dengan rm -r -f
) memiliki keduanya r
dan f
opsi.
Yang lainnya adalah argumen non-opsi, secara teknis disebut operan . Saya suka menyebut argumen posisi ini , karena maknanya ditentukan oleh posisi relatif mereka. Dalam chmod
, argumen posisi pertama adalah mode dan argumen posisi kedua adalah nama file.
Secara optimal, mode tidak boleh mengarah dengan -
. Jika ya, Anda harus menggunakan --
parsing sebagai operan alih-alih opsi (yaitu penggunaan chmod a-w file
atau chmod -- -w file
alih-alih chmod -w file
. Ini juga disarankan oleh POSIX.
Jika Anda melihat kode sumber , Anda akan melihatnya menggunakan getopt untuk mengurai opsi baris perintah. Di sini, ada penanganan khusus untuk mode 'salah' seperti -w
:
case 'r':
case 'w':
case 'x':
case 'X':
case 's':
case 't':
case 'u':
case 'g':
case 'o':
case 'a':
case ',':
case '+':
case '=':
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
/* Support nonportable uses like "chmod -w", but diagnose
surprises due to umask confusion. Even though "--", "--r",
etc., are valid modes, there is no "case '-'" here since
getopt_long reserves leading "--" for long options. */
Ambil contoh Anda:
chmod a-r file.txt
akan menjadi doa yang paling kuat .
chmod +r file.txt
berfungsi karena argumen pertama ditafsirkan secara posisi sebagai mode.
chmod -r file.txt
masih berfungsi karena -r
diartikan sebagai r
opsi pendek dan khusus.
chmod -- -r file.txt
benar dan berfungsi karena -r
posisi ditafsirkan sebagai mode. Ini berbeda dari kasus tanpa --
karena dengan --
itu -r
tidak ditafsirkan sebagai pilihan .
chmod file.txt -r
masih berfungsi karena -r
diartikan sebagai r
opsi pendek dan khusus. Opsi tidak bergantung pada posisi. Ini secara teknis menyalahgunakan kebiasaan yang tidak berdokumen.
chmod file.txt +r
tidak berfungsi karena +r
operan, bukan opsi. Operan pertama ( file.txt
) ditafsirkan sebagai mode ... dan gagal diurai.
a+rwx
dan melakukan sesuatu sepertichmod * +r
, dana+rwx
file tersebut menjadi yang pertama dalam ekspansi glob.getopt
perintah , bukan rutin perpustakaan di bagian 3 . Kedua, itu merujuk padaoptstring
, yaitu daftar opsi yang diterima (dalamchmod
sumberoptstring
diatur ke"Rcfvr::w::x::X::s::t::u::g::o::a::,::+::=::"
). Bagian "SCANNING MODES" yang ditautkan tidak ada hubungannya dengan array argumenargv
yang berisi argumen yang diteruskan ke dalam program.