質問のタイトルの選択は少し混乱しています。
pushd
/ popd
、およびcsh
によってコピーされた機能は、記憶されたディレクトリのスタックを管理する方法です。bash
zsh
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
以前のディレクトリのパスを取得するために使用することはできません。一般に、その出力を後処理することはできません(ただし、そのディレクトリスタックの要素にアクセスするには、一部のシェルの$dirstack
or $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
、プロセスがシグナルによってポークされた場合、ハンドラーはディレクトリをクリーンアップできます。