同じフォルダーに2つのBashスクリプトがあります(リポジトリー全体をダウンロードするユーザーによってどこかに保存されます):
script.sh
_はユーザーによって実行されますhelper.sh
_は必須で、_script.sh
_によって実行されます2つのスクリプトは同じディレクトリにある必要があります。 2番目のスクリプトを呼び出すには最初のスクリプトが必要ですが、2つの問題があります。
/usr/bin/script.sh
_、_./script.sh
_、または_../Downloads/repo/scr/script.sh
_)script.sh
_は、_helper.sh
_を呼び出す前に別のディレクトリに変更されます。現在のディレクトリ を変数に格納することでこれを行うBashを完全にハックすることはできますが、そのコードは非常に一般的で単純なタスクであるため、不必要に複雑に思えます。
_helper.sh
_内から_script.sh
_を確実に呼び出す標準的な方法はありますか?また、Bashがサポートされているどのオペレーティングシステムでも動作しますか?
_$0
_は実行中のスクリプトの完全なパスを保持しているため、スクリプトに対して dirname
を使用してスクリプトのパスを取得できます。
_#!/bin/bash
script_name=$0
script_full_path=$(dirname "$0")
echo "script_name: $script_name"
echo "full path: $script_full_path"
_
たとえば、_/tmp/a.sh
_に保存すると、次のような出力が表示されます。
_$ /tmp/a.sh
script_name: /tmp/a.sh
full path: /tmp
_
そう
- ユーザーが最初のスクリプトをどのように実行しているかわからないため、現在の作業ディレクトリを知ることは役に立たない(_
/usr/bin/script.sh
_、_./script.sh
_、または_../Downloads/repo/scr/script.sh
_)
_dirname "$0"
_を使用すると、元のパスを追跡できます。
- スクリプト_
script.sh
_は、_helper.sh
_を呼び出す前に別のディレクトリに変更されます。
繰り返しますが、_$0
_にパスがあるので、cd
に戻ることができます。
多くの開発者は、$ 0は nsafe と見なされます。別の解決策を見つけました。bashスクリプトのチェーンとsourceに対して安全です。
A.shが(同じフォルダーにある)b.shをchildbashプロセスを使用して実行する必要がある場合:
#!/bin/bash
__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
bash ${__dir}/b.sh
A.shがsamebashプロセスを使用してb.sh(同じフォルダーにある)を実行する必要がある場合:
#!/bin/bash
__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source ${__dir}/b.sh