특정 경로에서 주어진 명령을 실행하고 현재 경로로 돌아가는 명령을 구현합니다.

특정 경로에서 주어진 명령을 실행하고 현재 경로로 돌아가는 명령을 구현합니다.

내 코드:

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

그러나 서브쉘을 사용하는 것이 더 쉽습니다.

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실패할 경우 failed 상태를 원하고, 실패할 경우 종료 상태를 원합니다 "$@".
  • $@항상 인용해야 합니다.
  • cd some-dir;...;cd original-dir100% 안정적으로 동일한 원래 디렉터리로 돌아가는 것은 불가능합니다 .

답변3

Bash에서 변수를 할당할 때 $(perl과 달리)는 없지만 bash에서 변수를 사용/참조할 때는 $를 추가해야 합니다. 당신 cd prev_dircd $prev_dir.

관련 정보