无法按预期在bash脚本中使用cd

时间:2012-01-02 13:53:01

标签: bash

考虑我编写的这个脚本,当没有给出参数时,它应该进入父目录(if ...部分)。

#/bin/bash

if (($# == 0))
then
  cd ..
else
  for basename
  do
    cd ${PWD%$basename*}$basename
  done
fi

问题是,如果我像这样执行它

./up.sh

cd在子shell中执行,使其无用。

如果我使用source执行脚本,它可以工作,但我不想这样调用它(我调用脚本变得复杂,你也希望直接调用它,如果在PATH)。

2 个答案:

答案 0 :(得分:3)

任意程序(例如你的bash程序)都不能改变父进程的工作目录,因为这几乎会破坏产生子进程的所有现有进程。

您应该定义bash aliasfunction。正如您所发现的那样,输入source ./up.sh(或更短:. ./up.sh)也可以。

答案 1 :(得分:3)

我建议使用函数而不是脚本

function myscript()
{
     // use $1, $2, "$@" as usual in scripts

     local v1="bla"       # can use globals
     export PATH="$PATH"  # but global shell env too

     somedirectory=.. 
     cd $somedirectory
}

或者,alias可以工作(但它不支持重定向,参数传递,流量控制等,并且你不能将它们嵌套在$() IIRC中)。

最后在当前shell中获取现有脚本,如下所示:

source ./script.sh

ksh和bash有这样的缩写:

. ./script.sh

请注意带有'exit'语句的脚本:它们将退出父shell!