Perl执行shell命令的几种方式及其区别
来源:互联网 发布:淘宝的企业店铺卖手机 编辑:程序博客网 时间:2024/06/05 08:18
There are many ways to execute external commands from Perl. The most commons are:
- system function
- exec function
- backticks (``) operator
- open function
All of these methods have different behaviour, so you should choose which one to use depending of your particular need. In brief, these are the recommendations:
method
use if ...
system()
you want to execute a command and don't want to capture its output
exec
you don't want to return to the calling perl script
backticks
you want to capture the output of the command
open
you want to pipe the command (as input or output) to your script
More detailed explanations of each method follows:
- Using system()
-
system() executes the command specified. It doesn't capture the output of the command.
system() accepts as argument either a scalar or an array. If the argument is a scalar, system() uses a shell to execute the command ("/bin/sh -c command"); if the argument is an array it executes the command directly, considering the first element of the array as the command name and the remaining array elements as arguments to the command to be executed.
For that reason, it's highly recommended for efficiency and safety reasons (specially if you're running a cgi script) that you use an array to pass arguments to system()
Example:
#-- calling 'command' with arguments system("command arg1 arg2 arg3"); #-- better way of calling the same command system("command", "arg1", "arg2", "arg3");
The return value is set in $?; this value is the exit status of the command as returned by the 'wait' call; to get the real exit status of the command you have to shift right by 8 the value of $? ($? >> 8).
If the value of $? is -1, then the command failed to execute, in that case you may check the value of $! for the reason of the failure.
Example:
system("command", "arg1"); if ( $? == -1 ) { print "command failed: $!\n"; } else{ printf "command exited with value %d", $? >> 8; }
- Using exec()
-
The exec() function executes the command specified and never returns to the calling program, except in the case of failure because the specified command does not exist AND the exec argument is an array.
Like in system(), is recommended to pass the arguments of the functions as an array.
- Using backticks (``)
-
In this case the command to be executed is surrounded by backticks. The command is executed and the output of the command is returned to the calling script.
In scalar context it returns a single (possibly multiline) string, in list context it returns a list of lines or an empty list if the command failed.
The exit status of the executed command is stored in $? (see system() above for details).
Example:
#-- scalar context $result = `command arg1 arg2`; #-- the same command in list context @result = `command arg2 arg2`;
Notice that the only output captured is STDOUT, to collect messages sent to STDERR you should redirect STDERR to STDOUT
Example:
#-- capture STDERR as well as STDOUT $result = `command 2>&1`;
- Using open()
-
Use open() when you want to:
- capture the data of a command (syntax: open("command |"))
- feed an external command with data generated from the Perl script (syntax: open("| command"))
Examples:
#-- list the processes running on your system open(PS,"ps -e -o pid,stime,args |") || die "Failed: $!\n"; while ( ) { #-- do something here } #-- send an email to user@localhost open(MAIL, "| /bin/mailx -s test user\@localhost ") || die "mailx failed: $!\n"; print MAIL "This is a test message";
- Perl执行shell命令的几种方式及其区别
- shell的不同执行方式及其区别
- python中执行shell命令的几种方式
- Shell脚本的几种执行方式之区别
- shell脚本执行的几种方式
- 几种shell执行模式的区别
- Perl 获取shell命令的执行结果
- shell脚本的几种不同执行方式的区别实验
- shell脚本的几种不同执行方式的区别实验
- shell执行命令的方式
- Linux 下 SHELL的几种执行方式
- Linux中shell的几种执行方式
- shell与subshell与执行脚本的几种方式
- linux shell 执行多个命令的几种方法
- python执行shell命令的几种方法
- shell命令串联起来执行的几种方法
- python执行shell命令的几种方法
- python执行shell命令的几种方法
- 组合数
- mysql innodb 独占表空间和共享表空间
- 107. Binary Tree Level Order Traversal II | 层次遍历顺序逆置输出
- 使用python+urllib爬取最受欢迎豆瓣影评信息
- Eclipse 项目导入Android Studio
- Perl执行shell命令的几种方式及其区别
- 遭遇“HTTP 错误 500.19 无法访问请求的页面,因为该页的相关配置数据无效。”处理
- S5PV210----裸机LCD驱动
- java文件的读写问题
- 11. Container With Most Water
- shell 脚本nginx日志分割
- AutoLayout android studio
- 33. Search in Rotated Sorted Array
- Postgresql数据库DETAIL: Key (irecordid)=(25) already exists.