Bashの代わりにPerlでこれらのシェルを実行するのは合理的ですか?

Bashの代わりにPerlでこれらのシェルを実行するのは合理的ですか?

私はパールを学んでいます。 Perlスクリプトの周りにbashスクリプトラッパーを含むシンプルなアプリケーションがあります。私はBashスクリプトを削除し(学習練習として)Perlですべてのことを行うことを検討しています。

私はPerlでシステムコマンドを呼び出す3つの方法、すなわち逆引用符exec()system()

どちらが好むか知りたいです。私は持っています読む:

Perlのexec()関数とsystem()関数はどちらもシステムシェルコマンドを実行します。主な違いは、system()がフォークプロセスを生成し、コマンドが成功したか失敗したかを確認するのを待って値を返すことです。 exec() は何も返さずにコマンドを実行します。これらのコマンドのどれも、システムコールの出力をキャプチャするために使用しないでください。目標が出力をキャプチャすることである場合は、バックティック演算子を使用する必要があります。

私のサンプルコード(下)では、このタイプのシステムコールを混在させる必要がありますか、それとも単純に保ち、バックティックを使用する必要がありますか?

次に、bashスクリプトラッパーの機能をPerlスクリプトに移動することをお勧めします。たとえば、私が職場でこのように簡単なことをしている場合は、2つの異なる言語の2つのスクリプトで構成された実装から批判を受けますか、それともPerl Heavy批判で簡単にできることをしていると批判されますか?または「私は何が好きですか?」

#!/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私のシステムのデフォルトシェルなので、特に指定しない限り、Perlはそれを使用します。私は他のシステムや他のシェルへの移植性に興味がありません。

ベストアンサー1

私はPerlでシステムコマンドを呼び出す3つの方法、すなわち逆引用符、exec()、およびsystem()を見ました。

どちらが好むか知りたいです。私は読んだ:

あなたが好むのは、あなたがしたいことに完全に依存します。これら3つのメカニズムは非常に異なる動作をします。

  • バックティックは、プログラムの出力をキャプチャするときに使用されます。
  • exec()必要に応じて使用してください変えるあなたのスクリプトは新しいバイナリが付属しています。 Perl スクリプトの実行は呼び出すポイントで停止し、続行されませexec()ん。
  • system()コマンドを実行してからPerlスクリプトを実行し続けたい場合に使用されます。

次に、bashスクリプトラッパーの機能をPerlスクリプトに移動することをお勧めします。

これは一般的に個人的な好みの問題ですが、スクリプトで実行する操作の場合、すべてのロジックをPerlコードに移動すると、作業が簡素化される可能性があります(たとえば、Perlにはすでにさまざまな呼び出しを簡単に置き換えることができる日付/時刻機能があります)date)。 。

おすすめ記事