在 Perl 而不是 Bash 中执行这些 shell 操作是否有意义?

在 Perl 而不是 Bash 中执行这些 shell 操作是否有意义?

我正在学习 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)。

相关内容