前段时间我写了一个脚本(让我们称之为 myScript ),这样它就可以进入特定的文件夹。我把它保存在cygwin主目录中,所以我可以通过调用〜/ myScript来运行它。我遇到了问题,但通过调用
. ~/myScript
来解决问题
我编写了一个父脚本(让我们称之为 parentScript ),它执行的任务很少,并且想要添加一个选项,以便通过调用其中的myScript来cd到我的特定目录。
myScript看起来像这样:
cd /cygdrive/c/Users/USER_NAME
parentScript具有以下内容:
if [ "${1}" -eq CD_TO_USER_NAME_OPTION ]; then . ~/myScript fi
这给了我以前使用myScript时遇到的同样问题。它在子shell中cds,但随后退出,留在我开始的目录中。我希望能够在不使用父母的情况下运行myScript,这就是为什么我没有输入parentScript(如grep -E和Egrep)。 我做错了什么?
答案 0 :(得分:1)
您还需要通过采购来调用parentScript
:
. parentScript
然后,在任何包含该脚本的脚本中,您需要确保第一个参数是
./grandparentScript CD_TO_USER_NAME_OPTION
除了采购之外的任何其他方式调用的脚本都在新进程中运行。进程有自己的当前工作目录(man 3 getcwd)。该目录是从父进程继承的,但是当子进程退出时父进程没有从子进程获取它。使内部脚本更改外部脚本的工作目录的唯一方法是在同一进程中运行它们。最简单的方法是通过采购或.
命令完成,如您所发现的那样。
另一个解决方案是使用shell函数进行目录更改:
magicCd() {
cd my/special/place
}
但是,为避免将过程代码与数据混合,最好的选择可能就是使用内置cd
命令并将所需目标存储在变量中。
my_special_place="$HOME/my/special/place"
cd "$my_special_place"
这最后的内容与源脚本,函数或别名一样抽象,对任何出现的维护程序员来说都更为明显。
答案 1 :(得分:0)
通过别名而不是shell脚本可以做得更好:
$ alias myscript="cd /to/some/directory"
然后执行myscript
会将您置于该目录中:
$ myscript
$ pwd
/to/some/directory