जब पहली पंक्ति में `#! / usr / bin / env python` है, तो स्क्रिप्ट को खोजने में विफल होने का कारण क्या हो सकता है?


19

उबटन 12.04 पर चलने वाले कास्परज को प्राप्त करने की कोशिश कर रहा है। इसे स्थापित करने के बाद जब मैं चलाता हूं मुझे मिलता है:

09:20 $ ll /usr/local/bin/casperjs
lrwxrwxrwx 1 root root 26 Nov  6 16:49 /usr/local/bin/casperjs -> /opt/casperjs/bin/casperjs

09:20 $ /usr/bin/env python --version
Python 2.7.3

09:20 $ cat /opt/casperjs/bin/casperjs | head -4 
#!/usr/bin/env python

import os
import sys

09:20 $ casperjs
: No such file or directory

09: 22 $ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2

इसलिए पायथन मौजूद है और चलने योग्य है, कैस्परज सही जगह की ओर इशारा कर रहे हैं और यह एक अजगर स्क्रिप्ट है। लेकिन जब मैं इसे चलाता हूं तो मुझे "ऐसी कोई फ़ाइल नहीं मिलती है"।

मैं इसे कीपरज पायथन फ़ाइल की पहली पंक्ति को बदलकर ठीक कर सकता हूं:

#!/usr/bin/env python

सेवा:

#!/usr/bin/python

परिणाम:

$ casperjs --version
1.1.0-DEV

मैं इसे ठीक करने में कामयाब रहा, लेकिन मैं सोच रहा हूं कि इसके साथ काम क्यों नहीं हुआ #!/usr/bin/env python, क्योंकि यह एक सामान्य दुभाषिया रेखा है। क्या मेरे पास कुछ गलत है?

यहाँ कास्परज करने के लिए चरण दिए गए हैं:

$ git clone git://github.com/n1k0/casperjs.git
$ cd casperjs
$ ln -sf `pwd`/bin/casperjs /usr/local/bin/casperjs
$ casperjs
: No such file or directory

आप strace /usr/local/bin/casperjsnonworking संस्करण पर चलने की कोशिश कर सकते हैं ? सहायक होगा यदि हम देख सकते हैं कि कौन सी फाइलें एवीजी निष्पादित करने की कोशिश करती हैं, और क्या एवी अजगर खोजने में विफल हो रहा है या अजगर स्क्रिप्ट को खोलने में विफल हो रहा है।
मार्क प्लॉटनिक

@ MarkPlotnick ने दौड़ाया कि, आउटपुट की 100s, विशेष रूप से कुछ भी?
21

: No such file or directoryआउटपुट होने से पहले उत्सर्जित कोई भी लाइनें जिसमें निष्पादित होने का प्रयास किया जाता है। [संपादित करें: सिर्फ गिल्स का जवाब देखा। स्ट्रेस आउटपुट में लाइनों की जाँच करें जो दिखती हैं execve("/usr/bin/python\r", ...)। ]
मार्क प्लॉटनिक

जवाबों:


36

यदि आप त्रुटि देखते हैं: "ऐसी कोई फ़ाइल या निर्देशिका नहीं" (बृहदान्त्र से पहले कुछ भी नहीं है), तो इसका मतलब है कि आपकी शेबंग लाइन में अंत में एक गाड़ी वापसी है, संभवतः क्योंकि यह विंडोज के तहत संपादित किया गया था (जो सीआर, एलएफ का उपयोग करता है एक के रूप में) लाइन सेपरेटर)। CR वर्ण कर्सर को पंक्ति की शुरुआत में वापस ले जाता है क्योंकि शेल संदेश की शुरुआत को प्रिंट करता है और इसलिए आपको केवल CR के बाद का भाग देखने को मिलता है जो कि दुभाषिया स्ट्रिंग को समाप्त करता है जो त्रुटि संदेश का हिस्सा है।

सीआर को हटा दें: शेबबैंग लाइन को यूनिक्स लाइन समाप्त होने की आवश्यकता है (केवल लाइनफीड)। पायथन ही CRLF लाइन एंडिंग की अनुमति देता है, इसलिए अन्य लाइनों पर CR वर्ण चोट नहीं पहुँचाते हैं। दूसरी ओर शैल स्क्रिप्ट सीआर वर्णों से मुक्त होनी चाहिए।

विंडोज लाइन एंडिंग को हटाने के लिए, आप dos2unix का उपयोग कर सकते हैं :

sudo dos2unix /usr/local/bin/casperjs

या sed:

sudo sed -i -e 's/\r$//' /usr/local/bin/casperjs

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


मैं इस मुद्दे में चला गया, लेकिन यह हमेशा एक ^Mअंत में है। मैं यहाँ विशेष रूप से उबंटू में हूँ लेकिन फिर भी gedit उस ^ M को कभी-कभी डालता है, इसलिए मैं Geany गया। वैसे भी यह एक अलग त्रुटि देगा और यह वह त्रुटि नहीं है जो मैं देख रहा हूं।
21

1
@jcollum ^Mसीआर कहने का एक और तरीका।
गिल्स एसओ- बुराई को रोकना '

हां मैं समझता हूं कि लेकिन मैं जो कह रहा हूं वह यह है कि मुझे वह त्रुटि अब नहीं मिल रही है, इसलिए यह लाइन ब्रेक मुद्दा नहीं है।
21

@jcollum जब आपने शेब लाइन को संपादित किया तो आपने CR को हटा दिया। यदि आप इसे वापस #!/usr/bin/env python(सीआर को जोड़े बिना) बदलते हैं , तो यह काम करेगा।
गिल्स एसओ- बुराई को रोकना '

2
शब्दावली के बारे में भ्रमित किसी के लिए ध्यान दें: CR = \r= यूनिकोड U + 0D = ^ M (Ctrl + M), और LF = \n= Unicode U + A0 = ^ J (Ctrl + J)
wjandrea

0

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

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