[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
質問
が存在するディレクトリのパスを取得するにはどうすればよいですか? バッシュ スクリプトが配置されています。 内部 そのスクリプトは?
Bashスクリプトを別のアプリケーションのランチャーとして使いたいのですが、どうすればいいですか?作業ディレクトリをBashスクリプトのあるディレクトリに変更し、そのディレクトリのファイルを操作できるようにしたいのですが、以下のような方法があります。
$ ./application
解決方法は?
#!/usr/bin/env bash
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
は便利なワンライナーで、どこから呼び出されてもスクリプトの完全なディレクトリ名を表示します。
この方法は、スクリプトを見つけるためのパスの最後のコンポーネントがシンボリックリンクでない限り機能します (ディレクトリリンクは問題ありません)。 スクリプト自体へのリンクも解決したい場合は、複数行のソリューションが必要です。
#!/usr/bin/env bash
SOURCE=${BASH_SOURCE[0]}
while [ -h "$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 を賢くオーバーライドして出力を標準エラーにリダイレクトしている場合、標準エラー出力の副作用もあります (エスケープシーケンスを含む。
update_terminal_cwd >&2
Macの場合)。追加
>/dev/null 2>&1
の末尾にある
cd
コマンドを使えば、両方の可能性に対処できます。
どのように動作するかを理解するために、より冗長なこのフォームを実行してみてください。
#!/usr/bin/env bash
SOURCE=${BASH_SOURCE[0]}
while [ -h "$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'
関連
-
[解決済み] Bashスクリプトで引数を反復処理する方法
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashでコマンドの出力に変数を設定するにはどうすればよいですか?
-
[解決済み] あるディレクトリにあるすべてのコード行を再帰的にカウントするにはどうすればよいですか?
-
[解決済み] 現在のファイルのディレクトリのフルパスを取得するにはどうすればよいですか?
-
[解決済み] Bashスクリプトでカレントディレクトリ名(フルパスなし)を取得する
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Git リポジトリに空のディレクトリを追加するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】if [](角括弧)の「[: 引数が多すぎる」エラーの意味)
-
[解決済み】 -bash: 予期しないトークン「改行」付近での構文エラー
-
[解決済み】ログアウトと再ログインをせずに.bashrcの設定を再読み込みする方法?
-
[解決済み] osx find exec rm find: exec: 不明な主またはオペレータ
-
[解決済み] docker alpine /bin/sh script.sh not found
-
[解決済み] condaのアップデート後、ターミナルのプロンプトから(base)を削除する方法
-
[解決済み] シェルスクリプトでこのエラーを解決するにはどうしたらよいでしょうか。"読み取り。Illegal option -t "というエラーはどうすれば解決できますか?
-
[解決済み] Bashのforeachループ
-
[解決済み】Bashスクリプトが自分へのフルパスを取得する確実な方法【重複あり
-
[解決済み] 現在の作業ディレクトリではなく、ファイルの場所に基づく相対パス [重複]。