shell - 如果我将这个 shell 脚本分成两行,为什么它会失败?

标签 shell node-webkit

我使用 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 的符号链接(symbolic link)。然后,将 $LD_LIBRARY_PATH 的先前值附加到新值。然后执行 nw 二进制文件,传递传递给 shell 脚本的参数。

这工作得很好,正如预期的那样,但是如果我将代码分成两行,如下所示:

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

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

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

PS。有点偏离主题,我发现在同一目录(Fedora 18 64 位中的/lib64/)中创建 libudev.so.1 的符号链接(symbolic link)并调用它 libudev.so.0 也可以工作,而无需创建 shell 脚本,但我不推荐它,因为你会污染/lib64/目录,并且可能会导致你的系统出现问题。

最佳答案

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

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 继承。

关于shell - 如果我将这个 shell 脚本分成两行,为什么它会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20011053/

相关文章:

amazon-web-services - AWS 在创建 Alexa 技能时无法创建和更新堆栈(主动事件 API)

c++ - 众所周知的虚拟文件夹 GUID 是什么?

linux - 如何在 linux 中使用 xmlstarlet 从 xml 中获取值

javascript - 禁用浏览器页面中的 PDF 加载

javascript - 第一次找不到模块

mongodb - 在 Mongo shell 中多行编辑一行

macos - 如何在 macOS 上的 Sublime Text 中在同一窗口中打开文件和文件夹?

javascript - 在 Node webkit 桌面应用程序中实现 View

node.js - 当应用程序重新启动时,NEDB 正在清除文件内容

node.js - 检查 WebKit 上下文何时在 NW.js 中可用