执行>>来自Julia程序的shell运算符

时间:2016-12-07 05:56:39

标签: shell julia

我试图使用反引号从Julia中追加一个文件

run(`cat file2 >> file1`)

但这不起作用。看来>>运算符无法正确解释。有没有办法用管道或其他技巧来做到这一点?

2 个答案:

答案 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`)

假设参数化了file1file2,以下是更安全的等价物(不容易发生shell注入攻击,因为它传递file1file2 -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")))