回答:
ファイル名をスクリプトインタープリタープログラムに渡してスクリプトを実行すると、スクリプトを引数として渡してインタープリタープログラムを実行します。たとえば、これは引数 'filename.sh'を持つプロセス 'sh'のように見えます。sh
インタプリタは、ファイルを開いています。
一方、スクリプト自体を実行すると、システムは指定されたインタープリタープログラムを呼び出し、スクリプトの内容をフィードします。この場合、プロセスは引数なしの「filename.sh」のように見えます。
バンラインがあることを確認する必要があります。
#!/bin/bash
# bash script here
bang行は、スクリプトの最初の行であり、同じ2文字#!
で始まります。これらは、システムがスクリプトを実行しようとしたときに読み取られ、システムはその直後にプログラムにプログラムを渡します。この行はbashとは関係がなく、Pythonとperlでもまったく同じように機能しますが、それらは非常に異なる言語です。#!/usr/bin/python
たとえば、使用してから、Pythonコードを使用します。
スクリプトを作成したら、実行権限を設定していることを確認してください。
chmod a+x filename.sh
その後、スクリプトを独自のプロセスとして実行できます。
./filename.sh
または/usr/sbin
、どこからでも実行できるように、素敵なプログラム名を持つ既知の場所にファイルを配置します。
sudo cp filename.sh /usr/sbin/program-name
program-name
そして、これは本当に適切なパーミッションでbangラインを使用することの実際的な利点です-それはすべてデプロイについてです。スクリプトを実行するプログラムを覚えておく必要がある場合、ユーザーにスクリプトを実行させるのは非常に困難です。スクリプトを実行するたびに、スクリプトへの完全なパスを忘れずに指定してください。どこにそれを置くよう/usr/local/bin
例えば、および実行可能なそれを作る、あなたのスクリプトを使用しようとしている人々のために悲しみの非常に多くを保存することができます。これらのプログラムは、コンピューター上のすべてのユーザーが利用できるようになります。
識別にも適しています。top
プログラムにアクセスすると、bang行なしで実行されたスクリプトには、インタープリターの名前(bash
、perl
または)が付けられpython
ます。ただし、適切な権限でスクリプトを実行すると、スクリプトの名前が表示されます。
注:誰でもアクセスできるスクリプトを配布する場合は、manページとdebパッケージを作成してインストールしてください。オンラインでのランダムスクリプトの数を減らし、アンインストールできるデバッグの数を増やす必要があります。
bash
であることに注意してくださいsh
。
PATH
。特にに配置するときはそうではありません。
/usr/local/bin
おそらくそれよりも良いでしょう/usr/sbin
-それは、プログラムがディストリビューションの一部ではなく、このマシンに対してローカルであることを示しています。
ショートバージョン:
sh
コマンドラインインタープリター(ダッシュ)です。
実行sh my_script
すると、ダッシュがスクリプトを解釈します。
./
最初の行を見て、使用するインタープリターを見つけようとします。例えば#!/bin/bash
、さらには#!/bin/ruby
(実行とは対照的にruby my_script
)。
./
に何かを見つけるのではなく、ファイルの最初の2バイトを調べるのはシステム実行メソッドです。
sh
してファイルにsha-bangが含まれている場合、sha-bangは無視されるのsh
でしょうか、それともリンクのあるシェルを開いてから、他のシェルを開くのでしょうか?
エラーが発生する主な理由は3つあります。
chmod +x <myscriptname.sh>
れませんnoexec
")/usr/local/bin
#!
行にエラーがあり#!/bin/sh
か#!/bin/bash
最初の行が正しいように見えても動作しない場合は、ファイルにDOS行末記号がないことを確認してください。
エラーは次のようになります。
$ ./myscript.sh
bash: ./myscript.sh: /bin/bash^M: bad interpreter: No such file or directory
を実行することで修正できますdos2unix <myscriptname.sh>
。または、お持ちでない場合は、をご覧ください
perl -p -i -e 's/\r\n$/\n/' <myscriptname.sh>
。
答えは、shは非常に人気のあるシェルの名前だということです。しかし、時代遅れで、他のものに置き換えられました。現在、shはマシンにインストールされている他のシェルにリンクされています。例えば、私はそこにパッシュを入れました。shからシェルを実行すると、通常、元の「シェル」動作との「互換性」モードがトリガーされます。
したがって、解決策は非常に簡単です。shコマンドの背後にあるもの(ls -al / bin / sh)を見て、#!/ bin / whatever_you_find_thereを最初の行に追加します(またはスクリプトにそのようなものがある場合は編集します)。
または、スクリプト自体にバグがある可能性があります。shが満たす依存関係と同様ですが、実際に使用されるインタープリターはそうではありません。
mkdir ~/bin ; cp myscript.sh ~/bin/
echo "export PATH="$PATH:/home/$USER/bin" >> ~/.profile ; source ~/.profile ;
ではなく/usr/sbin
、それは非必須の管理ツールのためで/usr/local/bin
あり、を持ちたくない場合はより良い選択ですが、可能な限り~/bin/
避けるsudo
ことをお勧めします。
~/.profile
すでにが~/bin
存在する場合、を追加するためのコードがありますPATH
。別の注意として、スクリプトに拡張子を付けないでください。
ls ~/bin/|wc -l = 428
)私はそこにたくさんのものを入れました;)
/bin
と/usr/bin
、あなたは、彼らが拡張機能を使用しないでください表示されます。