1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェルは現在実行中のスクリプトの絶対パスを取得する

2022-01-05 02:24:30

1. pwdコマンド

pwdコマンドを使って、現在実行中のスクリプトの絶対パスを取得できるかどうか見てみましょう。コマンドは "print name of current/working directory" で、これは本当に現在の作業ディレクトリを意味し、スクリプトが実行されているディレクトリを意味するものではありません。

xiaosi@Qunar:~/company/sh$ cat pwd.sh
echo `pwd`
xiaosi@Qunar:~/company/sh$ sh pwd.sh
/home/xiaosi/company/sh
xiaosi@Qunar:~/company/sh$ cd .
xiaosi@Qunar:~/company$ sh sh/pwd.sh 
/home/xiaosi/company

pwd.sh スクリプトは echo `pwd` という一行だけです。このスクリプトを別のパスで実行すると、sh pwd.sh は /home/xiaosi/company/sh を取得しますが、sh sh/pwd.sh は /home/xiaosi/company を取得するので、pwd コマンドはスクリプトが実行されるディレクトリを取得しないことを意味します。

2. $0

シェルの初期化時に設定されます。bashがコマンドのファイルとともに起動された場合、$0にそのファイル名が設定されます。bashが-cオプション付きで起動された場合、実行する文字列の後の最初の引数が存在すれば、$0が設定されます。それ以外の場合は、引数0で与えられた、bashの起動に使用されたファイル名が設定されます。

この$0の値は、起動の仕方に関係します。

(1) ファイルを指定してbashを呼び出した場合、$0の値はファイル名となる

xiaosi@Qunar:~/company/sh$ cat pwd.sh 
echo $0
xiaosi@Qunar:~/company/sh$ sh pwd.sh 
pwd.sh

(2) -cオプションをつけてbashを起動すると、実際のコマンドは文字列から読み込まれ、文字列に他の引数がある場合は$0で始まる特別な変数参照が続きます(もうパスとは関係ありません)。

(3) これに加えて、$0にはbashが起動されたファイル名がセットされる(絶対パスとは書いていない)。

3. 正しい解答

basepath=$(cd `dirname $0`; pwd)

dirname $0, 現在実行中のスクリプトファイルの親ディレクトリを取得します。

cd `dirname $0`, このディレクトリに入る (現在の作業ディレクトリを変更する)

pwd, 現在の作業ディレクトリを表示する(cd実行後)

現在実行中のスクリプトの絶対パスを取得するShellについては、この記事がすべてです。スクリプトの絶対パスを取得するShellについては、Script Houseの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。