我正在尝试使用以下命令创建符号链接:
$ 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:警告:shell 级别(1000)太高,重置为 1
答案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}" "$@"
富
#!/bin/bash
echo "$@"
现在我们可以创建一个符号链接:
$ ln -s /path/to/foo.sh bar
无论符号链接的名称是什么,都会执行文件 foo。