Mac OS Xでバッチ(.command)ファイルの現在の場所を指定する方法


2

ダブルクリックして作業を行うバッチファイル(.command)があります。同じフォルダー内のファイルに依存関係がありますが、.commandファイルをダブルクリックすると、起動し、現在の場所が/〜であると想定されます

スクリプト自体で.commandファイルの場所を見つけて指定するにはどうすればよいですか?それで、相対的なアセットを参照できますか?

回答:


3

bashを使用している場合(つまり、スクリプトがで始まる#!/bin/bash場合)、$ BASH_SOURCEを使用してスクリプトのファイル名を取得できます。それから、それが入っているディレクトリを取得できます:

mydir="$(dirname "$BASH_SOURCE")"

...そして、それを使用して、たとえばスクリプトに関連するファイルを見つけますcp "$mydir/fileInTheSameFolder" /tmp(そして、ここでやったように、常に二重引用符を使用してください)。

これは相対パスの場合があることに注意してください。たとえば、スクリプトがを使用して対話型シェルから実行された場合、./scriptname.command「。」として出力されます。スクリプトcdが別の場所にない限り、これは問題になりませんが、フルパスが必要な場合は、代わりにこれを使用できます。

mydir="$(cd "$(dirname "$BASH_SOURCE")" && pwd)" || {
    echo "Error getting script directory" >&2
    exit 1
}

または、cdスクリプトの先頭にあるスクリプトのディレクトリに移動することもできます。

cd "$(dirname "$BASH_SOURCE")" || {
    echo "Error getting script directory" >&2
    exit 1
}

ディレクトリ名にスペースが含まれている場合、パスは見つかりません。
スティーブン

@StevenVachonパスへのすべての参照を二重引用符で囲む限り機能します。つまり、ls "$mydir"およびsomecommand >>"$mydir/output.log"動作しますが、ls $mydirsomecommand >>$mydir/output.log失敗します。これが、シェルスクリプト内のすべての変数参照を(ほぼ)二重引用符で囲むことをお勧めする理由の1つです。
ゴードンデイヴィソン

MacOSでは$ BASH_SOURCEは空ですが、Linuxでは値があります
LCB

@LCB本当に他のシェルではなくbashの下でスクリプトを実行していますか?
ゴードンデイヴィ

@GordonDavissonを使用してoh-my-zshいるので、理由がわかりました。そして#!/bin/bash、ファイルをで実行すると行が無視されることを知りませんでしたsource ./script.sh
LCB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.