为什么脚本中的 cd 功能不起作用

为什么脚本中的 cd 功能不起作用

我编写了一个脚本来更改目录,然后扫描文件。

#!/bin/bash
model_dir=/mypath

function chdir () {
  cd $1
}
chdir ${model_dir}/config
if [[ ! -s *.cfg ]]
then
  echo `date` "configure file does not exist"
  exit 1
fi

我不明白为什么在我使用 执行此脚本后我的当前目录没有更改source myscript.sh

答案1

当使用或等效命令调用时,您的脚本(特别是其内部cd命令)可以正常工作。bashsource.

主要问题是,正如 @adonis 评论中已经指出的那样,您的 shell 在正确更改其目录后将退出,除非确实存在名为“*.cfg”的文件,这是非常值得怀疑的。

我猜您想使用 *.cfg 作为模式,以下是我将如何稍微修改您的脚本以使其按预期工作:

#!/bin/bash # Note that the shebang is useless for a sourced script

model_dir=/mypath

chdir() { # use either function or (), both is a non portable syntax
  cd $1
}

chdir ${model_dir}/config
if [ ! -s *.cfg ]; then # Single brackets here for the shell to expand *.cfg
  echo $(date) "configure file does not exist"
  exit 1  # dubious in a sourced script, it will end the main and only shell interpreter
fi

答案2

这是因为该cd命令是在脚本内部执行的,而不是在当前的 shell 环境中执行的。如果您希望脚本在当前的 shell 环境中运行,请像这样运行:

. /path/to/script.sh

我自己的脚本工作示例的输出,并pwd替换了您的if语句:

Jamey@CNU326BXDX ~
$ /usr/local/bin/this.sh
/cygdrive/c/users/jamey/downloads

Jamey@CNU326BXDX ~
$ . /usr/local/bin/this.sh
/cygdrive/c/users/jamey/downloads

Jamey@CNU326BXDX /cygdrive/c/users/jamey/downloads
$

请注意脚本第二次运行后的当前工作目录。

相关内容