summaryrefslogtreecommitdiff
path: root/examples/functions/ksh-cd
blob: 801a4909a83114a021fc441c496ec0b83600d7e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#
# ksh-like `cd': cd [-LP] [dir [change]]
#
cd()
{
	OPTIND=1
	while getopts "LP" opt
	do
		case $opt in
		L|P)	CDOPTS="$CDOPTS -$opt" ;;
		*)	echo "$FUNCNAME: usage: $FUNCNAME [-LP] [dir] [change]" >&2
			return 2;;
		esac
	done

	shift $(( $OPTIND - 1 ))

	case $# in
	0)	builtin cd $CDOPTS "$HOME" ;;
	1) 	builtin cd $CDOPTS "$@" ;;
	2)	old="$1" new="$2"
		case "$PWD" in
		*$old*)	;;
		*)	 echo "${0##*/}: $FUNCNAME: bad substitution" >&2 ; return 1 ;;
		esac

		dir=${PWD//$old/$new}

		builtin cd $CDOPTS "$dir" && echo "$PWD"

		;;
	*)	echo "${0##*/}: $FUNCNAME: usage: $FUNCNAME [-LP] [dir] [change]" >&2
		return 2 ;;
	esac
}