shシェルでソースコマンドが見つかりません


147

shシェルを使用するスクリプトがあります。sourceコマンドを使用する行でエラーが発生します。それsourceは私のshシェルに含まれていないようです。

sourceシェルから明示的に実行しようとすると、次のようになります。

sh: 1: source: not found

どういうわけか「ソース」をインストールする必要がありますか?のバージョンが間違っていshますか?


1
サポートするシェルsourceは「間違ったバージョン」であると合理的に主張することができます。
ウィリアムパーセル

1
また、エラーメッセージsource: not foundは、sourceコマンドが適切に評価されたが、読み取ったはずのファイルが存在しないことを意味します。
Simon Richter

4
シェルの機能のsource ため、「インストール」することはできません。外部コマンドとして実装することはできません。
クリストファーシュルツ

回答:


151

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


2
ありがとう!/ bin / shを/ bin / bashに置き換えるとUbuntuで動作しました!Ubuntuのbashがshであるという意味ですか?
Milad

1
@Milad:最近のUbuntuでは、を/bin/sh呼び出します/bin/dash。従来、sh互換モード/bin/shと呼ばれてい/bin/bashます。
チョロバ

@Milad ubuntu 14.04では動作しないと思います。OSのバージョンは何ですか?
Reza Ameri 2014

1
多分既知を助ける-カスケードスクリプトがある場合すべての「sh-> bash」の名前を変更します。ありがとうございました。:-)
BG Bruno

残念ながらこの問題を解決する方法はすぐにはわかりませんでしたが、正しい方向に進みました。SHELL := /bin/bashMakefileの先頭に追加する必要がありました。
anon58192932

136

Bourne shell(sh)では、を使用します。ファイルを読み込むコマンド

. filename

スクリプトの変更は許可されていません。Redhatサーバーでは問題なく実行されます。しかし、そのサーバーでは、ソースはshに含まれているようです
Milad

2
持っているsource場合は厳密ではありませんsh
tripleee 2014年

4
Jenkins(「シークレットファイル」として格納されているファイルをソースしようとする)でこの種の問題が発生し、「。」によるソースが発生しました。コマンドが解決策でした。
Jan Vlcinsky 2015年

これは、sh、dash、およびbashで機能するため、一番の答えになるはずです。
akhan

3
Mac OS(開発環境)とTravis-CI(テスト環境)との互換性のために、を使用する必要がありました. ./filename。そうしないと、sh: 1: .: filename: not foundTravis-CIでテストを実行するときにエラーが発生します。
エイドリアンジョリー2017

49
$ls -l `which sh`
/bin/sh -> dash

$sudo dpkg-reconfigure dash #Select "no" when you're asked
[...]

$ls -l `which sh`
/bin/sh -> bash

それで大丈夫でしょう


いいね!私はRHELとUbuntuサーバーを実行していますが、Ubuntuでこのような問題が常に発生します。私はRHELとLinuxのようなRHELが本当に好きです。
radtek、2014年

受け入れられた回答はUbuntu 14では機能しません。これは機能します!
rohithpr 2015年

回答にさらに説明を追加してください-何をしますか?dpkg-reconfigure特にDebianに基づいていないシステムでは、すべてのユーザーがアクセスできない可能性があります
Nico Haase

source: not foundDebianアップグレード後の古いTelnetクライアントに関するエラーを修正しました。ありがとうございます。
bjoster


9

この問題は、jenkins実行シェルが/ bin / sh経由でスクリプトを実行するために発生します

したがって、/ bin / shは「ソース」を認識しません

jenkinsの実行シェルの上部に以下の行を追加するだけです

#!/bin/bash

与えられた質問は結局ジェンキンスとは関係ありません
ニコ・ハーセ

8

sourceコマンドは、一部のシェルに組み込まれています。スクリプトがある場合は、次のように、最初の行で使用するシェルを指定する必要があります。

#!/bin/bash

まあ、それは#!/ bin / shと表示し、shを手動で入力して「どのソース」と尋ねると、別のLinuxではそれが教えてくれます:source:sh​​ell built-in command
Milad

ああ、これがこの行の目的です。私はいつも疑問に思いました。本当にありがとう!
CommonSenseCode

5

ソースを呼び出そうとしたときにこのエラーに直面しました#Jenkins実行シェルからコマンドを呼び出そ。

source profile.txt または source profile.properties

ソースの置き換えコマンドのは使用することです、

. ./profile.txt または . ./profile.properties

注: 2つのドット(。)の間にスペースがあります。


0

UbuntuのGNU Makefileで見つかりました(/ bin / sh-> bash)

を使用する必要がありました。コマンド、および./プレフィックスを使用してターゲットスクリプトを指定します(以下の例を参照)

/ bin / bash ..を呼び出す必要があるため、ソースはこのインスタンスでは機能しませんでした。

SHELL環境変数も/ bin / bashに設定されています

test:
    $(shell . ./my_script)

このサンプルにはタブ文字が含まれていないことに注意してください。スタック交換のためにフォーマットする必要がありました。


0

sourceはbash組み込みコマンドなので、sourceコマンドを実行するには、Rootとしてログインできます。

sudo -s source ./filename.sh


これは有効なソリューションのようには見えません。ユーザーにsudo権限がない場合はどうなりますか?そして、調達されたものはその後、管理者ユーザーとしてのみ利用可能になり、新しい問題が発生します
ニコ・ハーセ

0

Ubuntuでは、sh scriptname.shを使用してファイルを実行する代わりに、を使用しました。scriptname.shとうまくいきました!私のファイルの最初の行には以下が含まれます: #!/bin/bash

このコマンドを使用してスクリプトを実行します

.name_of_script.sh

1
これはすでに複数回回答されています。そのような場合に新しい回答を追加する場合は、詳細情報を提供してください
Nico Haase

-3

これはあなたを助けるかもしれません、私は.profileコマンドで自分をリロードしよう. .profileとしていて、構文エラーがあったので、このエラーを受け取りました


-6

Bourneシェル(sh)は、PATHを使用してを検索しsource <file>ます。ソースにしようとしているファイルがパスにない場合、「ファイルが見つかりません」というエラーが表示されます。

試してください:

source ./<filename>

5
ポスト氏は述べていsh: 1: source: not foundないfile not found
クリスティアン・チャパロA.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.