我很习惯使用shell,但我对shell脚本的了解不多。今天我想了解一个小的shell脚本来修复node-webkit libudev.so.0问题: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,并为其赋值,在这种情况下,它是我们之前为libudev.so.1创建符号链接的nw目录的路径。然后,将$ 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 /和其他变体,脚本始终按预期工作。这是为什么? (我最后用正确的路径指向我创建符号链接的位置)
PS。有点偏离主题,我发现在相同的目录(/ lib64 /在Fedora 18 64bit中)创建一个符号链接到libudev.so.1并调用它libudev.so.0也可以工作,而无需创建shell脚本,但我不推荐它,因为你会污染/ lib64 /目录,它可能会导致你的系统出现问题。
答案 0 :(得分:3)
以变量赋值为前缀的命令在修改后的环境中运行。
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"
./nw
在LD_LIBRARY_PATH
设置为给定值的环境中运行,但当前环境中没有任何内容发生更改。
您的双行命令相当于
LD_LIBRARY_PATH=/home/omi/nw:$LD_LIBRARY_PATH; ./nw $*
(注意分号)。如果LD_LIBRARY_PATH
尚未标记为导出到环境,则它只是一个本地shell变量,并且在./nw
运行时不会继承。
答案 1 :(得分:2)
这是你的第一个脚本:
LD_LIBRARY_PATH=/home/omi/nw:$LD_LIBRARY_PATH ./nw $*
该命令在子进程的环境中设置LD_LIBRARY_PATH
(运行nw
)。
这是你的第二个剧本:
LD_LIBRARY_PATH=/home/omi/nw:$LD_LIBRARY_PATH
./nw $*
该脚本设置LD_LIBRARY_PATH
shell变量。它不会修改任何进程的环境,除非shell正在导出LD_LIBRARY_PATH
,这在默认情况下不会发生。您需要使用LD_LIBRARY_PATH
命令要求shell至少导出一次export
以实现此目的。例如:
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 $*