2012-01-24 82 views
1

這裏我有一個腳本在Linux中導出一些必要的路徑。運行這個腳本後,我必須運行一些其他腳本。這兩個用來運行shell腳本的命令有什麼區別?

我有兩個腳本

1 import.sh = importing paths 
2 main.sh = this script do something with HCI (use for Bluetooth purpose). 
當我運行 ./import.sh

,比./main.sh然後它給錯誤。 當我運行. ./import.sh,然後./main.sh然後它工作正常。

那麼./import.sh. ./import.sh之間的差異是什麼?

如果我作爲超級用戶運行腳本會發生什麼?可能是. ./用作超級用戶的運行腳本。

回答

4

兩個調用之間的區別是,./import.sh正在執行import.sh作爲一個程序,. ./import.sh在你的shell評測吧。

如果「import.sh」是ELF程序(編譯的二進制文件,而不是shell腳本),. ./import.sh將不起作用。

如果import.sh在頂部(如#!/bin/perl)有一個家當,你會在一個討厭的驚喜和錯誤消息的一個巨大的數字,如果你試圖做. ./import.sh - 除非發生認領以符合當前外殼,在這種情況下,它會意外地工作。或者,如果Perl代碼以某種方式成爲有效的Bash腳本,這似乎不大可能。

. ./import.sh相當於source import.sh,並且不需要該文件執行位設置(因爲它是由您已經運行shell來解釋,而不是通過exec生成)。我認爲這是你錯誤的根源。另一個區別是./import.sh在當前shell而不是子shell中運行,所以任何未導出的環境變量都將影響用於啓動的shell!

所以,他們實際上很不一樣。除非您知道自己在做什麼,並瞭解其差異,否則通常需要./import.sh

+0

但是。 ./import.sh在所有shell中的作用? – user1089679

0

./import.sh將腳本作爲普通腳本運行 - 即在子shell中運行。這意味着它不能以任何方式影響你的當前shell。它應該導入的路徑不會在您當前的shell中設置。

額外的.(相當於source)在當前shell的上下文中運行腳本 - 這意味着它可以修改當前shell中的環境變量等(如您嘗試設置的路徑) 。從bash man page

文件名 [參數]
文件名 [參數]
讀取和在當前shell環境從文件名執行命令並返回來自文件名最後執行的命令的退出狀態

+0

我想將此導出路徑腳本轉換爲C程序,所以我使用系統調用。並使用system()函數。但我也面臨這個問題。可能是system()會在當前shell中導出路徑嗎? – user1089679

1

./import.sh在新的子shell shell中執行shell腳本。

. ./import.sh在當前shell中執行shell腳本。
額外的.表示當前shell。

+0

我想將此導出路徑腳本轉換爲C程序,因此我使用系統調用。並使用system()函數。但我也面臨這個問題。可能是system()會在當前shell中導出路徑嗎? – user1089679

0

. ./import.sh「來源」的腳本,其中就像./import.sh只是執行它。

前者允許您修改當前環境,後者只會影響子執行中的環境。

前者也相當於(雖然擊特異性主要):

source ./import.sh 

help source收率:

source: source filename [arguments]

從文件中的當前殼執行命令。

從當前shell中的FILENAME讀取並執行命令。 $ PATH中的 條目用於查找包含FILENAME的目錄。 如果提供了任何自變量,則當執行FILENAME時,它們成爲位置參數 。

退出狀態: 返回在FILENAME中執行的最後一個命令的狀態;如果 無法讀取FILENAME,則失敗。

+0

我手動執行命令終端輸出比我執行我的主藍牙ON命令後,但仍然面臨問題。爲什麼這件事發生? – user1089679