web-dev-qa-db-ja.com

シェルスクリプトが実行されていない、コマンドが見つからない

私は、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.shchmod u+x FILENAME.shを使用して、実行可能であることを確認しようとしましたが、役に立ちませんでした。スクリプトを1行のgrep行(#!/ bin/bashの最初の行)に切り詰めても、動作させることはできません。これらのファイルはいずれも160KBを超えず、一部のファイルは非常に小さいため、コマンドラインに直接入力するだけで処理が完了します。これは私が入力したものであり、ファイルを実行しようとすると得られます(HWは正しいディレクトリです)

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

私はもう2日間この行き詰まりにいるので、どんな入力でも大歓迎です!ありがとう!!

23
ChickadeeChick

セキュリティ上の理由から、シェルは実行可能ファイルの現在のディレクトリ(デフォルト)を検索しません。特定する必要があり、スクリプトが現在のディレクトリにあることをbashに伝えます(.):

$ ./MigrateNshell.sh
32
chepner

Marc Bが指摘したように、最初の行を次のように変更します

#!/bin/bash 

次に、スクリプトを実行可能としてマークし、コマンドラインから実行します

chmod +x MigrateNshell.sh
./MigrateNshell.sh

または、コマンドラインからbashを実行し、スクリプトをパラメーターとして渡します

/bin/bash MigrateNshell.sh
18
Ryan Williams

dos2unixシェルスクリプト。Windowsの行末記号が含まれていて、シェルがそれを認識しないことがあるためです。

$ dos2unix MigrateNshell.sh

これは時々役立ちます。

9
Adolfo

環境変数の既存のPATHを上書きする変数として「PATH」を使用していないことを確認してください。

9
janhavi

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に配置します。

2
David W.

スクリプトの先頭にShebang行を追加することについて、いくつかの良いコメントがありました。移植性を高めるために、envコマンドも使用することをお勧めします。

#!/bin/bashはシステム上の正しい場所である可能性がありますが、それは普遍的ではありません。さらに、ユーザーのpreferredbashではない場合があります。 #!/usr/bin/env bashは、パスで最初に見つかったbashを選択します。

2
broadmonkey

chmod u+x MigrateNshell.sh

2
Aminah Nuraini
#! /bin/bash
  ^---

指定されたスペースを削除します。シバンは

#!/bin/bash
1
Marc B

また、/ bin/bashがbashの適切な場所であることを確認してください....特定のサーバーと一致しない可能性のある例からその行を使用した場合。 bashに無効な場所を指定している場合、問題が発生します。

0
James Gawron

.profileパスに以下の行を追加します

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

export PATH

これで、スクリプトは./なしで動作するはずです

ラジ・ダグラ

0
Raj Dagla