При использовании cd для перехода к пути, найденному cdpath который не расположен относительно . Полученный путь отражается. Например, если предположить структуру каталогов, например ~/parent/child и cdpath например cdpath(~/parent) , вы увидите следующее:

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

По сути, я хочу, чтобы cd child молчал, как и cd ~/parent/child , независимо от расстояния до текущего каталога. Есть ли способ заставить cd замолчать, когда он использует cdpath для поиска и перехода в каталог?

2 ответа2

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 во время выполнения; Я оставлю это как упражнение.

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 .

Так что, если вы действительно хотите избавиться от печати нового dir, закомментируйте остальную часть else if в источнике - с тем недостатком, который вы никогда больше не заметите.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .