2011-05-10 122 views
3

我想編寫一個perl腳本,將其工作目錄更改爲其他位置,執行某些操作,然後在我從shell調用該目錄後將該目錄留在該目錄中。 chdir只做第一部分。如何更改呼叫者的工作目錄?Perl更改調用者的工作目錄

+9

幸運的是,這是不可能的。 – Ingo 2011-05-10 19:30:37

回答

5

你想做什麼是不可能的。最接近的做法是編寫一些bash,然後在調用shell中發送它,而不是運行它。軟件不能影響調用它的shell。

+1

「不可能」不是**超嚴格**是真實的。我做了這種頑皮。但是,凡是豁免正常規章制度的人都不適用,肯定不會適用,這裏就不會問了。這絕對是最好的,如果他們*認爲*不可能:考慮他們是否嘗試過,錯過了。 :) – tchrist 2011-05-10 20:31:23

2

你可以做followng模擬效果:

  1. 打電話給你的腳本EXEC
  2. 在你的腳本,而不是退出,exec的一個新的外殼。
5

將您的perl腳本包裝在shell腳本中,在執行perl腳本之前從bash腳本中更改目錄並獲取腳本。

所以不是一個Perl腳本,如:

#!/usr/bin/perl 
# my_program.pl ... 
chdir "/my/directory"; 
... 

使用,比方說,一個bash腳本,如:

#!/usr/bin/bash 
cd /my/directory 
perl my_program.pl "[email protected]" 

和來源,當你把它叫做腳本,即

$ source my_bash.sh 

$ . my_bash.sh 

(現在你可以使用的定界符,並把它所有到一個腳本:

#!/usr/bin/bash 
cd /my/directory 
perl <<EOF 
... include your perl script here ... 
EOF 

但我不認爲你可以使用@ARGV變量)

+0

這是比「不要那樣做,這是錯誤的」更有用的答案。謝謝。 – 2014-12-04 19:49:16

9

可能。

但是,你必須打開在讀/寫模式/dev/mem設備之一,在存儲器中找到合適的位置存儲父進程的[dev,ino]對爲其cwd,並用新捅它。

即使你管理,我懷疑你可以在第二天早上看到自己在鏡子裏。我確定知道我永遠不會。 :)儘管如此,我的同事們臉上的神態完全是值得的。我使用這種方法將shell的提示從一個命令更改爲下一個命令。這只是珍貴的。直到我告訴他們我是如何做到的,他們根本弄不明白。

這也不被推薦。 :)

+1

我希望你還沒有發佈的代碼。因爲,當這些腳本變得很普遍時,切換到另一個操作系統肯定是時候了。 OTOH,幸運的是,不是每個人都是根源的(你需要爲此做根,不是嗎?) – Ingo 2011-05-10 20:45:56

+0

@Ingo:是的,你需要成爲root用戶才能做到這一點。 – tchrist 2011-05-10 22:52:56

+0

這真的很有趣。 – 2011-05-10 23:58:59