【问题标题】:Perl change working directory of callerPerl更改调用者的工作目录
【发布时间】:2011-05-10 19:28:36
【问题描述】:

我想编写一个 perl 脚本,将其工作目录更改为其他位置,执行某些操作,然后在我从 shell 调用它后将我留在那个目录中。 chdir 只做第一部分。如何更改调用者的工作目录?

【问题讨论】:

  • 幸运的是,这是不可能的。

标签: perl working-directory


【解决方案1】:

可能的。

但是,您必须以读/写模式打开其中一个/dev/mem 设备,在内存中找到存储父进程的[dev,ino] 对的正确位置,然后用cwd 戳它新的。

即使你成功了,我怀疑你第二天早上能不能照镜子。我当然知道我永远做不到。 :) 尽管如此,我同事脸上完全惊奇的表情还是值得的。我使用这种方法将他们的 shell 提示从一个命令更改为下一个命令。简直太珍贵了。直到我告诉他们我是怎么做到的,他们才弄明白。

这也不推荐。 :)

【讨论】:

  • 希望你还没有发布代码。因为,当此类脚本变得普遍时,肯定是时候切换到另一个操作系统了。 OTOH,幸运的是,不是每个人都是 root(你需要成为 root,不是吗?)
  • @Ingo:是的,你需要是 root 才能做到这一点。
【解决方案2】:

你想做的事是不可能的。最接近的方法是编写一些 bash 来执行您想要的操作,然后在调用 shell 中获取它而不是运行它。软件不能影响调用它的 shell。

【讨论】:

  • “不可能”不是超严格正确的。我做过这种调皮的事。但是,任何不适用正常规则和法规的豁免肯定不会适用的人不会在这里问这个问题。如果他们认为不可能,那绝对是最好的:考虑他们是否尝试过并错过了。 :)
【解决方案3】:

将您的 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 "$@"

并在调用脚本时获取脚本,即

$ source my_bash.sh

$ . my_bash.sh

(现在您可以使用heredoc语法并将其全部放入一个脚本中:

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

但我认为你不能使用@ARGV 变量)

【讨论】:

  • 这是一个比“不要那样做,这是错误的”更有用的答案。谢谢。
【解决方案4】:

你可以做如下模拟效果:

  1. 用 exec 调用你的脚本
  2. 在您的脚本中,执行一个新的 shell,而不是退出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多