"-" नामक फ़ाइल को "कम" कैसे करें?


17

मैंने गलती से नाम -(जैसे seq 10 > -) के साथ एक फ़ाइल बनाई । फिर मैंने lessइसे देखने के लिए उपयोग करने की कोशिश की , लेकिन यह सिर्फ लटका हुआ है।

मैं समझता हूं कि ऐसा इसलिए हो रहा है less - इनपुट से उम्मीद है stdin, इसलिए यह -फ़ाइल नाम के रूप में व्याख्या नहीं करता है । मैंने कोशिश की less \-लेकिन यह भी काम नहीं करता है।

तो, क्या यह इंगित करने का कोई तरीका है lessकि -फ़ाइल है और स्टडिन नहीं है?

सबसे अच्छा मुझे मिल सकता है:

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

2
@ muru टिप्पणी के लिए धन्यवाद, लेकिन संभव डुप्लिकेट इतना विशिष्ट है कि मुझे नहीं लगता कि यह "सटीक डुप्लिकेट" होने के लिए योग्य है। अगर इसे "- '' के साथ शुरू होने वाली फ़ाइल का उपयोग कैसे किया जाए जैसे कुछ और सामान्य चीज़ों के लिए फिर से तैयार किया गया था।
फेडोरक्वि

4
यह कोई दोहरा प्रश्न नहीं है। -अकेले के लिए मामला अलग है। -एक विकल्प नहीं है।
स्टीफन चेज़लस

1
@terdon मुझे नहीं लगता कि एक ही जवाब होने का सीधा मतलब है कि वे डुप्लिकेट हैं। मेटा SO में कहीं एक उदाहरण था: यदि किसी प्रश्न का उत्तर "नहीं" के साथ मिलता है, तो क्या ऐसा कुछ होगा जिसका सही उत्तर "नहीं" है? जैसा कि मैंने पहले कहा था, डुप्लिकेट के उम्मीदवार को फिर से जोड़ना दिलचस्प होगा ताकि यह अधिक सामान्य हो; अन्यथा, यह इस तरह से अन्य प्रश्न भेजने के लिए बहुत मायने नहीं रखता है।
फेडोरक्वि

4
@terdon, नहीं। यहाँ स्वीकृत समाधान काम नहीं करेगा। और नहीं, -एक विकल्प के रूप में नहीं माना जाता है, यह उन तर्कों के मामले से पूरी तरह से अलग समस्या है जो विकल्पों की तरह आकार लेते हैं।
स्टीफन चेज़लस

2
-एकल उद्धरणों के बीच संलग्न करना '-'या इसे बचाना आवश्यक नहीं है \-क्योंकि -आम गोले (कम से कम POSIX आज्ञाकारी) के लिए एक विशेष चरित्र नहीं है। नतीजा वही है।
पाबौक

जवाबों:


53

बस इसके साथ उपसर्ग करें ./:

less ./-

या पुनर्निर्देशन का उपयोग करें:

less < -

ध्यान दें कि चूंकि -( उदाहरण के लिए -xया इसके विपरीत --foo--) एक विकल्प के बजाय एक विशेष फ़ाइल नाम माना जाता है, निम्नलिखित काम नहीं करता है:

less -- -   # THIS DOES NOT WORK

3
BTW, कि क्या find -name '-' -exec less {} +रन है।
स्टीफन चेज़लस

6
@fedorqui, नहीं, यह सिर्फ इतना है कि -और ./-(या /path/to/-या ../to/-) उस -फ़ाइल के दो (4) वैध रास्ते हैं , लेकिन एक -तर्क विशेष है less(इसका मतलब स्टड से पढ़ा जाता है) जबकि ./-विशेष नहीं है।
स्टीफन चेज़लस

2
@fedorqui find -name '-' -exec less {} +के लिए गैर-मानक रूप है find . -name '-' -exec less {} +। यह पेड़ पर उतरता है .और फाइलों को ढूंढता है और उन फाइलों के रास्तों को तर्क के रूप में पारित करता है less। बदलें -exec lessके साथ -exec echo lessक्या चलाया जा रहा है देखने के लिए।
स्टीफन चेज़लस

4
@haylem, --विकल्पों के अंत को चिह्नित करना है। यह यहाँ मदद नहीं करेगा। यह -एक विकल्प नहीं है, यह एक विशेष गैर-विकल्प तर्क है। यह भी देखें unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756
Stéphane Chazelas

3
@ हाइलम, इसे अपने लिए आजमाएं। --विकल्प के अंत को चिह्नित करने के लिए getopt () द्वारा नियंत्रित किया जाता है, getopt () -द्वारा एक विकल्प के रूप में मान्यता प्राप्त नहीं है, इसलिए यह -एक सामान्य तर्क के रूप में पहचाना जाएगा कि क्या --प्रदान किया गया है या नहीं। और एक सामान्य तर्क के रूप में, lessअधिकांश पाठ उपयोगिताओं की तरह इसे अर्थ स्टड के रूप में माना जाएगा, जो हम यहां नहीं चाहते हैं।
स्टीफन चेज़लस

3

मैं बस करूंगा mv - f && less f। समस्या सुलझ गयी।


ठीक है, यह काम करता है, भले ही यह मुझे नासा स्पेंट मिलियन्स के बारे में याद दिलाता है कि एक पेन विकसित करना है जो अंतरिक्ष में लिखेगा, जबकि सोवियत कॉस्मोनॉट्स ने एक पेंसिल का उपयोग किया था । मुझे लगता है कि हम यहां शोध में थोड़ा निवेश कर सकते हैं।
फेडोरक्वि

+1 आसान समाधान मौजूद होने पर चीजें जटिल क्यों होती हैं।
ममद

3

नोट: मेरा उत्तर ओपी के मामले में मान्य नहीं है, और केवल नीचे उल्लिखित कन्वेंशन के बाद टूल पर लागू होता है, न कि सिर्फ -(डैश) नामक एक फ़ाइल के मामले में , जो अक्सर मानक से पढ़ने को निर्दिष्ट करने के लिए एक विशेष मामला है। इनपुट अपेक्षित है स्वीकृत उत्तर देखें।

इसे यहां छोड़ते हुए क्योंकि इसमें अन्य मामलों के लिए उपयोगी जानकारी है जो उत्तर खोजते समय ठोकर खा सकते हैं।


डबल-डैश यह!

--अंतिम तर्क को इंगित करने के लिए मानक डबल-डैश ( ) कन्वेंशन का उपयोग करें :

less -- -FILENAME

उदाहरण

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

Whhhaattt?

यह --तर्क शेल उपयोगिताओं और कमांड-लाइन टूल के अधिकांश कार्यान्वयनों द्वारा समर्थित एक कन्वेंशन से उपजा है, और अधिकांश शेल स्पष्ट रूप से वकालत करेंगे कि आपको सीएलआई टूल्स को लागू करते समय इसका पालन करना चाहिए।

ओपन ग्रुप द्वारा अनुशंसित

ओपनग्रुप ने इसके बेस स्पेसिफिकेशन के उपयोगिता विवरण डिफॉल्ट्स (v6) अनुभाग में भी इसका उल्लेख किया है :

डिफ़ॉल्ट व्यवहार: [...] मानक उपयोगिताओं जो विकल्पों को स्वीकार नहीं करती हैं, लेकिन जो ऑपरेंड स्वीकार करते हैं, वे "-" को पहले तर्क के रूप में खारिज कर दिया जाएगा।

"-" को पहचानने की आवश्यकता इसलिए है क्योंकि अनुरूपण अनुप्रयोगों को अपने ऑपरेंड को किसी भी मनमाने विकल्प से ढालने की आवश्यकता होती है जिसे कार्यान्वयन एक विस्तार के रूप में प्रदान कर सकता है। उदाहरण के लिए, यदि मानक उपयोगिता फू को कोई विकल्प नहीं के रूप में सूचीबद्ध किया गया है, और एप्लिकेशन को इसे एक अग्रणी हाइफ़न के साथ एक मार्गनाम देने की आवश्यकता है, तो वह इसे सुरक्षित रूप से कर सकता है:

foo -- -myfile

और एक्सटेंशन के रूप में इस्तेमाल होने वाली एम के साथ किसी भी समस्या से बचें।

और उपयोगिता सिंटैक्स दिशानिर्देश (v7) में:

दिशानिर्देश 10: पहला - तर्क जो विकल्प-तर्क नहीं है, उसे विकल्प के अंत का संकेत देने वाले परिसीमन के रूप में स्वीकार किया जाना चाहिए। किसी भी निम्नलिखित तर्क को ऑपरेंड के रूप में माना जाना चाहिए, भले ही वे '-' चरित्र से शुरू हों।

बैश द्वारा अनुशंसित

यहाँ, बैश मैनुअल से इसके अंशों के बारे में बताया गया है, जो इसका समर्थन करते हैं:

जब तक अन्यथा उल्लेख नहीं किया जाता है, तब तक प्रत्येक अंतर्निहित आदेश इस खंड में प्रलेखित विकल्पों को स्वीकार करने से पहले स्वीकार करता है - विकल्पों को समाप्त करने के लिए।

:, सत्य, असत्य, और परीक्षण निर्मित विकल्प स्वीकार नहीं करते हैं और न ही उपचार करते हैं - विशेष रूप से। एक्ज़िट, लॉगआउट, ब्रेक, जारी, लेट, और शिफ्ट बिलिन स्वीकार करते हैं और प्रक्रिया की दलीलों को शुरू करते हैं - बिना आवश्यकता के -। अन्य बिल्डिंस जो तर्कों को स्वीकार करते हैं, लेकिन विकल्प को स्वीकार करने के रूप में निर्दिष्ट नहीं किए जाते हैं, इस व्याख्या को रोकने के लिए - अवैध विकल्पों के रूप में शुरू होने वाले तर्कों की आवश्यकता होती है।

ध्यान दें कि गूंज व्याख्या नहीं करता है - विकल्पों के अंत का मतलब है।

अतिरिक्त पढ़ना


2
+1: सबसे पोर्टेबल और कमांड-इंडिपेंडेंट सॉल्यूशन, याद रखने में आसान और "बेस्ट प्रैक्टिस" माना जाता है
mveroone

2
@Kwaio "सर्वोत्तम अभ्यास" के बारे में कोई संदर्भ? बस इसे लेकर उत्सुकता है।
फेडोरक्वि

24
यह उत्तर उन तर्कों पर लागू होता है जो विकल्प की तरह दिखते हैं। यह ऐसा नहीं है -जिसके लिए कोई विकल्प नहीं है। का उपयोग करना ./-या पुनर्निर्देशन जब संभव आम तौर पर एक बेहतर तरीका है के रूप में यह इस तरह की समस्याओं के अन्य प्रकार से बचा जाता है foo=barकी awkया कि -। यह भी देखें unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756
स्टीफन Chazelas

7
स्टीफन कहते हैं, इस का उत्तर न मिले सवाल। अभी भी स्टड से पढ़ने की कोशिश करेंगे। less -- -
माइकल पोलित्स्की

5
आप उत्तर को हटाना चाहते हैं (या इसे अन्य प्रश्न पर स्थानांतरित कर सकते हैं क्योंकि यहां उपयोगी संदर्भ हैं) या यह स्पष्ट करें कि यह इस विशेष मामले पर लागू नहीं होता है (और शायद समझाएं कि यह क्यों और भी उपयोगी होगा)।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.