Perl如何在同一个shell中执行命令呢?

时间:2013-09-13 03:14:01

标签: perl shell command

我不确定标题是否真的对这个问题有意义。我的问题很简单,我想编写一个perl脚本来更改我当前的目录,并希望在调用perl脚本后可以保留结果。脚本如下所示:

if ($#ARGV != 0) {
    print "usage: mycd <dir symbol>";
    exit -1;
}

my $dn = shift @ARGV; 

if ($dn eq "kite") {
    my $cl = `cd ./private`;
    print $cl."\n"; 
}
else {
    print "unknown directory symbol";
    exit -1; 
}

但是,调用脚本后我的当前目录不会更改。是什么原因?我该如何解决?

2 个答案:

答案 0 :(得分:1)

不,Perl脚本将在子进程中运行,因此它将无法影响调用它的进程的环境。

您可以使用各种技巧,例如获取shell脚本(在当前shell的上下文而不是子进程中),或使用bash函数和别名,但它们在此处不起作用。

答案 1 :(得分:0)

  

Perl如何在同一个shell中执行命令?

除非你有一个非常典型的shell,shell只能通过STDIN,命令行以及内置的命令评估接收命令。

前两个是out,除非Perl脚本是shell的父级,但你可以间接使用第三个,如下例所示。

script.pl

#!/usr/bin/perl
print "chdir 'private'\n";

bash脚本:

echo "$PWD"             # /some/dir
eval "$( script.pl )"
echo "$PWD"             # /some/dir/private

当然,如果你使用bash,你可以在shell函数中隐藏细节。

mycd () {
    eval "$( mycd.pl "$@" )"
}

允许您使用

mycd

甚至

mycd foo