Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

실전 예제로 익히는 리눅스 명령어 연결 연산자 10가지

리눅스에서 명령어 연결(Command Chaining)이란 여러 개의 명령어를 하나로 조합하여, 그 사이에 사용된 연산자의 특성에 따라 순차적 또는 조건적으로 실행되도록 만드는 기법을 말합니다. 마치 셸 자체에서 짧은 셸 스크립트를 작성해 터미널에서 바로 실행하는 것과 같으며, 반복 작업을 손쉽게 자동화할 수 있습니다. 또한 관리자가 상주하지 않는 서버 환경에서도 연결 연산자를 활용하면 시스템이 훨씬 체계적으로 동작하도록 구성할 수 있습니다.

실전 예제로 익히는 리눅스 명령어 연결 연산자 10가지

함께 보기: Awk와 정규 표현식으로 파일 내 텍스트 필터링하는 방법

이 글에서는 실무에서 자주 사용되는 명령어 연결 연산자 10가지를 간단한 설명과 함께 소개합니다. 이 연산자들을 잘 활용하면 코드를 더 짧고 의미 있게 작성할 수 있고, 경우에 따라서는 시스템 부하까지 줄일 수 있습니다.

1. 앰퍼샌드 연산자 (&)

& 연산자는 명령어를 백그라운드(background)에서 실행하도록 합니다. 명령어 뒤에 공백을 두고 &를 붙이기만 하면 되며, 한 번에 여러 명령어를 동시에 백그라운드로 실행할 수도 있습니다.

단일 명령어를 백그라운드로 실행하기:

admin@wsxdn.com:~$ ping ­c5 www.tecmint.com &

두 개의 명령어를 동시에 백그라운드로 실행하기:

admin@wsxdn.com:/home/tecmint# apt-get update & apt-get upgrade &

2. 세미콜론 연산자 (;)

세미콜론 연산자는 여러 명령어를 한 번에 입력하고 앞선 명령어의 성공 여부와 관계없이 순차적으로 실행되게 합니다.

admin@wsxdn.com:/home/tecmint# apt-get update ; apt-get upgrade ; mkdir test

위 명령어 조합은 먼저 update를 실행한 다음, upgrade를 수행하고, 마지막으로 현재 작업 디렉터리 아래에 test 디렉터리를 생성합니다.

3. AND 연산자 (&&)

AND 연산자(&&&)는 앞선 명령어가 성공했을 때, 즉 종료 상태(exit status)가 0일 때만 다음 명령어를 실행합니다. 마지막 명령어의 실행 결과에 따라 후속 작업을 제어해야 할 때 매우 유용합니다.

예를 들어, 터미널에서 links 명령어로 tecmint.com 사이트에 접속하기 전에 해당 호스트가 살아 있는지 먼저 확인하고 싶다면 다음과 같이 작성할 수 있습니다.

admin@wsxdn.com:/home/tecmint# ping -c3 www.tecmint.com && links www.tecmint.com

4. OR 연산자 (||)

OR 연산자(||)는 프로그래밍 언어의 'else' 문과 비슷하게 동작합니다. 앞선 명령어가 실패했을 때, 즉 종료 상태가 1일 때만 다음 명령어를 실행합니다.

예를 들어, 일반 사용자 계정(non-root)에서 'apt-get update'를 실행하고, 이 명령이 실패하면 'links www.tecmint.com' 명령어가 실행되도록 해보겠습니다.

admin@wsxdn.com:~$ apt-get update || links tecmint.com

위 명령어에서는 사용자에게 시스템 update 권한이 없으므로 첫 번째 명령어의 종료 상태가 1이 되고, 그 결과 마지막 명령어인 'links tecmint.com'이 실행됩니다.

반대로 첫 번째 명령어가 성공적으로 실행되어 종료 상태가 0이라면 어떻게 될까요? 당연히 두 번째 명령어는 실행되지 않습니다.

admin@wsxdn.com:~$ mkdir test || links tecmint.com

여기서는 사용자에게 허가된 홈 디렉터리에 'test' 폴더를 생성합니다. 명령어가 성공적으로 실행되어 종료 상태가 0이 되었기 때문에 뒤따르는 명령어는 실행되지 않습니다.

5. NOT 연산자 (!)

NOT 연산자(!)는 프로그래밍의 'except'(제외) 문처럼 동작하며, 지정된 조건을 제외한 나머지 모든 대상에 대해 실행됩니다. 이를 이해하기 위해 홈 디렉터리에 'tecmint' 디렉터리를 생성하고 해당 위치로 이동해 보겠습니다.

admin@wsxdn.com:~$ mkdir tecmint 
admin@wsxdn.com:~$ cd tecmint

다음으로 'tecmint' 폴더 안에 여러 형식의 파일을 생성합니다.

admin@wsxdn.com:~/tecmint$ touch a.doc b.doc a.pdf b.pdf a.xml b.xml a.html b.html

'tecmint' 폴더 내에 새 파일들이 모두 생성되었는지 확인해 보겠습니다.

admin@wsxdn.com:~/tecmint$ ls 

a.doc  a.html  a.pdf  a.xml  b.doc  b.html  b.pdf  b.xml

이제 'html' 파일만 남기고 나머지 파일을 한 번에 삭제해 보겠습니다.

admin@wsxdn.com:~/tecmint$ rm -r !(*.html)

마지막으로 ls 명령어로 남아 있는 파일을 확인해 결과를 검증합니다.

admin@wsxdn.com:~/tecmint$ ls 

a.html  b.html

6. AND-OR 연산자 (&& – ||)

이 연산자는 AND(&&&)OR(||) 연산자의 조합으로, 프로그래밍의 'if-else' 문과 거의 동일하게 동작합니다.

예를 들어 tecmint.com에 ping을 보내고, 성공하면 'Verified'를 출력하고, 실패하면 'Host Down'을 출력하도록 해보겠습니다.

admin@wsxdn.com:~/tecmint$ ping -c3 www.tecmint.com && echo "Verified" || echo "Host Down"

실행 결과

PING www.tecmint.com (212.71.234.61) 56(84) bytes of data. 
64 bytes from www.tecmint.com (212.71.234.61): icmp_req=1 ttl=55 time=216 ms 
64 bytes from www.tecmint.com (212.71.234.61): icmp_req=2 ttl=55 time=224 ms 
64 bytes from www.tecmint.com (212.71.234.61): icmp_req=3 ttl=55 time=226 ms 

--- www.tecmint.com ping statistics --- 
3 packets transmitted, 3 received, 0% packet loss, time 2001ms 
rtt min/avg/max/mdev = 216.960/222.789/226.423/4.199 ms 
Verified

이번에는 인터넷 연결을 끊고 같은 명령어를 다시 실행해 보겠습니다.

admin@wsxdn.com:~/tecmint$ ping -c3 www.tecmint.com && echo "verified" || echo "Host Down"

실행 결과

ping: unknown host www.tecmint.com 
Host Down

7. 파이프 연산자 (|)

파이프(PIPE) 연산자는 첫 번째 명령어의 출력을 두 번째 명령어의 입력으로 전달할 때 매우 유용합니다. 예를 들어 'ls -l' 명령어의 출력을 'less'로 넘겨 페이지 단위로 편안하게 확인할 수 있습니다.

admin@wsxdn.com:~$ ls -l | less

8. 명령어 결합 연산자 ({})

중괄호({})를 사용하면 두 개 이상의 명령어를 하나의 묶음으로 결합할 수 있으며, 이때 두 번째 명령어의 실행은 첫 번째 명령어의 결과에 의존합니다.

예를 들어 'bin' 디렉터리의 존재 여부를 확인하고, 그 결과에 맞는 메시지를 출력해 보겠습니다.

admin@wsxdn.com:~$ [ -d bin ] || { echo Directory does not exist, creating directory now.; mkdir bin; } && echo Directory exists.

9. 우선순위 연산자 (())

소괄호 연산자를 사용하면 명령어를 원하는 우선순위대로 그룹화하여 실행할 수 있습니다.

Command_x1 &&Command_x2 || Command_x3 && Command_x4.

위의 가상 명령어에서 만약 Command_x1이 실패한다면 어떻게 될까요? Command_x2, Command_x3, Command_x4 중 어떤 것도 실행되지 않습니다. 이런 경우 우선순위 연산자를 사용하면 됩니다.

(Command_x1 &&Command_x2) || (Command_x3 && Command_x4)

위와 같이 괄호로 묶으면, Command_x1이 실패하더라도 Command_x3의 종료 상태에 따라 Command_x3Command_x4가 실행됩니다.

10. 연결(줄바꿈 이스케이프) 연산자 (\)

연결 연산자(\)는 이름 그대로, 긴 명령어를 셸에서 여러 줄에 걸쳐 나누어 작성할 때 사용합니다. 참고로 역슬래시는 특수문자를 일반 문자로 처리하는 이스케이프 용도로도 활용됩니다. 예를 들어 아래 명령어는 'test(1).txt' 텍스트 파일을 열어 줍니다.

admin@wsxdn.com:~/Downloads$ nano test\(1\).txt

마치며

지금까지 리눅스에서 가장 많이 쓰이는 10가지 명령어 연결 연산자를 살펴보았습니다. 이 연산자들을 적절히 조합하면 복잡한 작업도 한 줄의 명령어로 처리할 수 있고, 셸 스크립트 작성 능력 또한 크게 향상됩니다. 실제 터미널에서 직접 실습해 보면서 각 연산자의 동작 방식을 익혀 보시기 바랍니다.