2016-08-04 3 views
6

У меня есть следующий код:Как запустить vi из Symfony Process?

 
     $process = new Process('vi'); 

     try { 
      $process->setPty(true); 
      $process->mustRun(function ($type, $buffer) { 
       echo $buffer; 
      }); 
      //echo $process->getOutput(); 
     } catch (ProcessFailedException $e) { 
      echo $e->getMessage(); 
     } 

Однако, он умирает для меня со следующей информацией:

 
The command "vi" failed. 

Exit Code: 1(General error) 

Working directory: [path] 

Output: 
================ 
Vim: Error reading input, exiting... 
Vim: Finished. 


Error Output: 
================ 
Vim: Warning: Output is not to a terminal 
Vim: Warning: Input is not from a terminal 

UPDATE

Кажется, это было не ясно, для некоторых людей, что я Я собираюсь сделать. Я объясню. Этот скрипт запускается в консоли. То же самое работает через passthru (хотя Vim все еще предупреждает о выходе). Я хочу иметь интерактивный процесс, который позволит пользователям модифицировать некоторый файл перед его отправкой куда-нибудь. Я не хочу реализовывать свой собственный редактор, поэтому я хочу, чтобы они использовали vi. vi доступен на моем сервере (это ясно видно из предоставленного мной вывода).

+1

Ну, вы уверены, что можете выполнить vi через php? (По крайней мере, если вы говорите об текстовом редакторе linux) – Epodax

+0

Я уверен. Его можно выполнить с помощью passthru(). Моя цель - запустить интерактивный процесс, в котором пользователю будет предоставлена ​​возможность изменить файл, который будет отправлен где-то после его модификации. –

ответ

4

Здесь я был дан правильный ответ: https://github.com/symfony/symfony/issues/19528

В принципе, я должен был использовать $process->setTty(true).Итак, полный пример будет:

$process = new Process('vi'); 

    try { 
     $process->setTty(true); 
     $process->mustRun(function ($type, $buffer) { 
      echo $buffer; 
     }); 
    } catch (ProcessFailedException $e) { 
     echo $e->getMessage(); 
    } 
-2

Зачем вам это нужно? vi - это то, что контролируется клавиатурой. Если вам это нужно, вам может потребоваться проверить полный путь, и если php/symfony имеет доступ к этому пути. Вероятно, ваш php-скрипт не имеет доступа к этому скрипту, и веб-сервер (предположим, вы говорите о веб-приложении здесь), возможно, не будет разрешено запускать оболочку входа на сервере в любом месте. Было бы здорово, если бы вы могли предоставить более подробную информацию о своей цели + окружении.

Если вы просто хотите отредактировать/обработать файл, команда sed может быть вариантом. Или открыть/манипулировать файлом напрямую с помощью php может быть даже лучше.

+0

Моя цель - запустить интерактивный консольный процесс, в котором пользователю будет предоставлена ​​возможность изменить файл, который будет отправлен где-то после его модификаций. И у меня нет веб-сервера вообще. PHP имеет доступ к vi (точно, как работает passthru). Разрешено запускать оболочку входа, так как я запускаю ее с консоли. –

+1

@DenisV Возможно, вы захотите проверить, существует ли переменная окружения 'EDITOR', и использовать ее, если она установлена. Таким образом, если пользователь настроил свой редактор cli по умолчанию как 'nano',' emacs', 'vi',' vim', 'neovim' или что-то еще, он будет работать. Если 'EDITOR' не установлен, вы можете, конечно, предположить, что у них есть' vi' по умолчанию. – Paulpro

+0

@Paulpro да, спасибо за ваш совет. На самом деле, это было следующим, что я собирался сделать, но без возможности запуска 'vi', это не имело смысла. В любом случае, благодарю Вас. :) –

0

Ваш вопрос имеет полный смысл, кстати ..

Мои мысли:

  • Вы получаете код возврата: 1 -> Что означает имя файла для редактирования не был указан , Хотя я могу ошибаться.
  • Он показывает «Рабочий каталог: [путь]». Что говорит мне, может быть, путь отсутствует.
  • Кроме того, я не знаю, какой пользователь (в системе) запускает компонент Symfony Process.

Так может быть, попробовать:

$process = new Process('vi /tmp/temp.file'); 

Используйте/TMP, потому что каждый должен иметь доступ, а также возможные веб-папку, которая доступна для записи. Еще одна мысль, чтобы запустить процесс с Судом и указать пользователя vimrc:

$process = new Process('sudo vim -u ~user/.vimrc /tmp/temp.file'); 

Но тогда вам, возможно, потребуется пройти ввод (как SUDO пароль):

$process->setInput('someSudoPassword'); 

Но кто пароль SUDO я не Не знаю. Опять же, я не уверен, какой пользователь запускает компонент Process.

Это лишь некоторые мысли, и я не уверен, что он решает что-либо, но я надеюсь, что это может помочь вам или даже поможет подумать о другом способе справиться с этим.

+0

Благодарим вас за ответ. 'vi' может быть запущен без указания пути или имени файла. '[path]' здесь был только мой локальный каталог, который не имел отношения к вопросу, поэтому я пропустил его. Я также пробовал это под root, поэтому 'sudo' здесь не так. –

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