मुझे "लाइन 1: $ ': \ r' क्यों मिल रहा है: कमांड नहीं मिला"?


13

मैंने अपने लैपटॉप (DOS) पर Cygwin का इस्तेमाल किया। मेरे पास अपने सहयोगियों से लिपियों का संग्रह है, और मेरा अपना है। मैं एक आईटी व्यक्ति नहीं हूं, यूनिक्स में जानकार नहीं हूं। मैं अपने सहयोगियों के सिंटैक्स का पालन करता हूं और कुछ सरल चीजों का प्रबंधन करने में सक्षम हूं।

स्क्रिप्ट ने मेरे पुराने लैपटॉप पर अच्छा काम किया। मैंने अभी-अभी लैपटॉप बदला, Cygwin स्थापित किया। जब मैं अपनी स्क्रिप्ट चलाता हूं, तो वे काम नहीं करते हैं। यहाँ मुझे मिलने वाले त्रुटि संदेश का एक उदाहरण है:

line 1: $':\r': command not found
line 5: syntax error near unexpected token `$'\r''
line 5: `fi

यहाँ मेरी स्क्रिप्ट की शीर्ष 5 लाइनें हैं

:
iter=1
if [ -f iter.txt ]
   then rm ./iter.txt 
fi  

क्या कोई कृपया बता सकता है कि मैं इस समस्या के आसपास कैसे पहुँच सकता हूँ?

जवाबों:


29

आपके पास विंडोज-स्टाइल लाइन एंडिंग्स हैं।

नो-ऑप कमांड :को इसके बजाय पढ़ा जाता है :<carriage return>, जैसा कि :\rपूरी तरह से प्रदर्शित किया गया है $':\r'

दौड़ो dos2unix scriptnameऔर तुम ठीक हो जाओ।


यदि आपके पास नहीं है dos2unix, तो निम्नलिखित को लगभग कहीं भी काम करना चाहिए (और मैंने विंडोज़ पर MobaXterm पर परीक्षण किया है):

vi -b filename

फिर में viटाइप करें:

:%s/\r$//
:x

आप जाने के लिए अच्छे हैं।


में vim, जो आप के लिए Cygwin पर उपयोग कर रहे हैं vi, ऐसा करने के कई तरीके हैं। एक अन्य में fileformatसेटिंग शामिल है , जो मान ले सकता है dosया unix। फ़ाइल लोड करने के बाद या तो इसे स्पष्ट रूप से बदलें

fileformat = unix सेट करें
फ़ाइल के साथ लिखते समय फ़ाइल प्रारूप को स्पष्ट रूप से बाध्य करें

: w + फाइलफॉर्मैट = यूनिक्स

इस पर अधिक जानकारी के लिए, इस विषय को शामिल करते हुए यहां कई प्रश्न और उत्तर देखें:


बस स्पष्ट करना चाहते हैं, "iter = 1" मेरा काउंटर है जो एक गणित एल्गोरिथ्म के दौर की संख्या के लिए उपयोग किया जाएगा जो कि मेरे मॉडल को बाद में लाइन 5 से आगे दोहराना होगा। मैंने अभी शीर्ष 5 लाइनों के साथ जाने के लिए पोस्ट किया है त्रुटि संदेश। सभी टिप्पणियों और निर्देश की बहुत सराहना की जाती है !!
22

मैंने केवल सुझाए गए कमांड "$ tr -d ....." की कोशिश की, लेकिन मेरे लैपटॉप में कुछ गड़बड़ है। यह "$" पर वापस नहीं जाता है, लेकिन ">" इसके बजाय स्क्रीन पर दिखाई देता है। मुझे बाहर निकलने के लिए contrl C का उपयोग करना होगा। फिर, मैंने यह देखने के लिए स्क्रिप्ट का परीक्षण किया कि क्या समस्या ठीक हो गई है, लेकिन यह अभी भी है। क्षमा करें, इस क्षेत्र में मेरा ज्ञान बहुत कम है! मैं अपने स्क्रिप्ट के संग्रह का उपयोग करने की कोशिश कर रहा हूं क्योंकि वे मेरे काम में इतनी मदद करते हैं। धैर्य रखने और मेरे लिए मदद करने के लिए आप सभी को धन्यवाद।
टीपहम

@TPham, संपादित देखें। यदि यह कार्य "स्वीकार" करने के उत्तर के आगे चेकमार्क का उपयोग करना सुनिश्चित करता है। (जो भी जवाब सबसे अच्छा आपकी समस्या को हल किया स्वीकार करें।) unix.stackexchange.com/help/someone-answers
Wildcard

1
कमांड जो शब्द हैं, वे वास्तव में एक रहस्यमय चीरफाड़ की तुलना में नौसिखिए के लिए अधिक जटिल नहीं हैं जो लगभग पूर्ण विराम चिह्न हैं। इसके लिए अलग उत्तर की आवश्यकता नहीं है। यह उल्लेख करने के लिए केवल इस उत्तर की आवश्यकता है कि vimयह दो तरीकों से हो सकता है, जिनमें से एक शब्दों का उपयोग करता है। या, अभी तक, जहां तक ​​इस अधीनस्थ कार्य का उत्तर दिया गया है, इस बिंदु पर इस पृष्ठ पर किसी भी उत्तर की तुलना में कहीं अधिक विस्तार से बताया गया है , जिसमें केवल शुरुआत के लिए unix.stackexchange.com/questions/88811 शामिल है ।
JdeBP

1
ध्यान दें कि vi -b, \rवैसे भी एक्सटेंशन हैं। POSIX नहीं, एनवीआई, एल्विस, सोलारिस vi में नहीं ...
स्टीफन चेजलस

10

यह उस स्क्रिप्ट के कारण होता है जिसे किसी संपादक द्वारा सहेजा गया है जो DOS लाइन-एंडिंग्स (जैसे नोटपैड ++, उदाहरण के लिए) का उपयोग करता है। आपको इन्हें अपनी स्क्रिप्ट से हटाना होगा।

ऐसा करने के लिए, या तो dos2unixस्क्रिप्ट फ़ाइल पर उपयोग करें , या

$ tr -d '\r' <script >script.new && mv script.new script

(यह स्क्रिप्ट में कहीं से भी सभी कैरिज रिटर्न को हटा देगा )


स्क्रिप्ट में कोड के लिए:

:
iter=1
if [ -f iter.txt ]
   then rm ./iter.txt 
fi  

यह संभवतः कुछ इस तरह दिखना चाहिए

iter=1
if [ -f "./$iter.txt" ]; then
   rm "./$iter.txt"
fi

यह फ़ाइल 1.txtको वर्तमान निर्देशिका से निकालता है , यदि यह मौजूद है। :आदेश कुछ नहीं करता है (लगभग) और हटाया जा सकता है। iterवेरिएबल का मान के रूप में इस्तेमाल किया जाना चाहिए $iter, और उद्धृत किया। और फिर मुझे संभवतः ./यह कहने की ज़रूरत से अधिक स्पष्ट किया जा रहा है कि फ़ाइल को वर्तमान निर्देशिका में खोजने की आवश्यकता है।

आप एक पाश में इस बारी करने के योजना बना रहे हैं (यहाँ, सभी फ़ाइलों को हटाने 1.txt, 2.txt, ..., 10.txt):

iter=1
while [ "$iter" -le 10 ]; then
    if [ -f "./$iter.txt" ]; then
        rm "./$iter.txt"
    fi
    iter=$(( iter + 1 ))
done

या, अगर हम डरपोक / आलसी महसूस करते हैं,

rm -f {1..10}.txt

गोले में जो ब्रेस विस्तार को समझता है।


3
नोटपैड ++ में वास्तव में विंडोज / मैक / लिनक्स लाइन ब्रेक का उपयोग करने का विकल्प है। आपको बस संपादन मेनू और फिर EOL रूपांतरण-> यूनिक्स (LF) पर जाने की आवश्यकता है। या आप नीचे दाहिने कोने में डबल क्लिक कर सकते हैं, जहां यह कहता है Windows (CR LF)और इसे Unix (LF)
बदलकर

आपके निर्देश के लिए सभी को धन्यवाद। स्पष्ट करना चाहेंगे: "iter = 1" एक काउंटर है जिसका उपयोग मैं बाद में अपने मुख्य उद्देश्य के लिए लाइन 5 से परे करता
हूं

@TPham आपका स्वागत है। मैं बस ऊब गया था और आपका कोड ले लिया और अपने दिमाग को इसके साथ प्रभावित होने दिया।
Kusalananda

या rm -f [1-9].txt 10.txt। लेकिन वह नहीं है पूरी तरह से , तार्किक समकक्ष के रूप में अगर कोई फ़ाइलें हैं 1-9 लेकिन वहाँ है सचमुच नामक एक फ़ाइल [1-9].txtतो इसे हटा दिया जाएगा। : D
वाइल्डकार्ड

5

आपकी स्क्रिप्ट में गलत लाइन-एंडिंग्स हैं। Windows CR + LF (\ r \ n) का उपयोग करता है, यूनिक्स LF (\ n) का उपयोग करता है, और क्लासिक MacOS CR (\ n) का उपयोग करता है। आपको सभी प्रभावित फ़ाइलों पर लाइन-एंडिंग को बदलना होगा, या तो टेक्स्ट एडिटर या स्टैंडअलोन टूल जैसे dos2unix

एसवीएन जैसे एफ़टीपी और संस्करण नियंत्रण प्रणालियां लाइन अंत को उचित रूप से परिवर्तित करने में सक्षम होती हैं, इसलिए आप भविष्य में फ़ाइलों को स्थानांतरित करने के लिए उन विकल्पों पर गौर कर सकते हैं।

यदि इन फ़ाइलों को स्थानांतरित नहीं किया जा रहा है, लेकिन सिर्फ एक मशीन पर उपयोग किया जाता है, तो आप अपने पसंदीदा पाठ संपादक में लाइन अंत के लिए सेटिंग्स ढूंढना चाहेंगे। "प्रोग्रामर के लिए" के रूप में विज्ञापित अधिकांश के पास ऐसा विकल्प होगा।


आपकी मदद के लिए सभी को धन्यवाद। मैंने अभी dos2unix की कोशिश की, लेकिन ऐसा लगता है कि मेरे पास नहीं है। खोज कर फिर से कोशिश करेंगे।
टीपहम

3

पूरक उत्तर के रूप में मुझे कुछ नोट्स / टिप्स जोड़ने दें ...

सबसे पहले, नियमित पाठ फ़ाइलों के लिए आप आसानी से निर्धारित कर सकते हैं कि क्या उनके पास fileकमांड का उपयोग करके यूनिक्स या डॉस लाइन है । उदाहरण के लिए:

$ file test.txt
test.txt: ASCII text, with CRLF line terminators
$ dos2unix test.txt
dos2unix: converting file test.txt to Unix format...
$ file test.txt
test.txt: ASCII text

मेरे उपयोग पर ध्यान दें dos2unix। मैं आपको इसे स्थापित करने की अत्यधिक सलाह देता हूं। इस बात पर निर्भर करते हुए कि आप साइगविन का उपयोग कैसे करते हैं, आप पा सकते हैं कि आपको इस रूपांतरण को अक्सर करने की आवश्यकता है कि सुविधा का स्वागत है। इससे भी महत्वपूर्ण बात यह है कि यहां चर्चा किए गए मैनुअल संपादन के साथ आपको त्रुटि का कोई मौका नहीं मिलता है।

स्थापित करने के लिए मुख्य Cygwin निष्पादन योग्य प्रारंभ करें। यह सेटअप-x86_64.exe जैसे नाम के साथ एक है या उन पंक्तियों के साथ कुछ है। सुनिश्चित करें कि आप इस तरह से एक स्क्रीन देखते हैं:

यहाँ छवि विवरण दर्ज करें

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

यहाँ छवि विवरण दर्ज करें

फिर नेक्स्ट पर फिर से क्लिक करें और इंस्टॉलेशन को पूरा होने दें। बस। मज़े करो। Cygwin, इस सामयिक असुविधा के अपवाद के साथ, एक भयानक पैकेज है।


आपके निर्देश B परत के लिए बहुत बहुत धन्यवाद! यह स्टैक एक्सचेंज समूह कितना मददगार है। मैं वास्तव में इस समर्थन की सराहना करता हूं।
टीफाम

1

यदि dos2unix नहीं है, तो 'फ्लिप' भी है

$ फ्लिप -u yourfilename.txt

यूनिक्स लाइन अंत का उपयोग करने के लिए इसे फ्लिप करेगा।


1

मैं WinSCP द्वारा सर्वर से कनेक्ट करके अपनी bash (.sh) स्क्रिप्ट को संपादित करने के लिए Notepad ++ का उपयोग करता हूं ( Notepad के लिए WinSCP संपादक को सेट करने के लिए ++: https://winscp.net/eng/docs/ui_editor_ferferences )

यह " विम " संपादक के बजाय सर्वर से फ़ाइलों को संपादित / सहेजने के लिए बहुत व्यावहारिक है ।
जब आप नोटपैड ++ में फ़ाइल खोलते हैं , तो नीचे स्थिति पट्टी पर 7 वें कॉलम पर डबल-क्लिक करें और " यूनिक्स (एलएफ) " चुनें।

यहाँ छवि विवरण दर्ज करें

इसके अलावा, आपको एनकोडिंग -> शीर्ष बार में UTF-8 में एनकोड करके 8 वें को बदलना होगा।


0

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

बस अपने अपडेट करें ~/.bash_profileताकि इसमें शामिल हो

export SHELLOPTS
set -o igncr

Https://ptolemy.berkeley.edu/projects/chess/softdevel/faq/5.html देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.