特定のパスで指定されたコマンドを実行し、現在のパスに戻るコマンドを実装します。

特定のパスで指定されたコマンドを実行し、現在のパスに戻るコマンドを実装します。

私のコード:

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-dir100%安定して同じ元のディレクトリに戻ることは不可能です。

答え3

Bashで変数を割り当てるときは$(perlとは異なり)はありませんが、bashで変数を使用/参照するときは$を追加する必要があります。あなたcd prev_dircd $prev_dir

関連情報