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()、使用反引號 (``) 等。請點擊下面的連結以了解更多資訊。另請注意,程式中所做的任何更改僅影響子 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);

相關內容