Показывать только текущий и родительский каталог в приглашении bash

Я новичок в bash и хотел бы, чтобы мое приглашение показывало что-то, что в tcsh было тривиально, но после хорошего поиска Google я все равно не могу этого сделать.

Я хотел бы, чтобы мой запрос включал только текущие и родительские каталоги, подобные этому:

/parent/currentdir $ 

В tcsh это достигается путем:

 set prompt = "%C2 %" 

Однако в bash до сих пор я только обнаружил, что мне приходится разбирать pwd, чтобы получить тот же результат.

Разве нет более простого способа, как делать:

 export PS1="$(some_command) $" 

  • Как добавить цвет фона с непрямоугольной формой в строку подсказки (PS1)?
  • Как я могу избежать восклицательного знака в переменной среды PS1?
  • Сокращенный текущий каталог в командной строке оболочки?
  • scp с удаленного хоста не удается из-за приветствия входа в систему .bashrc
  • Почему это значение PS1 вызывает неожиданное поведение?
  • Пользовательское приглашение bash - проблема позиционирования курсора
  • Выделите текущую строку подсказки bash
  • скрипт bash не создает псевдоним и не обновляет $ PS1
  • 5 Solutions collect form web for “Показывать только текущий и родительский каталог в приглашении bash”

    Функции быстрого управления Bash довольно статичны. Если вы хотите больше контроля, вы можете включить переменные в свой запрос; убедитесь, что вы не отключили опцию promptvars .

     PS1='${PWD#"${PWD%/*/*}/"} \$ ' 

    Обратите внимание на одинарные кавычки: расширения переменных должны выполняться во время отображения приглашения, а не в то время, когда определена переменная PS1 .

    Если вы хотите больше контролировать отображаемое, вы можете использовать подстановки команд. Например, фрагмент выше теряет ~ аббревиатуру для домашнего каталога.

     PS1='$(case $PWD in $HOME) HPWD="~";; $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";; $HOME/*) HPWD="~/${PWD##*/}";; /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";; *) HPWD="$PWD";; esac; printf %s "$HPWD") \$ ' 

    Этот код довольно громоздкий, поэтому вместо того, чтобы вставлять его в переменную PS1 , вы можете использовать переменную PROMPT_COMMAND для запуска кода для установки HPWD а затем использовать его в своем приглашении.

     PROMPT_COMMAND='case $PWD in $HOME) HPWD="~";; $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";; $HOME/*) HPWD="~/${PWD##*/}";; /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";; *) HPWD="$PWD";; esac' PS1='$HPWD \$' 

    Поскольку сокращенное приглашение изменяется только при изменении каталога, вам не нужно пересчитывать его каждый раз, когда отображается приглашение. Bash не обеспечивает крючок, который работает в текущем изменении каталога, но вы можете имитировать его , переопределяя cd и его кузенов.

     cd () { builtin cd "$@" && chpwd; } pushd () { builtin pushd "$@" && chpwd; } popd () { builtin popd "$@" && chpwd; } chpwd () { case $PWD in $HOME) HPWD="~";; $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";; $HOME/*) HPWD="~/${PWD##*/}";; /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";; *) HPWD="$PWD";; esac } PS1='$HPWD \$' 

    Обратите внимание, что вам не нужно экспортировать PS1 и не следует экспортировать, поскольку это параметр оболочки, а не переменная среды. Настройка bash PS1 не будет понята другими оболочками.

    PS Если вам нужна приятная интерактивная оболочка, переключитесь на zsh , где все из них (приглашение % расширения, в основном охватывающее tcsh's, chpwd и т. Д.) Являются собственными функциями.

     PS1='%2~ %# ' 

    Синтаксис для получения родительского и текущего каталогов берется из ответа Мунаи.

    Однако, как отметил Жиль, этот код показывает только текущий каталог на момент загрузки .bashrc , но при перемещении системы в другие папки он не изменится.

    Имея это в вашем файле .bashrc вы автоматически обновляете приглашение в ваш текущий каталог:

     prompt_command () { PS1='$(basename $(dirname "$PWD"))/$(basename "$PWD") $ ' } PROMPT_COMMAND=prompt_command 

    Строку запроса можно легко изменить в bash , отредактировав переменную оболочки PS1 . Он обозначает строку подсказки 1. Больше информации здесь .

    Теперь запустите свою оболочку bash .

    vi ~/.bashrc

    Добавить определение PS1 в файл

     `export PS1="$(basename $(dirname $PWD))/$(basename $PWD)"` 

    Дополнительные уроки здесь и здесь , чтобы помочь вам настроить его еще больше.

    Может быть проще с «~» для домашнего каталога.

     function PWDN { echo "${PWD/#$HOME/~}" | rev | cut -d "/" -f1 -f2 | rev } 
     export PS1='[\u@\h $(basename $(dirname ${PWD}))/$(basename ${PWD})]\$ ' export PROMPT_COMMAND='echo -ne "\033]0;$(basename $(dirname $PWD))/$(basename ${PWD})\007"' 
    Interesting Posts

    Использование sudoers для запуска команды php

    Как найти путь установки для программного обеспечения под Linux?

    Как отображать подсветку синтаксиса в файле?

    Как установить квоту на диск процесса?

    Отладка iptables с использованием просмотра в реальном времени

    typeet -A дает ошибку в скрипте

    Книга или онлайн-статья по анализу и настройке производительности системы Linux

    Почему я получаю «rsync: не удалось установить время на …: операция не разрешена (1)» ошибка на Ubuntu 10.10 с SME Server 7.4?

    Как разделить FHS только для чтения и читать / писать каталоги на двух дисках с помощью Linux / systemd, без разбиения диска raed / write?

    Печать нового символа строки awk

    Может ли vim редактировать удаленный файл с правами root?

    tmux перестала нормально работать с zsh и oh-my-zsh

    Как я могу сопоставить устройство ttyUSBX с последовательным устройством USB

    Получение совместной работы VLC и Remmina

    ожидание и переработка ПИД

    Linux и Unix - лучшая ОС в мире.