2013-05-13 5 views
15

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

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

#! /bin/bash 

grep -f Samples.NFCup.txt locus1.fasta > locus1.NFCup.txt 
grep -f Samples.NFCup.txt locus2.fasta > locus2.NFCup.txt 
grep -f Samples.NFCup.txt locus3.fasta > locus3.NFCup.txt 
grep -f Samples.NFCup.txt locus4.fasta > locus4.NFCup.txt 
grep -f Samples.NFCup.txt locus5.fasta > locus5.NFCup.txt 
grep -f Samples.Salmon.txt locus1.fasta > locus1.Salmon.txt 
grep -f Samples.Salmon.txt locus2.fasta > locus2.Salmon.txt 
grep -f Samples.Salmon.txt locus3.fasta > locus3.Salmon.txt 
grep -f Samples.Salmon.txt locus4.fasta > locus4.Salmon.txt 
grep -f Samples.Salmon.txt locus5.fasta > locus5.Salmon.txt 
grep -f Samples.Cascades.txt locus1.fasta > locus1.Cascades.txt 
grep -f Samples.Cascades.txt locus2.fasta > locus2.Cascades.txt 
grep -f Samples.Cascades.txt locus3.fasta > locus3.Cascades.txt 
grep -f Samples.Cascades.txt locus4.fasta > locus4.Cascades.txt 
grep -f Samples.Cascades.txt locus5.fasta > locus5.Cascades.txt 

echo 3 5 Salex_melanopsis > Smelanopsis.mig 
echo 656 708 847 1159 779 >> Smelanopsis.mig 
echo 154 124 120 74 126 NFCup >> Smelanopsis.mig 
cat locus1.NFCup.txt locus2.NFCup.txt locus3.NFCup.txt locus4.NFCup.txt locus5.NFCup.txt >> Smelanopsis.mig 
echo 32 30 30 18 38 Salmon River >> Smelanopsis.mig 
cat locus1.Salmon.txt locus2.Salmon.txt locus3.Salmon.txt locus4.Salmon.txt locus5.Salmon.txt >> Smelanopsis.mig 
echo 56 52 24 29 48 Cascades >> Smelanopsis.mig 
cat locus1.Cascades.txt locus2.Cascades.txt locus3.Cascades.txt locus4.Cascades.txt locus5.Cascades.txt >> Smelanopsis.mig 

greps की श्रृंखला सिर्फ बाहर खींच रहे हैं डीएनए अनुक्रम डेटा: यहाँ विवरण (मैं लंबाई के लिए माफी माँगता हूँ) कर रहे हैं। नमूने ... txt फ़ाइलों में साइट के लिए नमूना आईडी नंबर होते हैं, .fasta फ़ाइलों में नमूना आईडी द्वारा अनुक्रमित अनुक्रम जानकारी होती है; यदि मैं इसे व्यक्तिगत रूप से चलाता हूं तो grepping कमांड लाइन में ठीक काम करता है।

कोड का दूसरा समूह वास्तविक नई फ़ाइल बनाता है जिसे मुझे समाप्त करने की आवश्यकता है, जो .mig में समाप्त होता है। गूंज रेखाएं गणना के बारे में डेटा हैं (बेसस के आधार पर आधार, विश्लेषण में आबादी, प्रति साइट नमूने इत्यादि) कि कार्यक्रम को जानकारी की आवश्यकता है। बिल्ली रेखाएं गूंज रेखा में निर्धारित साइट-विशिष्ट जानकारी के नीचे सभी grepping द्वारा बनाई गई साइट डेटा द्वारा लोकस को एक साथ मैश करना है। आपको कोई तस्वीर नहीं है।

शैल स्क्रिप्ट बनाने के लिए मैं एक्सेल में शुरू कर रहा हूं, इसलिए मैं आसानी से कॉपी-पेस्ट/ऑटोफिल सेल कर सकता हूं, टैब-डिलीमिट किए गए टेक्स्ट के रूप में सहेज रहा हूं, फिर टेक्स्टवेंगलर में उस टेक्स्ट फ़ाइल को खोलने से पहले टैब को हटाने के लिए खोल सकता हूं। sh फ़ाइल (लाइन ब्रेक: यूनिक्स (एलएफ) और एन्कोडिंग: यूनिकोड (यूटीएफ -8)) उसी निर्देशिका में लिपि में उपयोग की जाने वाली सभी फाइलों के रूप में। मैंने यह सुनिश्चित करने की कोशिश करने के लिए chmod +x FILENAME.sh और chmod u+x FILENAME.sh का उपयोग करने का प्रयास किया है, लेकिन इसका कोई फायदा नहीं हुआ है। यहां तक ​​कि अगर मैंने स्क्रिप्ट को केवल एक ही grep लाइन में घटाया है (#!/Bin/bash पहली पंक्ति के साथ) मैं इसे काम नहीं कर सकता। प्रक्रिया केवल एक पल लेती है जब मैं इसे सीधे कमांड लाइन में टाइप करता हूं क्योंकि इनमें से कोई भी फाइल 160 केबी से बड़ी नहीं है और कुछ काफी कम हैं। यह है कि मैं क्या लिखें और क्या मैं जब मैं फ़ाइल चलाने का प्रयास

localhost:HW Mirel$ MigrateNshell.sh 
-bash: MigrateNshell.sh: command not found 

मैं दो दिनों के लिए इस impass पर किया गया है अब, इसलिए किसी भी इनपुट बहुत सराहना की जाएगी (HW सही निर्देशिका है) ! धन्यवाद!!

+3

अपने 'PATH' में' MigrateNshell.sh' के स्थान है प्रयास करें? यदि इसे वर्तमान निर्देशिका से चलाने की कोशिश कर रहा है, तो '।/MigrateNshell.sh' आज़माएं। –

उत्तर

1
#! /bin/bash 
    ^--- 

संकेतित स्थान को हटा दें। मामला होना चाहिए

#!/bin/bash 
+6

हैशबैंग के बाद आमतौर पर एक जगह बर्दाश्त की जाती है। – chepner

+0

यह भी देखें [यह उत्तर] (http://stackoverflow.com/a/10197964/3266847)। –

28

सुरक्षा कारणों से, खोल एक निष्पादन के लिए वर्तमान निर्देशिका (डिफ़ॉल्ट रूप से) खोज नहीं होंगे।

$ ./MigrateNshell.sh 
+0

+1 मुझे लगता है कि यह कारण होगा। – Kent

+2

आप दुभाषिया भी निर्दिष्ट कर सकते हैं: 'bash MigrateNshell.sh'। यह निष्पादन अनुमतियों के बिना भी काम करता है। – Otaia

-3

पहले::

chmod 777 ./MigrateNshell.sh 
फिर

: आप विशिष्ट होना, और bash बताते हैं कि अपनी स्क्रिप्ट मौजूदा निर्देशिका में है (.) है

./MigrateNshell.sh 

या, जोड़ने के अपने आपके $ PATH चर में मान्यता प्राप्त निर्देशिका में प्रोग्राम।उदाहरण: Path Variable Example कौन सा है तो आप बिना ./

+4

'chmod 755' बनाओ,' chmod 777' नहीं। '777' सिस्टम पर सभी को लिखने की अनुमति देता है। '755' आपको पूर्ण अनुमति देता है, लेकिन केवल सभी को पढ़ और निष्पादित करता है। –

1

यूनिक्स अपने कार्यक्रम फोन करने की अनुमति देगा एक चर PATH कहा जाता है कि निर्देशिका जहां आदेशों को खोजने के लिए की एक सूची है।

$ echo $PATH 
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/david/bin 

अगर मैं आदेश पंक्ति पर एक कमांड foo टाइप करें, मेरी खोल पहले देखना एक निष्पादन आदेश /usr/local/bin/foo हो, तो होगा। यदि ऐसा है, तो यह /usr/local/bin/foo निष्पादित करेगा। यदि नहीं, तो यह देखेगा कि कोई निष्पादन योग्य आदेश /usr/bin/foo है और यदि वहां नहीं है, तो यह देखने के लिए होगा कि /bin/foo मौजूद है, आदि जब तक यह /Users/david/bin/foo तक नहीं पहुंच जाता है।

यदि यह किसी भी निर्देशिका में foo कमांड नहीं मिला है, तो यह मुझे बताएं कमांड नहीं मिला।

  • आदेश bash foofoo के बाद से एक खोल स्क्रिप्ट है उपयोग:

    ऐसे कई तरीके है मैं इस मुद्दे को संभाल कर सकते हैं कर रहे हैं।

  • जब आप /Users/david/foo या $PWD/foo या केवल सादा ./foo जैसे आदेश को eecute करते हैं तो निर्देशिका नाम शामिल करें।
  • अपनी $PATH वैरिएबल को उस निर्देशिका को जोड़ने के लिए बदलें जिसमें आपके आदेश PATH में हैं।

आप $HOME/.bash_profile या $HOME/.profile संशोधित कर सकते हैं, तो .bash_profile मौजूद नहीं है। मैंने इसे /usr/local/bin में जोड़ने के लिए किया जो मैंने पहले अपने रास्ते में रखा था। इस तरह, मैं ओएस में मानक आदेशों को ओवरराइड कर सकता हूं। उदाहरण के लिए, मेरे पास चींटी 1.9.1 है, लेकिन मैक चींटी 1.8.4 के साथ आया था। मैंने कमांड /usr/local/bin में रखा है, इसलिए ant का मेरा संस्करण पहले निष्पादित होगा। मैंने अपने स्वयं के आदेशों के लिए पैथ के अंत में $HOME/bin भी जोड़ा। अगर मेरे पास एक फ़ाइल है जिसे आप निष्पादित करना चाहते हैं, तो मैं इसे निष्पादित करने के लिए इसे $ HOME/bin में रखूंगा।

14

बदलें करने के लिए पहली पंक्ति निम्नलिखित के रूप में मार्क बी द्वारा बताया

#!/bin/bash 

तब निष्पादन योग्य के रूप में स्क्रिप्ट चिह्नित करने और कमांड लाइन से निष्पादित

chmod +x MigrateNshell.sh 
./MigrateNshell.sh 

या बस से बैश पर अमल पैरामीटर

/bin/bash MigrateNshell.sh 
0

यह सुनिश्चित करें कि बिन// bash bash के लिए उचित स्थान है .... यदि आपने उस रेखा को किसी उदाहरण से लिया है तो यह आपके विशेष सर्वर से मेल नहीं खा सकता है। यदि आप बैश के लिए एक अवैध स्थान निर्दिष्ट कर रहे हैं तो आपको कोई समस्या होगी।

7

शैल स्क्रिप्ट के dos2unix को भी आजमाएं, क्योंकि कभी-कभी इसमें विंडोज लाइन के अंत होते हैं और खोल इसे पहचान नहीं पाता है।

$ dos2unix MigrateNshell.sh 

यह कभी-कभी मदद करता है।

+0

यह मेरे लिए हल हो गया। इस मामले में मैं समस्या को देख सकता था (इस जवाब के बाद इसे सुझाव दिया गया था)^एम में ध्यान देकर^एम प्रत्येक पंक्ति में जोड़ा गया। विचित्र रूप से gvim ने सोचा था कि यह पहले से ही यूनिक्स प्रारूप था इसलिए यह सिर्फ एक पंक्ति समाप्त होने वाली गलत थी। – lessthanideal

+0

मैं हर जगह देख रहा था भूल गया कि मैंने विंडोज़ में फ़ाइल संपादित की है! – Omar

0

अपनी लाइनों में नीचे दी गई रेखाएं जोड़ें।प्रोफ़ाइल पथ

PATH=$PATH:$HOME/bin:$Dir_where_script_exists 

export PATH 

अब अपनी स्क्रिप्ट के बिना ./

राज Dagla

2

स्क्रिप्ट की शुरुआत करने के लिए shebang line जोड़ने के बारे में कुछ अच्छा टिप्पणी नहीं की गई है काम करना चाहिए। मैं अतिरिक्त पोर्टेबिलिटी के लिए env command का उपयोग करने के लिए एक सिफारिश जोड़ना चाहता हूं।

जबकि #!/bin/bash आपके सिस्टम पर सही स्थान हो सकता है, यह सार्वभौमिक नहीं है। इसके अतिरिक्त, यह उपयोगकर्ता का पसंदीदा बैश नहीं हो सकता है। #!/usr/bin/env bash पथ में पाए गए पहले बैश का चयन करेगा।

9

सुनिश्चित करें कि आप एक चर के रूप में "पथ" का उपयोग नहीं कर रहे हैं, जो पर्यावरण चर के लिए मौजूदा पथ को ओवरराइड करेगा।

संबंधित मुद्दे