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ポップオフするディレクトリ スタックを調査するのがおそらく最善です。コマンドでスタックを表示できます。これにより、ディレクトリのリストが表示されます。最初は現在の作業ディレクトリです。つまり、次のようになります。pushdpopddirs

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

+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オプションを使用していると思います。

于 2013-10-16T04:22:56.020 に答える