Невозможно запустить сценарий оболочки с полными разрешениями (UNIX) - PullRequest
3 голосов
/ 11 февраля 2011

У меня есть сценарий оболочки, который создается внутри сценария php (с полными разрешениями). Когда я пытаюсь запустить скрипт оболочки из терминала, я не получаю ошибок, но скрипт не запускается (ни одна из команд не выполняется). Хотя, как только я копирую содержимое сценария оболочки, вставляю его в новый файл в XCode и перезаписываю старый сценарий оболочки, он работает правильно.

Есть предложения? Я пытался понять это в течение очень долгого времени без какого-либо прогресса.

Я предполагаю, что существует проблема с написанием сценария оболочки из сценария php, поскольку он работает при написании в XCode или текстовом редакторе.

Вот скрипт php, который пишет скрипт оболочки:

<code>
    $filePath = "/Applications/MAMP/htdocs/php/Batch/modulator/Release23/Library/irShell.sh";
    $script = fopen($filePath, 'w+');
    chmod($filePath, 0777);
    fwrite($script,"#!/bin/sh");
    $irPath = "/Applications/MAMP/htdocs/php/Batch/modulator/Release23/Library"; //path to .ir files
    $modPath = "/Applications/MAMP/htdocs/php/Batch/modulator";

    if($dir = opendir($irPath)){        
        while(($file = readdir($dir)) !== false){
            $posA = strpos($file, ".IR");
            $posB = strpos($file, ".ir");
            $posC = strpos($file, ".Ir");
            if ($posA == true){
                $fileName = trim($file, ".IR");
                $noT = substr_replace($fileName, "", 0, 1);
                echo "$noT\n";
                fwrite($script, "\r" . $modPath . "/mod -o " . $irPath . "/codes/" . $noT . " " . $fileName . ".IR"); 
            }
            else if ($posB == true){
                $fileName = trim($file, ".ir");
                $noT = substr_replace($fileName, "", 0, 1);
                echo "$noT\n";
                fwrite($script, "\r" . $modPath . "/mod -o " . $irPath . "/codes/" . $noT . " " . $fileName . ".ir");
            }
            else if ($posC == true){
                $fileName = trim($file, ".Ir");
                $noT = substr_replace($fileName, "", 0, 1);
                echo "$noT\n";
                fwrite($script, "\r" . $modPath . "./mod -o " . $irPath . "/codes/" . $noT . " " . $fileName . ".Ir");
            }
        }
    }
</code>

А вот пример сценария оболочки, сгенерированного этим php:

#!/bin/sh</p> <pre><code>/Applications/MAMP/htdocs/php/Batch/modulator/mod -o /Applications/MAMP/htdocs/php/Batch/modulator/Release23/Library/codes/1294 T1294.ir /Applications/MAMP/htdocs/php/Batch/modulator/mod -o /Applications/MAMP/htdocs/php/Batch/modulator/Release23/Library/codes/1295 T1295.ir /Applications/MAMP/htdocs/php/Batch/modulator/mod -o /Applications/MAMP/htdocs/php/Batch/modulator/Release23/Library/codes/1296 T1296.ir

1 Ответ

4 голосов
/ 11 февраля 2011

Измените все \r в ваших fwrite инструкциях на \n и переместите их в конец (или добавьте окончательный fwrite($script, "\n"); в конце прямо перед закрытием файла (я не вижу fclose(), кстати).

fwrite($script,"#!/bin/sh" . "\n");
...
fwrite($script, $modPath . "/mod -o " . $irPath . "/codes/" . $noT . " " . $fileName . ".IR" . "\n");
...
fclose($script);

или

fwrite($script,"#!/bin/sh");
...
fwrite($script, "\n" . $modPath . "/mod -o " . $irPath . "/codes/" . $noT . " " . $fileName . ".IR" . "\n");
...
fwrite($script, "\n");
fclose($script);

В сценариях оболочки должны быть новые строки для окончаний строк, а не возврат каретки.

...