2013-09-27 308 views
0

我對shell腳本不太瞭解。我想修改一個腳本,但它給了我錯誤「沒有這樣的文件或目錄」我改變它之後。命令從命令行運行,但不能從shell腳本運行

但是該命令在命令提示符下工作。

這是引起問題的線。 (甚至不知道如何以下命令生成一個進程。)如果我運行命令

$valgrind ---tool=memcheck --trace-children=yes command 

任何想法

_T_COMMAND_=1 "valgrind ---tool=memcheck --trace-children=yes command" 

同樣事情的作品?

+0

要執行命令,您需要執行'var = $(command)'。因此,你需要'_T_COMMAND _ = $(valgrind --- tool = memcheck -trace-children = yes命令)' – fedorqui

+0

,但它正在使用_T_COMMAND_ = 1「命令」。我已修改爲_T_COMMAND_ = 1「valgrind ---工具= memcheck -trace-children = yes命令」 – Sach

+1

調整腳本更改...修正了cpp代碼更改的問題,並將valgrind添加到特定的子進程中! – Sach

回答

2

請勿將該命令放在雙引號中。

_T_COMMAND_=1 valgrind ---tool=memcheck --trace-children=yes command 

一般語法簡單地

[var=value ...] cmd [args] 

這將設置爲value環境變量varcmd的持續時間。您可以通過這種方式設置多個變量。

或者,設置變量和export它;那麼它將在當前shell的剩餘時間內保持設置,並且暴露給子進程(這就是export所做的)。

_T_COMMAND_=1 
export _T_COMMAND_ 
valgrind ---tool=memcheck --trace-children=yes command 

同樣,valgrind處理其選項,然後運行指定command(帶任何選項)作爲子進程。

雙引號中的單個命令是無害的,因爲shell在內核看到參數之前會剝去引號。包含雙引號空格的字符串將保留爲單個參數,而不帶引號時,它將成爲多個參數。看哪:

bash$ perl -le 'print "<<$_>>" for @ARGV' "foo bar" baz quux 
<<foo bar>> 
<<baz>> 
<<quux>> 

或者一樣好,加上週圍的一切無害的,但毫無疑問相當混亂雙引號這是不是已經引述:

bash$ "perl" "-le" 'print "<<$_>>" for @ARGV' "yowza" 
<<yowza>> 

殼解析成

<<perl>> 
<<-le>> 
<<print "<<$_>>" for @ARGV>> 
<<yowza>> 

並刪除進程中的(外部)引號。