【问题标题】:LD_PRELOAD - shell expansion troubleLD_PRELOAD - shell 扩展问题
【发布时间】:2014-04-06 07:16:50
【问题描述】:

我想调用一个带有 LD_PRELOAD 的可执行文件,其中包含一些 .so 文件。 但是我有一个问题,bash shell 扩展似乎不适用于变量扩展:

这些是文件,我正在尝试为 LD_PRELOAD 设置:

nuclear@Korhal:~$ ls speedhack/speedhack*.so
speedhack/speedhack32.so  speedhack/speedhack.so

但是shell扩展在这里不起作用:

nuclear@Korhal:~$ LD_PRELOAD="speedhack/speedhack*.so" ./my_executable
ERROR: ld.so: object 'speedhack/speedhack*.so' from LD_PRELOAD cannot be preloaded: ignored.

我写了一个脚本来检查,shell变量扩展会发生什么:

nuclear@Korhal:~$ cat test.sh 
#!/bin/bash

echo "LD_PRELOAD w/o quotes:"
echo $LD_PRELOAD

echo "LD_PRELOAD with quotes:"
echo "$LD_PRELOAD"

运行它:

nuclear@Korhal:~$ LD_PRELOAD="speedhack/speedhack*.so" ./test.sh
ERROR: ld.so: object 'speedhack/speedhack*.so' from LD_PRELOAD cannot be preloaded: ignored.
LD_PRELOAD w/o quotes:
speedhack/speedhack32.so speedhack/speedhack.so
LD_PRELOAD with quotes:
speedhack/speedhack*.so

但它变得更复杂:当从 ld.so 访问变量时,星号没有展开 并且在脚本内部,只有当我在 echo 中没有引号时,它才会被扩展。据我所知,双引号对变量扩展没有影响(echo $VAR 应该与 echo "$VAR" 相同。但是 echo '$VAR'将打印字符串 $VAR)

主要问题:如何在变量赋值中强制shell扩展,让LD_PRELOAD保存文件列表?

【问题讨论】:

  • 您认为引号无关紧要的假设是完全错误的,您对带和不带双引号的实际行为的观察恰恰说明了这一点。

标签: linux bash shell


【解决方案1】:

您可以将文件名放在一个数组中并使用它来扩展列表:

FILES=(speedhack/speedhack*.so)
LD_PRELOAD="${FILES[@]}" ./my_executable

【讨论】:

    【解决方案2】:

    您还可以使用反引号或 $() 语法将命令的结果复制粘贴到命令行。然后使用双引号将所有单词抓取到同一个变量中。

    LD_PRELOAD="$(ls speedhack/speedhack*.so)" ./my_executable
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 2010-10-12
      • 1970-01-01
      • 2011-06-05
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多