【发布时间】:2019-01-24 16:00:59
【问题描述】:
我正在尝试使用 Perl6 对变量 $cmd 运行一系列 shell 命令,看起来像
databricks jobs run-now --job-id 35 --notebook-params '{"directory": "s3://bucket", "output": "s3://bucket/extension", "sampleID_to_canonical_id_map": "s3://somefile.csv"}'
- 将命令拆分为
notebook-params之后的所有内容
我的 $cmd0 = 'databricks 作业现在运行 --job-id 35 --notebook-params '; 我的 $args = "'{\"目录\": \"$in-dir\", \"输出\": \"$out-dir\", \"sampleID_to_canonical_id_map\": \"$map\"}'"; 我的 $run = run $cmd0, $args, :err, :out;
失败。 Databricks 或外壳都没有给出答案。 stdout 和 stderr 为空。
-
用空格分割整个命令
我的@cmd = $cmd.split(/\s+/); 我的 $run = 运行 $cmd, :err, :out
错误:得到了意外的额外参数(“s3://bucket”、“输出”: "s3://bucket/extension", “sampleID_to_canonical_id_map”: "s3://somefile.csv"}'
- 以字符串形式提交命令 我的 $cmd = "$cmd0\"$in-dir\", \"output\": \"$out-dir\", \"sampleID_to_canonical_id_map\": \"$map\"}'";
同样,stdout 和 stderr 是空的。退出代码 1。
这是关于 run 如何只能接受数组而不是字符串(我很好奇为什么)
如果我复制并粘贴给 Perl6 的 run 的命令,它在从 shell 给出时可以工作。通过 perl6 给出时它不起作用。这不好,因为我必须执行这个命令数百次。
也许 Perl6 的 shell https://docs.perl6.org/routine/shell 会更好?我没有使用它,因为手册建议run 更安全。我想在Proc 类中同时捕获标准输出和标准错误
编辑:我已经使用shell 运行此程序,但遇到了与我最初发布的内容无关的其他问题。我不确定这是否有资格被回答。我刚决定在 perl5 中使用反引号。是的,反引号已被弃用,但它们可以完成工作。
【问题讨论】:
-
你为什么在
/\s+/上分手?--notebook-params后面应该跟一个字符串,即''{"directory": "s3://bucket", "output": "s3://bucket/ext...'- 但其中包含空格。所以你在空间上的分裂是一个坏/奇怪的主意。您很可能希望通过使用shell $cmd来涉及 shell。 -
我不明白为什么应该将数组提交给
run而不是字符串的逻辑。这对我来说是 0 意义。你说的我试过了,还是不行。 -
您的简单化
split破坏了引用的参数'{"directory": ... .csv"}'。这需要在命令行上显示为 一个 参数,而不是多个。 -
@StefanBecker 我也试过了,但失败了
-
所以你告诉我你已经尝试过
my @cmd = ( 'databricks', 'jobs', 'run-now', '--job-id', '35', '--notebook-params', '{"dire... file.csv"}' );(即绕过拆分进行测试),但仍然失败?
标签: raku