
내가 이 작업을 수행할 수 있어야 하는 이유는 내 PS1에 변수를 '업데이트'하기 위해서입니다. 줄 바꿈하거나 새 줄로 내려가지 않고 터미널의 전체 너비에 걸쳐 프롬프트를 표시하고 싶습니다. 이를 위해 이미 작동시키는 방법을 찾았지만 이 방법을 사용하려면 매번 bash를 다시 로드해야 합니다. 내가 원하는 모습은 다음과 같습니다.
|me::awesome| --------------------------------------------------------- ~/.config/awesome
$
그 후, 새 디렉토리로 CD를 넣으면 다음과 같이 보일 것입니다:
|me::themes| -------------------------------------------------------------------------
------ ~/.config/awesome/themes
$
하지만 내가 달릴 때
exec bash
모든 값이 성공적으로 변경되며 다음과 같습니다.
|me::themes| --------------------------------------------------- ~/.config/awesome/themes
$
그래서 나는 새로운 프롬프트가 호출될 때마다 업데이트되기를 원하는 PS1 변수에 변화하는 변수를 통합하는 방법을 찾고 있습니다. 현재 내 .bashrc의 모습은 다음과 같습니다.
mytest=$PWD
mynext="$(basename $PWD)"
mylength=$((${#mytest}+${#mynext}))
length=$(($mylength+6))
PS1='|me::\W| $(printf "\\u2500%.0s" $(seq $length $(tput cols))) \w\n\$'
또한 변수를 별도의 쉘 스크립트 파일에 넣고 PS1 내에서 다음과 같이 실행해 보았습니다.
#/home/me/.PS1.sh
mytest=$PWD
mynext="$(basename $PWD)"
mylength=$((${#mytest}+${#mynext}))
length=$(($mylength+6))
echo "|me::\W| $(printf "\\u2500%.0s" $(seq $length $(tput cols))) \w\n\$"
#/home/me/.bashrc
PS1=$(/home/me/.PS1.sh)
답변1
변수는 처음에만 평가됩니다. 처음에 문자 그대로 처리되도록 ps1 내부에 넣어야 하며 명령 실행 후에 평가되어야 합니다.
PS1='|me::\W| $( mytest=$PWD;mynext="${PWD##*/}"; mylength=$((${#mytest}+${#mynext})) ; length=$(($mylength+6)) ; printf "\\u2500%.0s" $(seq $length $(tput cols))) \w\n\$'
ps1에 뭔가를 추가했다면 6개만 변경할 수 있습니다