Bash 如何在不更改目录的情况下将目录从popd保存到变量?

Bash 如何在不更改目录的情况下将目录从popd保存到变量?,bash,macos,cd,Bash,Macos,Cd,我知道我在Linux机器上遇到了这个问题,但现在我在Mac OS X上,我需要做同样的事情。我想使用pushd和popd在多个位置调用脚本或二进制文件,但在此期间我需要保持相同的工作目录 这是一个测试脚本。我想这是我之前做这件事的愚蠢方式: cd ~ pushd . 1>/dev/null cd Documents NEW_DIR=`pwd` OLD_DIR=$(`popd`) cd $OLD_DIR echo Current directory: `pwd` echo New direc

我知道我在Linux机器上遇到了这个问题,但现在我在Mac OS X上,我需要做同样的事情。我想使用pushd和popd在多个位置调用脚本或二进制文件,但在此期间我需要保持相同的工作目录

这是一个测试脚本。我想这是我之前做这件事的愚蠢方式:

cd ~
pushd . 1>/dev/null
cd Documents
NEW_DIR=`pwd`
OLD_DIR=$(`popd`)
cd $OLD_DIR
echo Current directory: `pwd`
echo New directory: $NEW_DIR
其结果是:

$ ./pushpop.sh
./pushpop.sh: line 5: cd: ~: No such file or directory
Current directory: /Users/NobleUplift
New directory: /Users/NobleUplift/Documents

它可以工作,但不是没有错误。

popd
是一个命令,它将弹出目录堆栈的顶部并将您的工作目录更改为它,因此您不需要使用
cd
。因此,您的
pushpop.sh
应该如下所示:

#!/bin/bash
cd ~/
pushd . 1>/dev/null
cd Documents
NEW_DIR=`pwd`
popd
echo Current directory: `pwd`
echo New directory: $NEW_DIR
您将获得所需的输出:

~
Current directory: /home/imp25
New directory: /home/imp25/Documents
编辑以下OPs评论 如果您想在不移动目录的情况下捕获
popd
的输出,最好是对
pushd
添加到的目录堆栈进行互操作,然后弹出
popd
。您可以使用查看堆栈,它将给出目录列表,第一个目录是您当前的工作目录,即:

cd ~
pushd .
cd Documents
pushd .
dirs
~/Documents ~/Documents ~
您可以使用dirs的
+N
-N
选项访问堆栈中的特定条目(
+N
从左侧开始计数,
-N
从右侧开始计数)。如果要获取最后一个推送到堆栈的内容,可以使用
dirs+1
访问它

修改脚本会给您带来如下效果:

cd ~/
pushd . 1>/dev/null
cd Documents
NEW_DIR=`pwd`
OLD_DIR=$(dirs -l +1)
cd $OLD_DIR
echo Current directory: `pwd`
echo New directory: $NEW_DIR

这里,
$(dirs-l+1)
获取您推送的堆栈顶部,并以长格式返回它(例如,将
~
扩展到
/home/foo
)。我认为您遇到的错误是
cd
没有正确地将
~
作为目录处理,因此使用了
-l
选项。

我错过了手册中最后一句话:p。我的朋友向我介绍了pushd/popd,他就是这样写的。我想我们一直都在做错事。有可能把它放入一个变量中吗?这正是我真正需要的,但我的问题措辞非常糟糕。我已经更新了答案,以反映问题的变化和您的评论。谢谢!在一天结束之前做这个真的很有帮助。