我有以下代码:
$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
更新
似乎某些人不清楚我要做什么。我会解释。此脚本正在控制台中运行。同样的事情通过passthru工作(虽然Vim仍然警告输出)。我希望有一个交互式进程,允许用户在发送某个文件之前修改它。我不想实现自己的编辑器,这就是我希望他们使用vi的原因。 vi在我的服务器上可用(从我提供的输出中可以清楚看到)。
答案 0 :(得分:4)
我给了一个正确答案:http://webix.com/snippet/c01714d0
基本上,我必须使用$process->setTty(true)
。所以,完整的例子将是:
$process = new Process('vi');
try {
$process->setTty(true);
$process->mustRun(function ($type, $buffer) {
echo $buffer;
});
} catch (ProcessFailedException $e) {
echo $e->getMessage();
}
答案 1 :(得分:0)
顺便提一句,你的问题很有道理。
我的想法是:
所以也许试试:
const branchSchema = mongoose.Schema({ name: String });
const Company = mongoose.model('Company', mongoose.Schema({
name: String,
branches: [{type: mongoose.Schema.ObjectId, ref: 'Branch'}]
}));
使用/ tmp因为任何人都应该有权访问,也可以是可写的web文件夹。另一个想法是,使用sudo运行进程并指定用户vimrc:
$process = new Process('vi /tmp/temp.file');
但是你可能需要传递输入(比如sudo密码):
$process = new Process('sudo vim -u ~user/.vimrc /tmp/temp.file');
但是我不知道的是谁的密码。同样,我不确定哪个用户运行过程组件。
这些只是一些想法,我不确定它是否会解决任何问题,但我希望它可以帮助你,甚至帮助思考另一种方法来解决这个问题。
答案 2 :(得分:-2)
你为什么要这样做? vi是由键盘控制的东西。如果需要,您可能需要检查完整路径以及php / symfony是否可以访问此路径。可能你的php脚本无权访问这个脚本,并且可能不允许web服务器(我假设你在这里谈论的是一个web应用程序)在任何地方的服务器上启动登录shell。如果您能提供有关目标+环境的更多详细信息,那就太棒了。
如果您只想编辑/操作文件,可以选择sed命令。或者用php直接打开/操作文件可能会更好。