PS1 변수에 bash 스크립트를 삽입하는 방법


2

커스텀 PS1 변수를 만들었습니다. 다음은 완전히 작동하는 데 가장 가까운 것입니다.

PS1 = "\ n [\ e [1; 31m] \ u @ \ H [\ e [35m] \ @ [\ e [32m] PWD : \ w [\ e [1; 34m]이 폴더에는 \ $ ( / bin / ls -1 | / usr / bin / wc -l | / bin / sed 's : :: g') 파일 [\ e [1; 33m] 총 \ $ (/ bin / ls -lah | / bin / grep -m 1 total | / bin / sed 's / total //') b \ n`if [\ $? = 0]; 그런 다음 echo [\ e [32m] ^ _ ^ [\ e [0m ] 작동 함-[\ e [0m]; 그렇지 않으면 echo [\ e [31m] O_O [\ e [0m] 일하지 않았습니다-; fi` "

이것은 이전 코드 샘플과 동일한 코드이지만 더 나은 가독성을 위해 블록으로 분리되어 주석 처리되었습니다.

#User@Host [Red]
\n\[\e[1;31m\]\u@\H

#Hour [Purple]
\[\e[35m\] \@ 

#PWD [Green]
\[\e[32m\] PWD: \w 

#Number of files in PWD [Blue]
\[\e[1;34m\]This folder has \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files 

#Amount of space the PWD files take, also line break [Yellow]
\[\e[1;33m\]A total of \$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\n

#Malfunctioning condition, should smile if the instruction went right, or poker-face if not [green and red]
\`if [ \$? = 0 ]; then echo \[\e[32m\]^_^ \[\e[0m\]\[\e[0m\]Worked - \[\e[0m\]; else echo \[\e[31m\]O_O\[\e[0m\] Didn't worked - ; fi\`

문제를 설명하려고합니다.

  • if는 (예를 들어)를 실행 한 후에 더 이상 거짓이 될 수없는 조건을 찾습니다. "This folder has \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files"최신 문장이 깔끔하게 끝났다면 사실이기 때문입니다.

출력을 같은 위치에 유지하면서 어떻게 작동시킬 수 있습니까? 첫 번째 명령이 실행되기 전에 if로 이동하면 정상적으로 작동합니다.

ifPS1 시작시 해당 조건 의 변수를 할당하려고 생각했습니다 . 그런 다음 if이 위치에서 다른 것은 변하지 않는 대체 변수를 판단합니다. 그러나 불행히도 Bash에는 전혀 기술이 없습니다. 나는 이미 수천 번 정도 그렇게하지 못했습니다.

이 같은 (그러나 잘 쓰여진)

PS1="`if [ \$? = 0 ];then echo "prev_err=0"; else prev_err=0; fi\` 
...[Some more code in between]...
`if [ \$prev_err = 0 ]
    then echo "No error"
    else echo "There was an error in the statement." 
fi\`"

일부`(백틱 문자)가 잘못된 위치에 있거나 이전 코드 블록에서 생략되었습니다.

답변:


3

배시 매뉴얼을 인용하기 위해 PROMPT_COMMAND에서 대부분의 작업을 수행하는 것이 좋습니다. "설정하면 각 기본 프롬프트를 실행하기 전에 값이 명령으로 실행됩니다"

이 거대한 예를 참조하십시오 .

광산은 :-

PROMPT_COMMAND='history -a; history -n; printf "\e]1;${PWD}\a"'

터미널 창에 내 역사가 동기화되어 있습니다.

그렇다면 문제를 단순화하기 위해 bash 함수 안에 가능한 많은 것을 넣어야 할 것입니다.

BTW - 당신이 찾을 수있는 du -sh .것보다 좀 더 유용하고 쉽게 /bin/ls -lah | /bin/grep -m 1 total단지 파일 usage`를 얻을 수


나는 내가 본 모든 것을 사랑했다. 당신 (특히 연결된 거대한 예)을 염두에 두십시오. 그러나 그 마지막 부분은 심각한 지연을 초래할 수있는 것처럼 들립니다. 예를 들어 du -sh .$ HOME의 시간 a 는 0m34.018s를 가져 왔고 4 du : ./Library / ... : Permission denied 'diagnostics가 있었습니다. 후자의 경우 타이밍, 실제 0m0.006s- 거의 눈에 띄지 않습니다.
Billy McCloskey

2

내 프롬프트 에는 다음과 같은 몇 가지 기능이 포함되어 있습니다

PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s \[$BOLD_FORMAT\] \[$ERROR_FORMAT\] $exit_code \[$RESET_FORMAT\] " ")'

그게 당신을 위해 작동합니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.