PS1과 PROMT_COMMAND의 차이점은 무엇입니까?
이 멋진 스레드를 보는 동안 몇 가지 예제가 사용되고 있다는 것을 알게 되었습니다.
PS1="Blah Blah Blah"
및 일부 용도
PROMPT_COMMAND="Blah Blah Blah"
(및 그 중 일부는 둘 다 사용) 프롬프트를 Bash 쉘로 설정할 때 사용합니다.그 둘의 차이점은 무엇입니까?Stack Overflow 검색이나 Google의 보다 광범위한 검색에서는 결과를 얻을 수 없기 때문에 정답을 찾을 수 있는 올바른 위치에 대한 링크도 도움이 될 것입니다.
PROMT_COMMAND는 일반적인 Bash 문을 포함할 수 있지만 PS1 변수는 변수에 호스트 이름의 "\h"와 같은 특수 문자를 포함할 수도 있습니다.
예를 들어 PROMT_COMMAND와 PS1을 모두 사용하는 Bash 프롬프트가 있습니다.PROMT_COMMAND의 Bash 코드는 사용자가 어떤 Git 브랜치에 속해 있는지 파악하여 프롬프트에 마지막 실행 프로세스의 종료 상태, pwd의 호스트 이름 및 기본 이름과 함께 표시합니다.
변수 RET는 마지막으로 실행된 프로그램의 반환 값을 저장합니다.단말기에서 마지막으로 실행한 프로그램의 에러 코드와 에러 유무를 확인하는 것이 편리합니다.PROMT_COMMAND 식 전체를 둘러싼 바깥쪽 '에 주의해 주세요.PS1이 포함되어 있기 때문에 PROMT_COMMAND 변수가 평가될 때마다 이 변수가 재평가됩니다.
PROMPT_COMMAND='RET=$?;\
BRANCH="";\
ERRMSG="";\
if [[ $RET != 0 ]]; then\
ERRMSG=" $RET";\
fi;\
if git branch &>/dev/null; then\
BRANCH=$(git branch 2>/dev/null | grep \* | cut -d " " -f 2);\
fi;
PS1="$GREEN\u@\h $BLUE\W $CYAN$BRANCH$RED$ERRMSG \$ $LIGHT_GRAY";'
Git 이외의 디렉토리에서의 출력 예는 다음과 같습니다.
sashan@dhcp-au-122 Documents $ false
sashan@dhcp-au-122 Documents 1 $
Git 디렉토리에서 지점 이름을 볼 수 있습니다.
sashan@dhcp-au-122 rework mybranch $
갱신하다
댓글과 밥의 답변을 읽어본 결과, 설명대로 쓰는 것이 더 낫다고 생각합니다.PS1 변수는 PROMT_COMMAND 내에 설정되어 있기 때문에 위에서 설명한 것보다 유지보수가 용이합니다.PROMT_COMMAND는 실행 시 Bash에 의해 평가되는 매우 복잡한 문자열입니다.
작동은 하지만 필요 이상으로 복잡해요.솔직히 말하면, PROMT_COMMAND는 약 10년 전에 제가 직접 작성했는데, 효과가 있었고 별로 생각하지도 않았습니다.
제가 어떻게 수정했는지 궁금하신 분들을 위해 PROMT_COMMAND의 코드를 (Bob이 설명한 대로) 다른 파일에 넣은 후 PS1이 되고 싶은 문자열을 에코합니다.
GREEN="\[\033[0;32m\]"
CYAN="\[\033[0;36m\]"
RED="\[\033[0;31m\]"
PURPLE="\[\033[0;35m\]"
BROWN="\[\033[0;33m\]"
LIGHT_GRAY="\[\033[0;37m\]"
LIGHT_BLUE="\[\033[1;34m\]"
LIGHT_GREEN="\[\033[1;32m\]"
LIGHT_CYAN="\[\033[1;36m\]"
LIGHT_RED="\[\033[1;31m\]"
LIGHT_PURPLE="\[\033[1;35m\]"
YELLOW="\[\033[1;33m\]"
WHITE="\[\033[1;37m\]"
RESTORE="\[\033[0m\]" #0m restores to the terminal's default colour
if [ -z $SCHROOT_CHROOT_NAME ]; then
SCHROOT_CHROOT_NAME=" "
fi
BRANCH=""
ERRMSG=""
RET=$1
if [[ $RET != 0 ]]; then
ERRMSG=" $RET"
fi
if which git &>/dev/null; then
BRANCH=$(git branch 2>/dev/null | grep \* | cut -d " " -f 2)
else
BRANCH="(git not installed)"
fi
echo "${GREEN}\u@\h${SCHROOT_CHROOT_NAME}${BLUE}\w \
${CYAN}${BRANCH}${RED}${ERRMSG} \$ $RESTORE"
그리고 내 .bashrc 파일에:
function prompt_command {
RET=$?
export PS1=$(~/.bash_prompt_command $RET)
}
PROMPT_DIRTRIM=3
export PROMPT_COMMAND=prompt_command
GNU Bash 문서 페이지(Bash Reference Manual)에서 다음을 수행합니다.
PROMPT_COMMAND
If set, the value is interpreted as a command to execute before
the printing of each primary prompt ($PS1).
사용한 적은 없지만 sh밖에 없을 때는 다시 사용할 수 있었습니다.
점은 '하다'는 것입니다.PS1
실제 또, 「 」는 「 」입니다.PROMPT_COMMAND
는 프롬프트 직전에 실행되는 명령어입니다.프롬프트를 작성하는 가장 간단하고 유연한 방법은 다음과 같습니다.
.bashrc 파일에 저장합니다.
function prompt_command {
export PS1=$(~/bin/bash_prompt)
}
export PROMPT_COMMAND=prompt_command
그런 다음 스크립트(Bash, Perl 또는 Ruby: 선택)를 작성하여 파일 ~/bin/bash_prompt에 저장합니다.
스크립트는 프롬프트를 작성하기 위해 원하는 모든 정보를 사용할 수 있습니다.IMO만을 에 훨씬 왜냐하면 당신은 단지 그들을 위해 개발된 다소 바로크 대체 언어를 배울 필요가 없기 때문이다.PS1
★★★★★★ 。
그냥 설정만 될 것 같아요, 이렇게 하면 될 것 요.PROMPT_COMMAND
~/bin/syslog_syslog에 직접 연결 및 설정PS1
을 사용하다
동작하는 , 는 「」 「」 「」 「」 「」 「」 「」 「」 「」 「」 「」 「」 「」 「」 「」 「」 「」 「」 「」를 상정하고 있는 것을 곧 알 수 .PS1
실제 프롬프트로 설정되며, 히스토리를 뒤로 스크롤하면 결과적으로 문제가 발생합니다.
으로 인해 " "가 발생합니다.PS1
프롬프트를 이 함수는 프롬프트를 합니다).PS1
을 지정하면 및 합니다.
송신원:
PROMPT_COMMAND
설정되어 있는 경우 값은 각 프라이머리 프롬프트를 발행하기 전에 명령어로 실행됩니다.
PS1
이 파라미터의 값이 확장되어(다음 프롬프트 참조), 프라이머리 프롬프트 문자열로 사용됩니다.기본값은 "\s-\v\$" 입니다.
프롬프트스트링을는, 「」PS1
합니다.
PS1='user \u on host \h$ '
에 다른 를 하십시오.PROMPT_COMMAND
예를 들어, 캐시된 쓰기를 디스크에 동기화하는 경우 다음과 같이 쓸 수 있습니다.
PROMPT_COMMAND='sync'
네, 그래서 이걸 확실히 하기 위해서:
PROMPT_COMMAND
편리한 Bash 편의 변수/함수입니다만, 엄밀히 말하면, 를 사용할 수도 없는 것은 없습니다.PS1
,,, ???
즉, 프롬프트 외부에 스코프가 있는 다른 변수를 설정하려면 셸에 따라 해당 변수를 먼저 외부에 선언해야 합니다.$PS1
의 경우) FIFO를 호출하기 하고 있는 때 할 수.$PS1
하다)$PS1
);\u
\h
특히 화려한 정규식을 사용할 경우 문제를 일으킬 수 있습니다.그렇지 않으면: 어떤 것도 달성할 수 있습니다.PROMPT_COMMAND
명령어 치환을 사용하여 할 수 있습니다.$PS1
(구석에 있는 경우에는 명시적인 서브셸)
그렇죠?
다른 점은 말이다.
- 에서 불완전한 행을 출력하면
PROMPT_COMMAND
Bash 프롬프트가 스크루 됩니다. PS1
대체품\H
그리고 친구들PROMPT_COMMAND
그 내용을 실행하고,PS1
는 그 내용을 프롬프트로 사용합니다.
PS1
는 각 프롬프트에서 변수 확장 및 명령어 치환을 수행합니다.사용할 필요가 없습니다.PROMPT_COMMAND
을 PS1
또는 임의의 코드를 실행합니다. 할 수 요.export PS1='$(uuidgen) $RANDOM'
file once once once 。.bash_profile
따옴표만 작은 따옴표만 사용하세요.
나는 이것에 너무 많은 시간을 할애해서 나에게 효과가 있는 것을 공유하고 싶었다.PROMPT_COMMAND와 PS1에 관한 SO 포스트를 많이 보고 작은따옴표, 큰따옴표, 호출함수의 조합을 많이 시도했습니다.컨트롤 문자를 인쇄하거나 확장되었지만 처리되지 않은 문자 그대로 프롬프트 문자열을 인쇄하지 않거나 PROMT_COMMAND에서 PS1을 설정하지 않으면 매번 프롬프트를 업데이트할 수 없습니다.문제는 제어문자를 포함하는 변수(컬러)를 설정하는 것이었습니다.이러한 변수들은 PS1의 변수명 뒤에 하드코딩해야 합니다.PROMT_COMMAND는 변수를 설정하는 함수로 설정되며 이중 따옴표로 둘러싸인 PS1 문자열에서 사용(에스케이프)됩니다.이것은 각 명령어로 색상을 변경하는 전원 라인 스타일의 프롬프트용입니다.
icon1=#unicode powerline char like
#these: https://github.com/ryanoasis/powerline-extra-symbols#glyphs
icon2=#same
#array of ANSI colors. 2 for rgb mode then the rgb values
#then 'm' without '\]' control character. these are from
#the solarized theme https://ethanschoonover.com/solarized/
declare -a colors=(
"2;220;50;47m"
"2;203;75;22m"
"2;181;137;0m"
"2;133;153;0m"
"2;42;161;152m"
"2;38;139;210m"
"2;108;113;196m"
"2;211;54;130m"
"2;0;43;54m"
"2;7;54;66m"
"2;88;110;117m"
"2;101;123;131m"
"2;131;148;150m"
"2;147;161;161m"
)
#outside of vars set in PROMPT_COMMAND it's ok to have control chars
LEN=${#colors[@]}
BG="\[\e[48;"#set bg color
FG="\[\e[38;"#set fg color
TRANSP="1m\]"#transparency
BASE2="2;238;232;213m\]"#fg (text) color
myfunc(){
RAND=$(($RANDOM % $LEN))
COLOR1=${colors[$RAND]}
COLOR2=${colors[($RAND + 1) % $LEN]}
COLOR3=${colors[($RAND + 2) % $LEN]}
}
PROMPT_COMMAND=myfunc
#note double quotes and escaped COLOR vars followed by hard-coded '\]' control chars
PS1="$BG$TRANSP$FG\$COLOR1\]$icon1$BG\$COLOR1\]$FG$TRANSP$BG\$COLOR1\]$FG$BASE2
[username hard-coded in unicode] $BG\$COLOR2\]$FG\$COLOR1\]$icon2$BG\$COLOR2\]$FG$BASE2
\w $BG\$COLOR3\]$FG\$COLOR2\]$icon2$BG\$COLOR3\]$FG$BASE2 [more unicode]
\[\e[0m\]$FG\$COLOR3\]$icon2\[\e[0m\] "
그렇게 하면 더 잘 할 수 있을 거야!
언급URL : https://stackoverflow.com/questions/3058325/what-is-the-difference-between-ps1-and-prompt-command
'itsource' 카테고리의 다른 글
Swift 사전을 통한 반복 (0) | 2023.04.22 |
---|---|
Django에서 여러 쿼리 세트를 결합하는 방법은 무엇입니까? (0) | 2023.04.22 |
잠재적으로 위험한 요청입니다.클라이언트(*)에서 경로 값이 탐지되었습니다. (0) | 2023.04.22 |
bash를 사용하여 각 행의 마지막 단어를 얻으려면 어떻게 해야 합니까? (0) | 2023.04.22 |
선언한 행과 같은 행에서 C# 목록을 초기화하려면 어떻게 해야 합니까(IEnumerable String Collection 예) (0) | 2023.04.22 |