我的.bashrc具有以下功能
function myfile {
file $1
}
export -f myfile
Run Code Online (Sandbox Code Playgroud)
当我直接调用它时它工作正常
rajesh@rajesh-desktop:~$ myfile out.ogv
out.ogv: Ogg data, Skeleton v3.0
Run Code Online (Sandbox Code Playgroud)
当我尝试通过exec调用它时,它不起作用
rajesh@rajesh-desktop:~$ find ./ -name *.ogv -exec myfile {} \;
find: `myfile': No such file or directory
Run Code Online (Sandbox Code Playgroud)
有没有办法用exec调用bash脚本函数?
任何帮助是极大的赞赏.
谢谢Jim的回应.
但这正是我想要首先避免的,因为我在bash脚本中定义了很多实用函数,我想将它们与find -exec等其他有用的命令一起使用.
我完全看到你的观点,发现可以运行可执行文件,它不知道传递的参数是在脚本中定义的函数.
当我尝试exec处于bash提示符时,我将得到相同的错误.
$ exec myfile out.ogv
Run Code Online (Sandbox Code Playgroud)
我希望可能有一些巧妙的技巧,exec可以给出一些假设的命令,如"bash -myscriptname -myfunctionname".
我想我应该尝试找到一些方法来动态创建一个bash脚本并使用exec运行它.
我有一个应用程序应该使用一些shell命令将文件从SD卡复制到/ system/media /.它将需要root,我正在root设备上进行测试.我正在使用运行时来执行shell命令,但它不起作用.这是我的运行时间
public void RunAsRoot{String[] commands = {"sysrw", "rm /data/local/bootanimation.zip", "sysro"};{
Process p = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(p.getOutputStream());
for (String tmpCmd : commands) {
os.writeBytes(tmpCmd+"\n");
}
os.writeBytes("exit\n");
os.flush();
}
Run Code Online (Sandbox Code Playgroud)
但我的logcat只显示其中两个没有被拒绝
07-30 03:14:11.112: WARN/su(3593): request rejected (10047->0 /system/bin/sh)
07-30 03:14:11.132: DEBUG/su(3592): 10047 com.bba.stormdroid executing 0 /system/bin/sh using shell /system/bin/sh : sh
07-30 03:14:11.152: WARN/su(3594): request rejected (0->0 /system/bin/sh)
07-30 03:14:11.182: WARN/su(3595): request rejected (0->0 /system/bin/sh)
07-30 03:14:11.202: WARN/su(3596): request rejected (0->0 /system/bin/sh)
07-30 03:14:11.242: DEBUG/su(3597): 10047 com.bba.stormdroid executing …Run Code Online (Sandbox Code Playgroud) exec()当我使用atUnix系统命令添加任务时,我一直在努力捕获它的输出.我的问题是,从我的脚本运行时它没有输出,但是从终端运行它并且 PHP在交互模式下打印出几行.
我想要执行的命令是这样的:
echo exec("echo 'php -f /path/to/file.php foo=1' | at now + 1 minutes", $result);
Run Code Online (Sandbox Code Playgroud)
var_dump()给出string(0) ""并print_r()吐出来Array ().我尝试使用shell_exec(),输出NULL,但在hi网页上下文中运行时,以下输出:
echo exec("echo 'hi'");
Run Code Online (Sandbox Code Playgroud)
这也输出了东西:
echo exec("atq");
Run Code Online (Sandbox Code Playgroud)
但是,一旦我使用at,就不会输出任何内容.我怎样才能获得以下输出:
exec("echo 'php -f /path/to/file.php foo=1' | at now + 1 minutes", $result);
Run Code Online (Sandbox Code Playgroud)
因为目前它通过Apache通过Apache以"正常"运行时不输出任何内容,但是在终端以及PHP的交互式控制台中运行命令给了我预期的结果,例如:
php > echo exec("echo 'php -f /path/to/file.php foo=1' | at now + 1 minutes", $result);
warning: commands will be executed using /bin/sh …Run Code Online (Sandbox Code Playgroud) 1)当我打开新的CMD(Win + R => cmd)时.它从介绍开始.(第3行)
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
The system cannot find the path specified.
C:\Users\ViliamKopecky>
Run Code Online (Sandbox Code Playgroud)
2)当我执行某些命令cmd /C dir(或(cmd /C php -v或其他))时(第2行)
C:\Users\ViliamKopecky>cmd /C dir
The system cannot find the path specified.
Volume in drive C is Windows7_OS
Volume Serial Number is 8230-1246
...
C:\Windows\System32>cmd /C php -v
The system cannot find the path specified.
PHP 5.4.8 (cli) (built: Oct 16 2012 22:30:23)
Copyright (c) …Run Code Online (Sandbox Code Playgroud) 以下PHP代码确实返回了大约3.5秒的运行时间(多次测量并取平均值):
$starttime = microtime(true);
exec('/usr/local/bin/convert 1.pdf -density 200 -quality 85% 1.jpg');
$endtime = microtime(true);
$time_taken = $endtime-$starttime;
Run Code Online (Sandbox Code Playgroud)
当我在ssh终端上运行相同的命令时,运行时间减少到大约0.6秒(使用命令行工具测量time).
imagemagick库的版本是
Version: ImageMagick 6.7.0-10 2012-12-18 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC
Features: OpenMP
Run Code Online (Sandbox Code Playgroud)
这个时差的原因是什么?
在stackoverflow上对类似问题的一个答案是,开销来自必须启动线程/ shell的Web服务器.这可能是真的吗?我认为线程是轻量级的,并且不需要花很长时间才能启动/终止.
在调用之前exec我设置了imagemagick使用的线程数(因为这是/在OpenMP中的错误?,参考)到1 exec('env MAGICK_THREAD_LIMIT=1');.无论我设置什么值,PHP的运行时都没有太大变化MAGICK_THREAD_LIMIT.无论如何,在这个版本中OpenMP上似乎没有错误,因为命令行执行的运行时是可以的.
任何关于如何改进上述命令的运行时间的建议将不胜感激.
非常感谢您的帮助.
使用该os/exec包,我想代表另一个用户在*nix OS上运行外部命令(当然是在具有su权限的另一个用户的root用户下运行进程)
我想避免使用"su"或"bash"命令,并将其与go完全一致.
我使用了一个方法,syscall.Setuid但这会将用户更改为主项目,我只需要将用户更改为外部子进程:
func (self *Command) LoseTo(username string) {
u, err := user.Lookup(username)
if err != nil {
fmt.Printf("%v", err)
}
uid, err := strconv.Atoi(u.Uid)
if err := syscall.Setuid(uid); err != nil {
fmt.Printf("%v", err)
}
}
Run Code Online (Sandbox Code Playgroud) 我在这里遇到了一个关于将参数传递给Go exec.Command函数的问题,我想知道是否有办法动态传递这些参数?以下是sed问题的一些示例代码:
package main
import "os/exec"
func main() {
app := "echo"
//app := "buah"
arg0 := "-e"
arg1 := "Hello world"
arg2 := "\n\tfrom"
arg3 := "golang"
cmd := exec.Command(app, arg0, arg1, arg2, arg3)
out, err := cmd.Output()
if err != nil {
println(err.Error())
return
}
print(string(out))
}
Run Code Online (Sandbox Code Playgroud)
所以你可以看到每个arg的上述定义arg0,arg1,arg2和arg3.它们Command与实际运行的命令一起传递给函数,在本例中为appvar.
如果我有一系列的参数总是可能有一个我想要通过的不确定性计数怎么办?这可能吗?
我在我的localhost上运行Apache.从作为www-user运行的PHP脚本我想在我的机器上控制Rhythmbox播放.到目前为止,我的PHP脚本中有一个简单的命令:
exec('rhythmbox-client --pause');
当我从命令行运行它时,这很有效,但是如果它以www-user运行,我猜rhythmbox-client不知道/无法访问我的Rhythmbox实例.
有没有一种简单的方法让PHP脚本作为我的用户而不是www-user运行,或者告诉rhythmbox-client哪个实例要控制?
整个应用程序是,当我的手机摘机时,它调用我的PHP脚本暂停音乐,并在手机挂机时恢复播放.我喜欢VoIP电话!
解决方案:
感谢Carpetsmoker和Tarek,我使用sudo了答案,但有一些问题.为了克服它们,我做了以下事情:
创建了一个bash脚本来调用rhythmbox-client.这个bash脚本是sudo在PHP 中执行的,如下面的答案中所述.不幸的rhythmbox-client是不知道要控制什么环境,所以bash脚本看起来像这样:
#! /bin/bash
DBUS_ADDRESS=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/*/environ 2> /dev/null| sed 's/DBUS/\nDBUS/g' | tail -n 1`
if [ "x$DBUS_ADDRESS" != "x" ]; then
export $DBUS_ADDRESS
/usr/bin/rhythmbox-client --pause
fi
Run Code Online (Sandbox Code Playgroud)
现在bash脚本可以由PHP和wwwuser执行,我的手机可以暂停/播放我的音乐!
我想运行命令
find some/path -exec program \{} \;
Run Code Online (Sandbox Code Playgroud)
但我希望find命令尽快退出命令
program \{}
Run Code Online (Sandbox Code Playgroud)
找不到任何文件失败.
有一个简单的方法吗?
我不知道它是Scala还是Play!题.我想从我的Play应用程序执行一些外部命令,从命令获取输出并根据命令输出向用户显示报告.有人可以帮忙吗?
例如,当我从shell 输入my-command时,它会显示如下所示的输出,我想捕获并显示在web中:
Id Name IP
====================
1 A x.y.z.a
2 B p.q.r.s
Run Code Online (Sandbox Code Playgroud)
请不要担心输出的格式和解析.在功能上,我看起来像PHP exec.我知道java Runtime.getRuntime().exec("command")但是有没有Scala/Play版本可以达到目的?