문제

다음을 Stdout에 인쇄하는 Perl 스크립트 "foobar.pl"이 있다고 가정 해

date -R

또한 Perl 스크립트 출력을 독립형 배쉬 명령으로 실행하려고합니다 (신뢰할 수있는 환경에서 실행되므로 보안 문제에 대해 걱정하지 마십시오).

Bash가 이것을 독립형 명령으로 인식하는 방법은 무엇입니까?

Xargs를 사용해 보았지만 통과하고 싶은 것 같습니다. 논쟁 만 사전 정의 된 명령에.

Perl 스크립트가 임의의 명령을 출력 할 수 있기를 원합니다.

$command = 'date -R'
system($command); ## in the perl script 

기존 Cygwin 환경에서 실행되기를 원하기 때문에 위의 것은 작동하지 않습니다 ...

foobar.pl | xargs bash -i {}

Bash가 새로운 프로세스를 실행하는 것처럼 보이므로 Bash_profile의 초기화 및 설정이 인스턴스화되지 않기 때문에 위의 내용은 작동하지 않습니다.

도움이 되었습니까?

해결책

나쁜:

`perl foo.pl`
$(perl foo.pl)

이것이 왜 나쁘니? 많은 이유 때문에; 가장 주목할만한 :

  • WordSplitting : 여기서하고있는 일은 Perl 스크립트의 출력을 취하고 공백, 탭 또는 신성경이있는 곳마다 덩어리로 나누고 실행하는 명령 인 첫 번째 덩어리에 인수로 덩어리를 가져갑니다. 정말 매우 단순한 경우와 같은 경우 $(echo 'date +%s') 작동 할 수 있습니다. 그러나 그것은 당신이 정말로 여기서하고있는 일을 정말로 나쁜 표현 일뿐입니다.
  • 인용하거나 다른 사람을 사용할 수 없습니다 bash 매개 변수 확장, 배쉬 키워드 등과 같은 쉘 기능

좋지만 불편 함 :

perl foo.pl > mytmpfile; bash mytmpfile

Perl Script의 출력을 넣은 다음 Bash Works로 실행하는 임시 파일을 만들지 만 임시 파일을 작성하고 정리 해야하는 경우에는 불편합니다.

또한 사용하지 말아야합니다 . 또는 source 실제로 활성 쉘에서 실행하려고하지 않는 한 임시 파일을 실행합니다. 또한, 당신이 사용할 때 . 또는 source, 당신은 나중에 임시 파일을 안정적으로 정리할 수 없습니다.

아마도 최상의 솔루션 :

perl foo.pl | bash

이것은 PERL 스크립트 출력이 올바른 Bash 구문을 가정한다고 가정 할 때 매우 안전한 만능입니다 (버그가 최소 버그가 발생하는 맥락에서 "안전한"은 "안전한 경우".

거의 같은 일을하는 대안 :

bash < <(perl foo.pl)
bash <(perl foo.pl)

다른 팁

`foobar.pl`

Perl 파일이 주어지면 :

print "date";

다음 Bash 명령이 수행됩니다.

> $(perl qq.pl)
Mon Apr  6 11:02:07 WAST 2009

그러나 그것은 별도의 쉘로 실행됩니다. 당신이 정말로 현재의 쉘, 이것을하십시오 :

$ perl qq.pl >/tmp/qq.$$ ; . /tmp/qq.$$ ; rm -f /tmp/qq.$$
Mon Apr  6 11:04:59 WAST 2009

노력하다:

foobar.pl | bash

나는 이것이 당신이 찾고있는 것과 정확히 일치하지 않는다고 생각하지만, 내가 가진 것 :-)

perl foo.pl > /tmp/$$.script; bash /tmp/$$.script; rm /tmp/$$.script

행운을 빕니다!

Open ($ fh, "-|", $ arg1, $ arg2)으로 시도하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top