2013-11-15 40 views
2

我非常適合使用shell,但我對shell腳本知之甚少。今天我碰到一個微小的shell腳本凸輪用於固定節點的webkit libudev.so.0問題:https://github.com/rogerwang/node-webkit/wiki/The-solution-of-lacking-libudev.so.0如果我將它分成兩行,爲什麼這個shell腳本失敗?

正如你可以看到,解決一個指示它來創建下面的代碼一個shell腳本:

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

我的正在發生的事情是以下幾點認識:

1)聲明變量LD_LIBRARY_PATH,和值分配給它,在這種情況下,它是通向我們先前創建的符號鏈接西北目錄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。有一點不在話題中,我發現在同一目錄(/ lib64/in Fedora 18 64bit)中創建與libudev.so.1的符號鏈接,並將其稱爲libudev.so.0,而無需創建shell腳本,但我不會推薦它,因爲你會污染/ lib64 /目錄,並且它可能會導致系統出現問題。

回答

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

+0

非常感謝。這爲我澄清了一切:D – Buzu

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_PATHshell變量。它不會修改任何進程的環境,除非shell正在導出LD_LIBRARY_PATH,這在默認情況下不會發生。您需要使用命令export命令要求外殼至少導出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 $* 
+0

非常感謝您的解釋。我對所有事情都表示清楚:D我將其他答案標記爲我的答案,僅僅是因爲它顯示的更早,但是你的答案同樣有效,而且很有幫助。 – Buzu