리눅스 설치는 MAC과 Window가 다르기 때문에 구글링을 통해 설치하길 바란다.
Windwo는
VirtureBox 사이트에서 프로그램을 다운로드 받아 설치하면 되고,
MAC은 UTM 사이트에서 프로그램을 다운로드 받아 설치하면 된다.
공통적으로 여기에 필요한 ubuntu 파일은 ubuntu 사이트에서
Window는 기본 ubuntu desktop os를 다운받아 사용하고,
MAC은 ubuntu server os를 다운받아 사용하면 된다.
나는 Window와 MAC 둘 다 설치해 봤는데
Window에서 가상화 환경이 안되어 있으면 BIOS에 접속해서 가상화를 설정한 다음에 실행해야 설치가 완료되고,
(저처럼 안되시는 분은 가상화 오류 해결 참고 사이트를 참고하길 바란다.)
MAC에서는 마지막까지 프로그램 설치를 확인하고 다음 단계로 넘어가야 프로그램이 안전하고 완벽하게 설치가 된다.
리눅스에서 터미널을 실행하여 진행한다.
cal
: 현재 해당하는 월의 캘린더를 보여준다.
처음엔 설치가 되어 있지 않아 아래 명령어를 입력하여 설치하여 주고 실행이 가능하다.
sudo apt install ncal
sudo는 '관리자 권한으로 설치한다'라는 의미이다.
이 명령어를 사용하고 나면 사용자 비밀번호를 입력해야 한다.
cal 2023 // 2023년도 달력
cal -y // 올해 달력
cal 9 1996 // 1996년 8월 달력
date : 현재 날짜 및 시간을 보여준다.
KST로 맞춰있는지 맞춰있지 않는다면 추후 맞추는 방법도 알려줄 예정...!
history
: 여태까지 입력한 명령어 기록들을 보여준다.
아래 명령어를 입력하면 이 기록들을 삭제할 수 있다.
history -c; history -w;
일부 기록만 보여줄 수도 있는데 아래 코드와 같이 !이후에 원하는 기록의 번호를 적어주면 그 기록에 해당하는 명령어를 사용할 수 있다.
(원하는 기록의 번호는 history에서 확인할 수 있다.)
!3 // 3번째 기록의 명령 실행.
echo
: input 넣어서 반환.
echo hello
> hello
clear
: 위에 작성한 명령어 지우기.
exit
: 터미널 종료 명령어
commandNames -options inputs(commandLine arguments)
위에가 명령어의 기본 구조이다.
CommandName 들은 shell의 검색 PATH 안에 있어야 한다.
shell은 터미널을 통해 명령이 제출될 때 명령의 의미를 해석하는 것이다.
일부 명령에는 긴 형식과 짧은 형식의 옵션이 있을 수 있다.
긴 형식 옵션에는 대시(--)가 2개 있고 짧은 형식 옵션에는 대시(-)가 1개 있다.
우선 commandName의 종류 중 which가 있다.
inputs에 해당하는 부분에는 위에 기본적인 명령어에서 본
cal, echo 등이 해당한다.
option은 아래 예시를 들어 설명하려한다.
위에 date를 입력했을 때 한국시간대로 설정이 되어 있지 않은 경우 한국 시간으로 맞추는 방법에 대해 언급했다.
맞추는 방법은
1) 아래 코드를 입력하여 아시아 도시들 리스트를 확인한다.
ls /usr/share/zoneinfo/Asia
서울이 있는 것을 확인한다.
2) 아래 코드를 입력하여 설정한다.
sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
여기서 date 명령어에 option을 주려고 한다면
date -u // UTC 시간대로 날짜와 시간 반환.
date --universal // 위와 동일
date와 관련된 여러 option들은 아래 명령어로 확인할 수 있다.
date --help
cal과 관련된 여러 option들도 있다.
cal -A 1 12 2023 // 2023년 12월 이후 달력 1개까지 반환.
cal -B 1 12 2023 // 2023년 12월 이전 달력 1개까지 반환. 위 옵션과 이 옵션 같이 사용할 수 있다.
echo 관련 여러 option들도 있다.
echo $PATH //shell이 해당 명령어를 찾을 때 찾는 경로들 반환.
Linux 명령은 약간 다르게 구현되고 약간 다르게 작동한다.
수많은 다양한 구현 방법을 암기하는 것 외에 각 Linux 명령을 적절하게 사용하는 방법은 메뉴얼 페이지를 이용하는 것이다.
리눅스 메뉴얼 페이지를 보는 방법은 메뉴얼 페이지 보는 방법에서 참고하면 된다. section은 총 9개가 있다.

여기서 man은 manual의 약자이다.
메뉴얼 사용 방법은 아래와 같다.
man (원하는 section 번호) which // 해당 section을 보여준다.
man -k "(원하는 것)" // -k는 검색 기능이다.
man (원하는 기능) // 원하는 기능에 대한 설명을 보여준다.
설명중에 대괄호와 < >, ..., | 로 나와있는 것들이 있는데
[ ]
: 대괄호 안에 있는 것이 선택사항이란 뜻
< >
: 홑화살괄호 안에 있는 것이 필수사항이란 뜻
...
: ...앞에 있는 것이 반복할 수 있다는 뜻
|
: | 앞이나 뒤 중에 하나만 사용한다는 뜻
그리고 option을 2가지 사용할 때 꼭 '-l -h'이렇게 안 적고 '-lh'로 작성하여 실행해도 된다.
여기서 -l은 리스트 업을 하는 것이고 -h는 human readable로 인간이 읽기 쉽게 바꾸는 것을 말한다. (--human-readable과 동일하다.)
가끔 manual에서 없는 것도 있는데 (like cd) 이거는 help를 이용하면 찾을 수 있다.
help cd // cd명령어에 대한 설명 보여준다.
각 Linux 명령은 그 자체로 매우 강력하지만 Linux 명령어의 진정한 힘은 이러한 명령을 함께 연결하여 명령 파이프라인을 구축하는 능력에서 비롯된다.
따라서 강력하고 기능이 풍부한 빌딩 블록을 결합할 수 있으면 많은 작업을 하지 않고도 매우 강력한 워크플로우와 파이프 라인을 만들 수 있다.
예를 들면, data라는 명령을 보면 data를 입력하고 enter를 누르면 data 명령을 실행하라고 지시하고 출력은 data 명령에서 전송되고 기본적으로 터미널 화면에 연결된 표준 출력 스트림으로 흘러간다. 결과적으로 날짜가 표시된다.
만약에 오류가 발생하게 된다면 오류 메세지가 터미널 화면에 도착했기 때문에 표준 출력과 마찬가지로 표준 오류도 자동으로 터미널에 연결되는 것을 볼 수 있다.
표준 오류도 데이터 스트림이므로 원하는 곳 어디든 리디렉션 될 수 있다.
cat 명령은 파일(들)을 순서대로 읽고 그 내용을 읽은 순서대로 표준 출력(standard output)에 쓰는 명령이다. (cat은 concatenate의 줄임말이다.)
입력을 시작하고 'hello world'를 입력하고 enter를 하면 키보드에서 텍스트를 읽는 것을 볼 수 있다. 즉, 표준 입력(Standard input)에서 cat이 이를 처리하고 결과를 표준 출력(Starndard output)으로 출력한다.
표준 출력이 기본적으로 터미널에 연결되어 있으므로 출력이 터미널에 바로 나타나는 것을 볼 수 있다.
따라서 Standard Data Stream에는 Standard Input, Standard Output, Standard Error가 있으며 Command Arguments는 Data Stream에 포함되지 않는다.
Standard Data Stream은 redirect 될 수 있으며 stream 번호를 사용하여 식별된다. 한 명령의 Standard output을 다른 명령의 standard input으로 redirect 하는 것을 Piping(파이핑)이라고 한다.
Standard Input, Standard Output, Standard Error는 Standard Data Stream(표준 데이터 스트림)이다.
Standard Output은 기본적으로 Terminal(터미널)에 연결되어 있다.
Standard Error도 기본적으로 Terminal(터미널)에 연결되어 있다.
Standard Input Data Stream은 기본적으로 키보드에 연결되어 있다.
지금 까지 배운 것으로는 cat을 입력하고 enter 한 뒤 hello를 입력하면 동일한 입력이 표준 출력으로 출력된다.
그리고 표준 출력은 기본적으로 터미널에 연결되어 있기 때문에 우리가 입력한 것과 동일한 단어를 출력하고 이를 터미널에 출력한다.
이제 표준 입력이 끝났음을 cat 명령에 알리기 위해 ctrl+c를 하면 cat이 듣기를 중지한다.
터미널이 아닌 파일로 redirection하는 방법을 배우려고 한다.
cat 1> output.txt
위 코드는 출력을 터미널이 아닌 'output.txt'라는 파일로 하겠다는 명령이다.
따라서, 'Hello World!'를 입력하면 터미널로 출력되지 않고 'output.txt'파일에 출력된 것을 확인할 수 있다.
1을 입력한 이유는 Standard output을 출력한다는 의미다.
(Standard Error는 2, Standard input은 0이다.)
사실 1의 경우는 생략도 가능하다.
하지만 새로운 문장을 입력할 때마다 해당 문장만 입력되고 추가로 입력되지는 않는다.
cat 1>> ouput.txt
위 코드를 입력하고 'Hello World 2'를 입력하면 추가되는 것을 볼 수 있다. ctrl+c로 나가지 않고 계속 문장을 입력하면 입력하는 문장들이 계속해서 추가되는 것을 볼 수 있다.
(위 코드에서 1 생략 가능하다.)
rm (파일명)
이전 장에서 말했듯이 Standard Error는 2번을 입력하면 된다.
cat -k (말도안되는 코드) 2>> error.txt
위 코드대로 입력하면 error.txt 파일에 에러 문장이 출력된 것을 확인할 수 있다.
redirect는 아래 코드 처럼 output과 error를 동시에 할 수도 있다.
cat (1)>> output.txt 2>> error.txt
cat > input.txt // input.txt 파일 생성
Hello World 1
^c
cat 0< input.txt // 여기서 0도 생략 가능. 화살괄호 방향이 어차피 다르기 때문!
이 코드를 사용하면 input.txt 파일에 적혀있는 문장을 터미널에 출력하는 것을 확인할 수 있다.
여기서도 마찬가지로 input을 output으로 (파일에서 파일로) redirect하려면 아래 코드를 사용하면 된다.
cat < input.txt >> output.txt
만약 터미널 창이 2개라면 첫번째 창에서 두번째 창으로 출력을 하고 싶다면??
우선, 터미널의 위치를 알기 위해 아래 코드를 입력한다.
tty
[출력] /dev/pts/1
이제 input.txt에 있는 문장을 읽어와서 두번째 터미널에 출력하려면 아래 코드를 입력하면 된다.
cat < input.txt > dev/pts/1
만약 ls의 표준 출력을 output.txt로 하고 동시에 표준 오류를 error.txt로 출력하고 싶다면 아래 코드를 사용하면 된다.
ls > output.txt 2> error.txt
파이핑(Piping)은 한 명령의 표준 출력을 다른 명령의 표준 입력에 연결하는 것이다.
우선 date.txt 파일을 생성한다.
date > date.txt
만약 파일에 있는 문장 중 일부만 터미널에 출력하고 싶다면 cut을 사용하면 된다. 여기서 함께 사용되는 option이 --delimiter과 --fields다. --delimiter는 뒤에 나오는 것으로 나눈다는 의미이고, --fields는 나눈 단어들 중 몇번째를 보고 싶은지를 의미한다.
cut < date.txt --delimiter " " --fields (원하는 단어 순서)
// date.txt 파일 내에서 공백으로 나누기.
대부분의 키보드에서 Shift + Backslash()를 눌러 엑세스할 수 있는 파이프 문자(|)를 사용하여 파이프한다.
date | cut --delimiter " " --fields (원하는 단어 순서) > today.txt
date | cut > today.txt --delimiter " " --fields (원하는 단어 순서)
date | cut --delimiter " " > today.txt --fields (원하는 단어 순서)
date 명령을 입력해서 날짜를 받고 그 데이터를 공백으로 나누어 원하는 단어를 today.txt 파일에 저장하는 것을 말한다. 위 세가지 모두 같은 동작을 하는 명령이다.
만약에 파일에 저장하는 동시에 파이프라인에도 전달하게 하기 위해선 어떻게 할까?
date > date.txt | cut --delimiter " " --fields 4
위 코드대로 하면 date 명령으로 날짜를 date.txt 파일에 저장하고 자른 것 중 4번째 단어만 터미널에 출력하겠다고 생각할 수 있다. 하지만 실행하게 되면 date.txt에 날짜는 잘 입력 됐지만 터미널에는 아무것도 출력되지 않은 것을 확인할 수 있다.
이건 redirect가 한번 일어나면 이후 pipe line이 끊기기 때문이다.
그렇다면 계속해서 pipe line이 연결될 수 있게는 어떻게 할까?
이때 사용하는 명령어가 tee이다.
tee명령어 사용 구조는 아래와 같다.
명령어 1 | tee (출력 원하는 파일명) | 명령어 2
date | tee date.txt | cut --delimiter " " --fields 4
이 코드를 실행하게되면 우리가 원하는 대로 출력되는 것을 확인할 수 있다.
만약 요일 데이터를 터미널이 아닌 today.txt에 출력되게 하려면 어떻게 할까?
date | tee date.txt | cut --delimiter " " --fields 4 > today.txt
date | echo
위와 같이 date와 echo 명령어를 같이 사용하면 echo로 인해 오늘 날짜를 출력할거 같지만 echo는 표준 입력을 받아들이지 않는다. echo는 command line argument만 받아들인다. 그렇다면 파이프라인의 데이터를 표준 입력을 허용하지 않는 명령으로 전달하는 방법이 있을까?
이때 사용하는 명령어가 xargs이다.
date | xargs echo
위 명령어를 실행하면 date가 제대로 출력되는 것을 확인할 수 있다.
date | xargs echo "Hello World"
위 명령어를 실행하면 echo의 argument인 "Hello World"가 먼저 출력되고 이어서 date가 출력된다.
그렇다면 날짜 중 일부 단어만 출력하려면 어떻게 할까?
date | cut --delimiter=" " --fields=4 | xargs echo
이렇게 하면 원하는 단어만 출력할 수 있다.
(스페이스 주고 " "나 숫자를 입력해도 되고 =를 입력한 뒤 " "나 숫자를 입력해도 된다.)
새로운 텍스트 파일을 하나 만들고 해당 파일에 기존에 있는 텍스트 파일 이름을 몇개 적는다.
cat file.txt | rm
위 명령어로 file.txt 파일 안에 적은 파일명의 실제 파일을 삭제하려고 한다. 하지만 rm도 command line argument만 받아들이기 때문에 오류가 난다.
cat file.txt | xargs rm
위 명령어를 실행하면 나는 file.txt안에 date.txt, today.txt를 적어놨기 때문에 명령이 제대로 실행 되면서 두 파일이 삭제된 것을 알 수 있다.
만약 commandA, commandB, commandC가 있는데 commandB의 출력을 snapshot.txt 파일에 저장하려고 하면 어떻게 하면 좋을까?
// 해결
commandA | commandB | tee snapshot.txt | commandC
만약 commandB는 standard input을 허용하지 않고, command line argument만 허용한다면 어떻게 될까?
commandA | xargs commandB
Aliases(별칭)을 사용하게 파이프라인과 명령을 기억하기 쉬운 별명으로 저장하여 나중에 쉽게 사용할 수 있다.
홈 디렉터리의 .bash_aliases 파일을 만들어 해당 파일에서 별칭을 정의할 수 있다.
date | tee /home/ming/date.txt | cut --delimiter=" " --fields=4 | tee /home/ming/shortdate.txt | xargs echo
만약에 위 명령어 처럼 엄청 긴 명령인 경우 매번 해당 동작을 할때마다 긴 명령을 치는건 비효율적이다. 따라서 해당 명령에 별칭을 붙여 저장하려고 한다.
아까 만든 .bash_aliases 파일에 해당 명령어를 적어주고
맨 앞에 'alias (원하는 별칭)='을 입력하고 명령어를 작은 따옴표로 감싸준다. (아래처럼)
alias (원하는 별칭)='원하는 명령어'
이제 터미널로 돌아와서 별칭으로 지정한 것을 입력하고 실행하면 해당 코드가 잘 실행된 것을 볼 수 있다.
다른 alias를 하나 더 만들어보자.


위 그림과 같이 별칭들이 잘 만들어졌고 파일도 잘 생성되며 파일내 출력도 잘 이루어진 것을 확인할 수 있다.
.bash_aliases파일 안에서 생성한다.처음 해보는 리눅스! 설치하는데 오래 걸렸지만 실제로 사용해보니 유용한 오픈소스 소프트웨어인거 같다. 안에 기본 내장되어 있는 게임들도 있어서 오랜만에 지뢰찾기도 했다 히힛 😜