oh my zsh를 셋팅하는 글들을 보면, 이상한 명령어들을 많이 쓴다는 것을 알 수 있습니다. 특히 $ 표시가 붙은 것들 말입니다. 이것들이 대체 무엇일까요? 간단하게 알아보겠습니다.

 


 먼저, echo $SHELL 같은 것들 먼저 봅시다. 이것은 변수의 값을 출력해 줍니다.

 

 

 예를 들어, $SHELL은 /user/bin/zsh이고, $JAVA_HOME은 /usr/bin/jvm/java-8-openjdk-amd64입니다. 어디에선가, SHELL 변수는 /usr/bin/zsh로 정의되었을 뿐입니다. $JAVA_HOME은 /usr/bin/jvm/java-8-openjdk-amd64로 정의되었을 거고요.

 

 

 그래서, cd $JAVA_HOME 명령을 입력하면, java의 홈 디렉토리로 이동합니다. 그랬음을 알 수 있습니다. $V는 변수 V의 값을 의미합니다. echo $V는 V의 값을 출력한다는 의미이고, cd $V는 V가 저장하고 있는 path로 이동한다는 의미입니다.

 

 


 그런데, $() 이런 식으로 붙이는 경우도 있습니다. 이것은 명령어의 실행 결과를 의미합니다. 즉, $(Command) 쓰면, $(Command)는 명령어 Command의 실행 결과로 대치됩니다. 어떻게 쓸 수 있는지 예를 하나 들어보겠습니다.

 

 

 df는 mount가 된 것들에 대한 정보를 출력합니다. 여기서, /dev/sda6는 제가 ubuntu를 부팅할 때 쓰는 ssd입니다. Size가 109 기가바이트인 것만 봐도 얼추 감을 잡으실 수 있을 겁니다.

 

 

 여기서, sda6만 grep 처리를 하면, 위와 같습니다. Mounted on이 중요한데요. 현재 내가 바라보았을 때, Mount가 된 위치를 의미합니다. /dev/sda6은 / 위치에 마운트가 되었음을 알 수 있어요. 이 /만 뽑아오고 싶습니다. 그럴려면 6번째 위치를 뽑아오면 되는데요. 그럴 때 이용할 수 있는 것은 awk입니다. 이 글에 설명이 되어 있습니다.

 

 

 아무튼, 위와 같이 명령어를 입력해 주면 /만 뽑히게 됩니다.

 

 

 빨간 부분이, 해당 명령어를 실행한 결과인 /로 대치가 됩니다. 따라서, 위 명령어는 사실상 cd /와 같으므로, 최상위 디렉토리로 이동하게 됩니다.

 

 

 당연하게도 echo $(SHELL)은 먹히지 않는데요. 이는 SHELL이 명령어가 아니기 때문입니다.

 


 비밀 번호를 잊어버렸다고 해 보겠습니다. 그러면, 부팅 디스크로 부팅을 해야 합니다. 그리고 나서 어떻게 해야 할까요? 단순히, 부팅디스크로 부팅한 다음에, 터미널에서 passwd cho를 입력하면 될까요?

 

 

 그렇지 않습니다. 이 상태에서는 cho를 찾지 못할 겁니다.

 

 

 우분투가 설치된 디스크는 /dev/sda5라고 해 보겠습니다. 그러면, 우리는 df -h의 결과를 grep sda5로 파이핑 처리를 하고, 그 결과를 또 awk {'print $6'} 으로 파이핑 처리를 할 수 있어요.

 

 

 이것을 echo 해 보면, echo 다음 부분이 df -h | grep sda5 | awk {'print $6'} 을 한 결과인 /media/.../2795bb9로 치환됨을 알 수 있습니다.

 

 

 chroot 명령어는 루트 디렉토리를 바꿉니다. sda5의 루트 디렉토리로 접근한 다음에, passwd cho를 입력하면, cho의 비밀번호를 바꿀 수 있게 됩니다.