Как сделать так, чтобы строка заголовка динамически обновлялась после подключения к удаленному компьютеру, который использует sh в качестве оболочки по умолчанию?

sed -e'1{x;s/^/0ddsQsEsD[q]sq/p;x;}' \
    -e'/[^?!.]*\([?!.]\)[^?!.]*/!d;=' \
    -e's// l\11+s\1 /g;s/.*/pc0dds?s!s.&Q?E!D./' \
    -e's/\([QED]\)\(.\)/[l\21>q9P[\2=]Pl\2pl\1+9P[Total: ]Pps\1]x/g' |dc

Для любой строки, содержащей любое из [?!.] , эта команда сначала напечатает свой номер строки, а затем количество символы в этой строке, а затем текущий счет для каждого.

printf %s\\n \? \?\!. '' hey \? '' '' \! ...hey... .\!\? |
sed -e'1{x;s/^/0ddsQsEsD[q]sq/p;x;}' \
    -e'/[^?!.]*\([?!.]\)[^?!.]*/!d;=' \
    -e's// l\11+s\1 /g;s/.*/pc0dds?s!s.&Q?E!D./' \
    -e's/\([QED]\)\(.\)/[l\21>q9P[\2=]Pl\2pl\1+9P[Total: ]Pps\1]x/g' |dc

1
    ?=1
    Total: 1
2
    ?=1
    Total: 2
    !=1
    Total: 1
    .=1
    Total: 1
5
    ?=1
    Total: 3
8
    !=1
    Total: 2
9
    .=6
    Total: 7
10
    ?=1
    Total: 4
    !=1
    Total: 3
    .=1
    Total: 8
1
19.06.2018, 18:47
1 ответ

Пытаясь найти способ получить красивое приглашение в POSIX sh, я столкнулся с двумя ограничениями реализации sh в PS1, которые мне пришлось обойти:

  1. Хотя \wв переменной PS1работает, она не расширяет $HOMEдо ~

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

  4. .

Вот окончательный результат, работает очень хорошо. Его необходимо добавить в ваш файл.shrc (. Сначала убедитесь, что PS1 еще не определен ):

.
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

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

Обратите внимание, что подсказка будет заключена в круглые скобки. Это просто личное напоминание самому себе, что я на FreeBSD, а не на Ubuntu. Если вы предпочитаете более традиционное приглашение, просто используйте это:

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

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

Возможно, вы захотите удалить условие "/usr$HOME"*), если вы работаете в Linux. Это бесполезно, если вы не используете FreeBSD, где /homeобычно является символической ссылкой на /usr/home.

0
28.01.2020, 00:33

Теги

Похожие вопросы