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

Symfony Process component: argument substitution with 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: Unable to open file (/path/thumbs/video{1..353}.jpg) [No such file or directory].

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

我试着为它做了一个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();

它可以工作,但我想要一个比这更干净的代码。

有没有人知道如何改进它?提前致谢。

您可能已经猜到了,{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 代码以使用 -c "..." 选项与 bash 一起执行。