본문 바로가기
기타/셸스크립트

[리눅스] print 함수를 재정의해봤더니 화면이 와장창 깨진다ㅜ

by 일코 2024. 2. 10.

필자는 현재 zsh에 oh-my-zsh를 설치하고 powerlevel10k 테마를 사용중이다.

아래 내용의 myshell.sh를 만들고, (따라하지 말 것ㅜ)

#!/bin/bash

function print() {
    echo $1
}

print "Hello world!"

터미널에서 `source ~/myshell.sh`를 실행했더니
테마고 프롬프트고, 모든 화면이 와장창 깨지기 시작했다.

근데 터미널을 재시작해도, 리눅스 재로그인을 해도
깨진 화면이 돌아오지 않아서
여기저기 검색하다가 별 수 없이
~/.zshrc를 템플릿에서 재복사했더니 정상으로 돌아오기는 했다.

무식한 방법일지도 모르지만 내가 시도한 방법은

rm ~/.zshrc
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
source ~/.zshrc
# 플러그인에 zsh-autosuggestions 등 추가 및 powerlevel10k/powerlevel10k 테마 설정
p10k configure

등의 명령어를 차례대로 실행한 것.

 

참고로 myshell.sh 안에서 print()라고 정의한 함수명을 asdf() 라고만 수정하고 실행해도
터미널 화면이 깨지는 일은 일어나지 않았다.

환경변수나 alias 문제일까 찾아보고 싶었지만,
이 이상의 삽질은 (당분간은) 의미가 없을 것 같아서
그냥 진도를 빼기로 했다.

셸스크립트 문법과 기본명령어에
당분간 좀 익숙해지는 시간을 가져야겠다.

 

알아보는 중인데

아래 결과를 봐서는
내가 덮어씌운 print가
아래의 /usr/bin/print나 /bin/print 환경변수를
덮어써서 그런 게 아닌가 싶다.

다시 오류를 재현하고 싶지는 않지만
호기심을 참을 수가 없어 다시 오류를 내본다.
my.sh를 아래와 같이 만들고

#!/bin/bash

function print() {
    echo $1
}

print "Hello world"

```source my.sh```를 실행했더니 다시 터미널이 아래처럼 와장창 깨지기 시작했다.

자, 되돌릴 수 있을까?
ChatGPT야 도와줘!

이 중 하나만 걸려라!

1. 셸 재시작은 통하지 않는다.
2. unalias도 통하지 않는다.
3. (믿었던) unset -f print도 통하지 않는다.
4. 셸의 경로확인은 의미가 없었다.
5. 이건 뭐, 가장 의미없는 방법 아닌가?

다섯 가지 방법 모두 zsh을 되살리지 못했다.

```typeset -f | grep -A100 'prompt_asdf () {' | grep -B100 '}'```로
prompt_asdf도 읽어봤지만, print와 관련된 부분도 없었다.

영원히 미스테리로 남을 것인가ㅜ

한 가지 재미있는 점은

리셋하지 않고도 ```cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc``` 방법이
여전히 잘 통한다는 것인데,

myshell.sh로 print 함수만 재정의했는데도
~/.zshrc 파일의 내용이 바뀐다는 뜻인가?

그럼 ~/.zshrc 파일이 어떻게 바뀌는지 한 번 알아봐야겠다.

근데, 음? ~/.zshrc에는 바뀐 게 없는 것 같은데?
그럼에도 .zshrc를 삭제하고 나서 `p10k configure`를 실행하면
원래대로 돌아온다. p10k 세팅 중에 print와 충돌이 있는 건가?

1. aa.sh를 다시 실행한 후에
`p10k configure`를 실행하면

아예 화면 자체가 뜨지 않는다. (다행히 q를 누르면 설정화면에서 나갈 수 있다.)

2. ~/.zshrc를 삭제하고, 리셋 없이
oh-my-zsh 템플릿의 .zshrc를 홈에 복사한 후 `p10k configure`만 실행하면?

안된다. 여전히 빈 화면.

3. ~/.zshrc를 삭제하고,
템플릿의 .zshrc를 복사한 후, `reset` 하고
`p10k configure`를 실행하면?

동일하게 안 된다. 여전히 빈 화면

그럼
4. ~/.zshrc를 삭제하고,
reset 후에
템플릿의 .zshrc를 복사한 후
p10k configure를 실행하면?

이건 뭐 동일해서, 결과도 동일하다.

핵심은 터미널을 껐다 켜는 것이고,

이 화면에서 2를 선택하고 나서

`cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc`를 실행한 후에
(여전히 화면은 깨져 있지만)

p10k configure를 실행하면
아래처럼 프롬프트세팅화면이 나타나게 된다.

대신 세팅을 마친 후에도 화면은 아래처럼 깨져 있다.

하지만 다른 조치 없이
터미널을 재시작하기만 하면
화면이 정상으로 돌아온다.

결국 print에 대한 문제는 해결하지 못했다.

print에 대한 부분은
나중에 전문가를 찾아서 물어보든지 해야겠다.
ChatGPT한테서 답을 끌어내기에는
아직 내 리눅스 내공이 너무 부족한 것 같다.

오늘 삽질은 여기까지만 하자.

 

댓글