bash 脚本 cd 进入目录

bash 脚本 cd 进入目录

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在新的工作目录中执行。怎么会?

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

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

不久,要更改当前 shell 中的 $PWD,您应该像这样“获取”脚本:

source /path/to/script

或者

. /path/to/script

第三点:如果你不想弄乱sourceor .,你可以在 ~/.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"

当我编写脚本来创建新的虚拟主机时,它对我有用。 “设置前窗口的边界”是可选的。

相关内容