0

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

如果我运行以下命令:

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

空格和斜线给我带来了早期的问题。

4

2 回答 2

0

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

像这样定义你的变量:

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

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

解释

在命令行上,您可能已经像这样定义了您的变量:

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

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

除了导出之外,您还可以在 shell 脚本中定义变量。

于 2013-01-16T12:57:53.993 回答
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

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

于 2013-01-16T18:00:37.613 回答