Как сделать так, чтобы функция запускалась каждый раз, когда cd успешно переходит в другой каталог в sh на FreeBSD? - PullRequest
0 голосов
/ 29 июня 2018

Я использую sh в качестве оболочки для FreeBSD, но я хочу, чтобы у меня была такая подсказка, как та, что дает мне bash в Ubuntu. Кажется, что в реализации shB во FreeBSD отсутствуют две вещи, связанные с escape-символами PS1:

  1. \w работает, но не расширяется $HOME до ~, так что это то, что я уже взломал сам

  2. Я могу использовать PS1 для обновления подсказки на терминале, но, насколько я могу судить, невозможно также использовать переменную PS1 для обновления строки заголовка. ESC и BEL не могут установить заголовок так, как можно было бы ожидать, если бы они использовали bash или ksh

Вот мой файл .shrc

update_prompt() {
    case "$PWD" in
        "$HOME"*)
            pretty_pwd="~${PWD#*"${HOME}"}"
            ;;
        "/usr$HOME"*)
            pretty_pwd="~${PWD#*"/usr${HOME}"}"
            ;;
        *)
            pretty_pwd="$PWD"
            ;;
    esac

    case "$TERM" in
        xterm*|rxvt*)
            PS1="[$USER@\\h $pretty_pwd]\\$ "
            ;;
        *)
            ;;
    esac

    printf "\\033]0;[%s@$(hostname -s): %s]\\007" "$USER" "$pretty_pwd"
}

update_prompt

Поэтому, когда я запускаю терминал или захожу в систему через ssh, выдается довольно симпатичная подсказка, которая мне нравится. Но теперь мне нужно, чтобы эта функция запускалась каждый раз, когда выполняется cd, и возвращает состояние выхода 0.

Я собирался использовать псевдоним, который был что-то вроде:

alias cd="cd $1 && update_prompt"

но это было до того, как я понял, что псевдонимы - это не аргументы. Как я могу сделать что-то подобное?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Вы можете сделать это с псевдонимами + аргументами, если поменяете местами команды:

$ alias cd="echo change; cd"
$ pwd
/nas
$ cd /
change
$ pwd
/
$ cd /etc
change
$ pwd
/etc
$ 
0 голосов
/ 29 июня 2018

Вы можете использовать функцию вместо псевдонима:

cd() {
  command cd "$@" && update_prompt
}

Просто поместите его в ~/.shrc. Вы должны использовать command здесь, чтобы sh знал, что вы ссылаетесь на фактическую встроенную команду cd вместо функции, которую вы только что определили.

Обратитесь к странице справочника sh (1) за подробной информацией о том, как сделать sh (1) источником файла ~/.shrc при его запуске:

Поэтому пользователь должен размещать команды, которые должны выполняться только при входе в систему. время в файле .profile и команды, которые выполняются для каждой оболочки внутри файла ENV. Пользователь может установить переменную ENV для некоторого файла, поместив следующая строка в файле .profile в домашнем каталоге, заменяя .shrc желаемое имя файла:

ENV=$HOME/.shrc; export ENV

Я использую этот трюк в моем cd менеджере псевдонимов. Вот ссылка на исходный код функции: https://github.com/0mp/goat/blob/v2.5.0/libgoat.sh#L31-L57

...