Perl 脚本,在终端上执行 cd

joh*_*nes 3 bash terminal cd-command perl

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

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

Dav*_*man 9

你不能。

Perl 脚本在一个进程中运行,该进程是您的 shell 会话的子进程。这个子进程可以随意更改自己的工作目录,但不能更改其父进程的工作目录。当 Perl 脚本退出时,控制权将返回给父进程(shell 会话),无论子进程在运行时做了什么,它一直保持在同一个工作目录中。


Kei*_*son 5

你不能直接这样做。唯一的一个外壳的方法来改变其当前目录是用于壳本身执行cd命令(或者pushdpopd等)。

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

cd-tmp.pl:

#!/usr/bin/perl

print "cd /tmp\n";
Run Code Online (Sandbox Code Playgroud)

在您的.bashrc.bash_profile

cd-tmp() { eval $(cd-tmp.pl); }
Run Code Online (Sandbox Code Playgroud)

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

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

Perl 脚本不能使调用shell 更改目录,但可以为其提供一个命令,然后shell 可以执行该命令。

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

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

更新 :

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