考虑我编写的这个脚本,当没有给出参数时,它应该进入父目录(if ...部分)。
#/bin/bash
if (($# == 0))
then
cd ..
else
for basename
do
cd ${PWD%$basename*}$basename
done
fi
问题是,如果我像这样执行它
./up.sh
cd在子shell中执行,使其无用。
如果我使用source
执行脚本,它可以工作,但我不想这样调用它(我调用脚本变得复杂,你也希望直接调用它,如果在PATH)。
答案 0 :(得分:3)
任意程序(例如你的bash程序)都不能改变父进程的工作目录,因为这几乎会破坏产生子进程的所有现有进程。
您应该定义bash alias或function。正如您所发现的那样,输入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!