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
一起执行。
这是一个代码:
$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
一起执行。