Bash スクリプト自体から、スクリプトが配置されているディレクトリを取得するにはどうすればよいでしょうか? 質問する

Bash スクリプト自体から、スクリプトが配置されているディレクトリを取得するにはどうすればよいでしょうか? 質問する

ディレクトリのパスを取得するにはどうすればいいですか?バッシュスクリプトは、そのスクリプト内にありますか?

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'

おすすめ記事