对不起,这似乎以各种不同的方式被问到很多,但没有一个能帮助我理解为什么这不起作用。
如果我运行以下内容:
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
空格和斜线引起了我早期的问题。
答案 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
很抱歉浪费时间在这上面,显然我需要一杯咖啡!