我将部分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
dirname似乎工作正常,但是反引号和$()
停止工作。命令替换只返回一个空字符串。
编辑:删除所有双引号""
没有效果
EDIT2:在调用子脚本时显式执行bash无效
EDIT3:将"$(dirname "$0")"
保存到变量并使用该变量无效
EDIT4:在子脚本中添加相同的echo
命令,表明子脚本中的一切正常
EDIT5:根据请求,输出脚本
/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'
答案 0 :(得分:1)
我觉得调用子脚本会破坏现有bash脚本会话的环境变量。也许尝试使用bash
为子脚本行加前缀,所以
bash "`dirname "$0"`"/setup_buildroot.sh "$BUILDROOT"
并查看是否可以解决问题。这是一个奇怪的情况。
我推荐的另一个解决方案是在第一行,执行
mydir="$0"
并将所有$0
替换为$mydir
更好的是,
mydir=`dirname "$0"`
预先和不一遍又一遍地重新运行命令。
答案 1 :(得分:0)
它没有意义,但尝试寻找你的子脚本
. "$(dirname "$0")"/setup_buildroot.sh "$BUILDROOT" # call the sub-script