print -Pが環境変数を置き換えることを防ぐ

print -Pが環境変数を置き換えることを防ぐ

使っていますチップピュアzshでメッセージが表示されました。print -Pn ...現在のディレクトリを印刷するために内部的に使用されます。何らかの理由で現在のディレクトリの先頭に一致する環境変数を設定すると、その環境変数名が出力に置き換えられます。

例えば、

> export SOME_DIR=/home/bschlenk/some/path
> cd ~/some/path/deeper/nested/path
> print -Pn %~
~SOME_DIR/deeper/nested/path

任意の環境変数を一致するパスに置き換えることを防ぐ方法は何ですか?現在のパスを印刷して/home/bschlenkに置き換えたいのですが、~他に何もありません。

ベストアンサー1

~から出荷書類ビーチ%~:

プレフィックスという名前のディレクトリがある場合、その部分は~ディレクトリ名に置き換えられますが、結果がフルパスより短い場合にのみ適用されます。

注意事項は次のとおりです。動的そして変化のないディレクトリ名を指定します。あなたが見るのは静的に名前が付けられたディレクトリです

次のテキストが、~値がで始まる文字列シェルパラメータの名前である場合でも定義できます/

したがって、変数の値がある場合、値はSOME_DIR。静的に名前が付けられたディレクトリです。プロンプト拡張はこれを表示して短縮します。/home/bschlenk/some/path~SOME_DIR/home/bschlenk/some/path%~/home/bschlenk/some/path~SOME_DIR

しかし、それはすべてではありません。実際、略語はSOME_DIR「アクティブ化」を使用している場合にのみ表示されます~SOME_DIR。この内容は次のように記録されます。オプションauto_name_dirs、事前起動は必要ありませんが、デフォルトではオフになっています。

ディレクトリの絶対名に設定されたすべてのパラメータはすぐにそのディレクトリの名前になり、関連するプロンプトシーケンスで使用され、で始まる単語補完を%~実行するときに使用できます~。 (そうでない場合は、~param最初にそのパラメータをフォームに使用する必要があります。)

交換を有効にし%~て完了するパラメータ~は、次のように表示されます。名前付きディレクトリハッシュテーブルリストを使用できますhash -d

私たちは何が起こったのかを理解するために作品を一つにまとめました。問題をどのように解決しますか?SOME_DIR活性化の原因によって異なります。

このオプションがオンの場合は、auto_name_dirs当然オフにする必要があります。

以前に使用していた場合は、~SOME_DIR以下を使用して無効にできます。

unhash -d SOME_DIR

これは永久的ではありません。再使用すると再びポップアップします~SOME_DIR。しかし、$SOME_DIR可能な限りどこでも利用できることを考えると、~SOME_DIRそれほど~SOME_DIR有用な機能ではありません。

名前付きディレクトリコンポーネントを削除できず、→をSOME_DIR使用して$HOME現在のディレクトリを縮小したい場合は、~この変換を手動で実装できます。

if [[ $PWD = $HOME ]]; then
  HPWD=\~
elif [[ $PWD = $HOME/* ]]; then
  HPWD=\~/${PWD#$HOME/}
else
  HPWD=$PWD
fi

print -rn $HPWDその後、代わりに使用してくださいprint -Pn %~

SOME_DIRディレクトリの命名を防ぐことができず、使用されているコードを変更できない場合、%~状況はさらに難しくなります。明確なディレクトリhashtableを使用できますが、関数をローカルに作成することhash -rはできません(サブシェルのみ)。

おすすめ記事