为什么这个sed命令在终端中工作,而不是在bash“.sh”脚本中工作

时间:2013-01-16 12:51:07

标签: bash sed environment-variables

对不起,这似乎以各种不同的方式被问到很多,但没有一个能帮助我理解为什么这不起作用。

如果我运行以下内容:

sed -i".bak" "s:$PRELOADER_BASH::" ~/.bashrc

在终端,它的工作原理。但是我想将它作为sh脚本的一部分运行,当我这样做时,我得到以下错误:

sed: -e expression #1, char 8: unterminated `s' command

有人可以向我解释为什么会这样做吗?

环境变量PRELOADER_BASH是:

export LD_PRELOAD=/usr/lib/mylib1.so /usr/lib/mylib2.so

空格和斜线引起了我早期的问题。

2 个答案:

答案 0 :(得分:0)

您的变量PRELOADER_BASH是shell脚本已知的吗?您必须将其导出才能在子shell中访问它(例如在shell脚本中)。

像这样定义你的变量:

export PRELOADER_BASH="export LD_PRELOAD=/usr/lib/mylib1.so /usr/lib/mylib2.so"

然后运行你的shell脚本,它会工作。它将替换你的〜/ .bashrc文件中export LD_PRELOAD=/usr/lib/mylib1.so /usr/lib/mylib2.so的所有出现(即删除它)。

<强>解释

在命令行上你可能已经定义了你的变量:

PRELOADER_BASH="export LD_PRELOAD=/usr/lib/mylib1.so /usr/lib/mylib2.so"

这使它在当前shell中可用,但在子shell中不可用。因此,您需要使用export

您也可以在shell脚本中定义变量,而不是导出。

答案 1 :(得分:0)

好吧事实证明我有点过于谨慎和愚蠢,因为我没有在这里发布确切的脚本代码,在bash文件生命周期的早期尝试解决空间和/的问题我正在导出PRELOADER_BASH通过以下方式:

PRELOADER_BASH='export LD_PRELOAD="/usr/lib/libopenvg.so /usr/lib/libinterposer.so"'

这实际上是导致错误的原因!最好的方法是做到以下几点:

PRELOADER_BASH="export LD_PRELOAD=/usr/lib/libopenvg.so /usr/lib/libinterposer.so"
事后看来它真的很愚蠢,因为我的“过度完成”的预加载器bash设置可能直接扩展到:

sed -i".bak" "s:'export LD_PRELOAD="/usr/lib/libopenvg.so /usr/lib/libinterposer.so"'::" ~/.bashrc

所以sed命令确实有一个“未终止的's'命令”

sed -i“.bak” s:'export LD_PRELOAD =”/ usr / lib / libopenvg.so /usr/lib/libinterposer.so ' ::“〜/ .bashrc

很抱歉浪费时间在这上面,显然我需要一杯咖啡!