执行>&燃气轮机;Julia程序中的shell运算符

执行>&燃气轮机;Julia程序中的shell运算符,shell,julia,Shell,Julia,我正试图使用backticks从Julia内部附加一个文件 run(`cat file2 >> file1`) 但这不起作用。似乎无法正确解释>>运算符。有什么方法可以通过管道或其他技巧实现这一点吗?以下内容将以文本shell脚本的形式运行字符串,从而绕过Julia为您设置的安全性: script = "cat file2 >> file1" run(`sh -c $script`) 假设file1和file2是参数化的,以下是一个更安全的等价物(不容易受到shell

我正试图使用backticks从Julia内部附加一个文件

run(`cat file2 >> file1`)

但这不起作用。似乎无法正确解释>>运算符。有什么方法可以通过管道或其他技巧实现这一点吗?

以下内容将以文本shell脚本的形式运行字符串,从而绕过Julia为您设置的安全性:

script = "cat file2 >> file1"
run(`sh -c $script`)
假设
file1
file2
是参数化的,以下是一个更安全的等价物(不容易受到shell注入攻击,因为它从脚本文本带外传递
file1
file2
):

这将
作为$0传递,
file1
作为
$1
传递,
file2
作为
$2
传递


最后,为了完全避免使用shell,请指定
stdout=
作为文件句柄:

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

从主要问题主体来看,还不清楚您通常是试图以编程方式执行此操作,还是只是试图从julia REPL中以交互方式发出shell命令。。。但你的头衔表明是后者如果是这样*,只需键入
,即可进入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));
话虽如此,如果您通常是以编程方式执行此操作,因为您对file1所做的所有操作都是从中读取的,那么您可能只需要正常地对文件进行读写操作,并且完全避免使用shell命令:

open("file1", "r") do f1; 
  open("file2", "a") do f2; write(f2, readstring(f1)); end
end
这是特定的、更安全的、独立于平台的、信息量更大的



*:如果情况并非如此,您可能需要编辑问题的标题:)

>
是shell指令。茱莉亚的背虱不会起壳来。这就是预期的行为。@Charles Duffy我可以从Julia的内部使用>>吗?如果我把它分成
run(管道(`cat file2`,`>>file1`))
它也不起作用(这可能是一个更好的例子)。您可以按照我的回答中给出的精确方式使用它——在传递给显式
sh-c
调用的脚本文本中。否则,您需要使用管道
stdout=
参数将输出连接到
file1
。非常彻底。我特别喜欢管道建议,但希望对其进行编辑以使其运行
(pipeline(`cat file2`,stdout=open(“file1”,“a”))
(这确实有效),但系统不允许我做这么小的更改。有什么方法可以做一点(强迫性的)更清晰?顺便说一句——我非常同意@TasoSpapStylianou的观点,如果你的真正目标是附加到一个文件,而不是能够正确调用Julia的任意shell代码,更好的方法是使用原生Julia原语;我现在有点怪我自己没有仔细阅读这个问题的意图。我是g大体上是一致的。也就是说,关于“更安全”——我的答案是否有任何地方没有采取足够的预防措施,或者是关于以前未知的bug(类似于shellshock的尚未发现的shell bug,Julia中未知引用bug的可能性等等)?也谢谢你的解决方案。你是对的,原来的标题有误导性,暗示我只是想执行一个shell命令-所以我更改了标题。为了完全展开,我一直在执行一套(编译的C)来自Julia脚本的程序,习惯性地试图通过另一个
run
语句继续修改其输入和输出文件。解释
>
是@CharlesDuffy使用插值技巧解决的一个问题。作为一个新手,我没有想到shell注入攻击,也对任何潜在的bug感兴趣s/风险。@CharlesDuffy我脑子里没有太具体的东西:)但是,正如你刚才所说,是的,嘿嘿。我只是想说,在简单的读/写操作中使用简单的本机功能通常更安全,而不是引入另一个bug/攻击的入口点。无论如何,我只是涵盖了所有的基础,因为这个问题似乎足够普遍,可以指上述任何一个:)(奥特莉迪亚,谢谢你的澄清!)
open("file1", "r") do f1; 
  open("file2", "a") do f2; write(f2, readstring(f1)); end
end