問題
現在受け入れられている回答は、重要な条件下でのみ機能します。与えられた...
/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
指定されたファイルのコンテンツを現在のシェルにロードします