0

我知道我在我的 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

它有效,但并非没有错误。

4

1 回答 1

2

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

编辑以下 OP 评论

如果您想在popd不移动目录的情况下捕获输出,最好集成pushd添加和popd弹出的目录堆栈。您可以使用命令dirs查看堆栈,它将给出目录列表,第一个是您当前的工作目录,即:

cd ~
pushd .
cd Documents
pushd .
dirs
~/Documents ~/Documents ~

您可以使用dirs的+Nand选项访问堆栈中的特定条目(从左侧开始计数,从右侧开始计数)。如果你想得到你推送到堆栈的最后一个东西,可以使用.-N+N-Ndirs +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选项。

于 2013-10-16T04:22:56.020 回答