我正在学习 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 的可移植性。
首选哪个完全取决于您想要做什么。这三种机制做的事情非常不同。
exec()
当您想用新的二进制文件替换脚本时使用。perl 脚本的执行在您调用的点停止exec()
并且永远不会继续。system()
用于当您想要运行命令然后继续执行您的 perl 脚本时。这通常是个人喜好问题,但是对于您在脚本中所做的事情,它可能会简化事情,只需将所有逻辑移到您的 perl 代码中(例如,perl 已经有日期/时间函数可以轻松替换您的各种调用
date
)。