是否可以从node.js中执行外部程序?是否有相当于Python os.system()或任何添加此功能的库?
我正在尝试使用以下命令从PHP运行Python脚本:
exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
但是,PHP根本不会产生任何输出.错误报告设置为E_ALL并且display_errors已启用.
这是我尝试过的:
python2,/usr/bin/python2而python2.7不是/usr/bin/python2.7exec,shell_exec,system.但是,如果我跑
if (exec('echo TEST') == 'TEST')
{
echo 'exec works!';
}
Run Code Online (Sandbox Code Playgroud)
它完美无缺,shutdown now而且什么都不做.
PHP具有访问和执行文件的权限.
编辑:感谢亚历杭德罗,我能够解决问题.如果您遇到同样的问题,请不要忘记您的网络服务器可能/希望不会以root用户身份运行.尝试以您的网络服务器用户或具有类似权限的用户身份登录,并尝试自行运行命令.
请考虑以下代码:
String commandf = "ls /etc | grep release";
try {
// Execute the command and wait for it to complete
Process child = Runtime.getRuntime().exec(commandf);
child.waitFor();
// Print the first 16 bytes of its output
InputStream i = child.getInputStream();
byte[] b = new byte[16];
i.read(b, 0, b.length);
System.out.println(new String(b));
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
Run Code Online (Sandbox Code Playgroud)
该程序的输出是:
/etc:
adduser.co
Run Code Online (Sandbox Code Playgroud)
当我从shell运行时,它当然按预期工作:
poundifdef@parker:~/rabbit_test$ ls /etc | grep release
lsb-release
Run Code Online (Sandbox Code Playgroud)
互联网告诉我,由于管道行为不是跨平台的事实,在Java工厂生产Java的杰出人才无法保证管道工作.
我怎样才能做到这一点?
我不会做所有使用Java构建,而不是我的解析grep和sed,因为如果我想改变的语言,我将被迫在语言,这完全是一个没有去重新写我的解析代码.
在调用shell命令时如何让Java进行管道和重定向?
我想知道到底是什么{} \;和{} \+和| xargs ...做的.请用解释澄清这些.
以下3个命令运行并输出相同的结果,但第一个命令需要一点时间,格式也略有不同.
find . -type f -exec file {} \;
find . -type f -exec file {} \+
find . -type f | xargs file
Run Code Online (Sandbox Code Playgroud)
这是因为第一个file为来自命令的每个文件运行find命令.所以,基本上它运行如下:
file file1.txt
file file2.txt
Run Code Online (Sandbox Code Playgroud)
但后两个-exec命令运行文件命令一次为所有文件,如下所示:
file file1.txt file2.txt
Run Code Online (Sandbox Code Playgroud)
然后我运行以下命令,第一个运行没有问题,但第二个给出错误消息.
find . -type f -iname '*.cpp' -exec mv {} ./test/ \;
find . -type f -iname '*.cpp' -exec mv {} ./test/ \+ #gives error:find: missing argument to `-exec'
Run Code Online (Sandbox Code Playgroud)
对于命令 …
如何执行我在Vi(m)中编辑的文件并在分割窗口中输出(如在SciTE中)?
当然我可以这样执行:
:!scriptname
Run Code Online (Sandbox Code Playgroud)
但是,是否可以避免编写脚本名称以及如何在分割窗口中获取输出而不是屏幕底部?
这些是可以在C(和C++)中使用的exec的所有版本
execl
execle
execlp
execv
execve
execvp
Run Code Online (Sandbox Code Playgroud)
他们之间有什么区别?你怎么知道使用哪一个?
我试图通过exec任务得到简单的输出msbuild:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Test">
<Exec Command="echo test output">
<Output TaskParameter="Outputs" ItemName="Test1" />
</Exec>
<Exec Command="echo test output">
<Output TaskParameter="Outputs" PropertyName="Test2" />
</Exec>
<Message Text="----------------------------------------"/>
<Message Text="@(Test1)"/>
<Message Text="----------------------------------------"/>
<Message Text="$(Test2)"/>
<Message Text="----------------------------------------"/>
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)
但得到下一个输出:
echo test output
test output
echo test output
test output
----------------------------------------
----------------------------------------
----------------------------------------
Run Code Online (Sandbox Code Playgroud)
如何通过我的脚本输出?
我有一个方法,我用来在本地主机上执行命令.我想在方法中添加一个超时参数,这样如果被调用的命令没有在合理的时间内完成,那么该方法将返回错误代码.这是迄今为止的样子,没有超时的能力:
public static int executeCommandLine(final String commandLine,
final boolean printOutput,
final boolean printError)
throws IOException, InterruptedException
{
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(commandLine);
if (printOutput)
{
BufferedReader outputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
System.out.println("Output: " + outputReader.readLine());
}
if (printError)
{
BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
System.out.println("Error: " + errorReader.readLine());
}
return process.waitFor();
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议我实现超时参数的好方法吗?
两者都能够在容器中执行命令.两者都可以分离容器.
那么docker exec和docker attach之间的真正区别是什么?
system和exec家庭命令有什么区别?特别是我想知道哪一个创建子进程工作?