joh*_*nes 3 bash terminal cd-command perl
在更改当前目录的脚本 (cd, pwd) 中 ,展示了如何运行更改终端目录的 bash 脚本。
但是我如何运行一个 perl 脚本来运行一个改变终端目录的 bash 脚本?
你不能。
Perl 脚本在一个进程中运行,该进程是您的 shell 会话的子进程。这个子进程可以随意更改自己的工作目录,但不能更改其父进程的工作目录。当 Perl 脚本退出时,控制权将返回给父进程(shell 会话),无论子进程在运行时做了什么,它一直保持在同一个工作目录中。
你不能直接这样做。唯一的一个外壳的方法来改变其当前目录是用于壳本身执行cd
命令(或者pushd
,popd
等)。
但是你可以间接地做到这一点。这是一个将当前目录更改为的简单示例/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 脚本。你还没有告诉我们你真正想要实现的目标。