惜しみなく貸してくださいStackOverflow 回答、相対パスを使用してログイン時にロードできるように、スクリプトが実行されているディレクトリを探したいと思います。
今スクリプトは非常に小さいです。
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ] ; do SOURCE="$(readlink "$SOURCE")"; done
DIR=$( cd -P "$( dirname "$SOURCE" )" && pwd )
ただし、ログインまたは電話をかけると、次のメッセージがsource <this_script.sh>
表示されます。
-bash: script.sh: line 4: syntax error: unexpected end of file
カップルの質問:
- それは何にぶら下がっていますか?
- 解決策は何ですか?
次は実行中です。
-bash-3.2$ bash --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
編集1:
Jillのソリューションをお試しください。
parent="$(dirname "$SOURCE")"
echo "PARENT IS $parent"
DIR="$(cd -P "$parent" && pwd)"
echo "DIR IS $DIR"
source
ログインしようとしたりログインしたりすると、次のメッセージが表示されます。
Last login: Mon Mar 12 08:07:13 2012 from ....
PARENT IS .
: No such file or directory
DIR IS
: command not found
: command not found
: command not found
: command not found
答え1
最後の行の末尾に改行文字がありません。
答え2
ソースでコンパイルされたbash 3.2.25(2)を使用してこの動作を再現することはできません。
3.2シリーズのどこかで$(…)
解析方法が変更されました。
うふ。 Bash は、Posix ルールに従ってコマンド置換を解析します。 $() に含まれるコマンドは、閉じ区切り文字で解析されます。
この場合、再現できない理由はわかりませんが、古くてバグのある解析動作が発生する可能性があります。コマンドを簡素化してみてください。
parent=$(dirname "$SOURCE")
DIR=$(cd -P "$parent" && pwd)
外部コマンドの置換に二重引用符を追加すると役に立つと思います。二重引用符は、割り当ての値部分に使用するときに違いを生じませんが、バグのあるパーサーを含むシェルバージョンがあることを覚えていますが、処理するfoo=$(something)
ことはできましたfoo="$(something)"
。