我想运行一个脚本来简单地更改当前工作目录:
#!/bin/bash
cd web/www/project
但是,运行后,当前的 pwd 保持不变!我怎样才能做到这一点?
答案1
这是预期的行为。该脚本在子 shell 中运行,无法更改父 shell 工作目录。当它结束时,它的效果就会消失。
要永久更改当前 shell 的目录,您应该使用该source
命令,也简单地别名为.
,它在当前 shell 环境而不是子 shell 中运行脚本。
以下命令是相同的:
. script
或者
source script
答案2
对于像这样的小任务,不要创建脚本,而是创建一个像这样的别名,
$ alias cdproj='cd /dir/web/www/proj'
.bashrc
如果您希望为每个交互式 shell 设置它,您应该将其添加到您的文件中。
现在您可以将其运行为$ cdproj
.
答案3
exec bash
最后使用
bash 脚本在其当前环境或其子环境中运行,但绝不会在其父环境中运行。
然而,这个问题经常被问到,因为人们想要执行后留在某个目录的bash提示符下来自另一个目录的 bash 脚本。
如果是这种情况,只需在脚本末尾执行一个子 bash 实例即可:
#!/usr/bin/env bash
cd desired/directory
exec bash
这将创建一个新的子 shell。输入Ctrl+D或exit
返回到最初启动脚本的第一个 shell。
更新:$SHELL
最后使用
至少对于较新版本的bash
,exec
不再需要最后一行。此外,通过使用环境变量,可以使脚本与任何首选的 shell 一起工作$SHELL
。然后给出:
#!/usr/bin/env bash
cd desired/directory
$SHELL
答案4
虽然有一些答案可以执行您想要的确切操作,但用于此目的的更标准方法是创建符号链接:
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