Chmod ve -r + r


13

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:


18

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 ve chmod -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 .---r
  • chmod 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.

4
Örneğin adında bir dosyanız varsa ve bunun a+rwxgibi bir şey yaparsanız chmod * +rve a+rwxdosya glob genişlemesinde ilk sırada gelirse bunun ilginç sonuçları olabilir .
Jörg W Mittag

1
Veya "rm *" durumunda "-rf" adlı bir dosya.
Edheldil

@Edheldil Evet haklısın. Bu, ele alınması gereken bir şey gibi görünüyor (ve bir hata, tıpkı girdinin düzgün bir şekilde sanitize edilmemesi gibi.)
TestyTentacleLinux

OP sözdiziminin POSIX olmadığını unutmayın man7.org/linux/man-pages/man1/getopt.1.html#SCANNING_MODES
Steven Penny

@StevenPenny Bu alakasız. İlk olarak, bağlı manpage yani bölüm 1 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 .
Bob
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.