web-dev-qa-db-ja.com

スクリプトの実行時のエラーメッセージ「ソース:見つかりません」

一部のパスがエクスポートされない場合、/etc/profileおよび$HOME/.profileを変更する小さな自動セットアップスクリプトを作成しています。次に、これらを自動的にリロードします。

sourceがこれを行うことを読んだので、端末を起動して次のように入力しました。

source /etc/profile
source ~/.profile

ターミナルからは、エラーは出力されませんでした。

ただし、これら2つのコマンドをBashスクリプト内に配置すると、source: not foundになります。

  1. #!/bin/shが指定されている場合でも、スクリプトがBashによって実行されていることをどのようにして確認できますか(明らかに、保証されません)。
  2. なぜこれらの2つのソースが紛れもなくそこにあるのに見つからないと言うのでしょうか?
31
Yanick Rochon

/bin/shbashではありません。 bashを使用してスクリプトを実行するには、スクリプトの最初の行として#!/bin/bashと記述します。

source: not foundが見つからないため、エラー/etc/profileは削除されません。 sourceが見つからないため、削除されました。 sourceはBash組み込み関数であり、bashを使用してスクリプトを実行しないでください。なぜ見つからないのかは明らかです。スクリプトの#!行を変更すると、機能します。

47
chaos

1。 #!/bin/shが指定されている場合でも、スクリプトがBashによって実行されていることを確認するにはどうすればよいでしょう(明らかに、保証しません)?

sh Shell(あなたの場合 #!/ bin/shと#!/ bin/bashの違いは何ですか? を参照)用に記述されたスクリプトが実行されることを確認するBash、次のコマンドを実行するだけです:

bash script_name

したがって、このエラーはもう発生しません。

2。これらの2つのソースが紛れもなくそこにある場合、それらが見つからないと言うのはなぜですか?

これらのソースファイルが存在しないとは言いません。 sourceコマンドが見つからないということです。 #!/bin/sh行でスクリプトを開始するため、スクリプトはshではなくbashを使用して実行されるため、これは正常です。どうして普通なの? sourceコマンドはBashビルトインですが、shビルトインではないためです。 shのファイルを取得するには、.(ドット)を使用する必要があります。例:

. /etc/profile
. ~/.profile

別の方法は、 chaoshis answer で述べたように、Shebang行を#!/bin/bashに変更することです。

8
Radu Rădeanu

こちらをご覧ください SO question

/bin/shは通常、シェルを模倣しようとする他のシェルです。多くのディストリビューションはsh/bin/bashを使用しており、ソースをサポートしています。ただし、Ubuntuでは、ソースをサポートしない/bin/dashが使用されます。スクリプトを編集できない場合は、スクリプトを実行するシェルを変更してみてください。

4
muru