리눅스 명령어 순차 실행 구현 - linugseu myeonglyeong-eo suncha silhaeng guhyeon

CLI의 가치

명령을 통해서 컴퓨터를 제어하는 중요한 이유 중의 하나는 해야 할 일을 순서대로 배치해서 자동화된 처리를 할 수 있다는 점입니다. 정확한 작업을 위해서는 명령어와 명령어를 연결하는 구분자를 잘 이해하셔야 합니다. 언어로치면 접속사와 같은 역할을 하는 것입니다. 여기서는 이 접속사들을 정리해봅니다. 

리눅스 명령어 순차 실행 구현 - linugseu myeonglyeong-eo suncha silhaeng guhyeon

결론

  • ; - 앞의 명령어가 실패해도 다음 명령어가 실행
  • && - 앞의 명령어가 성공했을 때 다음 명령어가 실행
  • & - 앞의 명령어를 백그라운드로 돌리고 동시에 뒤의 명령어를 실행

; - 성공여부와 상관없이 다음 명령어 실행

한 줄에 여러 명령어를 순서대로 배열할 때는 ;를 구분자로 사용합니다. 아래 명령어는 test를 만든 후에 test 디렉토리로 이동합니다. 

&& - 성공한 경우에 다음 명령어 실행

&&의 의미

&&는 앞의 명령어가 실행되었을 때 성공한 경우에 다음 명령어를 실행합니다. ;와는 다릅니다. 예를들어보죠. 아래와 같은 명령어가 있을 때

1

mkdir test; cd test; touch abc

test 디렉토리가 이미 있어서 아래와 같은 상황이라고 해보죠. 

mkdir test(실패); cd test; touch abc

이 경우 cd test가 실행되고, touch abc도 실행됩니다. 

반면에 아래의 경우는 cd test와 touch abc가 실행되지 않습니다. 

mkdir test(실패) && cd test && touch abc

성공&실패와 무관하게 연속적으로 실행해야 할 명령이 있을 때 ;를 씁니다. 이전 명령이 성공했을 때 다음 명령을 실행하려면 &&를 씁니다. 대체로 &&를 쓰는게 좋을 때가 많습니다. 좀 더 정확하게는 &&는 이전 명령어의 실행결과가 참(true)일 때만 다음 명령을 실행합니다. 아래 내용은 참고삼아 읽어보세요. 

명령어의 반환값

리눅스(유닉스)의 모든 명령어는 종료할 때 성공 여부를 알려줍니다. 예를들어보죠. 

test 디렉토리가 없는 곳에서 아래 명령을 실행해보세요. 성공했을 때 어떻게 되는지 보시죠. 

mkdir test

그리고 아래 명령을 실행해보세요. 

이 명령어는 이전 명령어가 반환한 값을 알아내는 것입니다. 결과는 아래와 같습니다. 

0

반대로 test 디렉토리가 이미 있는데 mkdir test를 실행한 후에 echo $?를 실행하면 아래 값이 출력됩니다. 

1

또는 존재하지 않는 명령어를 실행하면 127이 출력될꺼예요. 즉 리눅스에서는 0이 아닌 값은 실패(false)를 의미합니다. 

리눅스 명령어 순차 실행 구현 - linugseu myeonglyeong-eo suncha silhaeng guhyeon

&와 &&는 다릅니다. 

&는 명령어를 백그라운드로 동작시킬 때 사용합니다. 

mkdir test & cd test를 실행하면 아래와 같은 결과가 나옵니다. 

1

2

3

[1] 19989

cd: no such file or directory: test

[1] + 19989 done mkdir test

test 디렉토리를 백그라운드로 생성함과 동시에 test 디렉토리로 이동하려고 했기 때문에 cd test는 존재하지 않는 디렉토리로 진입하려고 시도하기 때문입니다. 한편, test 디렉토리는 생성됩니다. 

명령의 그룹핑 {}

명령을 그룹핑 할 수도 있습니다. 아래 명령은

1

mkdir test3 && { cd test3; touch abc; echo 'success!!' } || echo 'There is no dir';

  • mkdir test가
  • 성공했을 때 cd test2; touch abc를 실행하고 success!!를 출력합니다. 
  • 실패했을 때 echo 'There is no dir'를 실행합니다. 
  • 이때 실행되는 명령들은 현재 쉘의 컨텍스트에서 실행됩니다. 만약 서브 컨텍스트에서 실행하고 싶다면 '('와 ')'를 사용하시면 됩니다. (참고)

리눅스 명령어 순차 실행 구현 - linugseu myeonglyeong-eo suncha silhaeng guhyeon

교수님 이건 아니잖아요

리눅스(Linux)

리눅스 쉘 구현 참고

ruming 2022. 5. 25. 22:11

redirect 구현

https://sosal.kr/1114?category=227313 

일반 실행, 후면 실행, 순차실행, 리다이렉션 구현

https://mhwan.tistory.com/42

https://github.com/mhwan/Myshell/tree/master/myshells/source

파이프, 리다이렉션

https://pracon.tistory.com/121

그 외 쉘 구현

https://github.com/Reevid/shell/blob/master/shell.c

https://stackoverflow.com/questions/39341331/linux-shell-implementation-in-c-redirected-file-includes-the-prompt

https://gist.github.com/leejaeyeong/b667fed149f387237cd239998478edbf

'리눅스(Linux)' 카테고리의 다른 글

리눅스 [파일접근권한]  (0)2020.09.29
[리눅스] 기본 명령어  (0)2020.09.29
[리눅스] 단축키  (0)2020.09.29

'리눅스(Linux)'의 다른글

  • 이전글리눅스 [파일접근권한]
  • 현재글리눅스 쉘 구현 참고

관련글

  • 리눅스 [파일접근권한] 2020.09.29

  • [리눅스] 기본 명령어 2020.09.29

  • [리눅스] 단축키 2020.09.29

댓글 0

    댓글

    비밀글

    ○ 다중 명령어

        ▷ 여러 명령어들을 한번에 수행하게 도와주는 기능이 있는 명령어

        ▷ 명령어와 명령어 사이에 붙여 여러개의 명령어를 전달할 수 있습니다.

    이해가 쉽게 예시로 설명을 하겠습니다.

    ● 세미콜론 (;)


        ▷ 명령이 끝났음을 나타내는 명령어

        ▷ 한 줄의 여러 명령어를 입력하게 해줍니다.

            앞에 명령을 실패해도 두번째 명령이 실행이 됩니다. (앞의 명령어부터 순차적으로 실행)

    예시

    # mkdir test; touch a; ls

    명령어가 전부 실행되었습니다. test디렉토리 생성, a파일 생성, 파일 리스트 보기

    리눅스 명령어 순차 실행 구현 - linugseu myeonglyeong-eo suncha silhaeng guhyeon

    ● 엠퍼센트 (&)


        ▷ 엠퍼센트로 명령어를 구분하여 앞의 명령어는 백그라운드로 실행하고,

            즉시 뒤의 명령어를 실행하게 됩니다.

         앞의 명령어 성공 여부 상관없이 뒤 명령어는 실행됩니다.

            하지만 뒤의 명령어가 앞의 명령어의 결과에 종속되면 안됩니다.

            (예를 들어 mkdir test & cd test 이렇게 되면 안됩니다.

             백그라운드로 앞의 명령을 실행시켰기 때문에 test디렉토리 만들기전에 뒤 명령어가 실행되기 때문)

    예시

    # mkdir test & touch test1

    test 디렉토리 생성, test1 파일 생성

    리눅스 명령어 순차 실행 구현 - linugseu myeonglyeong-eo suncha silhaeng guhyeon


    ● 더블 엠퍼센트 (&&)


        ▷ 명령어를 연결하게 되면 앞에 있는 명령어가 실패하면 뒤에 있는 명령어를 실행하지 않습니다.

         첫번째 명령을 성공을 해야만 다음 명령을 실행

    예시

    위에서 test 디렉토리를 만들었고, test1 파일을 만들었습니다.

    # cat test && echo a

    test가 디렉토리라 cat 명령어를 실패하여 다음 명령어를 실행하지 않습니다.

    # cat test1 && echo a

    test1 파일에 아무것도 없어서 출력하지 않았지만 명령을 성공해서 다음 명령어도 실행되었습니다.

    리눅스 명령어 순차 실행 구현 - linugseu myeonglyeong-eo suncha silhaeng guhyeon

    ● 버티컬바 (|)


        ▷ 앞의 명령어의 실행결과를 뒤의 명령어의 입력으로 넘깁니다.

         다른 이름으로 파이프(pipe)라고 불립니다.

         grep명령어와 묶어서 아주 유용하게 사용됩니다.

    예시

    # ls -l | grep test

    ls -l 명령 결과를 뒤로 넘겨 grep으로 test라는 이름을 가진 것들만 출력

    리눅스 명령어 순차 실행 구현 - linugseu myeonglyeong-eo suncha silhaeng guhyeon

    ● 더블 버티컬바 (||)

        ▷ 명령어를 연결하게 되면, 앞에 있는 명령어가 성공하면 뒤에 있는 명령어가 실행 안됨

        ▷ 앞에 명령어가 실패하면 뒤에 명령어가 실행

    예시

    # rmdir test || sudo rmdir test

    테스트 디렉토리를 삭제하려는데 디렉토리의 권한이 없어서 삭제하지 못할 경우

    sudo명령어로 관리자 권한을 얻어서 test 디렉토리를 삭제합니다.

    리눅스 명령어 순차 실행 구현 - linugseu myeonglyeong-eo suncha silhaeng guhyeon

    다중 명령어의 장점은 명령어의 성공 여부에 따라서 동작을 제어할 수 있다는 점에서 효율적으로

    작업을 할 수 있습니다.

    ○ 리눅스에서 자주 사용하는 명령어

    # ifconfig (= # ip a)

    리눅스 IP확인 하는 명령어

    만약 ifconfig 명령어가 안된다면 # yum -y install net-tools 설치하면 됩니다.

    # ping [통신하고 싶은 IP]

    # ping 8.8.8.8 (구글DNS) 외부 통신 확인할 때 사용

    네트워크 통신이 되는지 확인하는 명령어

    # Ctrl + C 누르면 현재 실행중인 프로세스 강제 종료

    # route (= # ip r = # netstat -nr)

    외부 통신이 안될 때 gateway확인하는 명령어

    # netstat -nat | grep LISTEN

    TCP 통신만, 대기중인 상태 확인하는 명령어 (t를 빼면 모든 프로토콜 출력)

    보통 옵션은 -nap / -napt 를 많이 사용합니다.

    n 도메인 숫자로 출력, a 모든 네트워크 출력, p PID 출력, t TCP 프로토콜 출력

    # netstat -nat | grep ESTABLISHED

    TCP 통신만, 접속중인 상태 확인하는 명령어

    # netstat -nltp

    TCP listening 상태의 포트를 확인하는 명령어

    # netstat -an | grep 포트번호

    특정 포트가 사용중에 있는지 확인하는 명령어

    # ps -ef | grep [프로세스명]

    시스템에 동작중인 프로세스를 정보 확인하는 명령어

    # firewall-cmd --list-all

    사용 가능한 서비스, 포트 확인하는 명령어

    # systemctl status [서비스명]

    서비스 상태 확인하는 명령어

    ○ 그 외 다른 명령어, 용어

    간단하게 설명을 할 예정입니다.

    이런 명령어들이 있다 정도만 개략적으로 이해하시면 좋을거 같습니다.

    ● 터미널 관련 용어

    - 터미널 : 서버 로컬이나 원격으로 접속할 수 있는 콘솔을 구현한 소프트웨어

    - 쉘 : 명령어를 해석하여 전달해주는 소프트웨어

    - 콘솔 : 서버의 로컬에서 직접 명령어를 작성할 수 있는 입출력 장치

    - tty (Tele Type Writer) : 콘솔 및 터미널 환경

    - pty (Pseudo-Terminal) : 가상 터미널 환경

    - pts (Pseudo-Terminal Slave) : 원격 터미널 환경

    ● diff

    different의 약자

    실제 파일을 수정하기 전에 원본 파일을 복사해두고, 변경 파일과 원본 파일을 비교해서

    원하는 부분이 잘 수정이 되었는지 확인하는 것이 필요합니다.

    이런 경우 등등 파일을 비교할 때 사용하는 명령어입니다.

    자주 쓰이고 많이 쓰이는 명령어 입니다.

    # diff [옵션] [파일1] [파일2]

    두 개의 파일을 행 단위로 비교하여 차이점을 출력해주는 명령어

    # diff3 [옵션] [파일1] [파일2] [파일3]

    파일 3개를 비교할 때 사용하는 명령어

    옵션도 다양하게 많이 있습니다.

    ● split

    파일을 쪼개는 명령어

    시간이 지나서 로그 파일이 커지는 것처럼

    파일에 내용을 계속 추가하다보면 일정 크기를 넘으면 vi 편집기가 에러 뜨는 경우도 있고

    파일이 너무 커서 찾는데 오래 걸리는 경우도 있습니다.

    이런 경우 등등 대비해 파일을 분할하기 위한 명령어 입니다.

    (로그가 계속 쌓여 커질 때 파일을 분리해줄 때 많이 사용합니다.)

    # split [옵션] [파일명]

    ● date

    서버에 설정된 날짜와 시간을 확인할 수 있고, 수정할 수 있는 명령어

    # date [옵션]

    ● who

    현재 서버에 접속해 있는 사용자를 확인하는 명령어

    접속한 계정의 터미널, 접속 시간 등을 확인할 수 있습니다.

    # who

    ● whoami

    자신의 정보 확인하는 명령어

    # whoami

    ● cal

    현재 달력을 출력하는 명령어

    # cal [옵션]