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


35

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

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

source /etc/profile
source ~/.profile

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

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

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

回答:


54

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

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


9

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

shシェル用に記述されたスクリプト(あなたの場合- #!/ bin / shと#!/ bin / bashの違いを参照)がBashによって実行されることを確認するには、次のコマンドを実行します。

bash script_name

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

2.なぜこれらの2つのソースが紛れもなくそこにあるのに見つからないと言うのでしょうか?

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

. /etc/profile
. ~/.profile

別の方法は#!/bin/bashカオス彼の答えで言ったようにシバンのラインを変更することです。


4

このSOの質問を参照してください:

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


1

一部のシェルはの.代わりにサポートしますsource。だから、あなたはこのようなものを試すことができます

. filename

の代わりに

source filename

うまくいけばいい

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.