在更改当前目录的脚本(cd、pwd) 显示了如何运行更改终端目录的 bash 脚本。
但是我如何运行一个 perl 脚本来运行一个 bash 脚本来更改终端目录呢?
答案1
你不能。
Perl 脚本在 shell 会话的子进程中运行。该子进程可以随意更改其自己的工作目录,但无法更改其父进程的工作目录。当 Perl 脚本退出时,控制权返回到父进程(shell 会话),父进程将始终保留在同一工作目录中,无论子进程在运行时做了什么。
答案2
你不能这样做直接地。 shell 更改其当前目录的唯一方法是 shell 本身执行cd
命令(或pushd
、popd
等)。
但你可以间接地做到这一点。这是一个将当前目录更改为的简单示例/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);