无法多次在当前环境中运行BASH脚本

时间:2011-07-13 22:13:00

标签: linux bash cd

我有一个bash脚本,我用它从我目前的任何地方从源目录移动到bin目录(我称之为脚本,'teleport')。因为它基本上只是一个美化的'cd'命令,所以我必须在当前的shell中运行它(即./teport.sh)。我在.bashrc文件中设置了一个别名,以便'teleport'匹配'。 teleport.sh”。

我第一次运行它,它运行正常。但是,如果我在运行一次之后再次运行它,它什么都不做。如果我关闭终端然后打开一个新终端,它会再次起作用,但这只是第一次。我的直觉是BASH内部有一些我不熟悉的东西,所以我想我会通过这里的大师来看看我是否能得到答案。

脚本是:

numargs=$#

function printUsage 
{
        echo -e "Usage: $0 [-o | -s] <PROJECT>\n"
        echo -e "\tMagically teleports you into the main source directory of a project.\n"
        echo -e "\t PROJECT: The current project you wish to teleport into."
        echo -e "\t -o: Teleport into the objdir.\n"
        echo -e "\t -s: Teleport into the source dir.\n"
}

if [ $numargs -lt 2 ]
then
        printUsage
fi

function teleportToObj
{
  OBJDIR=${HOME}/Source/${PROJECT}/obj
  cd ${OBJDIR}
}

function teleportToSrc
{
  cd ${HOME}/Source/${PROJECT}/src
}

while getopts "o:s:" opt
do
  case $opt in
    o)
      PROJECT=$OPTARG
      teleportToObj
      ;;
    s)
      PROJECT=$OPTARG
      teleportToSrc
      ;;
   esac
done

我对它的使用类似于:

sjohnson@corellia:~$ cd /usr/local/src
sjohnson@corellia:/usr/local/src$ . ./teleport -s some-proj
sjohnson@corellia:~/Source/some-proj/src$ teleport -o some-proj
sjohnson@corellia:~/Source/some-proj/src$ 
<... START NEW TERMINAL ...>
sjohnson@corellia:~$ . ./teleport -o some-proj
sjohnson@corellia:~/Source/some-proj/obj$

2 个答案:

答案 0 :(得分:5)

问题在于getopts必须保持一点状态,以便可以在循环中调用它,并且您不会清除该状态。每次调用它时,它会再处理一个参数,并递增shell的OPTIND变量,以便它知道下次调用时要处理的参数。当它完成所有参数时,每次调用它都会返回1(false),这会使while退出。

首次发布脚本时,它会按预期工作。第二个(和第三个,第四个......)时间getopts除了返回错误之外什么都不做。

在开始循环之前添加一行以重置状态:

unset OPTIND   # clear state so getopts will start over
while getopts "o:s:" opt
do
    # ...
done

(我假设你的成绩单中有一个拼写错误,因为它显示你在第二次尝试时调用脚本 - 而不是采购它 - 但这不是真正的问题。)

答案 1 :(得分:2)

问题是你第一次打电话的时候是你正在寻找脚本(那就是“./teport”)在当前shell中运行脚本所以保留了cd。第二次调用它时,它不是来源的,所以你创建一个子shell,cd到相应的目录,然后退出子shell,将你直接从你调用脚本的地方开始!

使这项工作的方法只是使teleportToSrc和teleportToObj别名或函数在当前shell中(即在脚本之外)