2016-12-07 87 views
1

執行的>>貝殼操作,我想從裏面朱莉婭追加一個文件中使用反引號從朱莉婭程序

run(`cat file2 >> file1`) 

但這不起作用。看起來>>操作符不能被正確解釋。有沒有辦法用管道或其他技巧來做到這一點?

+0

''>>是一個shell指令。朱莉婭的反引號並沒有啓動一個shell。這是預期的行爲。 –

+0

@Charles Duffy我可以使用Julia裏面的>>嗎?如果我把它分成'run(pipeline(\'cat file2 \',\'>> file1 \')'它也不起作用。(這可能是一個更好的例子)。 – ultradian

+0

你可以在我的回答中給出的精確方式使用它 - 在傳遞給顯式'sh -c'調用的腳本文本中。否則,您需要使用管道'stdout ='參數將輸出連接到'file1'。 –

回答

4

下面將運行一個字符串字面shell腳本,繞過安全裝置朱莉婭爲您設置:

script = "cat file2 >> file1" 
run(`sh -c $script`) 

假設file1file2是參數,下面是一個更安全的當量(不容易外殼注入攻擊,因爲它傳遞file1file2出帶從腳本文本):

script = "cat \"\$1\" >> \"\$2\"" 
source = "file1" 
dest = "file2" 
run(`sh -c $script _ $source $dest`) 

這傳遞_爲$ 0 file1作爲$1file2作爲$2


最後,爲了避免外殼完全,指定stdout=是你的文件句柄:

source = "file1" 
dest = "file2" 
run(pipeline(`cat $source`, stdout=open(dest, "a"))) 
+0

非常。我特別喜歡這個管道建議,但是想編輯它以使其運行(管道(\'cat file2 \',stdout = open(「file1」,「a」))'讓我做出這樣一個小小的改變。有沒有辦法做到這一點(迷戀)額外的清晰度? – ultradian

+0

編輯;謝謝。 –

+0

順便說一句 - 我非常同意@TasosPapastylianou,如果你真正的目標是附加到一個文件,而不是能夠正確地從Julia調用任意的shell代碼,更好的方法是使用原生的Julia基元;我現在有點責怪自己,因爲沒有仔細閱讀問題意圖 –

5

,如果你想在一般要做到這一點編程這不是從主要問題體清澈,或者只是試圖從茱莉亞REPL內部交互地發出一個shell命令 ......但是你的標題顯示它是後者; if就是這種情況*,您可以通過在REPL處輸入;併發出您的shell命令,進入shell模式

對於前一種情況,如果你必須追加使用run命令文件,然後使用內置pipeline機制提供了這個代替。閱讀幫助文件,你會看到一個可選的append參數可以提供。例如

run(pipeline(`cat file1`; stdout="file2", append=true)); 
# or even 
run(pipeline(`cat`; stdin="file1", stdout="file2", append=true)); 

說了這麼多,如果你一般編程這樣做,因爲所有你正在做的文件1是從中讀取,你應該只是閱讀和正常寫入文件,而不是和避免殼命令乾脆:

open("file1", "r") do f1; 
    open("file2", "a") do f2; write(f2, readstring(f1)); end 
end 

這是朱莉婭特定的,更安全的,獨立於平臺,更多的信息。


*:如果這的情況下,你可能需要編輯你的問題的標題:)

+0

我總體上是一致的,也就是說,就「更安全」而言 - 我的回答是否有任何地方沒有充分的預防措施,或者是對於以前未知的錯誤(至今尚未發現的殼蟲類似於shellshock,在Julia中引用未知的bug的可能性等等)? –

+0

感謝您的解決方案。你是正確的,原來的標題是誤導性的,並建議我只是想執行一個shell命令 - 所以我改變了標題。爲了完全展開,我一直在從Julia腳本中執行一套(編譯的C)程序,並習慣性地試圖通過另一個'run'語句繼續修改它們的輸入和輸出文件。解釋'>>'是@CharlesDuffy使用插值技巧解決的問題。作爲一個新手,我沒有考慮shell注入攻擊,也對任何潛在的bug /風險感興趣。 – ultradian

+0

@CharlesDuffy我沒有太具體的想法:)但是,你剛纔說的,是的,嘿。我的意思是,爲簡單的讀寫操作使用直接的本地功能通常比較安全,而不是爲錯誤/攻擊引入另一個入口點。無論如何,我只是覆蓋了所有的基礎,因爲這個問題似乎足以說明上面的任何一個:)(ultradian,謝謝澄清!) –