“-” adlı bir dosya nasıl “azaltılır”?


17

Yanlışlıkla adıyla bir dosya oluşturdum -(örn seq 10 > -.). Sonra lessgörüntülemek için kullanmaya çalıştım , ama sadece asılı.

Bunun gerçekleştiğini anlıyorum çünkü less -girdiyi bekler stdin, bu yüzden -bir dosya adı olarak yorumlamaz . Denedim less \-ama işe yaramıyor.

Yani, stdin değil bir dosya lessolduğunu belirtmenin bir yolu var -mı?

Alabileceğim en iyi şey:

find -name '-' -exec less {} +

2
@muru yorum için teşekkürler, ancak olası yinelenen o kadar spesifik ki "kesin yinelenen" olmaya hak kazanmadığını düşünüyorum. Eğer "-" ile başlayan bir dosyaya nasıl erişilir gibi daha genel bir şeyle yeniden yazılırsa, belki.
fedorqui

4
Bu yinelenen bir soru değil. İçin durum -yalnız farklıdır. -bir seçenek değil.
Stéphane Chazelas

1
@terdon Aynı cevaba sahip olmanın doğrudan kopya olduğu anlamına gelmez. Meta SO'da bir yerde bir örnek vardı: Bir soru "Hayır" ile cevaplanırsa, doğru cevabı "Hayır" olan herhangi bir şey kopya olur mu? Daha önce söylediğim gibi, yinelenen adayı daha genel hale getirmek için yeniden yazmak ilginç olurdu; Aksi takdirde, bunun gibi başka sorular göndermek pek mantıklı değil.
fedorqui

4
@terdon, hayır. Kabul edilen çözüm burada çalışmayacak. Ve hayır, -bir seçenek olarak ele alınmaz, bu seçenek gibi şekillenen argümanlar durumundan tamamen farklı bir sorundur.
Stéphane Chazelas

2
İçine gerekmez -gibi tek tırnak arasına '-'gibi veya kaçış \-çünkü -ortak kabukları için özel bir karakter (en azından POSIX uyumlu olanlar) değildir. Sonuç aynı.
pabouk

Yanıtlar:


53

Sadece önekle ./:

less ./-

Veya yeniden yönlendirme kullanın:

less < -

Çünkü Not o -(karşıt olarak -xveya --foo--özel bir dosya adı yerine bir seçenek olarak kabul edilir örneğin), şu değil çalışır:

less -- -   # THIS DOES NOT WORK

3
BTW, işte bu find -name '-' -exec less {} +.
Stéphane Chazelas

6
@ fedorqui, hayır bu sadece -ve ./-(veya /path/to/-veya ../to/-) o -dosyaya iki (4) geçerli yol , ancak -özel değil less(stdin'den okunan anlamına gelir) bir argüman ./-özeldir.
Stéphane Chazelas

2
@fedorqui find -name '-' -exec less {} +standart olmayan formdur find . -name '-' -exec less {} +. Ağaca iner .ve dosyaları bulur ve bu dosyaların yollarını argüman olarak iletir less. Neyin çalıştırıldığını görmek için -exec lessile değiştirin -exec echo less.
Stéphane Chazelas

4
@haylem, --seçeneklerin sonunu işaretlemektir. Burada yardımcı olmaz. Bu -bir seçenek değil, özel bir seçenek olmayan argüman. Ayrıca bkz. Unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756
Stéphane Chazelas

3
@ haylem, kendin dene. --seçeneklerin sonunu işaretlemek için getopt () tarafından işlenir, getopt () -tarafından bir seçenek -olarak tanınmadığından --, sağlanmış olsun veya olmasın normal bir bağımsız değişken olarak kabul edilir . Ve normal bir argüman olarak, lessçoğu metin yardımcı programı gibi, burada istemediğimiz stdin anlamına gelir.
Stéphane Chazelas


3

Not: Cevabım OP'nin durumunda geçerli DEĞİLDİR ve yalnızca aşağıda belirtilen kuralları izleyen araçlar için geçerlidir ve tam olarak sadece -(tire) adlı bir dosya için geçerli değildir , bu da genellikle standarttan okumayı belirtmek için özel bir durumdur. girdi bekleniyor. Kabul edilen cevaba bakınız.

Bunu burada bırakarak yanıtlar ararken karşılaşabileceğiniz diğer durumlar için yararlı bilgiler içerir.


Çift Kes!

--Son argümanı belirtmek için standart çift tire ( ) kuralını kullanın:

less -- -FILENAME

Misal

$ echo "meh" > -badname
$ less -badname
Number is required after -b
$ less -- -badname # GREAT SUCCESS!

Whhhaattt?

Bu --argüman, kabuk yardımcı programlarının ve komut satırı araçlarının çoğu uygulaması tarafından desteklenen bir kuraldan kaynaklanır ve çoğu kabuk, CLI araçlarını uygularken izlemeniz gerektiğini gözle görülür şekilde savunur.

Açık Grup tarafından tavsiye edilir

OpenGroup ayrıca Temel Spesifikasyonunun Yardımcı Program açıklaması varsayılanları (v6) bölümünde de bahseder :

Varsayılan Davranış: [...] Seçenekleri kabul etmeyen, ancak işlenenleri kabul eden standart yardımcı programlar, atılacak ilk argüman olarak "-" ifadesini tanıyacaktır.

"-" öğesinin tanınması şartı, uygun uygulamaların, işlenenlerini uygulamanın bir uzantı olarak sağlayabileceği keyfi seçeneklerden korumak için bir yola ihtiyaç duymasıdır. Örneğin, standart yardımcı program foo hiçbir seçenek almayan olarak listeleniyorsa ve uygulamanın kendisine ön tire ile bir yol adı vermesi gerekiyorsa, bunu güvenli bir şekilde yapabilir:

foo -- -myfile

ve -m uzantısı olarak kullanılan sorunlardan kaçının.

Ve Yardımcı Program Sözdizimi Yönergeleri'nde (v7):

Yönerge 10: Seçenek bağımsız değişkeni olmayan ilk bağımsız değişken, seçeneklerin sonunu belirten bir sınırlayıcı olarak kabul edilmelidir. Aşağıdaki argümanlar '-' karakteriyle başlasalar bile işlenen olarak ele alınmalıdır.

Bash tarafından tavsiye edilir

Burada, bash kılavuzundan, onu destekleyen yapıları hakkında alıntı:

Aksi belirtilmedikçe, bu bölümde belgelenen her yerleşik komut, seçeneklerin sonunu belirtmek için önce - kabul eder - seçeneklerini kabul eder.

:, True, false ve test yerleşikleri seçenekleri kabul etmez ve özel olarak işlemez. Çıkış, oturumu kapatma, kesme, devam etme, izin verme ve kaydırma yerleşikleri, gerekmeden - ile başlayan argümanları kabul eder ve işler. Bağımsız değişkenleri kabul eden ancak seçenek kabul etme olarak belirtilmeyen diğer yerleşikler, bu yorumu önlemek için - geçersiz seçenekler olarak ve gerektirdiği gibi bağımsız değişkenleri yorumlar.

Eko'nun yorumlamadığını unutmayın - seçeneklerin sonu anlamına gelir.

İlave Okuma


2
+1: En taşınabilir ve komut bağımsız çözüm, hatırlaması kolay ve "en iyi uygulama" olarak kabul edildi
mveroone

2
@Kwaio "en iyi uygulama" hakkında herhangi bir referans? Sadece merak et.
fedorqui

24
Bu cevap seçeneklere benzeyen argümanlar için geçerlidir. -Bir seçenek olmayan durum böyle değil. Kullanılması ./-neye farklı türde sorunları önler genel olarak daha iyi bir yaklaşım olduğu zaman mümkün veya yönlendirme foo=barait awkveya o -. Ayrıca bkz. Unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756
Stéphane Chazelas

7
Stéphane söylediği gibi bu cevap vermez soru. hala stdin'den okumaya çalışacak. less -- -
Michał Politowski

5
Cevabı silmek (veya burada yararlı referanslar olduğu için diğer soruya taşımak ) veya bu özel durum için geçerli olmadığını açıkça belirtmek isteyebilirsiniz (ve belki de neden daha da faydalı olacağını açıklayabilirsiniz).
Stéphane Chazelas
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.