Mac 终端上运行的这个 bash 文件无法更改目录。相反,当它实际存在时,报告它不存在。我有做错什么吗?
#!/usr/bin/env bash
set -e
read name
APPLICATION_PATH="~/Documents/meteor/apps/$name"
cd "${APPLICATION_PATH}"
答案1
有两点:
- 波形符扩展问题
- 采购与执行的问题。
对于波形符部分,超级用户最近的一个问题是关于同一问题的(https://superuser.com/questions/1161493/why-bash-script-wont-extend-bashrc/1161496#1161496)
波形符在变量之前展开,因此 cd 找不到路径。为了克服这个问题,可以eval
这样引导命令:
eval cd "${APPLICATION_PATH}"
不幸的是,当您执行脚本时(我的意思是,如果它被 chmod'ed 为“+x”,调用路径),您将看到 $PWD 在“当前 shell”中没有更改。但是,如果您在脚本末尾添加这样一行
ls
您将看到,ls
在新的工作目录中执行。怎么会?
简短回答:采购将在当前 shell 进程中运行命令。执行将在新的 shell 进程中运行命令。仍然困惑吗?那么请继续阅读长答案。
不久,要更改当前 shell 中的 $PWD,您应该像这样“获取”脚本:
source /path/to/script
或者
. /path/to/script
第三点:如果你不想弄乱source
or .
,你可以在 ~/.bashrc 中定义一个别名(https://stackoverflow.com/questions/752525/run-bash-script-as-source-without-source-command):
别名 mycmd="源 mycmd.sh"
答案2
你可以使用 tilda '~' 你只需要打开正确的 bash 扩展键
set -x
或使用完整路径“/Volumes/Swap/Apps/...”
使用 bashrc 设置 env 快捷方式,例如
export LocalApps=/Users/me/Applications
export SysApps=/Applications
我不会使用 eval
如果您只想从命令行中读取字符串,则不需要使用 read 只需获取 arg
if [[ $# -eq 1 ]]; then
#check if it's directory
if [[ -d $name ]] ; then
#do stuff here
else
echo 'bomb'
fi
else
usage
fi
学习如何使用 ~+、~-、pushd 和 popd,而不是“cd”到目录,很多时候您不需要实际“cd”到目录
你可能会做这样的事情
pushd $SysApps/$name
do stuff
popd
答案3
不要把~放在“”里面
#!/usr/bin/env bash
set -e
read name
APPLICATION_PATH=~/Documents/meteor/apps/$name
cd "${APPLICATION_PATH}"
pwd
答案4
另一种解决方法是,即使它不会从您正在使用的当前终端窗口中的脚本完全 cd 到该目录,它也会使用 osascript 打开另一个终端并 cd 到您想要的目录:
osascript -e "
tell application \"Terminal\"
do script \"cd $APPLICATION_PATH; pwd;\"
set bounds of front window to {900, 0, 1790, 565}
end tell"
当我编写脚本来创建新的虚拟主机时,它对我有用。 “设置前窗口的边界”是可选的。