Perl 脚本,在终端上执行 cd

Perl 脚本,在终端上执行 cd

更改当前目录的脚本(cd、pwd) 显示了如何运行更改终端目录的 bash 脚本。

但是我如何运行一个 perl 脚本来运行一个 bash 脚本来更改终端目录呢?

答案1

你不能。

Perl 脚本在 shell 会话的子进程中运行。该子进程可以随意更改其自己的工作目录,但无法更改其父进程的工作目录。当 Perl 脚本退出时,控制权返回到父进程(shell 会话),父进程将始终保留在同一工作目录中,无论子进程在运行时做了什么。

答案2

你不能这样做直接地。 shell 更改其当前目录的唯一方法是 shell 本身执行cd命令(或pushdpopd等)。

但你可以间接地做到这一点。这是一个将当前目录更改为的简单示例/tmp

cd-tmp.pl:

#!/usr/bin/perl

print "cd /tmp\n";

在你的.bashrc.bash_profile

cd-tmp() { eval $(cd-tmp.pl); }

这假设位于cd-tmp.pl您的目录中$PATH,或者您可以在函数中指定完整路径。

当您cd-tmp在 shell 提示符处键入时,它会调用cd-tmp.pl、捕获其输出,并将该输出作为 shell 命令执行。

Perl 脚本无法导致调用 shell 更改目录,但它可以为其提供命令,然后 shell 可以自行执行该命令。

当然,您可以使用除 之外的目录/tmp,包括根据其他信息确定的目录或动态创建的目录。

需要澄清的一点是:当前目录是当前 shell 进程的属性,而不是终端的属性。

更新 :

我刚刚意识到我错过了你问题的一部分;你想要“一个运行bash脚本的perl脚本”。修改我的示例来做到这一点很容易,但我不知道为什么您需要 Perl 脚本来运行 bash 脚本。您还没有告诉我们您实际想要实现的目标。

答案3

有多种方式(蒂姆托维迪)从 Perl 执行外部命令。就像使用exec()、使用反引号 (``) 等。如果您可以直接从 Perl 脚本运行外部命令,那么我认为无需调用另一个 Bash 脚本(但您也可以这样做)。请点击下面的链接了解更多信息。另请注意,程序中所做的任何更改仅影响子 shell,并且仅在整个程序中保持有效,这始终是一件好事,但有一些方法可以使更改永久生效,即它也会影响父 shell。

http://www.perlhowto.com/executing_external_commands

更新-

关于“如何以其他方式做到这一点”的一些问题。对于不寻常的需求,应该有不寻常的解决方案(有效)。但问题是为什么要使用 Perl 来更改父 shell 目录?不管怎样,你都会这样做

$cat test.pl
 print "Hello world\n";
 print "cd ..";
$pwd
 /home/user/perlcode
$eval `perl test.pl|tee -a test.pl.log|grep cd`
$pwd
 /home/user

答案4

另一个解决方案是首先将要访问的目录保存在字符串变量中:
例如:

$cd_path = "/var/tmp";
$cmd_to_run = "cd $cd_path ; ls -lrt";
system($cmd_to_run);

相关内容