以下を使用してシンボリックリンクを作成しようとしています。
$ ln -s path/to/foo.sh ~/.local/bin/bar
foo.shが実行されるパスには、という名前の別のファイルがありますfoo
。
次のbashスクリプトは、ターミナルから直接起動すると正常に実行されます(つまり、$ ./foo.sh)が、シンボリックリンクを使用するbar
と、エラーがスローされます。
# foo.sh
1 #!/usr/bin/env bash
2 appname=`basename $0 | sed s,\.sh$,,`
3
4 dirname=`dirname $0`
5 tmp="${dirname#?}"
6
7 if [ "${dirname%$tmp}" != "/" ]; then
8 dirname=$PWD/$dirname
9 fi
10 LD_LIBRARY_PATH=$dirname
11 export LD_LIBRARY_PATH
12 $dirname/$appname $*
起動しようとすると、シンボリックリンクから上記のスクリプトで次のエラーが発生する理由がわかりませんbar
。
bash:警告:シェルレベル(1000)が高すぎ、1にリセットされます
ファイルを処理する前にシンボリックリンクを解決してください。
foo.sh
#!/bin/bash
# Mark variable for export.
declare -xi LVL
# Resolve absolute pathname.
filename=$(realpath "$0")
# Strip .sh suffix from file and check for exec bit.
((LVL++ < 1)) && [[ -x "${filename%.sh}" ]] || exit 1
export LD_LIBRARY_PATH="${filename%/*}"
# Run it!
"${filename%.sh}" "$@"
foo
#!/bin/bash
echo "$@"
これで、シンボリックリンクを作成できます。
$ ln -s /path/to/foo.sh bar
シンボリックリンクの名前に関係なく、実行されるのはファイルfooです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加