0

我不确定标题是否真的对这个问题有意义。我的问题很简单,我想写一个 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; 
}

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

4

2 回答 2

1

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

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

于 2013-09-13T03:17:28.807 回答
0

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

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

除非 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
于 2013-09-13T03:38:12.790 回答