본문 바로가기

프로그래밍(TA, AA)/스크립트

[리눅스] 쉘 명령어

유닉스 시스템과 사용자 사이의 인터페이스는 일반적으로 쉘이 담당하게 됩니다. 유닉스 시스템의 사용법을 익힌다는 것은 대체로 쉘에서 제공하는 각종 명령어들을 익힌다는 것이라 말할 수 있습니다. 이번 포스팅에서는 쉘에 대한 소개와 쉘에서 제공하는 각종 시스템 인터페이스를 소개하고 익히도록 하겠습니다.



쉘 명령어


단일 명령을 실행하는 경우, 명령어 이름과 매개 변수(Argument)를 이용하게 되는데, 매개 변수의 경우 대부분 '-'와 알파벳 단어로 옵션을 부여한 다음 필요한 값들을 입력하게 됩니다. 명령어를 입력할 때, ;(세미콜론)을 이용하여 명령어들을 나열하게 되면 명령어가 순차적으로 실행이 됩니다. 그리고 명ㄹ령어 뒤에 &를 추가하면 프로그램이 백그라운드 프로세스로 실행이 되며, 명령어들을 &를 이용하여 나열하게 되면 프로그램들이 모두 동시에 실행됩니다.


Input/Output

프로그램의 입출력은 기본적으로 홤녀으로 되어 있지만 이를 재지정함으로 바꿀 수 있습니다. 출력을 재지정하기 위해선 '>' 기호가 사용되는데 이를 이용하면 화면으로 출력되던 것을 파일이나 기타 장치로 바꿀 수 있습니다. 만일 기존에 존재하는 파일에 '>' 기호를 사용하게 되면 해당 파일은 기존에 가지고 있던 데이터는 사라지고 새로운 데이터로 변경이 됩니다. 만일 기존의 데이터 밑에 새로운 출력 내용을 첨부하고 싶다면 '>' 대신 '>>' 기호를 사용하면 됩니다.


아래의 예를 보면 ls -l 명령 결과를 화면이 아닌 텍스트 파일에 출력하는 과정을 볼 수 있습니다.


$ ls -l > ls.txt

$ ls -l >> ls.txt 


이번에는 에러를 유발시켜 보겠습니다. 에러 출력의 경우 표준 출력장치(화면)를 이용하도록 되어있기 때문에 이를 다른 곳으로 지정하기 위해서는 옵션을 추가해야 합니다.


출력을 지정하는것과 유사하게 입력도 재지정할 수 있는데 이때는 '<' 기호를 사용하게 됩니다. 이 기호를 사용함으로써 기본적으로 키보드를 통해 읽어들이던 명령을 파일이나 기타 장치를 통해 입력 받게 됩니다.


ls -l > newLs.txt

abcdefg


그런 다음 아래와 같이 명령을 실행해 보겠습니다.


$ sh < commandList                   // 명령입력을 키보드가 아닌 파일로부터 받음

sh[2]: abcdefg:    not found         // 두 번째 명령에 에러가 있음이 출력 됨

$ cat newLs.txt                      // 첫번째 명령 결과를 확인함


입출력을 재지정하면서 사룡할 수 있는 다른 방법으로 '파이프'라는 것이 있습니다. 파이프는 특정 프로그램의 출력을 다른 특정 프로그램의 입력으로 연결시켜주는 것을 의미합니다. 파이프를 이용하면 두 개 또는 그 이상의 프로그램들이 서로의 결과물을 연동해서 사용하는 결과를 가지게 됩니다. 



문자 지정

문자를 지정할 때 와일드카드를 활용하면 마치 만능 문자를 사용한 것 같은 효과를 얻을 수 있습니다. 와일드카드 문자 중 '?'를 활용하면 종류에 상관없는 하나의 문자와 대체가 됩니다.


'?' 문자를 활용한 예들을 간단히 보면 다음과 같습니다.


$ ls .cshrc

.cshrc            // 현재 디렉토리에 .cshrc 파일이 있음을 먼저 확인

$ ls .cs?rc       // .cshrc를 .cs?rc로 기입

.cshrc            // 동일한 결과를 얻게 된다


'?' 기호가 하나의 단어와 대체되는 것과 달리 '*' 기호는 하나의 문자열과 대체할 수 있습니다. 이때 말하는 문자열이란 하나의 글자 또는 전혀 없는 글자, 또는 수많은 글자들을 포함하기 때문에 '*'를 전혀 없는 또는 하나 이상의 '?'로 이해하면 될 것입니다.


와일드카드를 사용하면서 문자열의 시작과 끝, 즉 문자열의 범위를 지정해 줄 수 있습니다. 문자열의 범위를 지정해 주는 방법으로 대괄호([])를 사용하는데 이를 활용한 예들을 간단히 살펴보면 다음과 같습니다.


$ ls .c[abs]hrc             // .cahrc, .cbhrc, 또는 .cshrc를 의미한다.

$ ls .c[a-s]hrc             // .cahrc, .cbhrc ~ .cshrc를 의미한다.

$ ls .c[a-zA-Z]hrc



시스템 환경 구축


path는 실행에 필요한 명령어나 기타 파일의 위치를 미리 지정해주는 기능을 가지고 있는데 윈도우의 PATH 등과 동일합니다. .cshrc 파일에서 사용하는 path 지정방법을 간단히 보면 다음과 같습니다.


set path = (. \

  /opt/sfw/bin  \

  /usr/openwin/bin)


history는 이전에 사용했던 명령어들의 리스트를 관리하는 명령어입니다. history 명령을 이용하면 예전에 실행했던 명령들을 쉽게 재실행시킬 수 있습니다. history에서 관리할 수 있는 명령어의 개수를 사용자가 지정할 수 있습니다.


history가 세팅이 되고 나면, history 명령을 이용하여 앞서 실행했던 명령어들이 무엇이었는지 확인하고 쉽게 재실행할 수 있습니다. 실제 사용 예를 보면 다음과 같습니다.


% history               // 지금까지 실행되었던 명령어들의 리스트를 출력

% !!                    // 마지막에 실행되었던 명령 재실행

% !3                    // history 리스트의 앞에서 3번째 명령 재실행

% ! -3                  // history 리스트의 마지막에서 3번째 명령 재실행

% !vi                   // 가장 최근에 실행되었던 명령중 vi로 시작되는 명령 재실행



프로세스 관련 사용법

쉘에는 프로세스를 컨트롤하는 기능이 있는데 이를 활용하면 쉘 상에서 프로그램을 백그라운드로 실행을 시킬 수도 있고 여러 개의 프로그램이 동시에 실행되도록 만들 수 있습니다.


먼저 ps(Process Status)를 살펴보면 'ps'는 프로세스의 리스트를 화면에 출력해주는 명령어로 옵션을 이용하여 출력되는 리스트를 원하는 형태로 필터링을 할 수 있습니다. 먼저 단순히 ps를 사용하면 현재의 쉘에서 실행중인 프로세스들이 화면에 출력됩니다. 'ps -ef' 등 다른 옵션을 이용하면 시스템 전체에서 실행중인 프로세스들의 리스트들이 출력됩니다. 


프로세스를 실행할 때 처음부터 백그라운드(Background)로 돌리고 싶으면 실행명령어 뒤에 & 옵션을 붙여서 실행합니다.


백그라운드로 실행중인 프로세스를 포그라운드(Foreground)로 변환하고 싶으면 'fg' 명령어를 사용합니다. 명령어 입력줄에서 fg를 입력하고 엔터를 누르면 백그라운드에서 돌고 있던 프로세스가 포그라운드로 실행되는 것을 확인 할 수 있습니다.


포그라운드로 돌고 있는 프로세스를 백그라운드로 변경하려면 먼저 Ctrl+Z를 누릅니다. 다시 말해, 컨트롤키와 z키를 함께 누르면 프로세스가 중단되었다는 메시지가 화면에 나타나게 됩니다. 이때 'bg' 명령어를 사용하면 중단된 프로세스는 백그라운드에서 다시 실행이 됩니다.


프로세스를 로그오프한 후에도 계속해서 작동하도록 만들고 싶으면 'nohup' 명령어를 사용하도록 합니다. 아래와 같이 멸영을 주면 로그오프와 상관없이 프로그램이 계속 실행됩니다.


$ nohup command name &



프로세스들은 우선 순위를 이용해 CPU 점유 우위 등을 정하게 되는데, 'nice' 명령을 이용하면 기본적으로 정해진 우선 순위를 사용자가 임의로 변경할 수 있습니다. 우선 순위는 1~19까지 있고 숫자가 높을수록 우선순위는 낮아지면 기본 우선 순위는 0입니다. nice 사용 예를 보면 다음과 같습니다.


$ nice -3 command name &      // 3만큼 우선순위 숫자를 높인다.

$ nice --3 command name &     // 3만큼 우선순위 숫자를 낮춘다.



통신 관련


유닉스에서 기본적으로 제공하는 네트워크 관련 도구들과 그 사용방법에 대해 살펴보겠습니다. 


파일 전송

네트워크 상에서 원격지에 있는 시스템에 파일을 보내거나(put) 얻어오기(get) 위해 가장 많이 사용하는 프로그램은 'ftp'입니다. ftp는 File Transfer Protocol의 약자로 먼저 대상이 되는 시스템에 ftp 명령어를 이용하여 접속부터 해야합니다. 아래와 같이 ftp 시스템명 또는 ftp ipaddress를 이용합니다.


$ ftp hostname

$ ftp ipaddress


아래와 같이 그냥 ftp 명령만 실행한 후 원격지 시스템에 접속을 시도할 수도 있습니다.


$ ftp

ftp> open hostname                 // 또는 open ipaddress


ftp 접속이 가능한 시스템이면 사용자 이름과 패스워드를 입력하라는 말이 나오는데 제대로 된 아이디와 패스워드를 입력하면 ftp 접속이 성공적으로 이루어지고 세션이 유지가 됩니다. ftp 연결이후에는 다양한 명령어들을 이용하여 파일을 주고받을 수 있게 되는데, 이 속에서 사용할 수 있는 명령어들을 먼저 살펴보면 다음과 같습니다.


참고로 ftp를 사용하는 컴퓨터를 host1, 원격지에 있는 컴퓨터를 host2라고 명명합니다.


  • ls: host2의 현재 디렉토리에 있는 파일리스트가 출력된다.
  • dir: host2의 현재 디렉토리에 있는 파일리스트가 자세히 출력된다. ls -l과 동일하다.
  • cd: host2의 작업 디렉토리를 이동한다.
  • lcd: host1의 작업 디렉토리를 이동한다.
  • ascii: 파일 전송 모드를 ascii로 지정한다.
  • bin: 파일 전송 모드를 binary로 지정한다.
  • get: host2에 있는 파일을 host1으로 전송한다.
  • mget: host2에 있는 파일들을 host1으로 전송한다.
  • put: host1에 있는 파일을 host2으로 전송한다.
  • mput: host1에 있는 파일들을 host2으로 전송한다.
  • ?: ftp에서 사용할 수 있는 명령어 목록을 보여준다.
  • bye: ftp 연결을 끊고 ftp 프로그램을 종료한다.


ftp 프로그램을 사용해 보지 않은 독자들은 유닉스 상에서 ftp를 실행한 후 위의 명령어들을 꼭 한번씩 실행시켜보면 도움이 될 것입니다.



메시지 통신

유닉스는 로컬머신에 있는 사용자 또는 원격지에 있는 사용자와 메시지를 주고받을 수 있는 프로그램들을 제공합니다. 먼저 동일한 시스템에 있는 사용자와 메시지 주고받는 방법부터 살펴보겠습니다.


시스템 내부의 사용자와 메시지를 주고 받으려면 먼저 누가 접속해 있는지 확인을 해야 합니다. 이를 위해서 사용할 수 있는 프로그램에는 'who', 'w', 'users' 등이 있습니다. 명령줄 입력라인에서 'who'를 실행시키면 현재 접속되어 있는 사람과 그가 사용하는 터미널 등이 화면에 출력됩니다.


'w' 명령어를 실행시키면 'who'에서 나은 정보에다 해당 사용자가 어떤 작업을 수행중인지도 간단히 출력도비니다. 단순히 접속된 사용자의 아이디만 보고 싶으면 'users' 명령어를 실행시키면 됩니다. 어떤 사용자가 로그인 되어 있는지 확인이 되었으면, 'write' 명령어를 사용하여 메시지를 전송하면 됩니다.


write username


메시지를 주고받는 또다른 프로그램으로 'talk' 명령어가 있습니다. 'talk' 명령어는 동일한 시스템 뿐만아니라 원격지 시스템 속의 사용자와도 통신이 가능합니다. 사용예는 아래와 같습니다.


talk username@hostname


users 명령어를 이용하면 로컬머신의 사용자를 알 수 있듯이, 'rusers' 명령을 이용하면 원격지 머신에 접속중인 사용자를 알 수 있습니다. rusers 명령어 사용예를 보겠습니다.


rusers -l hostname