在Perl中,是否有可能使'exec','system'和'qx'使用除/ bin/sh之外的shell(不使用像'exec'这样的构造$ SHELL -c ..."',并且没有重新编译perl)?
编辑:这个问题的动机是一个bash脚本,它执行'export -f foo',然后在子shell中使用perl直接通过'system"foo"'调用函数.我不确定这种技术是否适用于所有sh,虽然'system'/ bin/bash -c foo"'可能在这种情况下有效,但我不希望导出的函数在/ bin /的所有变体中传播SH.但大多数时候我只是好奇,现在对如何将解决方案扩展到qx感到好奇.此外,由于我对非unix平台一无所知,所以我想避免在解决方案中对备用shell的路径进行硬编码.
我试图列出我选择的任何Adventureworks表中的所有列.我可以执行哪些T-sQL语句或存储过程来查看所有列的列表?我想使用我的C#Web应用程序输入一个输入参数= table_name,然后获取所有column_names的列表作为输出.现在我正在尝试执行sp_columns存储过程,但是我不能只使用select和exec组合的一列.有人知道怎么做这个吗?
感谢大家的所有回复,但没有一个答案符合我的要求.让我更多地为您解释我的问题.下面的查询返回我需要的内容.但我的问题是将这个逻辑合并到一个带有输入参数的SP中.所以这是成功的SQL语句:
select col.name from sysobjects obj inner join syscolumns col
on obj.id = col.id
where obj.name = 'AddressType'
order by obj.name
Run Code Online (Sandbox Code Playgroud)
目前我的SP看起来像:
CREATE PROCEDURE [dbo].[getColumnNames]
@TableName VarChar(50)
AS
BEGIN
SET NOCOUNT ON;
SET @TableName = RTRIM(@TableName)
DECLARE @cmd AS NVARCHAR(max)
SET @cmd = N'SELECT col.name from sysobjects obj ' +
'inner join syscolumns col on obj.id = col.id ' +
'where obj.name = ' + @TableName
EXEC sp_executesql @cmd
END
Run Code Online (Sandbox Code Playgroud)
但我按上述方式运行
exec getColumnNames 'AddressType'
Run Code Online (Sandbox Code Playgroud)
它给了我错误:
Invalid column name …Run Code Online (Sandbox Code Playgroud) EXEC [dbo].[pr_cfgAddFact]
@SettingName = 'TransferBatch',
@RoleFK = SELECT TOP 1 rolepk FROM cfgRole WHERE cfgRole.Name = 'SuperAdmin'
Run Code Online (Sandbox Code Playgroud)
为什么SQL会在这里抱怨SELECT子句?我试图用子查询获取数据运行proc.
我正在使用ffmpeg命令在php中使用exec函数剪切视频.但它不是创建视频文件,也不显示任何错误.我用exec如下
exec("ffmpeg -i input.flv -ss 00:00:30.0 -t 00:00:10.0 -acodec copy -vcodec copy -async 1 output.flv");
Run Code Online (Sandbox Code Playgroud)
我可以帮助了解这里发生的错误是什么吗?
exec("ffmpeg -i input.flv -ss 00:00:30.0 -t 00:00:10.0 -acodec copy -vcodec copy -async 1 output.flv",$output);
Run Code Online (Sandbox Code Playgroud)
我也试过了.但我没有在变量中收到任何错误消息$output
根据exec引用,对exec(或一般的堆栈检查vararg函数)的调用在(char*)NULL参数列表的末尾需要一个aka 0.然而,海湾合作委员会抱怨以下代码
char cmdFullPath[4096]; //yes this 4096 thing is bad coding practice
...
execl(cmdFullPath, (char*)NULL);
//warning: not enough variable arguments to fit a sentinel
Run Code Online (Sandbox Code Playgroud)
谁知道什么是错的?
我正在运行一个带有apache版本1.3.33和PHP版本4.4的SCO Unix盒子.我可以通过cli正确执行exec命令,但是在尝试通过浏览器执行脚本时会遇到麻烦.我的设置是:
我的代码:htdocs目录中的test_script.php
<?php
exec('ls',$out,$rval);
echo "Output:<hr />";
print "<pre>"; print_r($out); print "</pre>";
echo "Return Value:<hr />";
echo $rval;
?>
Run Code Online (Sandbox Code Playgroud)
我也尝试过显式设置可执行二进制路径.测试脚本与apache是相同的用户/组.我也尝试在arg中添加2>&1,但看不到任何变化.先感谢您.
我有一个脚本,在几个目录中执行一个文件,如下所示:
exec("php-cli $file_path > /dev/null 2>/dev/null &"); //php command-line
Run Code Online (Sandbox Code Playgroud)
这适用于大多数主机,但有些主机不喜欢它并且它不运行,不会产生任何错误.
对于失败的主机,我使用
exec("php $file_path > /dev/null 2>/dev/null &"); //notice the -cli is gone
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.
$ file_path是正在执行的文件的完整路径/home/blah/path/blah.php
我如何制作这种制服,以便它适用于所有服务器(至少unix)
**编辑**
好吧,我这样做,它(很可能)不是正确的方式,但它的工作原理.
而不是只使用php-cli或php,我使用两者,所以如果一个失败,另一个经历.要么php作为cgi或cli运行,其中一个会捕获,并且因为没有输出,所以也没有错误.
exec("php-cli $file_path > /dev/null 2>/dev/null &");
exec("php $file_path > /dev/null 2>/dev/null &");
Run Code Online (Sandbox Code Playgroud)
除非您知道更好的解决方案,否则请告诉我.感谢你的帮助.
我需要你的帮助 !
我做了一个报告deamon(用c ++),需要在服务器上定期执行一堆命令.
一个简单的示例命令是:"/ bin/ps aux |/usr/bin/wc -l"
第一个想法是使用popen()分叉运行命令的子进程,并在父进程中设置一个alarm(),如果命令尚未退出,则在5秒后终止该子进程.
我尝试使用"sleep 20000"作为命令,子进程被杀死但是sleep命令仍在运行...不好.
第二个想法是使用execlp()而不是popen(),它使用简单的命令(即没有管道),如"ls -lisa"或"sleep 20000".我可以得到结果,如果5秒后没有完成,则会杀死进程.
现在我需要执行"/ bin/ps aux |/usr/bin/wc -l"命令,显然它不能直接使用execlp(),所以我尝试了"hack":
execlp("sh","sh","-c","/bin/ps aux | /usr/bin/wc -l",NULL);
Run Code Online (Sandbox Code Playgroud)
我工作......或者说我想...我试过了
execlp("sh","sh","-c","sleep 20000",NULL);
Run Code Online (Sandbox Code Playgroud)
只是为了确定并且子进程在5秒后被终止(我的超时)但是sleep命令就在那里...
我愿意接受建议(我会讨价还价)!
提前致谢 !
TLDR;
我需要一种方法:
我试图通过git shortlog这种方式在nodejs上获取结果:
var exec = require('child_process').exec;
exec("cd /tmp/"+folder +" && git shortlog", {maxBuffer: 500*1024}, function(error, stdout, stderror){
console.log(arguments);
});
Run Code Online (Sandbox Code Playgroud)
我的回调从未使用此方法调用,程序似乎无限期地处理某些事情.
当我在提示符中启动此命令时,我得到了结果.
尝试将结果重定向到文件会创建一个空文件:
"cd /tmp/"+folder +" && git shortlog > stats.txt"
Run Code Online (Sandbox Code Playgroud)
但如果我使用,git log我会得到我的结果.
你知道为什么我的回调永远不会被调用git shortlog吗?
编辑:我使用spawn得到了相同的结果:
exec("cd /tmp/"+folder, function(err){
if(err){
throw err;
}
var shortlog = spawn('git', ['shortlog']);
shortlog.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
shortlog.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
shortlog.on('close', function (code) {
console.log('child process exited with code …Run Code Online (Sandbox Code Playgroud) 我正在制作一个程序,最终能够(理论上)为传递给它的任何shell命令工作.我的问题是运行的exec不会将其输出放入管道,而是在运行时看起来好像初始调用是进入管道而已?我试过先冲洗stdout但它不起作用.任何帮助表示赞赏!
int main(int argc, char *argv[]) {
int i=0, pid;
int dataPipe[2];
pipe(dataPipe);
char *newArgs[5] = {"/bin/sh", "-c", "ls", "-a", NULL};
if ((pid = fork()) < 0) {
printf("Error: could not fork!");
exit(2);
}
else if (pid == 0) {
close(dataPipe[0]);
fflush(stdout);
dup2(dataPipe[1], 1);
close(dataPipe[1]);
if (execvp(newArgs[0], newArgs) < 0) {
printf("Command Failed to exucute!");
exit(3);
}
}
else {
char buf[BUFFER];
close(dataPipe[1]);
wait(0);
printf("Command exexuted correctly!\n");
while(read(dataPipe[0], buf, BUFFER) != 0) {
printf("Here is the command's output:\n%s\n", buf);
} …Run Code Online (Sandbox Code Playgroud)