2009-02-06 158 views
6

有人可以幫助解釋如下:的Bash腳本 - shell命令輸出重定向

如果鍵入:

a=`ls -l` 

然後ls命令的輸出保存在變量a

但如果我嘗試:

a=`sh ./somefile` 

結果輸出到shell(stdout)而不是變量a

我期望的是shell試圖執行腳本'somefile'的結果操作存儲在變量中。

請指出我的理解有什麼問題以及可能的解決方法。

謝謝。

編輯:

只是爲了澄清,劇本 'somefile' 可能會或可能不存在。如果存在,那麼我希望腳本的輸出存儲在'a'中。如果不是,我想要在'a'中存儲錯誤消息「no such file or dir」

回答

15

我認爲shell可能會附加到/ dev/tty,但我可能是錯的。你爲什麼不只是設置執行的腳本的權限和使用:如果你想捕捉標準錯誤標準輸出的,只是使用

a=`./somefile` 

a=`./somefile 2>&1` 

要檢查文件是可執行文件第一個:

if [[ -x ./somefile ]] ; then 
    a=$(./somefile 2>&1) 
else 
    a="Couldn't find the darned thing." 
fi 

並且您會注意到我切換到$()方法而不是反引號。我更喜歡$(),因爲你可以嵌套它們(例如,「a=$(expr 1 + $(expr 2 + 3))」)。

+0

它不是關於權限...我想要將錯誤消息或返回值存儲在變量中。 – 2009-02-06 07:37:27

+0

我在說的是,你不需要運行sh來運行腳本(如果你這樣做,sh會在輸出上加上自己的防火牆)。只需直接運行腳本,爲此,您需要'chmod + x'它。 – paxdiablo 2009-02-06 07:41:54

+0

請嘗試以下操作:「chmod u + x somefile; a =`。/ somefile`「,然後看看設置的是什麼 – paxdiablo 2009-02-06 07:44:10

5

您可以嘗試新的和改進的命令替換方法,使用$()而不是反引號。

a=$(sh ./somefile) 

如果還是不行,請檢查是否somefile實際上不是標準錯誤「荷蘭國際集團。

2

您是對的,./somefile的標準輸出存儲在變量a中。不過,我假設某些文件輸出爲stderr。您可以在./somefile之後直接通過2>&1重定向。