執行的>>貝殼操作,我想從裏面朱莉婭追加一個文件中使用反引號從朱莉婭程序
run(`cat file2 >> file1`)
但這不起作用。看起來>>操作符不能被正確解釋。有沒有辦法用管道或其他技巧來做到這一點?
執行的>>貝殼操作,我想從裏面朱莉婭追加一個文件中使用反引號從朱莉婭程序
run(`cat file2 >> file1`)
但這不起作用。看起來>>操作符不能被正確解釋。有沒有辦法用管道或其他技巧來做到這一點?
下面將運行一個字符串字面shell腳本,繞過安全裝置朱莉婭爲您設置:
script = "cat file2 >> file1"
run(`sh -c $script`)
假設file1
和file2
是參數,下面是一個更安全的當量(不容易外殼注入攻擊,因爲它傳遞file1
和file2
出帶從腳本文本):
script = "cat \"\$1\" >> \"\$2\""
source = "file1"
dest = "file2"
run(`sh -c $script _ $source $dest`)
這傳遞_
爲$ 0 file1
作爲$1
和file2
作爲$2
。
最後,爲了避免外殼完全,指定stdout=
是你的文件句柄:
source = "file1"
dest = "file2"
run(pipeline(`cat $source`, stdout=open(dest, "a")))
非常。我特別喜歡這個管道建議,但是想編輯它以使其運行(管道(\'cat file2 \',stdout = open(「file1」,「a」))'讓我做出這樣一個小小的改變。有沒有辦法做到這一點(迷戀)額外的清晰度? – ultradian
編輯;謝謝。 –
順便說一句 - 我非常同意@TasosPapastylianou,如果你真正的目標是附加到一個文件,而不是能夠正確地從Julia調用任意的shell代碼,更好的方法是使用原生的Julia基元;我現在有點責怪自己,因爲沒有仔細閱讀問題意圖 –
,如果你想在一般要做到這一點編程這不是從主要問題體清澈,或者只是試圖從茱莉亞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
這是朱莉婭特定的,更安全的,獨立於平臺,和更多的信息。
我總體上是一致的,也就是說,就「更安全」而言 - 我的回答是否有任何地方沒有充分的預防措施,或者是對於以前未知的錯誤(至今尚未發現的殼蟲類似於shellshock,在Julia中引用未知的bug的可能性等等)? –
感謝您的解決方案。你是正確的,原來的標題是誤導性的,並建議我只是想執行一個shell命令 - 所以我改變了標題。爲了完全展開,我一直在從Julia腳本中執行一套(編譯的C)程序,並習慣性地試圖通過另一個'run'語句繼續修改它們的輸入和輸出文件。解釋'>>'是@CharlesDuffy使用插值技巧解決的問題。作爲一個新手,我沒有考慮shell注入攻擊,也對任何潛在的bug /風險感興趣。 – ultradian
@CharlesDuffy我沒有太具體的想法:)但是,你剛纔說的,是的,嘿。我的意思是,爲簡單的讀寫操作使用直接的本地功能通常比較安全,而不是爲錯誤/攻擊引入另一個入口點。無論如何,我只是覆蓋了所有的基礎,因爲這個問題似乎足以說明上面的任何一個:)(ultradian,謝謝澄清!) –
''>>是一個shell指令。朱莉婭的反引號並沒有啓動一個shell。這是預期的行爲。 –
@Charles Duffy我可以使用Julia裏面的>>嗎?如果我把它分成'run(pipeline(\'cat file2 \',\'>> file1 \')'它也不起作用。(這可能是一個更好的例子)。 – ultradian
你可以在我的回答中給出的精確方式使用它 - 在傳遞給顯式'sh -c'調用的腳本文本中。否則,您需要使用管道'stdout ='參數將輸出連接到'file1'。 –