Symfony Process组件:用大括号替换参数

时间:2016-11-28 19:25:48

标签: bash symfony substitution curly-braces

这是一段代码:

$cmd_make_sprite = '/usr/bin/gm convert /path/thumbs/video{1..353}.jpg -append /path/thumbs/sprite.jpg';

$process = new Process($cmd_make_sprite);
$process->run();
echo $process->getErrorOutput();

当我运行此代码段时,我看到了这个输出:

  

/ usr / bin / gm convert:无法打开文件   (/path/thumbs/video{1..353}.jpg)[没有这样的文件或目录]。

我认为这是因为video{1..353}.jpg替换不起作用,Symfony Process构建器将其视为常规文件名,当然不存在。

我尝试为它制作sprite_wrapper.sh

#!/bin/bash

$@

并像这样使用它:

$cmd_make_sprite = 'bash sprite_wrapper.sh /usr/bin/gm convert /path/thumbs/video{1..353}.jpg -append /path/thumbs/sprite.jpg';

$process = new Process($cmd_make_sprite);
$process->run();
echo $process->getErrorOutput();

并且它有效,但我希望有一个比这更清晰的代码。

有没有人有一些想法如何改善它?提前谢谢。

1 个答案:

答案 0 :(得分:2)

正如您可能已经猜到的那样,{x..y}语法仅适用于Bash。 但Process的默认shell通常为/bin/sh, 这可能不是Bash。这就是为什么你的第一次尝试没有成功的原因。

中间人sprite_wrapper.sh真的很难看, 并且不必要。你可以这样写:

$cmd_make_sprite = 'bash -c "/usr/bin/gm convert /path/thumbs/video{1..353}.jpg -append /path/thumbs/sprite.jpg"';

也就是说,您可以使用bash选项将Bash代码传递给-c "..."执行。