리눅스 쉘에서 자주 만나는 상황들

휴먼스케이프

안녕하세요. 휴먼스케이프에서 개발을 하고 있는 Jinny입니다.

이번 글에서는 맥 또는 리눅스 사용자들이 개발을 하면서 자주 만나는 상황들과, 그 때 필요한 명령어들을 정리하였습니다.

파일 권한 관리 — chmod

새 프로그램을 빌드할 때 자주 만나는 에러 중 하나는 Permission denied 입니다. 접근해야하는 파일에 접근권한이 없음을 의미합니다.

Permission denied 에러

이 때 해결방법 중 하나는 커맨드 앞에 sudo(Superuser do)를 붙여 슈퍼유저 권한으로 커맨드를 실행하는 것입니다.

*주의*

sudo로 커맨드가 아닌 쉘 스크립트를 실행하는 경우 ``안에 파일 path를 명시하거나, sh -c를 사용하여 스크립트를 실행해야 합니다. 그렇지 않으면 ./env.sh을 파일 path로 인식하지 않고 커맨드명으로 인식되어 에러가 발생합니다.

잘못된 예

잘 실행되는 예

하지만 sudo를 붙여도 해결되지 않는 경우가 있습니다. sudo 계정 역시 파일 자체에 권한이 없는 경우입니다.

sudo를 붙여도 권한이 없음

env.sh 파일의 권한을 확인해보면 실행이 불가능한 것을 확인할 수 있습니다.

실행이 불가능한 파일

파일에 접근할 수 있는 주체는 3개의 카테고리로 분류됩니다. 파일 소유자, 소유자 그룹, 사용자입니다. 파일의 접근 방식은 read, write, execute 3가지로 분류됩니다.

예를 들어 위에서처럼 권한이 rw-r — r — 로 설정된 경우는, 소유자는 파일을 read, write 할 수 있고, 그룹과 사용자는 파일을 read만 할 수 있다는 의미입니다. 누구도 파일을 execute 할 수 없기때문에 계속해서 Permission denied가 발생합니다.

소유자에게 execute 권한을 부여하려면 chmod(Change mode) 커맨드를 사용합니다. 인자로는 권한을 표현하는 8진수와 권한을 수정할 파일명이 차례대로 옵니다.

소유자에게 파일 실행권한 부여

또는 8진수를 쓰지 않는 방법도 있습니다.

소유자, 소유자 그룹, 기타 사용자 중 권한을 설정할 대상을 u, g, o로, 권한을 추가할 것인지 취소할 것인지를 +, -로, 어떤 권한을 설정할 것인지를 r, w, x로 표기하여 아래와 같이 권한 설정을 할 수 있습니다.

예1)

소유자, 소유자 그룹, 기타 사용자에게 read, write, excecute 허용

예2)

소유자로부터 read, write, execute 권한 취소

더 자세한 사용법은 이 곳을 참고하세요. https://www.ibm.com/support/knowledgecenter/ko/ssw_ibm_i_73/rzahz/rzahzchmod.htm

환경변수 설정 — export

두번째는 쉘 환경변수 설정입니다. 프로그램을 설치하다보면 환경변수를 새로 추가하거나 변경해야 하는 경우가 있습니다. 이 때 사용되는 커맨드가 export입니다.

주의할 점은, child process에서 설정된 환경변수는 parent process에서 사용할 수 없다는 것입니다. (parent 프로세스의 환경변수는 child 프로세스에서 사용할 수 있습니다.)

예를 들어 아래처럼 하나의 bash 쉘에서 또다른 bash 쉘을 실행시켜, child 쉘을 생성합니다. child 쉘에서 환경변수 myname을 새롭게 추가하고, echo $myname으로 값을 출력합니니다. 그 후 child 쉘을 종료하고 parent 쉘에서 그 값을 출력하려고 하면 실패합니다.

child process에서 설정된 환경변수는 parent process에서 사용할 수 없다

쉘 스크립트를 실행하는 경우도 child process가 실행되는 경우입니다.

환경변수 day를 생성하는 쉘 스크립트 env.sh

이 스크립트를 아래처럼 실행해도, 실행이 끝난 후 parent 쉘에서는 변수 day를 찾을 수 없습니다.

day가 어디갔지?

반면 쉘 스크립트를 source 커맨드로 실행하면 day값이 출력되는 것을 확인할 수 있습니다. source 커맨드는 별도의 child process를 만들지 않고 현재 프로세스에서 스크립트를 실행하기 때문입니다. .bashrc 또는 .zshrc, .bash_profile 등의 설정파일을 수정하고 항상 source [파일명]을 실행하는 이유도 이 때문입니다. source를 붙이지 않고 실행하면 변경된 설정은 child 프로세스에만 반영되고, 스크립트 실행이 끝나면 사라집니다.

또는 . env.sh도 같은 역할을 합니다.

‘export day=30’ vs ‘day=30’

끝으로 export 를 붙여서 변수값을 설정하는 것과 export 없이 변수값을 설정하는 것의 차이를 알아보겠습니다. 두 개의 차이는 간단합니다. export day=30은 “환경변수' day를 생성하는 것이고, day=30은 일반 변수를 생성하는 명령입니다. 환경변수가 일반 변수와 다른 점 중 하나는, parent 프로세스의 환경변수가 child 프로세스로 복사된다는 것입니다.

감사합니다.

Get to know us better! Join our official channels below.

Telegram(EN) : t.me/Humanscape KakaoTalk(KR) : open.kakao.com/o/gqbUQEM Website : humanscape.io Medium : medium.com/humanscape-ico Facebook : www.facebook.com/humanscape Twitter : twitter.com/Humanscape_io Reddit : https://www.reddit.com/r/Humanscape_official Bitcointalk announcement : https://bit.ly/2rVsP4T Email : support@humanscape.io

기업문화 엿볼 때, 더팀스

로그인

/