나는 bash를 처음 접했고 내 프롬프트가 tcsh에서 사소한 것을 보여주기를 바랐지만 좋은 Google 검색 후에도 여전히 할 수 없습니다.
다음과 같이 프롬프트에 현재 디렉터리와 상위 디렉터리만 포함하고 싶습니다.
/parent/currentdir $
tcsh에서는 다음을 통해 이를 달성합니다.
set prompt = "%C2 %"
그러나 지금까지 bash에서는 동일한 출력을 얻으려면 pwd를 구문 분석해야 한다는 사실만 발견했습니다.
다음과 같이 더 쉬운 방법은 없을까요?
export PS1="$(some_command) $"
답변1
배쉬의시기적절한 통제특성은 상당히 정적입니다. 더 많은 제어를 원할 경우 프롬프트에 변수를 포함할 수 있습니다.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
환경 변수가 아닌 셸 설정이므로 내보낼 필요도 없고 내보내서도 안 됩니다 . PS1
다른 쉘은 bash 설정을 이해할 수 없습니다.
PS 좋은 대화식 쉘 경험을 원한다면 다음으로 전환하십시오.다루기 힘든, 모두(프롬프트 %
확장에는 주로 tcsh chpwd
등이 포함됨) 기본 기능입니다.
PS1='%2~ %# '
답변2
설정은 PROMPT_DIRTRIM=2
필요한 것이어야 합니다.
답변3
답변4
export PROMPT_DIRTRIM=2
bash 파일에 추가하면 최신 버전의 bash(v. 4+)에 대해 이 작업이 수행됩니다. 특히 이는 환경 변수 \w
의 항목 모양을 PS1
전체 경로에서 마지막 두 항목으로 변경합니다.
최종 결과는 다음과 같습니다.../Documents/MyFolder