Bash 명령 및 연산자
모든 셸 언어에는 가장 많이 사용되는 명령이 있습니다. 가장 일반적으로 사용되는 명령을 검토하여 Bash 레퍼토리를 빌드해 보겠습니다.
Bash 명령
일반적인 Bash 명령과 사용 방법을 살펴보겠습니다.
ls
명령
ls
는 현재 디렉터리 또는 명령의 인수에 지정된 디렉터리의 내용을 나열합니다. 이 명령은 현재 디렉터리의 파일 및 디렉터리를 나열합니다.
ls
이름이 마침표로 시작하는 파일 및 디렉터리는 기본적으로 숨겨져 있습니다. 디렉터리 목록에 해당 항목을 포함하려면 -a
플래그를 사용합니다.
ls -a
현재 디렉터리에 있는 파일 및 디렉터리에 대한 자세한 내용을 보려면 -l
플래그를 사용합니다.
ls -l
다음은 몇 개의 JPEG 및 PNG가 포함된 디렉터리와 gif라는 하위 디렉터리의 몇 가지 샘플 출력입니다.
-rw-rw-r-- 1 azureuser azureuser 473774 Jun 13 15:38 0001.png
-rw-rw-r-- 1 azureuser azureuser 1557965 Jun 13 14:43 0002.jpg
-rw-rw-r-- 1 azureuser azureuser 473774 Mar 26 09:21 0003.png
-rw-rw-r-- 1 azureuser azureuser 4193680 Jun 13 09:40 0004.jpg
-rw-rw-r-- 1 azureuser azureuser 423325 Jun 10 12:53 0005.jpg
-rw-rw-r-- 1 azureuser azureuser 2278001 Jun 12 04:21 0006.jpg
-rw-rw-r-- 1 azureuser azureuser 1220517 Jun 13 14:44 0007.jpg
drwxrwxr-x 2 azureuser azureuser 4096 Jun 13 20:16 gifs
각 줄은 해당 파일 또는 디렉터리에 대한 자세한 정보를 제공합니다. 해당 정보에는 할당된 사용 권한, 해당 소유자, 크기(바이트), 마지막으로 수정한 시간, 파일 또는 디렉터리 이름이 포함됩니다.
cat
명령
파일 내에 있는 내용을 확인하려는 경우를 가정해 보겠습니다. 이에 대해 cat
명령을 사용할 수 있습니다. 파일이 텍스트 파일이 아닌 경우 출력이 잘 이해되지 않을 것입니다. 다음 명령은 /etc 디렉터리에 저장된 os-release 파일의 내용을 보여 줍니다.
cat /etc/os-release
이 명령은 실행 중인 Linux 배포판을 알려주므로 유용합니다.
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
/etc 디렉터리는 Linux에서 특수 디렉터리입니다. 여기에는 시스템 구성 파일이 포함됩니다. 사용자가 수행 중인 작업을 알 수 없다면 이 디렉터리에서 파일을 삭제하지 않는게 좋습니다.
sudo
명령
일부 Bash 명령은 루트 사용자(시스템 관리자 또는 슈퍼 사용자)만 실행할 수 있습니다. 충분한 권한 없이 해당 명령 중 하나를 시도하면 실패합니다. 예를 들어, 슈퍼 사용자 권한으로 로그인한 사용자만 cat
을 사용하여 /etc/at.deny의 내용을 표시할 수 있습니다.
cat /etc/at.deny
at.deny는 다른 Bash 명령을 사용하여 나중에 실행하기 위해 작업을 제출할 수 있는 사용자를 결정하는 특수 파일입니다.
대부분의 경우에는 루트로 실행하지 않는 것이 좋습니다. 너무 위험하니까요. 슈퍼 사용자 권한으로 로그인하지 않고 관리자 권한이 필요한 명령을 실행하려면 명령 앞에 sudo
를 입력합니다.
sudo cat /etc/at.deny
sudo
는 “superuser do”를 나타냅니다. 이 명령을 사용할 때는 이 단일 명령을 셸에 알리고, 루트 사용자 수준의 사용 권한을 사용하여 작업하게 됩니다.
cd
, mkdir
및 rmdir
명령
cd
는 “change directory”를 나타내며 이름이 암시하는 기능을 정확히 수행합니다. 즉, 현재 디렉터리를 다른 디렉터리로 변경합니다. Windows의 해당 명령과 마찬가지로 한 디렉터리에서 다른 디렉터리로 이동할 수 있습니다. 다음 명령은 orders라는 현재 디렉터리의 하위 디렉터리로 변경합니다.
cd orders
..
을 디렉터리 이름으로 지정하여 한 디렉터리 위로 이동할 수 있습니다.
cd ..
이 명령을 실행하면 처음 로그인할 때 나타나는 홈 디렉터리로 바뀝니다.
cd ~
mkdir
명령을 사용하여 디렉터리를 만들 수 있습니다. 다음 명령은 현재 작업 디렉터리에 orders라는 하위 디렉터리를 만듭니다.
mkdir orders
하나의 명령을 사용해서 하위 디렉터리 및 그 아래에 있는 하위 디렉터리를 만들려면 --parents
플래그를 사용합니다.
mkdir --parents orders/2019
rmdir
명령은 디렉터리가 비어 있는 경우에만 디렉터리를 삭제(제거)합니다. 비어 있지 않으면 대신 경고가 표시됩니다. 다행히도 rm
명령과 함께 -r
(재귀) 플래그를 사용하여 비어 있지 않은 디렉터리를 삭제할 수 있습니다. 그러면 명령이 rm -r
과 같이 됩니다.
rm
명령
rm
명령은 "remove"의 약어입니다. 예상하시겠지만 rm
명령은 파일을 삭제합니다. 따라서 이 명령은 0001.jpg까지 삭제합니다.
rm 0001.jpg
또한 이 명령은 현재 디렉터리에 있는 모든 파일을 삭제합니다.
rm *
rm
을 사용할 때는 주의합니다. 위험한 명령이기 때문입니다.
-i
플래그를 사용하여 rm
을 실행하면 삭제하기 전에 다음을 수행할 수 있습니다.
rm -i *
모든 rm
명령에 항상 -i
를 포함하도록 하여 Linux에서 가장 큰 실수를 범하지 않을 수 있습니다. 강력한 rm -rf /
명령은 전체 드라이브에서 모든 파일을 삭제합니다. 루트의 모든 하위 디렉터리와 해당 하위 디렉터리를 재귀적으로 삭제하는 방식으로 작동합니다. -f
(“force”) 플래그는 프롬프트를 표시하지 않아 문제를 복잡하게 만듭니다. 이 작업은 수행하지 마세요.
비어 있지 않은 orders라는 하위 디렉터리를 삭제하려는 경우 다음과 같은 방법으로 rm
명령을 사용할 수 있습니다.
rm -r orders
이렇게 하면 다른 하위 디렉터리를 포함하여 orders 하위 디렉터리와 포함된 모든 항목이 삭제됩니다.
cp
명령
cp
명령은 파일뿐만 아니라 원하는 경우 전체 디렉터리와 하위 디렉터리를 복사합니다. 0002.jpg라는 0001. jpg 파일의 복사본을 만들려면 다음 명령을 사용합니다.
cp 0001.jpg 0002.jpg
0002.jpg가 이미 있는 경우 Bash는 자동으로 이 파일을 대체합니다. 해당 결과가 원래 의도와 맞는다면 좋은 일이겠지만 이전 버전을 덮어쓰게 된다는 사실을 몰랐다면 그리 적합한 일은 아닐 것입니다.
다행히 -i
(“interactive”) 플래그를 사용하는 경우 Bash는 기존 파일을 삭제하기 전에 경고를 표시합니다. 이 방법이 더 안전합니다.
cp -i 0001.jpg 0002.jpg
와일드카드를 사용하여 여러 파일을 한 번에 복사할 수 있습니다. 현재 디렉터리에 있는 모든 파일을 photos라는 하위 디렉터리에 복사하려면 다음을 수행합니다.
cp * photos
photos라는 하위 디렉터리의 모든 파일을 images라는 하위 디렉터리에 복사하려면 다음을 수행합니다.
cp photos/* images
여기서는 images 디렉터리가 이미 존재하는 것으로 가정합니다. 그러지 않으면 이 디렉터리를 만들고 다음 명령을 사용하여 photos 디렉터리의 내용을 복사할 수 있습니다.
cp -r photos images
-r
은 “recursive”를 나타냅니다. -r
플래그의 추가적인 혜택은 photos가 고유한 하위 디렉터리를 포함할 경우 images 디렉터리로도 복사된다는 것입니다.
ps
명령
ps
명령은 현재 실행 중인 모든 프로세스의 스냅샷을 제공합니다. 인수 없이 이 명령만 사용하면 모든 셸 프로세스가 표시됩니다. 즉, 말이 되지 않습니다. 그러나 -e
플래그를 포함하는 경우에는 이야기가 달라집니다.
ps -e
-e
는 실행 중인 모든 프로세스를 나열하며, 일반적으로 많은 프로세스가 있습니다.
시스템에서 실행 중인 프로세스를 더욱 포괄적으로 확인하려면 -ef
플래그를 사용합니다.
ps -ef
이 플래그는 실행 중인 모든 프로세스의 이름, PID(프로세스 ID 번호), PPID(부모 프로세스의 PID) 및 시작된 시간(STIME)을 표시합니다. 또한 연결된 터미널(TTY)(있는 경우), 소요된 CPU 시간(TIME), 전체 경로 이름racked CPU 시간(시간) 및 전체 경로 이름을 표시합니다. 다음은 간단한 예제입니다.
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 13:35 ? 00:00:03 /sbin/init
root 2 0 0 13:35 ? 00:00:00 [kthreadd]
root 3 2 0 13:35 ? 00:00:00 [rcu_gp]
root 4 2 0 13:35 ? 00:00:00 [rcu_par_gp]
root 5 2 0 13:35 ? 00:00:00 [kworker/0:0-cgr]
root 6 2 0 13:35 ? 00:00:00 [kworker/0:0H-kb]
root 8 2 0 13:35 ? 00:00:00 [mm_percpu_wq]
root 9 2 0 13:35 ? 00:00:01 [ksoftirqd/0]
root 10 2 0 13:35 ? 00:00:02 [rcu_sched]
그 외에도 해당 방식으로 사용되는 ps
를 보여 주는 설명서도 찾을 수 있습니다.
ps aux
ps aux
및 ps -ef
는 동일합니다. 이 이중성은 POSIX Unix 시스템(Linux) 및 BSD Unix 시스템(가장 일반적으로 macOS) 간의 기록 차이를 추적합니다. 처음에 BSD에는 aux
가 필요했지만 POSIX는 -ef
를 사용했습니다. 현재 두 운영 체제 제품군은 두 형식 중 하나를 허용합니다.
이러한 이유로 모든 Linux 명령에 대한 설명서를 자세히 살펴보아야 합니다. Bash를 학습하는 일은 영어를 제2언어로 학습하는 것과 같습니다. 규칙에는 많은 예외가 있습니다.
w
명령
사용자가 추가되거나 삭제되며 경우에 따라 원치 않는 사용자가 있을 수 있습니다. 회사를 그만두는 직원이 있는 경우 해당 직원이 회사 컴퓨터 시스템에 더 이상 로그인할 수 없도록 시스템 관리자가 호출됩니다. 또한 Sysadmin은 로그인한 사용자와 로그인하면 안 되는 사용자를 알아야 합니다.
서버에 있는 사용자를 확인하기 위해 Linux는 w
(“who”) 명령을 제공합니다. 현재 컴퓨터 시스템에 있는 사용자 및 해당 사용자의 작업에 대한 정보를 표시합니다. w
는 사용자 이름, 해당 IP 주소, 로그인한 시간, 현재 실행 중인 프로세스, 해당 프로세스를 사용하는 기간을 표시합니다. 이 도구는 sysadmin에 유용한 도구입니다.
Bash I/O 연산자
Bash 명령과 많은 옵션을 실행하는 것만으로 Linux에서 많은 작업을 수행할 수 있습니다. 그러나 다음 I/O 연산자를 통해 명령을 결합하여 작업을 완료할 수 있습니다.
<
: 키보드 이외의 원본으로 입력 리디렉션>
: 화면 이외의 대상으로 출력 리디렉션>>
: 동일한 작업을 수행하되 덮어쓰지 않고 추가|
: 한 명령의 출력을 다른 명령의 입력으로 파이핑
현재 디렉터리에 있는 모든 항목을 나열하되 listing.txt라는 파일에서 출력을 캡처하려고 한다고 가정해 봅니다. 다음 명령이 해당 작업을 수행합니다.
ls > listing.txt
listing.txt가 이미 있는 경우 덮어씁니다. >>
연산자를 대신 사용하는 경우 ls
의 출력이 listing.txt에 이미 포함된 내용 앞에 추가됩니다.
ls >> listing.txt
파이핑 연산자는 강력하며 자주 사용됩니다. 첫 번째 명령의 출력을 두 번째 명령의 입력으로 리디렉션합니다. cat
을 사용하여 큰 파일의 콘텐츠를 표시하지만 내용이 너무 빠르게 스크롤되어 읽을 수 없는 경우를 가정해 보겠습니다. 결과를 more
등의 다른 명령으로 파이핑하여 출력을 더욱 쉽게 관리할 수 있습니다. 다음 명령은 현재 실행 중인 모든 프로세스를 나열합니다. 그러나 화면이 가득 차면 Enter 키를 선택할 때까지 출력이 일시 중지되었다가 다음 줄이 표시됩니다.
ps -ef | more
출력을 head
로 파이핑하여 처음 몇 줄만 표시할 수도 있습니다.
ps -ef | head
또는 “daemon”이라는 단어를 포함하는 줄만 포함하도록 출력을 필터링하려고 한다고 가정해 보세요. 이 작업을 수행하는 한 가지 방법은 출력을 ps
에서 Linux의 유용한 grep
도구에 파이핑하는 것입니다.
ps -ef | grep daemon
출력은 다음과 같을 수 있습니다.
azureus+ 52463 50702 0 23:28 pts/0 00:00:00 grep --color=auto deamon
azureuser@bash-vm:~$ ps -ef | grep daemon
root 449 1 0 13:35 ? 00:00:17 /usr/lib/linux-tools/4.18.0-1018-azure/hv_kvp_daemon -n
root 988 1 0 13:35 ? 00:00:00 /usr/lib/accountsservice/accounts-daemon
message+ 1002 1 0 13:35 ? 00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
daemon 1035 1 0 13:35 ? 00:00:00 /usr/sbin/atd -f
root 1037 1 0 13:35 ? 00:00:00 /usr/bin/python3 -u /usr/sbin/waagent -daemon
root 1039 1 0 13:35 ? 00:00:00 /usr/lib/linux-tools/4.18.0-1018-azure/hv_vss_daemon -n
azureus+ 52477 50702 0 23:28 pts/0 00:00:00 grep --color=auto daemon
또한 파일을 입력으로 사용할 수 있습니다. 기본적으로 표준 입력은 키보드에서 제공되지만 리디렉션될 수도 있습니다. 키보드 대신 파일에서 입력을 가져오려면 <
연산자를 사용합니다. 일반적인 sysadmin 작업 중 하나는 파일의 내용을 정렬하는 것입니다. 이름에서 알 수 있듯이 sort
는 텍스트를 사전순으로 정렬합니다.
sort < file.txt
정렬된 결과를 새 파일에 저장하려면 입력 및 출력을 리디렉션할 수 있습니다.
sort < file.txt > sorted_file.txt
I/O 연산자를 사용하여 필요에 따라 Linux 명령을 체인으로 연결할 수 있습니다. 다음 명령을 생각해 봅시다.
cat file.txt | fmt | pr | lpr
cat
의 출력은 fmt
로 이동하고 fmt
의 출력은 pr
로 이동합니다. fmt
는 결과의 형식을 간단한 단락으로 지정합니다. pr
은 결과의 페이지를 매깁니다. 또한 lpr
은 페이지를 매긴 출력을 프린터로 보냅니다. 모든 출력이 한 줄에 포함됩니다.