나는 다음과 같은 Perl 스크립트를 가지고 있습니다(이것은 Python 및 기타 스크립팅 언어에서 작동하지만): script1.pl
, script2.pl
,script3.pl
이러한 스크립트는 사용자가 입력 플래그를 사용하여 실행하고 출력이 저장된 파일이 되는 방식으로 작성되었습니다.
perl script1.pl --i input1.tsv ## this outputs the file `outputs1`
perl script2.pl --i outputs1 ## this outputs the file `outputs2`
perl script3.pl --i outputs2 ## this outputs the file `final_output`
input1
이제 사용자가 간단히 소비 하고 그 대가로 출력을 얻을 수 있는 실행 가능한 bash 스크립트를 만들고 싶습니다 final_output
.
Perl 스크립트를 사용하여 이 작업을 수행하는 방법은 다음과 같습니다 execute.sh
.
#!/bin/sh
source ~/.bash_profile
FLAG1="--i=$1"
perl script1.pl $FLAG1
명령줄에서 실행 가능execute.sh input1.tsv
세 가지 스크립트의 예에서 중간 출력을 중간 스크립트로 파이프하여 하나의 execute.sh
스크립트(예: outputs1
into script2.pl
, outputs2
into scripts3.pl
등)를 생성하려면 어떻게 해야 합니까?
Perl/Python 스크립트를 다시 작성하지 않고 이 작업을 수행할 수 있는 방법이 있습니까?
답변1
당신이 원하는 것을 보여주기 위해 쓰는 3줄예유효한 bash
스크립트: 스크립트는 쉘이 차례로 실행하는 일련의 명령에 지나지 않습니다.
필요한 추가 코드는 script1.pl
임시 파일을 정리하고 생성하는 것뿐입니다 script2.pl
. 또한 절대 경로를 사용하여 위치를 지정할 수도 있습니다 script{1,2,3}.pl
.
#!/bin/sh
trap 'rm outputs1 outputs2' EXIT
perl script1.pl --i "$1"
perl script2.pl --i outputs1
perl script3.pl --i outputs2
$1
스크립트에 전달된 첫 번째 인수의 값을 나타내므로 다음과 같이 호출됩니다.
execute.sh input1.tsv
예상대로.
특정 출력 파일을 생성하기 위해 하드코딩된 것처럼 보이기 때문에 세 스크립트 사이에 파이프라인을 실제로 설정할 수 없습니다.
답변2
출력 파일이 로컬로 생성되었다고 가정합니다. 스크립트가 있는 디렉터리의 임시 작업 디렉터리에서 스크립트를 실행해 볼 수 있습니다. 여기서 스크립트를 실행하기 전에 스크립트를 복사할 수 있으며 다른 프로세스는 해당 디렉터리에 파일을 생성하지 않습니다. 그러면 특정 스크립트로 생성된 새 파일을 제어하고 조작할 수 있습니다.
/tmp
활성 사용자 디렉터리에 임시 디렉터리를 생성할 수 있습니다. 디렉터리를 해제하는 명령을 스크립트 끝에 추가합니다. 출력 파일을 다른 곳에 저장하려면 적시에 적절한 위치에 복사하면 됩니다.