命令替换打破命令替换

时间:2012-11-19 05:02:00

标签: bash command-substitution

我将部分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'

2 个答案:

答案 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