Bashスクリプトからフルパスを取得する

Bashスクリプトからフルパスを取得する

相対パスを使用するbashスクリプトがあります。スクリプトが保存されているディレクトリと同じ作業ディレクトリが必要です。プロンプトで実行すると、まずスクリプトディレクトリにCDを移動できるため、うまく機能します。ただし、/etc/cron.hourly でスクリプトへのシンボリックリンクを生成すると、スクリプトは中断されます。

bashスクリプトディレクトリをスクリプトが格納されているディレクトリに変更する方法が必要です。しかし、私はこれまで成功していませんでした。スクリプトがシンボリックリンクを介してcronから呼び出されても、これを行う簡単な方法はありますか?

ベストアンサー1

通常、シェルはスクリプトを読む必要があるため、常にスクリプトパスを知っています。場合によってはそうではありません。setuidスクリプトこれをサポートするオペレーティングシステム(Linuxではない)では - しかし、setuidシェルスクリプトはとにかく悪い考えです。さらに、スクリプトは、シェルが開いた時間とそれを使用して作業しようとした時間の間に移動した可能性があります。したがって、セキュリティや信頼性の問題がない場合にのみスクリプトパスを使用してください。構造が既知のパッケージは有効なユースケースです。

シェルインタプリタに渡されたスクリプトパスは特別なパラメータにあります$0。相対パスである可能性があるため、使用するには別のディレクトリに変更する前に使用してください。この間にスクリプトが移動されないことがわかっている場合は、それを使用できます。

シンボリックリンクである可能性があるため、ターゲットをインポートする$0必要があります。これを行うPOSIXメソッドはありませんが、Linux(GNU coreutilsまたはBusyBox)と最近はBSDでreadlink -f利用できます。標準絶対パス

script_path_in_package=$(readlink -f -- "$0")
script_directory=${script_path_in_package%/*}

これにより、パッケージの構築方法が制限されます。たとえば、アーキテクチャに依存しないディレクトリツリーにスクリプトを配置し、各アーキテクチャ固有のディレクトリツリー内でそのスクリプトに接続することはできません。

おすすめ記事