2

zshを使用してエイリアスを介して実行されるシェルスクリプトがありますalias wd=". /path/to/wd"。スクリプトはrubyプログラムを実行cdし、その出力に s を送信します。動作しますが、cdコマンドの後、ディレクトリは実際の名前ではなく「~result」として表示されます。

シェル スクリプトの簡略版は次のとおりです。

#!/bin/sh

result=$(ruby engine.rb $*)
cd $result

それは明らかに、変数「result」を使用する cd に関係しています。それが取得される名前です。

別のディレクトリに変更して戻った場合、間違った名前がまだ使用されています。

これを試してみるとbash、正しく機能するため、これはzsh問題です。

4

2 に答える 2

3

これは、次のオプションが原因AUTO_NAME_DIRSです (デフォルトでは有効になっていません)。

         AUTO_NAME_DIRS

         Any parameter that is set to the absolute name of a directory
         immediately becomes a name for that directory, that will be used
         by the `%~' and related prompt sequences, and will be available
         when completion is performed on a word starting with `~'.
         (Otherwise, the parameter must be used in the form `~param' first.)

つまり、 with AUTO_NAME_DIRSenabled のようなことをする と、 の略になりproject=/path/to/my/projectます。これにより、そのディレクトリのショートカットとして、またはのようなことができます。~project/path/to/my/projectcd ~projectls -lh ~project

ディレクトリがプロンプトのように表示されたくない場合は~project、プロンプトを に置き換え%~%d、常にフル パスを表示することができます。

この動作がまったく必要ない場合は、unsetopt AUTO_NAME_DIRS構成で行います。

オプションをオンのままにしたいが、スクリプト内で無効にしてresult名前付きディレクトリを作成しない場合はemulate -LR zsh、スクリプトの先頭で実行します。これにより、スクリプトの実行中にすべてのオプションが一時的にデフォルトにリセットされます。emulate -LR zshこのような奇妙なことが起こらないように、常にスクリプトで使用することをお勧めします。これはunhash -d result、事後に修正するよりも優れています。

于 2013-10-08T17:47:52.320 に答える
1

これは、静的な名前のディレクトリが使用されている場合のようです。の値はresult(おそらく) で始まるパスであるため/zshはその変数をパスの「名前」として使用し、プロンプトにフルパスを表示するときに省略します。詳細についてはman zshexpn、「静的な名前付きディレクトリ」を参照してください。

于 2013-10-07T13:44:08.163 に答える