Bash 대신 Perl에서 이러한 쉘 작업을 수행하는 것이 합리적입니까?

Bash 대신 Perl에서 이러한 쉘 작업을 수행하는 것이 합리적입니까?

저는 펄을 배우고 있어요. Perl 스크립트 주위에 bash 스크립트 래퍼가 포함된 간단한 애플리케이션이 있습니다. 나는 Bash 스크립트를 제거하고 (학습 연습으로) Perl에서 모든 작업을 수행하는 것을 고려하고 있습니다.

나는 Perl에서 시스템 명령을 호출하는 세 가지 방법, 즉 역따옴표 exec()system().

어느 것이 선호되는지 알고 싶습니다. 나는 가지고있다읽다:

Perl의 exec() 함수와 system() 함수는 모두 시스템 쉘 명령을 실행합니다. 가장 큰 차이점은 system()이 포크 프로세스를 생성하고 명령이 성공했는지 실패했는지 확인하기 위해 기다리고 값을 반환한다는 것입니다. exec()는 아무것도 반환하지 않고 단지 명령을 실행합니다. 이러한 명령 중 어느 것도 시스템 호출의 출력을 캡처하는 데 사용되어서는 안 됩니다. 목표가 출력을 캡처하는 것이라면 백틱 연산자를 사용해야 합니다.

내 예제 코드(아래)에서는 이러한 유형의 시스템 호출을 혼합해야 합니까, 아니면 단순하게 유지하고 백틱을 사용해야 합니까?

둘째, bash 스크립트 래퍼의 기능을 Perl 스크립트로 옮기는 것이 권장되는지 궁금합니다. 예를 들어, 내가 직장에서 이렇게 간단한 일을 하고 있다면 두 개의 다른 언어로 된 두 개의 스크립트로 구성된 구현으로 인해 비판을 받을까요, 아니면 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에서 시스템 명령을 호출하는 세 가지 방법, 즉 역따옴표, exec() 및 system()을 보았습니다.

어느 것이 선호되는지 알고 싶습니다. 나는 읽었습니다:

당신이 선호하는 것은 전적으로 당신이 하고 싶은 일에 달려 있습니다. 이 세 가지 메커니즘은 매우 다르게 작동합니다.

  • 백틱은 프로그램의 출력을 캡처할 때 사용됩니다.
  • exec()원할 때 사용하세요바꾸다귀하의 스크립트는 새로운 바이너리와 함께 제공됩니다. Perl 스크립트 실행은 호출하는 지점에서 중지되며 exec()계속되지 않습니다.
  • system()명령을 실행한 다음 Perl 스크립트를 계속 실행하려는 경우에 사용됩니다.

둘째, bash 스크립트 래퍼의 기능을 Perl 스크립트로 옮기는 것이 권장되는지 궁금합니다.

이는 일반적으로 개인 취향의 문제이지만 스크립트에서 수행하는 작업의 경우 모든 논리를 Perl 코드로 이동하면 작업이 단순화될 수 있습니다(예를 들어 Perl에는 이미 다양한 호출을 쉽게 대체할 수 있는 날짜/시간 기능이 있습니다 date). .

관련 정보