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

Son*_*tos 93 scripting bash cd-command environment-variables

我想运行一个脚本来简单地更改当前工作目录:

#!/bin/bash
cd web/www/project
Run Code Online (Sandbox Code Playgroud)

但是,运行后,当前密码保持不变!我怎样才能做到这一点?

enz*_*tib 123

这是预期的行为。该脚本在子 shell 中运行,不能更改父 shell 工作目录。当它完成时,它的效果就会消失。

要永久更改当前 shell 的目录,您应该使用该source命令,也简称为.,它在当前 shell 环境而不是子 shell 中运行脚本。

以下命令是相同的:

. script
Run Code Online (Sandbox Code Playgroud)

或者

source script
Run Code Online (Sandbox Code Playgroud)

  • @Sony:请注意,您应该使用 `return` 来退出以这种方式获取的脚本,而不是 `exit` - 它们就像 shell 函数,并且 `exit` 将退出获取脚本的 shell。 (11认同)
  • `source ./script` 是一样的吗? (8认同)
  • 1. `.` 和 `source` 在 bash 中是相等的。2.如果文件名在同一目录下,我们不需要在文件名前使用`./`。只运行这个就可以了:`. 脚本` (5认同)
  • @amyassin:是的,它是 (3认同)

Sac*_*kar 45

对于这样的小任务,与其创建脚本,不如创建一个像这样的别名,

$ alias cdproj='cd /dir/web/www/proj'
Run Code Online (Sandbox Code Playgroud)

.bashrc如果您希望为每个交互式 shell 设置它,您应该将它添加到您的文件中。

现在您可以将其作为$ cdproj.

  • 如果你打算使用 `eval` 方法,请非常小心你的输出。 (2认同)

Ser*_*ndt 28

使用exec bash

bash 脚本在其当前环境或其子环境中运行,但从不在其父环境中运行。

然而,这个问题经常被问到,因为从另一个目录执行bash 脚本后,人们希望留在某个目录中的 bash 提示符

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

#!/usr/bin/env bash
cd desired/directory
exec bash
Run Code Online (Sandbox Code Playgroud)

这将创建一个新的子外壳。键入Ctrl+Dexit返回到最初启动脚本的第一个 shell。

更新:使用$SHELL

至少对于较新版本的bashexec不再需要最后一行的 。此外,可以通过使用$SHELL环境变量使脚本与任何首选的 shell 一起工作。这然后给出:

#!/usr/bin/env bash
cd desired/directory
$SHELL
Run Code Online (Sandbox Code Playgroud)

  • 由于没有人详细说明这个问题(我在看着你,@Dennis):(1) 每次运行它时,它都会创建一个新的、持久的 bash 进程。在一个会话中执行十到二十次,您将有 11 到 21 个 bash 进程堆积起来。这可能会影响性能,并且,如果您尝试通过键入 `exit`(或 Ctrl+D)干净地终止会话,则必须执行 11 到 21 次。(2) 使用可执行脚本的另一个缺点是,如果您在交互式 shell 会话中设置任何 shell 选项(例如,`dotglob` 或 `globstar`),您将丢失它们,因为您正在启动一个新的 shell。 (7认同)
  • 这是解决这个问题的错误方法! (6认同)
  • 最好只提供脚本,如接受的答案:使用`exec`通常被认为是恶棍的最后手段..:) (2认同)

小智 14

取决于您要做什么,另一种解决方案可以是创建函数而不是脚本。

例子:

在文件中创建一个函数,让我们说/home/aidin/my-cd-script

function my-cd() {
  cd /to/my/path
}
Run Code Online (Sandbox Code Playgroud)

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

# Somewhere in rc file
source /home/aidin/my-cd-script
Run Code Online (Sandbox Code Playgroud)

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

$ my-cd
Run Code Online (Sandbox Code Playgroud)


小智 11

虽然有些答案可以执行您想要的确切操作,但用于此目的的更标准方法是创建符号链接:

ln -s ~/web/www/project proj   #use full path to dir!
Run Code Online (Sandbox Code Playgroud)

然后你可以cd使用名称进入目录proj

cd proj
Run Code Online (Sandbox Code Playgroud)

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

ls proj/   #note the endslash!
vim proj/file.x
Run Code Online (Sandbox Code Playgroud)