我试图使用反引号从Julia中追加一个文件
run(`cat file2 >> file1`)
但这不起作用。看来>>运算符无法正确解释。有没有办法用管道或其他技巧来做到这一点?
答案 0 :(得分:5)
主要问题机构不清楚您是否尝试以编程方式一般执行此操作,或者只是尝试从julia中以交互方式发出shell命令 REPL ......但你的标题表明它是后者; if 就是这种情况*,只需在REPL键入;
并发出shell命令即可进入 shell模式。
对于前一种情况,如果必须使用run
命令附加到文件,则使用为此提供的内置pipeline
机制。阅读帮助文件,您将看到可以提供可选的append
参数。 e.g。
run(pipeline(`cat file1`; stdout="file2", append=true));
# or even
run(pipeline(`cat`; stdin="file1", stdout="file2", append=true));
话虽如此,如果 通常以编程方式执行此操作,因为您从文件1中读取的所有操作都可以从中读取,您应该只是正常地读取和写入文件,并完全避免shell命令:
open("file1", "r") do f1;
open("file2", "a") do f2; write(f2, readstring(f1)); end
end
这是julia特定的,更安全,独立于平台,和更具信息性。
<小时/> *:如果 不 ,则可能需要修改问题的标题:)
答案 1 :(得分:3)
以下将运行一个字符串作为文字shell脚本,绕过Julia为您设置的安全程序:
script = "cat file2 >> file1"
run(`sh -c $script`)
假设参数化了file1
和file2
,以下是更安全的等价物(不容易发生shell注入攻击,因为它传递file1
和file2
-ab from script text):
script = "cat \"\$1\" >> \"\$2\""
source = "file1"
dest = "file2"
run(`sh -c $script _ $source $dest`)
这会将_
传递为$ 0,将file1
传递为$1
,将file2
传递为$2
。
最后,要完全避免使用shell,请指定stdout=
作为文件句柄:
source = "file1"
dest = "file2"
run(pipeline(`cat $source`, stdout=open(dest, "a")))