내 코드:
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-dir
100% 안정적으로 동일한 원래 디렉터리로 돌아가는 것은 불가능합니다 .
답변3
Bash에서 변수를 할당할 때 $(perl과 달리)는 없지만 bash에서 변수를 사용/참조할 때는 $를 추가해야 합니다. 당신 cd prev_dir
은 cd $prev_dir
.