perl - 在脚本中更改工作目录的最佳做法是什么?

标签 perl bash shell zsh

您认为在 bash 或 Perl 脚本中更改目录是否可以接受?还是应该不惜一切代价避免这样做?

这个问题的最佳做法是什么?

最佳答案

正如 Hugo 所说,您不能影响父进程的 cwd,所以没有问题。

问题更适用的地方是,如果您不控制整个过程,例如在子例程或模块中。在这些情况下,您希望在进入时所在的同一目录中退出子例程,否则细微的远距离 Action 会导致错误。

你可以手动...

use Cwd;
sub foo {
    my $orig_cwd = cwd;
    chdir "some/dir";

    ...do some work...

    chdir $orig_cwd;
}

但这有问题。如果子例程提前返回或终止(并且异常被捕获),您的代码仍将位于 some/dir 中。此外,chdir 可能会失败,您必须记得检查每次使用。呸。

幸运的是,有几个模块可以使这更容易。 File::pushd 是一个,但我更喜欢 File::chdir .

use File::chdir;
sub foo {
    local $CWD = 'some/dir';

    ...do some work...
}

File::chdir 使更改目录成为分配给 $CWD。并且您可以本地化 $CWD,因此它会在您的范围结束时重置,无论如何。它还会自动检查 chdir 是否成功,否则抛出异常。有时它会在脚本中使用它,因为它非常方便。

关于perl - 在脚本中更改工作目录的最佳做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/240661/

相关文章:

perl - perl 中的 Hello world OOP 示例?

linux - 在双引号内使用双引号

java - 某些 Unix 命令失败并显示 "... not found",即使在启用 setPty 的情况下使用 JSch 通过 Java 执行

perl - 如何在 Cygwin 中安装 Perl 库?

Perl DBI - 使用多条语句运行 SQL 脚本

mysql - 绑定(bind)值 INSERT INTO mysql perl

linux - 从 shellcode 启动的 Shell 在启动时立即停止

bash - 在 awk 中结合 if 和 NR

linux - Bash shell 'if' 语句比较不同命令的输出

Python:我想使用python脚本执行shell命令