【问题标题】:Why does this shell script fail if I split it in two lines?如果我将它分成两行,为什么这个 shell 脚本会失败?
【发布时间】:2013-11-15 21:38:05
【问题描述】:

我很喜欢使用 shell,但我对 shell 脚本知之甚少。今天我发现了一个用于修复 node-webkit libudev.so.0 问题的小 shell 脚本:https://github.com/rogerwang/node-webkit/wiki/The-solution-of-lacking-libudev.so.0

如您所见,解决方案一指示创建一个包含以下代码的 shell 脚本:

LD_LIBRARY_PATH=/home/omi/nw:$LD_LIBRARY_PATH ./nw $*

我对正在发生的事情的理解如下:

1) 声明变量 LD_LIBRARY_PATH,并为其赋值,在这种情况下,它是 nw 目录的路径,我们之前在该目录中创建了指向 libudev.so.1 的符号链接。然后,将 $LD_LIBRARY_PATH 的先前值附加到新值。然后执行传递给 shell 脚本的参数的 nw 二进制文件。

正如预期的那样效果很好,但是如果我像这样将代码分成两行:

LD_LIBRARY_PATH=/home/omi/nw:$LD_LIBRARY_PATH
./nw $*

它不起作用。 shell 脚本执行没有任何错误,但 node-webkit 应用程序没有运行。相反,我们得到关于 libudev.so.0 丢失的错误。这是为什么呢?

此外,您添加的路径(在本例中为 /home/omi/nw)似乎可以是任何东西。我尝试使用 /home/、/home/akjfd/ 和其他变体,并且脚本始终按预期工作。这是为什么? (我终于把它留下了指向我创建符号链接的正确路径)

PS。有点跑题了,我发现在同一目录(Fedora 18 64 位中的 /lib64/)中创建指向 libudev.so.1 的符号链接并将其命名为 libudev.so.0 也可以,而无需创建 shell 脚本, 但我不建议这样做,因为你会污染 /lib64/ 目录,并且可能会导致系统出现问题。

【问题讨论】:

    标签: shell node-webkit


    【解决方案1】:

    以变量赋值为前缀的命令在修改后的环境中运行。

    LD_LIBRARY_PATH=/home/omi/nw:$LD_LIBRARY_PATH ./nw $*
    

    (大致)相当于

    OLD_PATH="$LD_LIBRARY_PATH"
    export LD_LIBRARY_PATH=/home/omi/nw:$LD_LIBRARY_PATH
    ./nw $*
    LD_LIBRARY_PATH="$OLD_LIBRARY_PATH"
    

    ./nwLD_LIBRARY_PATH 设置为给定值的环境中运行,但当前环境中没有任何更改。

    你的两行命令相当于

    LD_LIBRARY_PATH=/home/omi/nw:$LD_LIBRARY_PATH; ./nw $*
    

    (注意分号)。如果LD_LIBRARY_PATH 尚未标记为导出到环境,则它只是一个本地shell 变量,在运行时不会被./nw 继承。

    【讨论】:

    • 非常感谢。这为我澄清了一切:D
    【解决方案2】:

    这是你的第一个脚本:

    LD_LIBRARY_PATH=/home/omi/nw:$LD_LIBRARY_PATH ./nw $*
    

    该命令在子进程(运行nw)的环境中设置LD_LIBRARY_PATH

    这是你的第二个脚本:

    LD_LIBRARY_PATH=/home/omi/nw:$LD_LIBRARY_PATH
    ./nw $*
    

    该脚本设置LD_LIBRARY_PATH shell 变量。它不会修改任何进程的环境,除非 shell 正在导出 LD_LIBRARY_PATH,默认情况下不会发生这种情况。您需要使用export 命令要求shell 至少导出一次LD_LIBRARY_PATH 以实现此目的。示例:

    export LD_LIBRARY_PATH=/home/omi/nw:$LD_LIBRARY_PATH
    ./nw $*
    

    也可以不设置变量单独导出,像这样:

    LD_LIBRARY_PATH=/home/omi/nw:$LD_LIBRARY_PATH
    export LD_LIBRARY_PATH
    ./nw $*
    

    【讨论】:

    • 非常感谢您的解释。我让我明白了一切:D 我将另一个答案标记为我的答案,只是因为它显示得较早,但你的答案同样有效,而且很有帮助。
    猜你喜欢
    • 2021-05-02
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2022-01-05
    • 2020-03-12
    • 2010-12-16
    • 2020-07-15
    • 1970-01-01
    相关资源
    最近更新 更多