Komut satırı argümanı gibi adlandırılmış bir dosya nasıl oluşturulur?


29

Bayrak olarak adlandırılan bir dosyayı nasıl yapacağımı merak ediyordum, örneğin, bir klasör yapmak isteseydim -a, hangi komutları yapardı?

Denedim mkdir '-a', mkdir \-ave ne çalıştı. Ubuntu'dayım.


13
Buradaki cevapların hepsi harika, ama bunu yapmak için troll olmayan bir sebep
düşünemiyorum

@evilsoup Bazı insanlar, klasörleri öneklendirmeyi severler, böylece alfanümerik olarak sıralanmış bir listeye en üste yapıştırırlar. Ama dürüst olmak gerekirse düşünebilmemin tek nedeni bu.
slhck

@slhck Öğrencileri, projelerinin dizinlerine boş alanlar koymaya teşvik ettikleri ve ortak iMac'lerde en üstte yer alacakları en az bir video düzenleme kursu biliyorum. Bu çirkindi ve komik bir yükselişe neden oldu, ama en azından potansiyel olarak sisteme
zarar vermezdi

3
Çoğunlukla bu akademik ilgi için burada.
MYV

5
Zorunlu çizgi roman: beesbuzz.biz/d/20110224.php
kabarık

Yanıtlar:


49

Komutu şöyle çağır:

mkdir -- -a

--Böylece araç seçenekleri, bundan sonra son vermesini -abir seçenek olarak tam anlamıyla değil yorumlanır alır mkdir. Bu sözdizimini yalnızca içinde değil mkdir, echove dışında herhangi bir POSIX uyumlu yardımcı programda bulacaksınız test. Şartnameden :

Argüman - seçeneklerin sonunu belirten bir sınırlayıcı olarak kabul edilmelidir. Aşağıdaki argümanlar '-' karakteriyle başlasalar bile, operand olarak değerlendirilmelidir. - argümanı bir seçenek olarak veya bir işlenen olarak kullanılmamalıdır.

Kullanılması --alan güvenlik Eğer dosya adları ile anlaşma ve emin onlar komutu bozmazlar yapmak istiyorum hemen her eylem için tavsiye edilir gibi bir döngü içinde dosyaları taşırken, örneğin bir dosya adı verilen böylece aşağıdakileri aramak istersin -i' değil mi t (in?) bir seçenek olarak doğru ayrıştırıldı:

mv -- "$f" new-"$f"

Bu yaklaşımın dezavantajı tam olarak opsiyon işlemeyi sonlandırmasıdır. Basit bir mkdir örneği için harikalar yaratıyor; Komut satırında dosya adını izlemek için bir seçeneğe gerçekten ihtiyacınız varsa, hiç çalışmaz.
CVn

1
Elbette — her şeyin bir dezavantajı var. Seçeneklerle serpiştirilmiş dosya adlarıyla ilgilendiğiniz durumlarda, Amos'un çözümü aklıma gelen tek mantıklı alternatif olacaktır ancak bu, aracın seçenekleri nasıl ayrıştırdığına bağlıdır.
slhck

1
OP, "komut satırı argümanı gibi" adında bir dosya oluşturma hakkında konuştuğundan (hadi kısa çizgi ile başlayan bir ad varsayalım), bunun tamamen mantıksız bir varsayım olduğunu sanmıyorum. cc -o -myfile -Wall -myfile.cSadece biraz tartışmalı bir örnek olarak alın . Tuzuna değecek herhangi bir editör, -myfile.cisterseniz adlandırılmış bir dosyaya kaydedebilmelidir , ancak C derleyicisi muhtemelen böyle bir seçenek listesi verildiğinde istediğinizi yapmaz.
CVn

1
@Maksim Örneğin , çıktı dosyasını belirleme seçeneğine ccsahip, yukarıda verilen komut gibi, bir girdi veya çıktı dosya adı belirleme seçeneği gerektiren komutlar -o.
slhck

1
Döngü örneği neden her zaman for f in ./*; do...yerine bir şey kullanmanız gerektiğidirfor f in *; do...
evilsoup

21

Makul bir programla çalışması gereken en basit yol, önünde geçerli bir yol adı kullanmaktır -; örneğin , geçerli çalışma dizininde mkdir ./-aadı verilen bir dizin oluşturur -a.

Bu "numarayı" kullanmanın en yaygın örneği bir çizgi ile başlayan bir dosyayı kaldırmak istediğinizde, böylece yapabilirsiniz rm ./-a.


3
Elbette bu sadece hile yapar, dosya yollarıyla çalışıyorsanız ve dizge olarak ayrıştırılan herhangi bir isteğe bağlı komut satırı seçeneği yoksa. Ancak, aksi takdirde önek ekleme ./her zaman iyi bir fikirdir - bir dosya oluşturduğunuzu -rfve daha sonra aradığınızı hayal edin rm *.
slhck

1
@slhck Şaka gibi görünebilecek birçok insan için. Ancak bu tür bir şeyin bir sunucuyu (bir kısmı) sildiği yeterli vaka gördüm. Bir çizgi ile başlayan dosyaların tehlikeleri hakkında insanları yeterince uyamazsınız. Çalıştığım bir yer bile resmi bir kuraldı: Asla "-f" ya da "-r" ile başlayan bir dosya oluşturma.
Tonny

1
Bunun cevabı olmalı: tek taşınabilir yol bu ( --her komutta anlaşılmayan, sadece birkaçı)
Olivier Dulac

@OlivierDulac --Bir bash şey olduğunu düşündüm , bu yüzden tüm programlar için çalışması gerekir?
gsingh2011

@ gsingh2011 no, "-" işaretinin "bayrakların sonu" işaretçisi olarak kabul edilip edilmeyeceğine karar veren kod uygulamada bulunur ve bu şekilde ele alıp almadığına karar vermek her uygulamaya bağlıdır.
Amos Shapira

4

Nedeni mkdir '-a', ya mkdir \-a(tırnak veya ters eğik çizgi kullanarak) bu yöntemlerin her ikisi senin önlemek için kullanılır çünkü does not iştir kabuğu (muhtemelen bashonlara herhangi bir özel anlam vermekten). Yana -aortalama şey özel Neyse kabuğuna değil, bu o geçirilir alır nasıl etkisi yoktur mkdir.

Kadarıyla şöyle mkdirilgilidir, bu kabuğundan bağımsız değişkenlerin bir listesini alır ve bir ters eğik çizgi vardı, yoksa tırnak koyun ya da olmasın bunu söylemek mümkün değil. Sadece bir argüman görür -a. Bu yüzden --diğer cevaplarda açıklandığı gibi ihtiyacın var .


-3

"Slhck" in cevabına ek olarak, bazen işe yarayan başka bir numara var:

Söz konusu dosya adını, "'-a'"veya gibi 2 farklı (farklı) qout kümesine yerleştirin '"-a"'.

Bunun işe yarayıp yaramadığı programa bağlıdır, ancak program POSIX --özelliğini desteklemiyorsa son çaredir .
POSIX yöntemi her zaman% 100 güvenilir olduğu için tercih edilir.


"POSIX yöntemi her zaman% 100 güvenilir olduğu için tercih edilir." --Seçenek işlemeyi sonlandırmak için kullanmak , aynı zamanda her zaman geçerli olmayan dosya adını takip etmek için hiçbir seçeneğe ihtiyacınız olmadığını varsayar.
CVn

@ MichaelKjörling Elbette ... Ama bunun açık olacağını varsaydım.
Tonny

4
Bu, '-a'ya da "-a"en azından BSD tipi sistemlerde
15’te

4
Bu bir OS / kabuk alıntı Can yapar işi?
yokuş yukarı

1
İşe yaratsaydı, adlarıyla çevrelenmiş isimleri olan dosyalarla uğraşırken oldukça önemli bir probleminiz olurdu.
muhmuhten
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.