Я пытаюсь скомпилировать содержимое файла Sass (.scss), используя shell_exec
или же exec
, не proc_open
, Не спрашивайте меня, почему я не просто передаю сам файл или использую proc_open, цель здесь — передать содержимое через stdin, переданный по каналу echo
,
Я думаю, что в строке есть символы, которые нарушают команду, но я не могу понять, какие именно. Я на Ubuntu 14.04, работает PHP 5.6 и в этом случае CLI.
Вы можете запустить это, чтобы убедиться в этом (понадобятся Ruby и Sass):
sudo apt-get установить Ruby && sudo gem установить 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"));
}
Тебе стоит попробовать :
$ esc = ‘$’. escapeshellarg ($ input);
escapeshellarg()
Функция экранирует одинарные кавычки с обратной косой чертой, что означает, что:
escapeshellarg("//where's the quote")
становиться 'where\'s the quote'
, Вы не можете отображать одинарные кавычки внутри одинарных кавычек в (bash) оболочке, смотрите: Как избежать одиночной кавычки в строке одинарных кавычек в Bash?
Я думаю, что проблема была в том, что команда была слишком длинной, когда я интерполировал всю входную строку. Решение заключается в использовании proc_open
или же popen
записывать на стандартный ввод, а не на канал |
,