質問のタイトルの選択は少し混乱しています。
pushd/ popd、およびcshによってコピーされた機能は、記憶されたディレクトリのスタックを管理する方法です。bashzsh
pushd /some/dir
プッシュ現在のスタックに作業ディレクトリを、そしてその後、現在の作業ディレクトリを変更し(そして印刷/some/dirそのスタック(スペースで区切られた)の内容が続きます。
popd
スタックのコンテンツを出力し(ここでもスペースで区切られます)、スタックの一番上の要素に変更し、スタックからポップします。
(また、いくつかのディレクトリはそこに~/xまたはの~user/x表記で表されることに注意してください)。
したがって、スタックに現在/aとがある/b場合、現在のディレクトリはで/hereあり、実行中です。
pushd /tmp/whatever
popd
pushd印刷されます/tmp/whatever /here /a /bとpopd意志出力/here /a /b、ありません/tmp/whatever。これは、コマンド置換の使用とは無関係です。popd以前のディレクトリのパスを取得するために使用することはできません。一般に、その出力を後処理することはできません(ただし、そのディレクトリスタックの要素にアクセスするには、一部のシェルの$dirstackor $DIRSTACK配列を参照してください)。
多分あなたが欲しい:
pushd "$(mktemp -d)" &&
popd &&
rmdir "$OLDPWD"
または
cd "$(mktemp -d)" &&
cd - &&
rmdir "$OLDPWD"
しかし、私は使用します:
tmpdir=$(mktemp -d) || exit
(
cd "$tmpdir" || exit # in a subshell
# do what you have to do in that tmpdir
)
rmdir "$tmpdir"
いずれにせよ、サブシェルでpushd "$(mktemp -d)"は実行さpushdれません。その場合、作業ディレクトリを変更できませんでした。それmktempはサブシェルで実行されます。別のコマンドであるため、別のプロセスで実行する必要があります。出力はパイプに書き込まれ、シェルプロセスはパイプの反対側でそれを読み取ります。
コマンドが組み込まれている場合、ksh93は個別のプロセスを回避できますが、それでも、通常はフォークによって提供される個別の環境に依存するのではなく、サブシェル(異なる作業環境)であり、今回はエミュレートされます。たとえばksh93、a=0; echo "$(a=1; echo test)"; echo "$a"では、フォークは関係しませんが、それでもecho "$a"出力します0。
ここで、の出力をmktemp変数に保存する場合、それをpushdに渡すと同時にzsh、を使用して次のようにできます。
pushd ${tmpdir::="$(mktemp -d)"}
他のボーンのようなシェルの場合:
unset tmpdir
pushd "${tmpdir=$(mktemp -d)}"
または、$(mktemp -d)明示的に変数に保存せずに数回の出力を使用するには、zsh無名関数を使用できます。
(){pushd ${1?} && cd - && rmdir $1} "$(mktemp -d)"
trap、プロセスがシグナルによってポークされた場合、ハンドラーはディレクトリをクリーンアップできます。