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


