問題
現在受け入れられている回答は、重要な条件下でのみ機能します。与えられた...
/foo/bar/first.sh
:
function func1 {
echo "Hello $1"
}
そして
/foo/bar/second.sh
:
#!/bin/bash
source ./first.sh
func1 World
これfirst.sh
は、が配置されているのと同じディレクトリ内からが実行された場合にのみ機能しfirst.sh
ます。つまり、シェルの現在の作業パスが、の場合、/foo
コマンドを実行しようとします
cd /foo
./bar/second.sh
エラーを出力します:
/foo/bar/second.sh: line 4: func1: command not found
これsource ./first.sh
は、がスクリプトのパスではなく、現在の作業パスに関連しているためです。したがって、1つの解決策は、サブシェルを利用して実行することです。
(cd /foo/bar; ./second.sh)
より一般的なソリューション
与えられた...
/foo/bar/first.sh
:
function func1 {
echo "Hello $1"
}
そして
/foo/bar/second.sh
:
#!/bin/bash
source $(dirname "$0")/first.sh
func1 World
その後
cd /foo
./bar/second.sh
プリント
Hello World
使い方
$0
実行されたスクリプトへの相対パスまたは絶対パスを返します
dirname
$ 0スクリプトが存在するディレクトリへの相対パスを返します
$( dirname "$0" )
dirname "$0"
コマンドは、その後の引数として使用されて実行されるスクリプトのディレクトリへの相対パスを返すsource
コマンド
- 「second.sh」に、
/first.sh
インポートされたシェルスクリプトの名前を追加するだけです
source
指定されたファイルのコンテンツを現在のシェルにロードします