ディレクトリのパスを取得するにはどうすればいいですか?バッシュスクリプトは、そのスクリプト内にありますか?
Bash スクリプトを別のアプリケーションのランチャーとして使用したいです。作業ディレクトリを Bash スクリプトが配置されているディレクトリに変更して、そのディレクトリ内のファイルを操作できるようにします。
$ ./application
ベストアンサー1
#!/usr/bin/env bash
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
は、スクリプトがどこから呼び出されたかに関係なく、スクリプトの完全なディレクトリ名を提供する便利なワンライナーです。
スクリプトを見つけるために使用されるパスの最後のコンポーネントがシンボリックリンクでない限り、これは機能します (ディレクトリリンクは OK)。スクリプト自体へのリンクも解決したい場合は、複数行のソリューションが必要です。
#!/usr/bin/env bash
SOURCE=${BASH_SOURCE[0]}
while [ -L "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR=$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )
SOURCE=$(readlink "$SOURCE")
[[ $SOURCE != /* ]] && SOURCE=$DIR/$SOURCE # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR=$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )
source
この最後のものは、エイリアス、、、bash -c
シンボリックリンクなどの任意の組み合わせで機能します。
注意:このスニペットを実行する前に別のディレクトリに移動するとcd
、結果が不正確になる可能性があります。
また、注意してください$CDPATH
落とし穴、およびユーザーが cd をスマートにオーバーライドして出力を stderr にリダイレクトした場合の stderr 出力の副作用 (Mac で を呼び出す場合などのエスケープ シーケンスを含むupdate_terminal_cwd >&2
)。コマンド>/dev/null 2>&1
の最後にを追加するとcd
、両方の可能性に対処できます。
動作の仕組みを理解するには、次のより詳細な形式を実行してみてください。
#!/usr/bin/env bash
SOURCE=${BASH_SOURCE[0]}
while [ -L "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
TARGET=$(readlink "$SOURCE")
if [[ $TARGET == /* ]]; then
echo "SOURCE '$SOURCE' is an absolute symlink to '$TARGET'"
SOURCE=$TARGET
else
DIR=$( dirname "$SOURCE" )
echo "SOURCE '$SOURCE' is a relative symlink to '$TARGET' (relative to '$DIR')"
SOURCE=$DIR/$TARGET # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
fi
done
echo "SOURCE is '$SOURCE'"
RDIR=$( dirname "$SOURCE" )
DIR=$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )
if [ "$DIR" != "$RDIR" ]; then
echo "DIR '$RDIR' resolves to '$DIR'"
fi
echo "DIR is '$DIR'"
そして、次のような内容が出力されます:
SOURCE './scriptdir.sh' is a relative symlink to 'sym2/scriptdir.sh' (relative to '.')
SOURCE is './sym2/scriptdir.sh'
DIR './sym2' resolves to '/home/ubuntu/dotfiles/fo fo/real/real1/real2'
DIR is '/home/ubuntu/dotfiles/fo fo/real/real1/real2'