我正在学习 Perl。我有一个简单的应用程序,其中包含 Perl 脚本的 bash 脚本包装器。我正在考虑摆脱 Bash 脚本并在 Perl 中完成这一切(作为学习练习)。
我至少见过三种从 Perl 调用系统命令的不同方式:反引号exec()
和system()
.
我想知道哪个是首选。我有读:
Perl 的 exec() 函数和 system() 函数都执行系统 shell 命令。最大的区别在于 system() 创建一个 fork 进程并等待查看命令是否成功或失败 - 返回一个值。 exec() 不返回任何内容,它只是执行命令。这些命令都不应该用来捕获系统调用的输出。如果您的目标是捕获输出,则应该使用反引号运算符。
对于我的示例代码(如下),我应该混合这些类型的系统调用,还是只是保持简单并使用反引号?
其次,我想知道是否建议将 bash 脚本包装器的功能移至 Perl 脚本中。例如,如果我在工作中做这样简单的事情,我是否会因为由两种不同语言的两个脚本组成的实现而受到批评,或者我是否会因为在 Perl 中做一些可以轻松完成的事情而受到批评重击?还是“我喜欢什么”?
#!/bin/bash
rm myfile.zip >/dev/null 2>&1
wget https://downloads.example.com/myfile.zip
if [[ $? -ne 0 ]]; then
echo "ERROR: failed to download list from example.com."
exit 1
fi
current_date=$(date +"%Y-%m-%d")
read -p "Save current input as input_$current_date.json then press Enter key to continue."
echo
current_datetime=$(date +"%Y-%m-%d_%H%M")
mylist="mylist_$current_datetime.txt"
zipinfo -1 myfile.zip | sed 's|myfile_xyz/||' | grep '^me' | sed 's/.top.myfile//' > $mylist
perl myperlscript.pl $mylist "input_$current_date.json"
bash
是我系统上的默认 shell,因此除非另有说明,Perl 将使用它。我不关心到其他系统或其他 shell 的可移植性。
答案1
我见过至少三种从 Perl 调用系统命令的不同方法:反引号、exec() 和 system()。
我想知道哪个是首选。我读过了:
首选哪个完全取决于您想做什么。这三种机制的作用截然不同。
- 当您想要捕获程序的输出时,可以使用反引号。
exec()
当你想要的时候使用代替您的脚本带有新的二进制文件。 Perl 脚本的执行会在您调用的地方停止exec()
,并且永远不会继续。system()
用于当您想要运行命令然后继续执行 perl 脚本时。
其次,我想知道是否建议将 bash 脚本包装器的功能移至 Perl 脚本中。
这通常是个人喜好的问题,但是对于您在脚本中所做的事情,将所有逻辑移到您的 perl 代码中可能会简化事情(例如,perl 已经具有日期/时间函数,可以轻松地替换您的的各种调用date
)。