我尝试使用shell_exec
或exec
,不 proc_open
来编译Sass(.scss)文件的内容。不要问我为什么不直接传递文件或使用proc_open,这里的目标是通过stdin传递内容,用echo
传送。
我认为字符串中有一些字符会破坏命令,但我无法弄清楚哪个字符。我在Ubuntu 14.04上运行PHP 5.6,在这种情况下运行CLI。
你可以运行它来亲眼看看(需要安装Ruby和Sass):
sudo apt-get install Ruby&& sudo gem install sass
<?php
/** Should work with '$large = true' and '$download = false' **/
// to prove that a small file DOES compile via stdin
$large = true;
// to prove that it's compilable as a file, rather than stdin
$download = false;
$domain = "http://test.fhmp.net";
$file = $large ? 'large' : 'small';
// grab a valid .scss file
$input = file_get_contents("$domain/$file.scss");
if($download){
// create temp file
$temp = tempnam(sys_get_temp_dir(), '');
file_put_contents($temp, $input);
// compile temp file
var_dump(shell_exec("sass --scss '$temp' 2>&1"));
// delete temp file
@unlink($temp);
} else {
// attempt to escape it
$esc = escapeshellarg($input);
// dump the results of the shell call
var_dump(shell_exec("echo $esc | sass --scss --stdin 2>&1"));
}
答案 0 :(得分:0)
你应该尝试:
$ esc =&#39; $&#39; .escapeshellarg($ input);
escapeshellarg()
函数使用反斜杠转义单引号,这意味着:
escapeshellarg("//where's the quote")
成为'where\'s the quote'
。你不能在(bash)shell中的单引号内回显单引号,请参阅:How to escape a single quote in single quote string in Bash?
答案 1 :(得分:0)
我认为这里的问题是当我对整个输入字符串进行插值时,命令太长了。解决方案是使用proc_open
或popen
使用|
写入标准输入而不是管道。