私は、UNIXプログラミングに非常に新しい(ターミナル経由でMacOSX Mountain Lionで実行)。私は最終的にPerlとpythonをデータ管理の目的に使用する予定です。ファイルのグループからデータを取得し、特定のプログラム(Migrate-N)で読み取り可能な形式で新しいファイルに書き込むシェルスクリプトを記述するタスク。
コマンドラインに入力するときに必要なことを正確に行うための関数をいくつか取得しましたが、それらをすべてスクリプトにまとめて実行しようとするとエラーが発生します。詳細は次のとおりです(長さについては謝罪します)。
#! /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は、各遺伝子座の各サイトのDNA配列データを新しいテキストファイルに引き出しているだけです。 Samples ... txtファイルにはサイトのサンプルID番号があり、.fastaファイルにはサンプルIDで整理されたシーケンス情報があります。 greppingは、個別に実行するとコマンドラインで正常に機能します。
コードの2番目のグループは、最終的に.migで終わる実際の新しいファイルを作成します。エコーラインは、プログラムが情報を必要とするカウント(遺伝子座ごとの塩基対、分析の母集団、サイトごとのサンプルなど)に関するデータです。猫のラインは、エコーラインで指定されたサイト固有の情報の下にあるすべてのgrepによって作成されたサイトデータによって、軌跡をマッシュすることです。あなたは間違いなく写真を取得します。
シェルスクリプトを作成するために、Excelで起動してセルを簡単にコピー/貼り付け/自動入力し、タブ区切りテキストとして保存し、そのテキストファイルをTextWranglerで開いてタブを削除してから.shファイル(行breaks:Unix(LF)およびEncoding:Unicode(UTF-8)))は、スクリプトで使用されるすべてのファイルと同じディレクトリにあります。 chmod +x FILENAME.sh
とchmod u+x FILENAME.sh
を使用して、実行可能であることを確認しようとしましたが、役に立ちませんでした。スクリプトを1行のgrep行(#!/ bin/bashの最初の行)に切り詰めても、動作させることはできません。これらのファイルはいずれも160KBを超えず、一部のファイルは非常に小さいため、コマンドラインに直接入力するだけで処理が完了します。これは私が入力したものであり、ファイルを実行しようとすると得られます(HWは正しいディレクトリです)
localhost:HW Mirel$ MigrateNshell.sh
-bash: MigrateNshell.sh: command not found
私はもう2日間この行き詰まりにいるので、どんな入力でも大歓迎です!ありがとう!!
セキュリティ上の理由から、シェルは実行可能ファイルの現在のディレクトリ(デフォルト)を検索しません。特定する必要があり、スクリプトが現在のディレクトリにあることをbash
に伝えます(.
):
$ ./MigrateNshell.sh
Marc Bが指摘したように、最初の行を次のように変更します
#!/bin/bash
次に、スクリプトを実行可能としてマークし、コマンドラインから実行します
chmod +x MigrateNshell.sh
./MigrateNshell.sh
または、コマンドラインからbashを実行し、スクリプトをパラメーターとして渡します
/bin/bash MigrateNshell.sh
dos2unix
シェルスクリプト。Windowsの行末記号が含まれていて、シェルがそれを認識しないことがあるためです。
$ dos2unix MigrateNshell.sh
これは時々役立ちます。
環境変数の既存のPATHを上書きする変数として「PATH」を使用していないことを確認してください。
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
が見つからない場合、command not foundと表示されます。
この問題を処理する方法はいくつかあります。
foo
はシェルスクリプトであるため、commandbash foo
を使用します。/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に配置します。
chmod u+x MigrateNshell.sh
#! /bin/bash
^---
指定されたスペースを削除します。シバンは
#!/bin/bash
また、/ bin/bashがbashの適切な場所であることを確認してください....特定のサーバーと一致しない可能性のある例からその行を使用した場合。 bashに無効な場所を指定している場合、問題が発生します。
.profileパスに以下の行を追加します
PATH=$PATH:$HOME/bin:$Dir_where_script_exists
export PATH
これで、スクリプトは./
なしで動作するはずです
ラジ・ダグラ