개발자

리눅스 연산자, |, >, >>, &, &&, !, =, (\) 똑똑하게 사용하기

Sandra Henry Stocker | Network World 2024.07.17
리눅스 명령줄의 강력함은 유용한 명령 못지않게 다양한 연산자에서도 나온다. 이 글에서는 많은 리눅스 연산자의 예제와 작동 방식을 세부적으로 살펴본다.

| 사용

세로줄 | 문자로 표기하는 명령줄 파이프는 상상할 수 있는 가장 유용한 연산자다. 이름도 "파이프"이고 문자의 형태도 실제 파이프와 비슷하다. 파이프의 역할은 특수한 연결을 통해 파이프 왼쪽 명령의 출력을 파이프 오른쪽 명령으로 전달하는 것이다. 예를 들어 다음과 같은 명령을 사용해서 시스템에 로그인한 사용자를 확인할 수 있다.
 
$ who
jdoe     seat0        2024-06-20 10:37 (login screen)
jdoe     tty2         2024-06-20 10:39 (tty2)
nancy    tty3         2024-06-20 10:40 (tty2)
shs      pts/1        2024-06-20 10:56 (192.168.0.5)

로그인 횟수만 계산하려면 다음과 같은 파이프를 사용하면 된다.
 
$ who | wc -l
4

로그인한 고유한 사용자 수를 보려면 조금 더 공을 들여야 한다. 다음과 같이 사용자 이름 목록을 고유한 이름으로 추릴 수 있다.
 
$ who | awk '{print $1}' | sort | uniq
jdoe
nancy
shs
 
첫 번째와 두 번째 파이프 사이의 awk 명령은 who 명령의 출력을 모든 줄의 첫 번째 문자열로 줄인다. 이후 sort 명령은 이 출력을 알파벳순으로 정렬해서 uniq 명령이 각 사용자 이름을 한 번만 포함하도록 한다. 여러 개의 파이프를 사용해서 정확히 원하는 출력만 표시되도록 했다.
 

|| 사용

모양은 |와 ||로 비슷해 보이지만 두 세로줄은 이중 파이프가 아니며, 사실 파이프와는 전혀 관계가 없다. 두 세로줄은 "or" 연산자를 나타내는데, 흥미로운 방식으로 작동한다. || 왼쪽의 명령이 작동하면 오른쪽의 명령은 아예 실행되지 않는다.
 
다음 예제에서 head 명령은 루트 수준 권한으로(예를 들어 sudo 사용) 실행되지 않으므로 실패하고 따라서 /etc/shadow 파일에 대한 액세스 권한이 없다. echo 명령은 오류가 표시된 후 실행된다.
 
$ head -4 /etc/shadow || echo oops
head: cannot open '/etc/shadow' for reading: Permission denied
oops

오류 메시지 없이 같은 효과를 얻으려면 다음과 같이 head 명령의 오류 출력을 /dev/null로 보내면 된다.
 
$ head -4 /etc/shadow 2>/dev/null || echo oops
oops 

2> 연산자는 오류 출력을 /dev/null로 보낸다.
 

> 및 >> 사용

> 및 >> 연산자는 |, ||와 달리 서로 긴밀하게 연관되면서 각기 다른 기능도 있다. 다음과 같은 명령을 실행하면 fortune 명령의 출력을 파일에 추가한다. 파일이 없으면 생성하고, 이미 있으면 덮어쓴다.
 
$ fortune > readme
$ cat readme
1 bulls, 3 cows.
$ fortune > readme
$ cat readme
Does a one-legged duck swim in a circle?

앞의 예제에서는 파일의 내용이 바뀌었다.
 
앞에서 > 대신 >>를 사용하면 파일이 이미 있는 경우 파일에 추가되고, 없는 경우에는 이 내용을 사용하여 새 파일이 생성된다.
 
$ fortune >> readme
$ cat readme
Does a one-legged duck swim in a circle?
fractal radiation jamming the backbone
$ fortune >> ignoreme
$ cat ignoreme
It's all magic.  :-)
 

& 및 && 사용

&와 && 연산자는 | 및 ||와 마찬가지로 모양은 비슷하지만 서로 전혀 다른 기능을 수행한다. 단일 & 연산자는 백그라운드에서 프로세스를 실행하는 데 사용된다. 즉, 해당 명령이 아직 실행 중인 상태에서 명령줄에서 다른 명령을 실행할 수 있다. 예제를 보자.
 
$ run-long-script &
$

프롬프트가 돌아와서 다음 명령을 대기하는 것을 볼 수 있다.
 
&& 연산자는 || 연산자와 비슷한 면이 있다. 차이는 && 왼쪽의 명령이 성공한 경우에만 오른쪽 명령이 실행된다는 것이다.
 
$ echo hello && echo goodbye
hello
goodbye
 

; 사용

; 연산자는 한 줄에서 여러 명령을 실행할 수 있게 해준다. 명령을 분리해서 각 명령이 서로 독립적으로 실행되도록 한다. 명령은 지정된 순서에 따라 실행되며 하나가 완료된 이후 다음 명령이 시작된다.
 
$ sleep 3; echo 1; sleep 2; echo 2; sleep 1; echo 3
1
2
3
 

! 사용

!(not) 연산자는 명령을 입력할 때 예외를 표현할 수 있게 해준다. 예를 들어 다음 명령은 현재 디렉터리에서 이름이 "ignoreme"인 파일을 제외한 모든 파일의 내용을 표시한다.
 
$ cat !(ignoreme)
Does a one-legged duck swim in a circle?
fractal radiation jamming the backbone
Virus transmitted from computer to sysadmins.
 
다음과 같이 !를 와일드카드와 함께 사용할 수도 있다.
 
$ ls
goodtimes  ignoreme  readme
$ rm !(*me)
$ ls
ignoreme  readme

앞의 rm 명령이 실행되면 "me"로 끝나는 파일을 제외한 모든 파일이 제거된다.
 

=, ==, != 사용

= 기호는 누구나 알겠지만 변수에 값을 할당하는 데 사용된다. ==와 != 기호는 같음과 같지 않음을 테스트한다.
 
$ three=3
$ if [ $three == 3 ]; then
>   echo I like math
> fi
I like math
$ if [ $three != 3 ]; then
>   echo "I do not trust math"
> fi

앞 예제의 테스트에서 다행히 three와 3은 같으므로 같지 않음 테스트에서는 아무런 결과도 표시되지 않는다.
 

이스케이프 문자(\) 사용

백슬래시 문자는 이스케이프 문자 역할을 한다(적어도 본(Bourne) 셸에서는). 이스케이프 문자는 다른 문자가 해석 없이 표시되도록 한다. 다음 예제에는 다소 복잡한 문자열이 있는데, 백슬래시 뒤에 오는 모든 문자는 있는 그대로 표시된다.
 
$ echo \"\'\&\|\;\(\)\^\'\<\>\$
"'&|;()^'<>$
 

맺음말

사용 가능한 명령 연산자를 모두 익히는 데는 시간이 좀 걸리지만 명령줄과 스크립트에서 매우 유용하다. &&, ||, !에 대한 설명은 이전 기사인 리눅스의 &&, !! 및 !에 대한 설명에서 볼 수 있다. 
editor@itworld.co.kr 
Sponsored

회사명 : 한국IDG | 제호: ITWorld | 주소 : 서울시 중구 세종대로 23, 4층 우)04512
| 등록번호 : 서울 아00743 등록발행일자 : 2009년 01월 19일

발행인 : 박형미 | 편집인 : 박재곤 | 청소년보호책임자 : 한정규
| 사업자 등록번호 : 214-87-22467 Tel : 02-558-6950

Copyright © 2024 International Data Group. All rights reserved.