मुझे एक स्क्रिप्ट चलाते समय [[: नहीं मिला] क्यों मिलता है?


15

मैं एक स्क्रिप्ट लिखने की कोशिश कर रहा हूं जिसमें यह जांचना है कि क्या कोई फाइल मौजूद है। कंसोल में मैं लिखता हूं

if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

और मुझे मिलता है

not mod

लेकिन जब मैं एक ही काम करने के लिए एक स्क्रिप्ट लिखता हूं:

#!/bin/sh
if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

और फिर स्क्रिप्ट निष्पादित करें, मुझे यह मिला:

./ex.sh: 2: [[: not found
mod

मैंने वर्तमान निर्देशिका पर स्क्रिप्ट को सहेजा और इसे ex.sh नाम दिया, फिर मैंने सुनिश्चित किया कि यह निष्पादन योग्य है। स्क्रिप्ट को कॉल करने के लिए मैं ऐसा करता हूं:

./ex.sh

मुझे यह समस्या क्यों हो रही है? मैंने पहले से ही कई चीजों की कोशिश की:

if [ -a /home ...

तथा

if test -a /home ...

दोनों लौट आते हैं

13: -a: unexpected operator

मैं इसे काम करने में सक्षम था, लेकिन इसके लिए मुझे पहली पंक्ति (#! / Bin / sh) को निकालना पड़ा था। क्या आप जानते हैं कि ऐसा क्यों होता है?
बुज़ु

कोशिश#!/bin/bash
kev

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

@ केव कृपया उत्तर के रूप में पोस्ट करें
'

बुज़ु, @ केव - यदि आपको कोई उत्तर मिलता है , तो नीचे दिए गए उत्तर के रूप में पोस्ट करें, प्रश्न को संपादित न करें।
user1686

जवाबों:


10

आप के लिए लिखी गई एक स्क्रिप्ट चला रहे हैं पार्टी के तहत , जिसमें विस्तृत वाक्य रचना सुविधाओं में से कई का अभाव है - [[एक है bashbuiltin कमान और में उपलब्ध नहीं है sh

परिवर्तन #!/bin/shकरने के लिए #!/bin/bashया करने के लिए#!/usr/bin/env bash


कुछ सिस्टम पर, के /bin/shलिए एक सहानुभूति है /bin/bash। और यह संभवतः यथोचित रूप से सुरक्षित bashहै /bin/bash
कीथ थॉम्पसन 19

@ कीथ: यह /bin/bashअधिकांश लिनक्स सिस्टम पर है, लेकिन /usr/pkg/bin/bashबीएसडी पर, या /usr/local/bin/bashयदि कोई सीधे स्रोत से संकलित करता है।
user1686

@ ग्रेविटी: या यदि आप स्रोत से संकलन करते हैं, तो आप इसे कहीं और लगाने का निर्णय लेते हैं। ठीक है, अच्छी बात है। व्यक्तिगत रूप से, मैं /usr/bin/envहैक के उपयोग की तुलना में प्रत्येक सिस्टम के लिए शेबंग को संपादित करता हूं (जो bashकि $PATHइस समय कॉलर्स में जो भी होता है) का उपयोग करता है , लेकिन YMMV। (और आप /bin/bashएक सिम्लिंक बना सकते हैं - अगर आपके पास अधिकार हैं और आप के साथ खिलवाड़ करने में कोई आपत्ति नहीं है /bin।)
कीथ थॉम्पसन

@ कीथ: /usr/localवह जगह है जहां ऑटोटूल डिफ़ॉल्ट रूप से इसे लगाने का फैसला करता है। जहाँ तक "व्यक्तिगत रूप से" चला जाता है, मुझे कई अलग-अलग सर्वर और वीएम समान स्क्रिप्ट / टूल रिपॉजिटरी से खींचते हैं, और हर प्रतिबद्ध के बाद उनमें से आधे पर शेबंग को फिर से संपादित करने की आवश्यकता नहीं है।
user1686

उनमें से किसी ने भी मेरे लिए काम नहीं किया: /
सेंटो

0

स्क्रिप्ट चलाने के दौरान श के बजाय बैश निर्दिष्ट करें। मैंने व्यक्तिगत रूप से देखा कि वे ubuntu 12.10 के तहत अलग हैं:

bash script.sh arg0 ... argn

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