Perl open에서 | 의 역할 질문 드립니다.

aqsmc의 이미지

안녕하세요

perl code에서 crontab의 Data를 수정하기 위해서 아래와 같은 code를 검색하여 찾았습니다.

open my $fh, "| crontab -";
my $cron = `crontab -l`;
$cron =~ s/.*Contents.*\n//g;
print $fh $cron;
close $fh;

crontab -l command로 현재 crontab에 작성된 내용을 $cron에 저장하고, "Contents" 문자열이 포함된 line을 s//g line을 통해 제거 하는 것 까지는 이해가 되는데, 제일 첫줄의 "| crontab -" 와 print $fh를 했을 때 어떤 원리로 Crontab이 $cron의 내용으로 새로 작성 되는 것인가요?

Terminal에서 "crontab file_path" command를 통해 crontab의 내용이 file의 내용과 동일해 지는 것은 test 해보았는데, 위 code에서 open과 print를 통해서 "crontab file_path"와 동일한 기능을 하는 원리가 궁금해서 질문드립니다.

그리고 이 질문과는 상관 없지만, 제가 KLDP 사이트를 처음 써봐서 이미 있는 글들에 대해서 검색을 하는 방법을 몰라서 함께 질문드립니다.
KLDP 페이지의 우측 상단의 검색(KLDP.net 메뉴 우측) 메뉴를 이용하면 찾아보기 - Google 메뉴에 들어가지나 아무 내용이 검색 되지 않아서요. 혹시 Forum에 있는 글들을 검색하는 방법도 아시는 분이 계시면 답변해 주시면 정말 감사하겠습니다.
우측 상단 검색 메뉴를 사용하는게 맞는데 제 컴퓨터 문제인건가요? 회사 환경에서 사용 중이여서 문제가 있을 지도 모르겠네요..

두서 없는 질문글 읽어 주셔서 감사드립니다.

김정균의 이미지

쉽게 설명하기 위해서 코드를 아래와 같이 수정해 보면 (결과는 달라지지 않습니다.)

my $cron = `crontab -l`;
$cron =~ s/.*Contents.*\n//g;
 
open my $fh, "| crontab -";
print $fh $cron;
close $fh;

위의 2줄은 이해를 하실 것이고요. 위의 코드를 bash 로 바꾸어 보면 아래와 같습니다.

cron="$(crontab -l)"
cron="$(echo "$cron" | sed '/.*Contents.*/d')"
 
echo "$cron" | crontab -

즉 "crontab -" 명령은 standard in 으로 흐르는 stream을 crontab 내용으로 기록하라는 의미 입니다.

그리고, 검색이 안되는 문제는 IE8 을 포함한 이하 버전에서는 기능이 지원되지 않아서 입니다. IE9 이상 또는 최신 브라우저를 사용해 주세요.

aqsmc의 이미지

명쾌하고 친절한 답변을 해주셔서 감사합니다.
가지고 있던 궁금증이 모두 해결 되었습니다!