我将一个 shell 脚本的一部分提取到另一个 shell 脚本中,由于某种原因,在调用子脚本后,命令替换停止工作。 我无法想象这是下脚本中的内容,但我也看不出我做错了什么。
我是否这样做:
dirname "$0" # works
echo "`dirname "$0"`" # works
echo "$(dirname "$0")" # works
cat <<< "`dirname "$0"`" # works
cat <<< "$(dirname "$0")" # works
"$(dirname "$0")"/setup_buildroot.sh "$BUILDROOT" # call the sub-script
dirname "$0" # works
echo "`dirname "$0"`" # empty string
echo "$(dirname "$0")" # empty string
cat <<< "`dirname "$0"`" # crash
cat <<< "$(dirname "$0")" # crash
或者我做:
dirname "$0" # works
echo "`dirname "$0"`" # works
echo "$(dirname "$0")" # works
cat <<< "`dirname "$0"`" # works
cat <<< "$(dirname "$0")" # works
"`dirname "$0"`"/setup_buildroot.sh "$BUILDROOT" # call the sub-script
dirname "$0" # works
echo "`dirname "$0"`" # empty string
echo "$(dirname "$0")" # empty string
cat <<< "`dirname "$0"`" # crash
cat <<< "$(dirname "$0")" # crash
目录名称似乎工作正常,但反引号和$()
停止工作。 命令替换只返回一个空字符串。
编辑:删除所有双引号""
EDIT2:调用子脚本时显式执行 bash 不起作用
EDIT3:将"$(dirname "$0")"
保存到变量并使用它不起作用
EDIT4:在子脚本中添加相同的echo
命令表明子脚本中一切正常
编辑5:根据请求,输出脚本
/home/jayen/rep
/home/jayen/rep
/home/jayen/rep
/home/jayen/rep
/home/jayen/rep
#setup_buildroot.sh output here
/home/jayen/rep
bash: syntax error near unexpected token `newline'
bash: syntax error near unexpected token `newline'
我觉得调用子脚本正在破坏现有 bash 脚本会话的环境变量。也许尝试在下脚本行前面加上 bash
,所以
bash "`dirname "$0"`"/setup_buildroot.sh "$BUILDROOT"
看看是否可以解决问题。这是一个奇怪的情况。
我推荐的另一个解决方案是在第一行,做
mydir="$0"
并将所有$0
替换为$mydir
更好的是,做
mydir=`dirname "$0"`
预先运行,而不是一遍又一遍地重新运行命令。
没有意义,但请尝试采购您的子脚本
. "$(dirname "$0")"/setup_buildroot.sh "$BUILDROOT" # call the sub-script