用于 cd 到目录的 bash 脚本

Fre*_* J. 0 bash cd-command shell-script

在 Mac 终端上运行的这个 bash 文件无法更改目录。而是在实际存在时报告它不存在。我做错了什么吗?

#!/usr/bin/env bash
set -e
read name
APPLICATION_PATH="~/Documents/meteor/apps/$name"
cd "${APPLICATION_PATH}"
Run Code Online (Sandbox Code Playgroud)

Ser*_*kel 6

有两点:

  • 波浪号扩展的问题
  • 采购与执行的问题。

对于波浪号部分,超级用户最近的一个问题是关于同样的问题(https://superuser.com/questions/1161493/why-bash-script-wont-extend-bashrc/1161496#1161496

波浪号在变量之前展开,因此 cd 找不到路径。为了克服这个问题,请使用以下命令引导命令eval

eval cd "${APPLICATION_PATH}"
Run Code Online (Sandbox Code Playgroud)

不幸的是,当你执行脚本时(我的意思是,如果它被修改为“+x”,调用路径),你会看到 $PWD 在“当前外壳”中没有改变。但是,如果您在脚本末尾添加这样一行

ls
Run Code Online (Sandbox Code Playgroud)

您将看到,ls在新的工作目录中执行。怎么来的?

答案在这里(https://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-and-sourcing-a-bash-scrip#176788

简短回答:source 将在当前 shell 进程中运行命令。执行将在新的 shell 进程中运行命令。仍然困惑?那么请继续阅读长答案。

很快,要在当前 shell 中更改 $PWD,您应该“源”脚本如下:

source /path/to/script
Run Code Online (Sandbox Code Playgroud)

或者

. /path/to/script
Run Code Online (Sandbox Code Playgroud)

第三点:如果你不想弄乱sourceor .,你可以在你的 ~/.bashrc 中定义一个别名(/sf/ask/52676781/ -源命令):

别名 mycmd="源 mycmd.sh"