【问题标题】:How Perl can execute a command in the same shell with it?Perl 如何在同一个 shell 中执行命令?
【发布时间】:2013-09-17 15:11:23
【问题描述】:

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

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

【问题讨论】:

  • 不可能。您必须编写一个 shell 脚本。

标签: perl shell command


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      相关资源
      最近更新 更多