2013-05-23 2 views
6

사용자 입력으로 날짜를 취하고 & 입력을 아래의 쉘 명령에 전달하고 싶습니다.쉘 명령에서 perl 변수 보간

$date = ARGV[0]; 
`cd xyz $date` 

이 변수는 perl로 보간됩니까?

+3

을 시도하고 무슨 일이 일어 나는지 ! – salva

+0

나는 위와 같은 커맨드를 시도 할 수 없다. 커다란 혼란이 될 것이다. 그래서 확인을 위해 스칼라 변수가 ""와 함께 명령어 내부에 보간 될지 물어보고 싶다. – Rock

+3

이 정확한 명령을 시도하지 못할 수도 있지만 엉망진창을 만들지 않고 hello-world-type을 시도해보십시오. – innaM

답변

7

이 테스트에 간단하다 :

입력 :

use v5.16; 
use strict; 
use warnings; 
my $foo = 123; 
say `echo $foo`; 

출력 :

123 

그래서 그래.

셸에서 특별한 의미가있는 문자가 포함 된 변수에주의하십시오.

+0

그래, 이거 ... 고맙습니다. Quentin :) – Rock

10

몇 가지 문제가 있습니다. 먼저 cd은 하나의 매개 변수만을 사용합니다. 아마도 cd xyz$date과 같은 의미일까요? 둘째, 백틱은 사용자가 지정한 명령을 실행하는 셸을 시작합니다.이 명령은 디렉토리 변경 명령을 수행 한 다음 즉시 종료하고 아무 효과가 없습니다. (부모 perl 프로세스의 현재 디렉토리는 변경되지 않습니다.) chdir을 찾고있을 수도 있습니다.

하지만 그렇습니다. 보간법이 작동합니다. 백틱에서 보간을 사용하지 않으려면 특수 문자 (echo xyz \$date)를 이스케이프하거나 작은 따옴표 구분 기호 (qx'echo xyz $date')와 함께 qx를 사용합니다.

6

Perldoc에는 답변이 있습니다.

특히 http://perldoc.perl.org/perlop.html#Quote-and-Quote-like-Operators은 보간에 "예"가 있습니까? 열 (단, 여기서는 걱정할 필요가 없습니다)이므로 변수가 보간 될 것이라고 가정하는 것이 안전합니다.

로컬 명령 줄에서 'perldoc perlop'을 실행하여 동일한 문서를 얻을 수 있습니다.

5

예, 변수를 보간합니다. 그러나 다음 두 가지를 적극 권장합니다.

  • 뒤로 틱 대신 qx/../을 사용하십시오.
  • 먼저 실행중인 명령을 Perl 변수로 설정 한 다음 해당 변수를 보간합니다.

    my $variable = qx(ls $directory); 
    my $variable = qx/ls $directory/; 
    my $variable = qx^ls $directory^; 
    my $variable = qx#ls $directory#; 
    

    문자 후 :

    my $variable = qx(ls $directory); 
    

    당신은 qx에 대한 문자의 다양한 사용할 수 있습니다 : 그것은 더 분명 무슨 일을하고 있습니다 때문에

qx/../은 좋은 qx따옴표으로 사용됩니다. 괄호, 대괄호 또는 중괄호를 사용하는 경우에는 여는 하나와 닫는 짝으로 쌍을 사용합니다.

이것은 명령의 특정 문자로 인해 혼란을 일으킬 수있는 문제를 피할 수 있음을 의미합니다.

다른 것은 Perl 변수에 명령을 작성한 다음 보간을 시도 할 때 실행하는 것입니다. 이것은 당신이하고있는 일을 통해 더 많은 제어 할 수 있습니다 :이 예제 모두에서

my $HOME; 
my $command; 

$HOME = "bin"; 
$command = "ls $HOME"; 
print qx($command); #Lists the directory bin 

$command = 'ls $HOME'; 
print qx($command); #List user's home directory 

, 나는 qx($command)을하고 있어요. 그러나 첫 번째 예에서 Perl은 $HOME. In the second example, I use single quotes, so Perl doesn't substitute the value of $ HOME . Instead, the string $ HOME` 값을 내가 사용하는 명령의 일부로 대체 할 수 있습니다. 나는 쉘이 그것을 보간하도록하고있다.

일반적으로 나는 qx/.../을 사용하는 프로그램을주의해야합니다. 대부분의 경우 Perl 자체에서 수행 할 수있는 명령을 실행하는 데 사용됩니다. 예를 들어, 초기 펄 프로그램에서,이 같은 일을 볼 것 :

$date = `date +%M/%Y/%D` 
chop $date;  #Yeah, I said EARLY Perl programs 

는 순수한 펄 방법으로 일을하려고하기보다는 유닉스 명령을 실행 훨씬 쉽게 단순히 이었기 때문에. 그러나 Perl (즉 은 올바른) 방식을 사용하면 더 이상 사용자의 통제하에 있지 않은 OS의 동작에 더 이상 의존하지 않게됩니다.

Perl 스크립트에서 사용할 명령의 출력이 필요한 경우, open을 사용하여 명령을 실행하고 명령의 출력을 파일로 처리해야합니다. 당신은 단순히 명령을 실행해야하는 경우

my $command = "ls $HOME"; 
open my command_fh, "|-", $command or die qq(Couldn't execute "$command"); 

system 명령을 사용합니다

my $command = "xyz $date"; 
my $error = system $command; 
if ($error) { 
    #Something terrible happened... 
} 

주 당신이 포함 system 명령에 단 하나의 스칼라 인수를 보내는 경우 그 가능한 셸 메타 문자는 OS 셸을 통해 명령을 실행합니다. 당신이 system 명령을 실행 목록을 보낼 경우, 또는 더 쉘 메타 문자가없는, 펄은 쉘 보간하지 않고 직접 명령을 실행 명령 집행을 호출합니다 :

my @command = qw(ls $HOME); 
system @command; #Will print out "No such directory '$HOME' 
+0

@ David W. _ 고맙습니다. 이것은 나와 같은 초보자들에게 매우 유용한 정보입니다. – Rock