터미널을 사용합시다 ! - 절대경로와 상대경로 이해하기

MS 도스와 다르게 리눅스는 파일을 실행할 때 꼭 앞에 [b:2s4odotm]"./"[/b:2s4odotm]을 붙여줍니다.
처음에는 많이 어색합니다.

[b:2s4odotm]"."[/b:2s4odotm] 은 자신의 현재 디렉토리를 뜻합니다. 점이 두개면 ("…") 바로 위 상위 디렉토리를 뜻합니다.
MS 도스와 똑 같고 경로지정 문자만 다릅니다. ( / 와 \ )

왜 불편하게 꼭 실행파일 앞에 "./"을 붙여주는지 꼭 필요한 것인지
한번쯤은 의문을 가져 보셨을 겁니다.

결론부터 말하자면 리눅스는 MS도스와 같이 현재 디렉토리를 경로(PATH)에 넣지
않았기 때문입니다.

경로란 내가 명령을 내렸을 경우 찾아 다니는 디렉토리입니다.
echo $PATH 하면 자신의 경로가 나타납니다.

[list:2s4odotm][b:2s4odotm]$ echo $PATH
/home/myhome/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games[/b:2s4odotm][/list:u:2s4odotm]

즉 ls를 입력하면 /home/myhome/bin 디렉토리를 찾아 ls가 있나 보고 없으면
다음 경로인 usr/local/bin 디렉토리를 뒤지게 됩니다.

이 일을 bash라는 shell이 해 주는 것입니다. (도스의 command.com)

ls는 /bin 디렉토리에 존재하므로 bash가 ls를 찾게 됩니다.
그리하여 ls는 "./" 없이 바로 실행이 되는 것입니다.

모든 파일 실행시 "./"없이 실행시키고 싶다면 자신의 홈 디렉토리 아래
[b:2s4odotm].bashrc[/b:2s4odotm] 파일 첫 줄에 다음을 추가하면 됩니다.

[list:2s4odotm][b:2s4odotm]export PATH="./:$PATH"[/b:2s4odotm][/list:u:2s4odotm]

그러면 다음부터 "./" 없이 모든 명렁어가 사용 가능합니다.
편리하겠죠?

내 아닙니다. 리눅스는 이 현재 경로를 일부러 빼 놓았습니다.
이유는 편리함보다 더 중요한 보안의 문제가 있기 때문입니다.

나쁜 해커들이 현재 경로의 파일을 읽을 수 있다는 점을 악용할 수 있기 때문에
일부러 빼 놓은 것입니다.

"나는 혼자 쓰는데 무슨 문제야?" 할 수 있겠지만
리눅스는 기본적으로 여러 사람이 같이 쓰는 운영체제라고 생각하기 때문에
조금 불편하시더라도 꼭 절대경로를 이용하는 습관을 들이는 것이 좋습니다.

파일 카피도 마찬가지입니다.

[list:2s4odotm][b:2s4odotm]$ cp original/* target/[/b:2s4odotm]
보다는

[b:2s4odotm]$ cp ./original/* ./target/[/b:2s4odotm]
이런식으로 표현해 주셔야 합니다.[/list:u:2s4odotm]

보다 정확하고 안전함을 위해서 편리함을 양보하는 것입니다.

[b:2s4odotm]리눅스는 까칠해…[/b:2s4odotm] 8-)

덕분에 좋은 정보 알아 갑니다.

항상 좋은 팁 감사합니다.

좋은 정보 얻어 갑니다!~

현재 디렉토리에 있는 파일을 실행할 때, 파일명 앞에 ./를 붙여줘야한다는
것은 이해하겠는데, 아래의 두 명령어 사이에는 어떤 차이가 있는 건지
모르겠습니다.

[quote:2zv3k4xi]
$ cp original/* target/
보다는

$ cp ./original/* ./target/
이런식으로 표현해 주셔야 합니다.
[/quote:2zv3k4xi]

둘 다 cp 명령어에 파일이나 디렉토리 이름을 인자로 넘겨주는 것 뿐이니
차이가 없는 거 아닌가요?

[quote="jeongsw":298fuba3]현재 디렉토리에 있는 파일을 실행할 때, 파일명 앞에 ./를 붙여줘야한다는
것은 이해하겠는데, 아래의 두 명령어 사이에는 어떤 차이가 있는 건지
모르겠습니다.

[quote:298fuba3]
$ cp original/* target/
보다는

$ cp ./original/* ./target/
이런식으로 표현해 주셔야 합니다.
[/quote:298fuba3]

둘 다 cp 명령어에 파일이나 디렉토리 이름을 인자로 넘겨주는 것 뿐이니
차이가 없는 거 아닌가요?[/quote:298fuba3]

사실, 현재 디렉토리를 패스에 걸어주지 않는 이유는 보안 때문에 그렇습니다. 예를 들어,

  1. 악의적인 목적을 가진 사용자가 자신의 디렉토리에 ls 라는 파일을 만들어놓고 755 퍼미션을 준 뒤, 안의 내용에는 엉뚱한 내용을 넣어놨다고 칩니다.
  2. 시스템 관리자(root)가 사용자 디렉토리를 여기저기 돌아다니다가 악의적인 목적을 가진 사용자 디렉토리에 와서 ls라고 치는 동시에, 뭔가 일이 일어나겠죠?

따라서 현재 디렉토리에는 패스를 걸어주지 않는 것이 일반적입니다.
다만, cp 명령어에서의 차이는 옛날에는 위의 예제처럼 타이핑하지 않으면 에러가 나던 시절/유닉스가 있었습니다. BASH에서 개선된 건지, 세월이 흐르면서 개선된 건지는 잘 모르겠습니다만 그랬던 시절/유닉스가 있었답니다. 지금은 위의 예제처럼 타이핑하지 않아도 잘 인식합니다. 심지어 ln 명령어의 경우는 후자는 점만 찍어도 되더군요. ln -s /usr/share/phpmyadmin . 이렇게요.

윈도우가 당장의 편리함을 위해 희생한 것들이 많죠.
그래서 지금에 이르러 별 시덥지 않은 스크립트 바이러스에도 시달리는 것이지만…

예전에 슬랙웨어를 사용할 당시에도 윈95는 뭔가 붕 떠서 불안불안 한것이 깨질까 무서운 접시를 쓰는 느낌이었다면
리눅스는 왠지 묵직하고 투박한 놋쇠그릇을 쓰는 느낌이랄까요.
무언가를 하더라도 자료가 손상될까, 파티션을 날리지는 않을까 하는 불안감 없이 꽤나 안정감이 있었죠. ㅋㅋ