리눅스에서 바로가기가 바로가기를 가리키고, 또 바로가기가 또 바로가기를 가리키고, 이런 식으로 들어가는 경우가 있습니다. 이 경우에 실제 파일이 어느 경로에 있는지는 어떻게 찾으면 될까요?

 


 먼저, which javac를 쳐 보겠습니다.

 

 

 그러면 이것은 /usr/bin에 있는 javac 명령어를 쓴다고 합니다.

 

 

 java는 /usr/bin에 있는 java 명령어를 쓴다고 하는군요. 글쎄요. 잘 모르겠으니, 일단 /usr/bin에 들어가서 이들에 대한 정보를 조회해 보도록 하겠습니다. 조회를 해 보니, 둘 다 /etc/alternatives에 있는 특정한 명령어를 가리키고 있음을 알 수 있어요. 바로가기인 셈입니다.

 

 

 해당 경로에 가서, java와 javac에 대한 정보를 보도록 하겠습니다.

 

 

 아. 또 링크로 연결이 되어 있습니다. javac를 찾기 위해서, 링크가 연결되어 있는 /usr/lib/.../bin 경로로 가겠습니다.

 

 

 그랬더니, javac가 있음을 알 수 있습니다. 링크 구조가 다소 복잡하군요.

 


 readlink는 심볼링 링크가 연결되어 있는 파일의 경로를 가져옵니다. 예를 들어, 바로가기 A가 실제로는 드라이브 C에 있는 1.txt를 가르켰다면, 바로가기 A를 readlink 하면 C 드라이브 안의 1.txt라는 정보를 리턴합니다.

 

 

 which java를 하면, java 명령어의 위치를 리턴합니다. /usr/bin/java입니다. 그런데, 이것은 바로가기입니다. 실제로 수행되는 프로그램은 어딘가에 따로 있을 겁니다. 그렇기 때문에, /usr/bin/java의 심볼릭 링크를 읽습니다. 그랬더니 /etc/alternatives/java가 나옵니다.

 

 역시나, 심볼릭이므로 또 읽어내서 어느 대상을 가리키는 지 읽어와야 합니다. 이런 식으로, 계속 읽다 보면, 언젠가는 실제 실행 파일의 경로가 나올 겁니다. 그런데, 이 경우는 겨우 3뎁스밖에 되지 않아서 다행인데요. 10뎁스, 20뎁스, 200뎁스라면 어떨까요? 계속 심볼링 링크의 경로를 찾아가면서 trace 할 수는 없는 노릇입니다.

 

 

 이 때 -f 옵션을 붙이면 됩니다. recursively하게 들어간다. 라는 말에서 눈치를 채셨을지도 모르겠지만. 재귀적으로 계속 들어가서, 실제 파일의 경로를 찾습니다. 잠깐. 재귀는 종료 조건이 있어야 할 텐데요. 실행 조건은 심볼릭이면 계속 타고 들어가면 됩니다. 종료 조건은? 심볼릭이 아니면 나와버리면 됩니다.

 

 그러면 실제로 활용을 해 보겠습니다.

 

 

 -f 옵션 뒤에 오는 $(which java)가 있습니다. 이것은 which java의 결과를 대치시킵니다. 만약에 which java 명령을 수행한 결과가, /usr/bin/java라면 $(which java) 부분이 /usr/bin/java로 대치될 겁니다. 그런데, 이것은 실제로 다음과 같이 연결되어 있습니다.

 

 

 노란색 부분은 링크가 아니므로, /usr/lib/jvm/.../java를 리턴하겠네요. 해당 경로에 들어가 보겠습니다.

 

 

 ls -ail를 입력해 보니, java가 보이고, 어떠한 것과도 연결되어 있지 않음을 알 수 있습니다.