实现一个命令,在某个路径下执行给定的命令并返回到当前路径

实现一个命令,在某个路径下执行给定的命令并返回到当前路径

我的代码:

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-dir100% 可靠地返回到同一原始目录。

答案3

当你在bash中分配一个变量时,没有$(与perl不同),但是当你在bash中使用/引用一个变量时,你需要添加$。你的cd prev_dir应该是cd $prev_dir

相关内容