my code:
execInPath() {
prev_dir=${PWD##*/}
cd $1
shift
res=$($@)
cd prev_dir
echo res
}
alias path=execInPath
$ path ~ ls gives:
bash: cd: prev_dir: No such file or directory
(and the files in my home directory prior to that)
You must use "$prev_dir" to reference variable prev_dir:
execInPath() {
prev_dir=${PWD##*/}
cd -P -- "$1"
shift
res=$( "$@" )
cd -- "$prev_dir"
printf '%s\n' "$res"
}
alias path=execInPath
But using a subshell is easier:
execInPath() {
: 'Change directory in subshell'
(
cd -- "$1" || return 1
shift
res=$( "$@" )
printf '%s\n' "$res"
)
: 'Back to previous dir'
pwd
}
alias path=execInPath
Use a subshell:
execInPath() (cd -P -- "$1" && shift && exec "$@")
Notes:
cd as if cd fails, you'd run the command in the wrong directory.cd to behave like in other languages, you need -P.cd fails, and be the exit status of "$@" otherwise.$@ must be quoted always.cd some-dir;...;cd original-dir and get back to the same original directory 100% reliably.When you assign a variable in bash, there is no $ (unlike perl), but when you use/refer to a variable in bash, you need to add the $ to it. Your cd prev_dir should be cd $prev_dir.
cd $prev_dir doesn't make sense. It should be at least cd "$prev_dir" or rather cd -P -- "$prev_dir".
export prev_dir="/bin";cd $prev_dir works just fine.
cd $prev_dirinstead ofcd prev_dir; maybe alsoecho $res