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, mkdirrmdir 명령

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 auxps -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은 페이지를 매긴 출력을 프린터로 보냅니다. 모든 출력이 한 줄에 포함됩니다.