2011-05-10 118 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