4

Если в bash я делаю « set -P », то bash следует "физической структуре каталогов" при выполнении « pwd » и « cd .. » и т.д., А не "логическому", который может быть определен с помощью символических ссылок. К сожалению, bash все еще не подчиняется физической структуре каталогов для завершения имени файла. Как я могу заставить Баш уважать мой авторитет в этом вопросе?

Спасибо!
|> Ouglas

PS К сожалению, та же самая проблема теперь затронула Emacs для открытия файлов и т.д. Если кто-то также знает, как также сказать Emacs уважать мою физическую структуру каталогов, то я также хотел бы узнать ответ на этот вопрос.

PPS Я не знаю, кто решил, что некоторые программы пытаются понять вашу "логическую структуру каталогов", это хорошая идея, но это не так! Нет, если только вы не сможете убедить каждую программу в мире действовать таким образом, поскольку наличие одних программ использует вашу физическую структуру каталогов, а использование других программ - вашей логической структуры каталогов - это рецепт путаницы и раздражения.

2 ответа2

3

Спасибо за предыдущие ответы. Но, на самом деле, как оказалось, « set -P » отлично справляется со своей задачей, в отличие от моего первоначального запроса по этому вопросу.

Когда я впервые попробовал это, я, должно быть, каким-то образом ввел bash в запутанное состояние, когда завершение имени файла не соответствовало настройке « set -P ». Но теперь со свежим ударом все работает нормально. « set -P », похоже, последовательно переводит bash в режим "физической структуры каталогов".

1

Это может помочь вам в этом.

Используйте type -a _expand и сравните его вывод с функцией ниже. Существующая функция должна соответствовать той части , которая после первого else ниже. Если нет, вы можете обернуть то, что у вас есть во внешнем, if...else как вы видите здесь.

Вставьте его в приглашение Bash для проверки. Затем, если вы удовлетворены, поместите его в файл ~/.bashrc чтобы переопределить определение функции в /etc/bash_completion (вместо непосредственного редактирования).

_expand ()
{
    if [[ $- == *P* && -L "$cur" && -d "$cur" ]]; then
        cd "$cur";
        eval cur="$PWD";
        cd - > /dev/null;
    else
        if [[ "$cur" == \~*/* ]]; then
            eval cur=$cur;
        else
            if [[ "$cur" == \~* ]]; then
                cur=${cur#\~};
                COMPREPLY=($( compgen -P '~' -u $cur ));
                [ ${#COMPREPLY[@]} -eq 1 ] && eval COMPREPLY[0]=${COMPREPLY[0]};
                return ${#COMPREPLY[@]};
            fi;
        fi;
    fi
}

Это добавление в функцию расширения тильды завершения вкладки Bash.

Теперь вы можете сделать

ls -l symdir<TAB>

и вы увидите

ls -l /dest/dir<CURSOR>

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