2014-09-20 2 views
0

Я пытаюсь скомпилировать содержимое файла Sass (.scss), используя shell_exec или exec, неproc_open. Не спрашивайте меня, почему я просто не передаю сам файл или не использует proc_open, цель здесь - передать содержимое через stdin, с номером echo.Как мне избежать этой строки правильно?

Я думаю, что есть несколько символов в строке, которые прерывают команду, но я не могу понять, какой. Я на Ubuntu 14.04, работая с PHP 5.6 и в этом случае CLI.

Вы можете запустить, чтобы увидеть для себя (нужно будет рубин и Sass установлен):

Sudo APT-получить установку рубин & & Судо камень установить 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")); 
} 
+1

Вы должны действительно сообщить об ошибке здесь и где это происходит. – Brad

+0

Извините за потенциально немой комментарий, но для тройного, вам не нужен оператор сравнения для того, что вы пытаетесь сделать здесь? -> $ file = $ large? 'большой маленький'; // Должен быть $ file === $ large? 'большой маленький'; //правильно? –

+0

@TheOneandOnlyChemistryBlob, я на самом деле назначаю строку '$ file', которая будет либо« большой », либо« малой »в зависимости от правды' $ large' – rtheunissen

ответ

0

Я думаю, проблема в том, что команда была слишком длинной, когда я интерполировал всю строку ввода. Решение состоит в том, чтобы использовать proc_open или popen для записи на стандартный ввод, а не на трубу, используя |.

0

Вы должны попробовать:

$ esc = '$'. Escapeshellarg ($ input);

escapeshellarg() функция ускользает одиночные кавычки с обратной косой чертой, которая означает, что: escapeshellarg("//where's the quote") стать 'where\'s the quote'. Вы не можете эхо одинарные кавычки внутри одинарных кавычек в оболочке (bash), см.: How to escape a single quote in single quote string in Bash?

+0

Я уже использую 'escapeshellarg'. – rtheunissen

+0

положите знак доллара перед вашим результатом escapeshellarg и выгрузите его в shell_exec –

Смежные вопросы