私のコード:
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
、失敗した場合は失敗した状態が必要で、失敗した場合は終了状態が必要です"$@"
。 $@
常に引用する必要があります。cd some-dir;...;cd original-dir
100%安定して同じ元のディレクトリに戻ることは不可能です。
答え3
Bashで変数を割り当てるときは$(perlとは異なり)はありませんが、bashで変数を使用/参照するときは$を追加する必要があります。あなたcd prev_dir
はcd $prev_dir
。