zshでcdpathを使用したサイレントCD


0

使用するとき cd で見つかったパスに移動する cdpath それは相対的に位置していません .結果のパスはエコーされます。たとえば、次のようなディレクトリ構造を想定します。 ~/parent/child そして cdpath 好き cdpath(~/parent)あなたはこれを見ます:

$ cd parent
$ cd ~
$ cd child
~/parent/child
$

基本的に、私は欲しい cd child 黙っているように、ちょうど cd ~/parent/child現在のディレクトリからの距離に関係なく。沈黙する方法はありますか cd 使用しているとき cdpath ディレクトリを見つけてジャンプするには?


@Scottクリーンアップしてくれてありがとう。私自身の質問は私にとってもっと理にかなっている。
lettertwo

回答:


2

それはシェルにハードコードされていると思います。ここからの抜粋です builtin.c

if (isset(INTERACTIVE) || isset(POSIXCD)) {
    if (func != BIN_CD && isset(INTERACTIVE)) {
        if (unset(PUSHDSILENT) && !quiet)
            printdirstack();
    } else if (doprintdir) {
        fprintdir(pwd, stdout);
        putchar('\n');
    }
}

int doprintdir これは一種のフラグです。の cdpath

それで、あなたが本当に新しいディレクトリの印刷を取り除きたいのであれば、コメントアウトしてください。 else if ソースの一部 - あなたがするという不利益 決して もう気がつく。


ああ、私はこれが事実であることを恐れていた。それを掘り下げてくれてありがとう。
lettertwo

2

一つのアプローチはあなた自身のものを転がすことでしょう cd 関数:

cd()
{
    if [ $# = 0 ]
    then
        builtin cd "$HOME"
        return
    fi
    # Use       if [[ "$1" =~ ^/ ]]
    # here if zsh supports it.
    case "$1" in
      /*)
        builtin cd "$1"
        return
    esac
    if [ -d "$1"  -a  -x "$1" ]
    then
        builtin cd "$1"
        # You might want this to return only if the cd succeeds.
        return
    fi
    for base in ~/parent /other/dir/thatIuse_a_lot
    do
        if builtin cd "$base/$1" 2> /dev/null
        then
            return
        fi
    done
    echo "$1: cd failed" >&2          # Customize to your liking.
    return 1                          # Indicate failure.
}

現時点ではzshにアクセスできませんが、これはKornシェルでテストしました。もちろん、これを拡張して、 cdpath 実行時に可変です。私はそれを練習として残します。


私はこれを検討しましたが、組み込み(特にシェル対話の中心的なもの)を駄目にするという考えです。 cd )私を怖がらせた。それでも、(実際の組み込みを変更することを除いて)代替手段がない場合は、これを真に堅牢なバージョンにすると良い結果が得られるかもしれません。 あーmy zsh 貢献…
lettertwo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.