2013-05-13 131 views
15

我對UNIX編程非常非常陌生(通過終端在MacOSX Mountain Lion上運行)。我一直在從生物信息學和分子方法課程(我們有兩個課程)中學習基礎知識,我們最終將使用perl和python進行數據管理。無論如何,我們的任務是編寫一個shell腳本從一組文件中獲取數據並將其寫入一個可以被特定程序(Migrate-N)讀取的格式的新文件。UNIX新手:shell腳本未運行,未找到命令

我已經獲得了許多功能,可以在命令行中鍵入它們時獨立完成所需功能,但是當我將它們全部放在一個腳本中並嘗試運行時,出現錯誤。下面是詳細信息(我的道歉長度):

#! /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 

該系列裏grep的只是拉出DNA序列數據爲每個站點每個位點到新的文本文件。 Samples ... txt文件具有站點的示例ID號,.fasta文件具有按樣本ID組織的序列信息;如果我單獨運行,grep在命令行中工作得很好。

第二組代碼創建了我需要結束的實際新文件,該文件以.mig結尾。回波線是關於計劃需要信息的計數(每個基因座的鹼基對,分析中的羣體,每個位點的樣本等)的數據。貓線將按照回聲線指定的特定站點信息下的所有灰線所創建的站點數據將軌跡混合在一起。你毫無疑問得到了圖片。

爲了創建shell腳本,我一直在Excel中啓動,因此我可以輕鬆地複製粘貼/自動填充單元格,保存爲製表符分隔文本,然後在TextWrangler中打開該文本文件以在保存之前移除製表符。 sh文件(換行符:Unix(LF)和Encoding:Unicode(UTF-8))與腳本中使用的所有文件位於同一目錄中。我試過使用chmod +x FILENAME.shchmod u+x FILENAME.sh來確保它是可執行的,但無濟於事。即使我將腳本簡化爲僅僅一個grep行(使用#!/ bin/bash第一行),我也無法使其工作。這個過程只需要一點時間,直接輸入到命令行中,因爲這些文件都不大於160KB,有些文件顯着小一些。這是我輸入和我所得到的,當我嘗試運行文件(HW是正確的目錄)

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

我已經在這個impass兩天了,所以任何輸入將不勝感激!謝謝!!

+3

''MigrateNshell.sh'在'PATH'中的位置?如果試圖從當前目錄運行它,請嘗試使用'./MigrateNshell.sh'。 – 2013-05-13 19:30:14

回答

1
#! /bin/bash 
    ^--- 

刪除指定的空間。該家當應

#!/bin/bash 
+6

hashbang後通常會容忍一個空格。 – chepner 2013-05-13 19:53:54

+0

另請參閱[這個答案](http://stackoverflow.com/a/10197964/3266847)。 – 2017-03-04 07:25:08

28

出於安全原因,外殼不會搜索可執行文件的當前目錄(默認情況下)。你必須要具體,並告訴bash你的腳本是在當前目錄(.):

$ ./MigrateNshell.sh 
+0

+1我認爲這將是原因。 – Kent 2013-05-13 19:57:14

+2

您也可以指定解釋器:'bash MigrateNshell.sh'。即使沒有執行權限,這也能工作 – Otaia 2013-05-13 20:21:35

-3

第一:

chmod 777 ./MigrateNshell.sh 

然後:

./MigrateNshell.sh 

或者,添加您的編程到您的$ PATH變量中可識別的目錄。例如:Path Variable Example 那麼這將允許你打電話給你的程序,而不./

+4

製作'chmod 755',而不是'chmod 777'。 '777'爲系統上的每個人提供寫入權限。 '755'給你完全的許可,但只能閱讀並執行給其他人。 – 2013-06-28 21:35:41

1

Unix有一個名爲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 foo因爲foo是一個shell腳本。
  • 當您執行命令如/Users/david/foo$PWD/foo或只是普通./foo時,請包含目錄名稱。
  • 更改您的$PATH變量以將包含您的命令的目錄添加到PATH。

您可以修改$HOME/.bash_profile$HOME/.profile如果.bash_profile不存在。我這樣做是爲了添加我首先放在我的路徑上的/usr/local/bin。這樣,我可以覆蓋OS中的標準命令。例如,我有Ant 1.9.1,但Mac帶有Ant 1.8.4。我把我的ant命令放在/usr/local/bin,所以我的版本ant會先執行。我還爲我自己的命令添加了$HOME/bin到PATH的末尾。如果我有一個你想執行的文件,我將它放在$ HOME/bin中執行它。

14

變化的第一行到下面的如由Marc乙指出

#!/bin/bash 

然後標記的腳本執行,因此從命令行執行它

chmod +x MigrateNshell.sh 
./MigrateNshell.sh 

或簡單地從執行的bash命令行傳入腳本作爲參數

/bin/bash MigrateNshell.sh 
0

另請確保/ bin/bash是bash的適當位置....如果你從某個示例中取出該行,它可能與您的特定服務器不匹配。如果你正在爲bash指定一個無效位置,你將會遇到問題。

7

也嘗試到dos2unix shell腳本,因爲它有時具有Windows行結束,並且shell不能識別它。

$ dos2unix MigrateNshell.sh 

這有助於有時。

+0

這爲我解決了它。在這種情況下,我可以通過在vi中注意添加到每行的^ M來看到問題(在這個答案提示它之後)。奇怪的gvim認爲它已經是Unix格式,所以它一定是一行結尾錯誤。 – lessthanideal 2015-05-12 16:54:37

+0

我到處尋找忘記我已經在Windows中編輯了文件! – Omar 2016-01-28 04:39:34

0

在你的下面添加下面幾行。配置文件路徑

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

export PATH 

現在你的腳本應該沒有./

拉吉Dagla

2

有許多關於添加shebang line到腳本的開頭幾個很好的意見。我想添加一個建議,以便使用env command以提高便攜性。

雖然#!/bin/bash可能是您的系統上的正確位置,但這不是通用的。此外,這可能不是用戶的首選 bash。 #!/usr/bin/env bash將選擇在路徑中找到的第一個bash。

9

確保您沒有使用「PATH」作爲變量,它將覆蓋環境變量的現有PATH。

1

嘗試chmod u+x MigrateNshell.sh