Komutu yanlış sırada çağırmayı denedim. chmod file.txt -rBu bir nedenle işe yaradı. chmod file.txt +rDiğer yandan çalışmayı reddetti. Bu neden? Bir komut hangi sebepten ötürü çalışıyor, diğeri çalışmıyor?
Komutu yanlış sırada çağırmayı denedim. chmod file.txt -rBu bir nedenle işe yaradı. chmod file.txt +rDiğer yandan çalışmayı reddetti. Bu neden? Bir komut hangi sebepten ötürü çalışıyor, diğeri çalışmıyor?
Yanıtlar:
Bu, GNU chmod'un girişi nasıl ele aldığının bir tuhaflığıdır ve tüm POSIX uyumlu chmod uygulamaları için taşınabilir değildir.
Not o POSIXchmod coomand satırı sözdizimi gerektirir sürece, birinci gelmek modunu GNUchmod (seçenekler de mod önce gelmelidir). Başka herhangi bir şey belgelenmemiş bir uygulama sorunudur.
Şimdi, bu özel uygulamada neden gerçekleştiği üzerine:
Kılavuzda ima edilmiştir :
Tipik olarak, '
chmod a-w file' tercih edilir vechmod -w file(olmadan--), 'chmod a-w file' ne yapacağından farklı davranırsa şikayet eder .
Kısaca, tarafından ayrıştırılan seçeneklerin getoptönüne a eklenir -. İçinde olduğu ls -agibi a, bir seçenektir. Uzun biçim ls --allvardır allbir seçenek olarak. rm -rf(eşdeğer rm -r -f) hem sahiptir rve fseçenekleri.
Diğer her şey teknik olarak işlenen olarak adlandırılan isteğe bağlı olmayan bir argüman . Anlamları göreceli konumlarına göre belirlendiği için bu konumsal argümanları çağırmayı seviyorum . İçinde chmod, ilk konum bağımsız değişkeni moddur ve ikinci konum bağımsız değişkeni dosya adıdır.
Optimal olarak, mod a ile yönlendirmemelidir -. Eğer öyleyse, --bir seçenek yerine işlenen olarak ayrıştırmayı zorlamanız gerekir (yani kullan chmod a-w fileveya chmod -- -w fileyerine chmod -w file. Bu POSIX tarafından da önerilir .
Kaynak koda bakarsanız, komut satırı seçeneklerini ayrıştırmak için getopt kullandığını fark edeceksiniz . Burada, 'yanlış' modlar için özel kullanım var -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. */
Örnek alarak:
chmod a-r file.txtolacağını en sağlam çağırma.chmod +r file.txt çünkü ilk argüman konumsal olarak mod olarak yorumlanır.chmod -r file.txthala çalışıyor çünkü -rkısa bir rseçenek olarak yorumlanıyor ve özel kasalı.chmod -- -r file.txtdoğrudur ve çalışır çünkü -rkonum olarak mod olarak yorumlanır. Olmadan davadan Bu farklılık --ile çünkü bir şekilde yorumlanmaz seçeneği .---rchmod file.txt -rhala çalışıyor çünkü -rkısa bir rseçenek olarak yorumlanıyor ve özel kasalı. Seçenekler konuma bağlı değildir. Bu teknik olarak belgelenmemiş bir tuhaflığı kötüye kullanır.chmod file.txt +rçalışmıyor çünkü +rbir işlenen, bir seçenek değil. İlk işlenen ( file.txt) bir mod olarak yorumlanır ... ve ayrıştırılamaz.getopt , komut değil, kütüphane rutin olarak bölüm 3 . İkincisi, bu optstring, kabul edilen seçeneklerin listesine ( chmodkaynakta optstringolarak ayarlanır "Rcfvr::w::x::X::s::t::u::g::o::a::,::+::=::") atıfta bulunur . Bağlantılı "TARAMA MODLARI" bölümü, programa iletilen bağımsız değişkenleri argv içeren bağımsız değişken dizisiyle hiçbir ilgisi yoktur .
a+rwxgibi bir şey yaparsanızchmod * +rvea+rwxdosya glob genişlemesinde ilk sırada gelirse bunun ilginç sonuçları olabilir .