diff options
author | Tom Ryder <tom@sanctum.geek.nz> | 2016-08-20 12:29:24 +1200 |
---|---|---|
committer | Tom Ryder <tom@sanctum.geek.nz> | 2016-08-20 12:43:48 +1200 |
commit | 416fc33ff1e9e034cf2bb4a58bb177f46606afd5 (patch) | |
tree | e067bc1c8c7af4bb7267b0b691b8b1a7fe832bb7 /sh | |
parent | Remove option term spec from bd() (diff) | |
download | dotfiles-416fc33ff1e9e034cf2bb4a58bb177f46606afd5.tar.gz dotfiles-416fc33ff1e9e034cf2bb4a58bb177f46606afd5.zip |
Port ud() to POSIX sh
Diffstat (limited to 'sh')
-rw-r--r-- | sh/shrc.d/ud.sh | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/sh/shrc.d/ud.sh b/sh/shrc.d/ud.sh new file mode 100644 index 00000000..0dfd858c --- /dev/null +++ b/sh/shrc.d/ud.sh @@ -0,0 +1,42 @@ +# Shortcut to step up the directory tree with an arbitrary number of steps, +# like cd .., cd ../.., etc +ud() { + + # Change the positional parameters from the number of steps given to a + # "../../.." string + set -- "$( + + # Check first argument, number of steps upward, default to 1 + # "0" is weird, but valid; "-1" however makes no sense at all + steps=${1:-1} + if [ "$steps" -lt 0 ] ; then + printf >&2 'ud(): Invalid step count\n' + exit 2 + fi + + # Check second argument, target directory, default to $PWD + dirname=${2:-"$PWD"} + + # Append /.. to the target the specified number of times + i=0 + while [ "$i" -lt "$steps" ] ; do + dirname=${dirname%/}/.. + i=$((i+1)) + done + + # Check we have a target after all that + if [ -z "$dirname" ] ; then + printf >&2 'ud(): Destination construction failed\n' + exit 1 + fi + + # Print the target + printf '%s\n' "$dirname" + + # If the subshell failed, return from the function with the same exit + # value + )" || return + + # Try to change into the determined directory + command cd -- "$@" +} |