更改当前目录的脚本(cd,pwd)


Answers:


63

这是一种预期的行为,并且已经讨论了多次。

该脚本在子外壳程序中运行,并且无法更改父外壳程序工作目录。完成时会失去效果。

要永久更改目录,应提供脚本,如下所示:

. ./script

8
@Sony:请注意,您应该使用return退出以这种方式获得的脚本的方式,而不是exit-它们类似于shell函数,并且exit将退出获得该脚本的shell。
查尔斯·斯图尔特

@CharlesStewart实际上,我不熟悉源脚本。谢谢!
索尼桑托斯,

5
source ./script一样的吗?
amyassin 2011年

2
@amyassin:是的,是
enzotib 2011年

2
1. .sourcebash相等。2. ./如果文件名在同一目录中,则无需在文件名前使用。可以仅运行以下命令:. script
sobi3ch

19

对于这样的小任务,不要创建脚本,而要创建别名,

$ alias cdproj='cd /dir/web/www/proj'

.bashrc如果要为每个交互式shell设置它,则应将其添加到文件中。

现在,您可以将其运行为$ cdproj


1
您还可以让脚本回显要执行的命令,然后使用eval `./script` eval $(./script)执行这些命令。这是需要更新调用外壳程序环境的命令的常用方法。
基思·汤普森

2
如果要采用该eval方法,请非常小心您的输出。
2012年

13

使用exec bash

bash脚本在其当前环境或其子级环境上运行,但绝不在其父级环境上运行。

但是,经常会问这个问题,因为一个人想另一个目录中执行 bash脚本后,留在某个目录中的bash提示符下

如果是这种情况,只需在脚本末尾执行一个子bash实例:

#!/usr/bin/env bash
cd desired/directory
exec bash

这将创建一个新的子外壳。键入exit以返回到最初启动脚本的第一个外壳程序。


最好只是提供脚本,如公认的答案:使用exec通常被认为是无赖的最后手段。.:)
Neuronet

1
这个技巧在debian 9 Stretch中不起作用。
vdegenne

3
这是错误的解决方法!
丹尼斯·威廉姆森

3
由于没有人详细说明此问题(我在看着您,@ Dennis),所以:(1)每次运行此命令时,它都会创建一个新的持久性bash进程。在一个会话中执行十或二十次,您将堆积11至21个bash进程。这可能会影响性能,并且,如果尝试通过键入exit(或Ctrl + D)完全终止会话,则必须执行11到21次。(2)使用可执行脚本的另一个缺点是,如果您在交互式shell会话中设置了任何shell选项(例如  dotglob或  globstar),则会丢失它们,因为您正在启动新的shell。
G-Man说“恢复莫妮卡”

1
非常好的解决方案!我已经在bash_profile中重写了别名,所以现在它是一个存储在单独文件中的脚本。我使用脚本转到新创建的临时文件夹。现在,进行临时bash会话更加容易。SRP在行动!谢谢!
artyom.razinov

8

尽管有答案可以执行所需的确切操作,但用于此目的的更标准方法是创建符号链接:

ln -s ~/web/www/project proj   #use full path to dir!

然后,您可以cd使用以下名称进入目录proj

cd proj

此方法更加灵活,因为您可以使用短名称访问文件而无需cd

ls proj/   #note the endslash!
vim proj/file.x


4

根据您要执行的操作,另一个解决方案可以是创建函数而不是脚本。

例:

在文件中创建一个函数,假设/home/aidin/my-cd-script

function my-cd() {
  cd /to/my/path
}

然后将其包含在您的bashrczshrc文件中:

# Somewhere in rc file
source /home/aidin/my-cd-script

现在您可以像命令一样使用它:

$ my-cd

0

为什么不使用它的“ exec”接缝来完全按照我的意愿去做。

#!/bin/bash

cd someplace
exec bash

~/someplace

1
当心似乎是您想要的东西。(一头巨大的木马!正是我想要的!)每次运行此命令时,它都会创建一个新的持久性bash过程。在一个会话中执行十或二十次,您将堆积11至21个bash进程。这可能会影响性能,并且,如果尝试通过键入exit(或Ctrl + D)完全终止会话,则必须执行11到21次。
G-Man说“恢复莫妮卡”

我绝对可以看到这将是一个问题。对我来说,虽然我已经使用了一次,但完成我需要的工作然后退出,如果那是我唯一可以忍受的缺点。另一方面,如果有更好的解决方案,我愿意研究一下。
paul

与外壳程序相比,使用shell函数的Aidin答案和使用别名的Sachin Divekar的答案是(IMO)更好的解决方案。PS使用脚本的另一个缺点是,如果您设置了任何外壳程序选项(例如  dotglob或  globstar),则会丢失它们,因为您正在启动新的外壳程序。…(续)
G-Man说“恢复莫妮卡”

(续)…PPS我刚刚注意到您基本上是在重申Serge Stroobandt的回答,并说“为什么不这样做?”在  Stack Exchange,我们希望答案能提供新的想法和/或信息,而不仅仅是讨论其他答案。
G-Man说“恢复莫妮卡”

-1

您可以使用函数或使用&&进行此操作。下面的示例将安装Zabbix并创建一个文件,其中包含一行。

例如:

#!/bin/bash

# Create Function:
installZabbix(){
    cd /usr/src/zabbix-4.2.4;
    ./configure --enable-agent;
    make install;
    cd /usr/src/;
    >file;
    echo "Hi, this is a file." >>file;
}

# Call the function:
installZabbix

要么:

#!/bin/bash
cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.