我有一個運行perl腳本的csh腳本。該命令是爲什麼Grave Keys導致CSH將字符串解釋爲命令?
`./test.pl`
這將引發錯誤讀取
Hello: Command not found.
這個csh腳本不包含「你好」,但Perl腳本包含一行讀
print "Hello world!\n";
拆除墳墓鍵圍繞原始命令修復錯誤。到底是怎麼回事?
我有一個運行perl腳本的csh腳本。該命令是爲什麼Grave Keys導致CSH將字符串解釋爲命令?
`./test.pl`
這將引發錯誤讀取
Hello: Command not found.
這個csh腳本不包含「你好」,但Perl腳本包含一行讀
print "Hello world!\n";
拆除墳墓鍵圍繞原始命令修復錯誤。到底是怎麼回事?
因爲這就是他們應該做的。
從man csh
我的系統上(這是tcsh
的文檔):
命令替換
命令替換被封閉在``」的命令表示。來自這樣的 命令的輸出在空白處,製表符和換行符處分成單獨的單詞,並且丟棄空字 。輸出是可變的和命令替換,並放置在原始字符串的位置。雙引號內
命令替換(`「')保留空白和tab;只有換行 力新字的單個最終換行符並不強制在任何情況下一個新的字是 因此,有可能爲一個命令替換到。即使命令 輸出完整的一行
默認情況下,自版本6.12開始,shell將用空格替換命令中的所有換行符和回車符,如果通過取消設置csubstnonl ,換行符 照常單獨執行命令。
如果分配給Hello World!
的環境變量TEST
,然後
echo $TEST
$TEST
將是相同
echo 'Hello' 'World!'
'Hello' 'World!' # Fails: No program named Hello
因爲$TEST
被替換拆分版本的內容。這裏也一樣。
echo `./test.pl`
`./test.pl`
相同
echo 'Hello' 'World!'
'Hello' 'World!' # Fails: No program named Hello
我不關注。我認爲它分開了在後臺運行的過程? – DeepDeadpool
沒有。反引號的內容作爲shell命令執行(在前臺)。它的輸出被捕獲,反引號被輸出代替。然後執行帶有(現在替代的)反引號的命令。 – ikegami
@ user3263864,要在後臺啓動進程,請追加'&':'./test。pl&' – ikegami
你看到的一直是反引號,因爲至少是Bourne shell是在1977年〜創建是如何工作的。如果您不需要該功能,請不要使用它們。幾乎所有的shell都支持反引號來替換命令。祝你好運。 – shellter