ダブルクリックして作業を行うバッチファイル(.command)があります。同じフォルダー内のファイルに依存関係がありますが、.commandファイルをダブルクリックすると、起動し、現在の場所が/〜であると想定されます
スクリプト自体で.commandファイルの場所を見つけて指定するにはどうすればよいですか?それで、相対的なアセットを参照できますか?
ダブルクリックして作業を行うバッチファイル(.command)があります。同じフォルダー内のファイルに依存関係がありますが、.commandファイルをダブルクリックすると、起動し、現在の場所が/〜であると想定されます
スクリプト自体で.commandファイルの場所を見つけて指定するにはどうすればよいですか?それで、相対的なアセットを参照できますか?
回答:
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
}
ls "$mydir"
およびsomecommand >>"$mydir/output.log"
動作しますが、ls $mydir
とsomecommand >>$mydir/output.log
失敗します。これが、シェルスクリプト内のすべての変数参照を(ほぼ)二重引用符で囲むことをお勧めする理由の1つです。
oh-my-zsh
いるので、理由がわかりました。そして#!/bin/bash
、ファイルをで実行すると行が無視されることを知りませんでしたsource ./script.sh
。