你认为在bash或Perl脚本中更改目录是可以接受的吗?或者应该不惜一切代价避免这样做?
这个问题的最佳做法是什么?
就像Hugo说的那样,你无法影响父进程的cwd,所以没有问题.
如果您不控制整个过程,例如子程序或模块,则问题更适用.在这些情况下,您希望退出与您输入的目录相同的子程序,否则微妙的远程动作会导致错误.
你可以手工制作......
use Cwd; sub foo { my $orig_cwd = cwd; chdir "some/dir"; ...do some work... chdir $orig_cwd; }
但那有问题.如果子程序提前返回或死亡(并且异常被捕获),您的代码仍然会存在some/dir
.此外,chdir
s可能会失败,你必须记住检查每次使用.的Bleh.
幸运的是,有几个模块可以让这更容易.File :: pushd是一个,但我更喜欢File :: chdir.
use File::chdir; sub foo { local $CWD = 'some/dir'; ...do some work... }
File :: chdir使目录更改为分配$CWD
.并且您可以进行本地化,$CWD
以便在范围的最后重置,无论如何.它还会自动检查是否chdir
成功,否则抛出异常.有时它会在脚本中使用它,因为它非常方便.
当前工作目录是执行shell的本地目录,因此除非他是"点"(在当前shell中运行它,而不是正常运行它创建新的shell进程),否则不能影响用户.
这样做的一个很好的方法是使用子shell,我经常用别名来做.
alias build-product1='(cd $working-copy/delivery; mvn package;)'
该paranthesis将确保从子shell执行该命令,因此不会影响我的shell的工作目录.它也不会影响last-working-directory,所以cd - ; 按预期工作.