如何通过提供来自终端的输入,使用perl脚本在终端中进行cd?

如何通过提供来自终端的输入,使用perl脚本在终端中进行cd?,perl,Perl,我是perl方面的新手,如何也使用perl更改终端中的当前工作目录。 我想从终端提供输入,所以它将需要相应的目录 use Cwd; my $in1 = shift; my $in2 ="/usr/swarak/scripts/dir"; my $str = $in2.$in1; print "$str\n"; chdir "$str"; print(cwd); 这正在改变当前的脚本执行目录,我想改变Linux终端也 输出:如果我给1,

我是perl方面的新手,如何也使用perl更改终端中的当前工作目录。 我想从终端提供输入,所以它将需要相应的目录

use Cwd;
my $in1 = shift;
my $in2 ="/usr/swarak/scripts/dir";
my $str = $in2.$in1;
print "$str\n";
chdir "$str";
print(cwd);
这正在改变当前的脚本执行目录,我想改变Linux终端也

输出:如果我给1,它应该是/usr/swarak/scripts/dir1,如果我给99,/usr/swarak/scripts/dir99


我丢失了dir,所以需要这个简单的快捷方式。

Linux服务器上的每个进程都在一个环境中运行。当前工作目录是该环境的属性之一

当一个新进程启动时(并且您的Perl程序作为一个新进程运行),它将从其父进程继承当前环境。然后,新流程可以对其新环境进行任何更改。但是,它不能更改其父环境。当进程结束时,其环境将被破坏

那么,这里发生了什么:

  • 您有一个进程(例如,您的shell窗口),它有自己的环境。当前工作目录是。。。好吧,让我们看看你的主目录
  • 运行Perl程序。继承现有环境的副本,并将当前工作目录设置为主目录
  • 您可以将程序目录更改为新目录。这在子流程环境中。它不会影响父环境
  • 您的程序结束并退出。子流程环境被破坏
  • 您回到了shell窗口环境中。这种环境没有改变。因此,您当前的工作目录没有更改

这是所有Unix/Linux用户都必须在某个时候自己去发现的。您不能编写更改其父进程当前工作目录的程序。

您不能这样做,因为Perl脚本解释器将在不同的进程(而不是bash)中运行,并且当它离开时,其环境将被破坏(即调用方环境CWD…不变)。使用bash函数。。。[如果我没有误解您的问题!]另请参阅并非常感谢您的评论,我现在明白了,我们如何在bash脚本中实现它?您可以将此添加到
perl
脚本的末尾:
print“启动子shell,完成后退出”。\n;exec$ENV{SHELL}来模拟您想要做的事情。非常感谢您解释环境,我现在理解了限制。但对于这个问题,还有其他方法吗?我尝试在cshrc中使用别名,但失败了,而且csh不支持在函数中使用函数,我没有bash,无法安装它。@swarak:您可以使用这里描述的方法-。让您的程序打印目录并与
source
一起使用。直到这里,```/usr/bin/csh`set num=“$argv”set scr=(/usr/swarak/scripts/dir)set scrp=“$scr$num”echo“$scrp”set jobdir=
dirname$scrp
cd$jobdir from terminal:source cdn.csh 1这将一直到/usr/swarak/scripts,并在echo中打印正确的dir,/usr/swarak/scripts/dir1,但它不会进入内部dir1@swarak:请不要在注释中添加代码。这真的很难读。而是添加新代码。@swarak:您刚刚编写了一个csh版本的Perl代码。因为完全相同的原因,它不起作用。子进程不能更改其父进程的环境。