我的代码:
execInPath() {
prev_dir=${PWD##*/}
cd $1
shift
res=$($@)
cd prev_dir
echo res
}
alias path=execInPath
$ path ~ ls
给出:(
bash: cd: prev_dir: No such file or directory
以及之前我的主目录中的文件)
答案1
您必须使用"$prev_dir"
引用变量prev_dir
:
execInPath() {
prev_dir=${PWD##*/}
cd -P -- "$1"
shift
res=$( "$@" )
cd -- "$prev_dir"
printf '%s\n' "$res"
}
alias path=execInPath
但使用子 shell 更容易:
execInPath() {
: 'Change directory in subshell'
(
cd -- "$1" || return 1
shift
res=$( "$@" )
printf '%s\n' "$res"
)
: 'Back to previous dir'
pwd
}
alias path=execInPath
答案2
使用子外壳:
execInPath() (cd -P -- "$1" && shift && exec "$@")
笔记:
- 您需要检查退出状态,
cd
就好像cd
失败一样,您会在错误的目录中运行命令。 - 如果你想像
cd
其他语言一样表现,你需要-P
. - 想想你的函数的退出状态。这里,你希望如果
cd
失败则为不成功,否则为退出状态"$@"
。 $@
必须始终被引用。- 不可能
cd some-dir;...;cd original-dir
100% 可靠地返回到同一原始目录。
答案3
当你在bash中分配一个变量时,没有$(与perl不同),但是当你在bash中使用/引用一个变量时,你需要添加$。你的cd prev_dir
应该是cd $prev_dir
。