리눅스 명령어
window pc 에 까는 리눅스는 -> 우분투 계열
라즈베리파이에 까는 리눅스는 -> 데비안 계열
Android 는 리눅스 기반
Mac은 유닉스 기반
* 리눅스는 서버에서도 압도적 !
펌웨어 개발 : 운영체제 없이 개발 하는 것
** Shell 은 사용자와, 커널과의 "인터페이스"
쉘을 통해 명령을 주고 받음, os가 부팅되자마자 실행
OS = 커널 + app + shell
* 리눅스는 os가 아닌 커널(OS의 핵심 소스코드 역할)이다!
* 리눅스에 app, shell 을 추가해 만든 하나의 운영체제를 "리눅스 배포판" 이라고 한다.
* os에서 가장 필수적인 요소는 : 스케줄링, 자원관리 ***
* window의 shell 세가지 종류
-> cmd / powershell / window (GUI그자체가 쉘)
* 우분투의 GUI shell은 ? => GNOME
우분투의 CLI shell은 ? => bash 외 여러개
*** 본인이 사용하고 있는 쉘은 뭔지 알아야 shell script 작성할 때 오류 잡을 수 있음 !! (shell script 명령어가 조금씩 다름)
* 라즈베라피이 용 쉘 : LXDE (저성능 컴퓨터 전용의 쉘)
윈도우+쉬프트+S (윈도우에서, 우분투에서 하면 키 안먹음요)
공유폴더로 만들 때
루트/home/본인아이디/우분투에서만든폴더이름
ctrl +(alt) + T : 터미널 실행 키
ls : 디렉토리 목록
-a : 숨김파일 출력 * 파일명 맨앞이 . 으로 시작하면 숨김파일 나타냄퍄 ㅁ.
-l : 리스트 형태로 상세보기
pwd : 현재 작업중인 디렉토리 확인
ctrl + l : 화면 지우기
cd : 디렉토리 이동하기
cd ..: 이전 디렉토리
cd / : 루트 디렉토리
./ : 현재파일
cd ~ : super user 권한!!!!! $ 앞이 root 인 일반 사용자라면 디렉토리 못만듦!!! *****************
f11 : 화면 전체키우기
ctrl + shift + t : 새탭 열기
alt + 1 2 3... : 창 간 전환
ctrl + shift + w : 탭닫기
ctrl + insert : 복사
shift + insert : 붙여넣기
ctrl +s : 터미널 멈추기
ctrl + q : 터미널 시작
tab : 자동완성
tab tab : 자동완성 후보목록
파일 생성/삭제
touch [파일명] : 생성
rm [파일명] : 삭제
디렉토리 생성/제거
mkdir [디렉토리명] : a b c 등 디렉토리 여러개 생성 가능
-p : 디렉토리 하위메뉴까지 모두 생성
ex) mkdir -p ./aaa/bbb/ccc/dd
rmdir [디렉토리명] : 디렉토리 삭제 (파일있으면 삭제가 되지 않음)
rm -r [경로] : 사용하면 디렉토리 내부 파일까지 모두 한꺼번에 삭제
rm -r./* : 현재디렉토리에서 전체 삭제 (내부에 있는 파일 전부삭제)
파일 이동 )
mv [파일] [옮길 곳] : 파일 이동
mv [파일] [파일이름] : 이름 변경
파일 복사 )
cp [파일] [경로] :
-r 옵션 : 디렉토리 복사하기
ex) cp abc1 ./abc2 : 파일 abc1을 현재디렉토리의 새파일 abc2로 만들어 복사함
패키지 다운)
sudo apt install [패키지 이름]
apt show [패키지 이름] : 패키지 정보 확인
* apt는 설치에 필요한 의존 패키지들을 자동으로 설치 해좀
패키지 삭제)
sudo apt purge [패키지 이름]
텍스트 편집기 )
설치 : sudo apt install vim -y
파일열기 : vi [텍스트명]
------------------------
편집모드 진입 : i 버튼
편집모드 종료 : esc 버튼
저장 : :w (반드시 편집모드에서 나와서 수행해야 함)
그냥 종료 : :q (:q! 는 저장안하고 강제종료)
저장후 종료: :wq
---------------------------
이후 텍스트 출력하기 : cat [텍스트명]
----------------------------------
텍스트 내에서 이동하기))
* 반드시 편집모드 탈출 한 후 실행 !!
G : 맨 아랫줄로 이동
gg : 맨 윗줄로 이동
dd : 한 줄 삭제 (100dd : 100줄 삭제)
$ : 문장 맨끝
: : command line활성화
v : 비주얼 모드 진입
visual mode)
command 모드에서 v눌러 visual 모드 진입
영역선택 : ctrl 후 방향키 움직여 블록 잡기
복사하기 : y 영역선택 한 채로 (yy : 한줄 복사)
붙여넣기 : p 커서 뒤쪽에
command mode에서 )
undo : u
redo : ctrl + r
단어 찾기)
command mode에서
/찾을단어 : 단어찾기 ()
다음 검색 : n
이전 검색 : N
단어 바꾸기)
:%s /찾을단어/바꿀단어/g : 단어 바꿈 (g는 전역으로 전체단어를 바꾸는 옵션)
간단한 코딩 )
:set nu 라인 번호 나옴
:set ts=4 탭사이즈
:set shiftwidth=4 탭을 space 4개로 자동변환
:set laststatus=2 status bar 추가
* vi 껐다 켜면 설정 초기화 , 즉, 설정파일에 세팅 !
* .vimrc 로 환경설정파일 하나 만들어서 설정 가능
*************************************************************
* 파일 디버깅 -> gcc로 가능
gcc 다운로드 ) sudo apt install gcc -y
빌드 ) gcc [빌드할c파일명] -o [생성할결과파일명]
실행 ) [빌드 파일명]
ex) ./gogo
* 쉘스크립트는 "자동화 작업"을 하기위해 필요 ** (명령어 for문으로 자동입력 등 )
쉘 스크립트 명령어 ))
echo : 출력 명령어 _ 쉘스크립트 명령어(리눅스 명령어 X bash 명령어 O)
* 쉘 명령어 vs 쉘 스크립트 명령어는 다르다 !!!!
printenv : 쉘 스크립트의 시스템 전역변수 :쉘 명령어
쉘명령어 )
history : 이전 기록 확인 => 확인후 !번호 입력하면 해당 shell이 나타남
cat : 파일 내용 출력 => 내용을 파일로 저장하는 법 : 명령어 뒤에 " > 저장할파일명.txt" 를 붙이면 파일로 저장됨
find : 파일찾는 명령어 => ex) find [경로] -name "파일명" +) "파일명" 대신 " *단어명* "은 해당 단어가 포함된 모든 파일, 디렉토리 찾기, * 파일만 찾으려면 가장 뒤에 -type f, 디렉토리만 찾으려면 가장 뒤에 -type d
grep : 문자열 검색 => grep 문자열 ./파일명 : 파일내에서 문자열 검색 (문자열 있는 라인 한 줄 출력)
=> ls -al | grep .v : 다른 명령어 출력결과에 문자열 검색하기
* 왼쪽의 출력결과를 | 의 오른쪽으로 넘겨서 처리 한다.
ex) cat abc.txt | grep bbq
----------------------------------------------------------------------------------
리눅스 유저 추가 )
sudo adduser [계정명]
리눅스 유저 삭제 )
sudo deluser --remove-home [계정명]
리눅스 유저 확인 )
cat /etc/passwd | grep bash : | grep bash는 로그인 가능한 유저만 띄워줌 (로그인 가능한 사람은 로그인 후 bash가 바로 실행되도록 되어있어서)
사용자 전환 )
su [사용자명] : 로그아웃 하는게 아니라 사용자 전환
exit : 입력하면 다시 원래 사용자로 돌아옴
* sudo su : root계정으로 들어감
-------------------------------------------------------------------------------------
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char str[10]; // c 에서는 라이브러리 포함해도 string으로는 못 씀
while (1) {
printf("SSAFY_ECHOBOT \n");
scanf("%s", str); // string scanf type은 %s !
if (strcmp(str, "exit") == 0 || strcmp(str, "bye") == 0) { // 그냥 str == "exit" 식으로는 문자열 비교 안됨 !!!
break;
}
else
printf("%s \n", str);
}
return 0;
}
--------------------------------------------------------------------------
Shell 명령어 수행하기 )
- 자동화 - bash를 실행시킨 후 shell명령어를 수행함
1. .c 파일 만들어
2. #include<stdlib.h> 반드시 포함,
3. system함수 사용 ex) system("하고싶은쉘명령어");
4. 나머지 c 파일 형태와 같이 만들기
5. gcc 함수로 빌드 ex) gcc ./파일명 -o ./빌드할파일명
6. 빌드한 파일 실행
쉘명령어 )
* dmesg : (system diagnostic message:시스템진단메시지)
사용했던 커널 메시지를 모두 출력하는 쉘 명령어
* date : 현재시간 확인
* uptime : 현재시간, 시스템 시간, 커널부팅된 후 지난 시간 출력
(접속자 수, cpu부하율(1분,5분, 15분 평균치)도 출력)
-------------------------------------------------------------------------
* c언어에서 표준입력, 출력, 에러 장치는 stdout
stdout : 모니터와 연결 - printf
stdin : 키보드, 마우스와 연결 - scanf getche, getch
stderr : 모니터와 연결
* 위 모든 걸 정의한 파일 : #include<stdout.h>
리눅스 : 다중사용자 컨셉
---------------------------------------------------------------------------
심볼릭 링크 )
ln -s (파일) (링크이름) : 심볼릭링크 만들기
--------------------------------------------------------------------------------
#pragma once
표준 아님 !!! : 헤더파일 중복되면 오류 뜨는데, 그걸 막아줌
???파일 입출력 정리
클러스터 : 하드디스크의 최소사이즈 4kB
----------------------------------------------------------------------------------
스케줄링 )
라운드 로빙 ? : 1,2,3,4를 그냥 차례로 순회하며 loop
형평성에서 good but 효율 ↓
dangling pointer : 프로세스가 아님 !!! 포인터의 포인터 연결을 정리하려면, 연결 차례로
해제해야 하는데, 중간 포인터가 중단되면, 마치 좀비프로세스 같이
해제 안된 포인터에 접근할 방법이 없음 .(메모리 깔끔하게 정리하려면 free를 잘하자)
-------------------------------------------------------------------------
시스템 정보확인)
lscpu
lsmem
lsscsi
lsusb
배포판 정보 확인)
cat /etc/os-release
lsb_release -a
커널 버전 확인)
cat /proc/vrsion
* 32비트 리눅스 18.04 LTS 버전부터 지원안함
디스크 용량확인)
du -h 디렉토리명
------------------------------------------------------------------------------
네트워크))
ip 주소 확인)
i) ip addr
ii) ifconfig =>net-tools 패키지 설치 필요 : sudo apt install net-tools
NIC)
-네트워크 인터페이스 카드(Network Interface Card)
: 네트워크 설정, 네트워크 카드 정보를 포함한 연결 통로, 인터페이스
- lo : 가상 루프백 넽트워크 인터페이스 (Loopback Network Interface)
: 이 인터페이스에 신호를 보내면, 랜카드 밖으로 신호가 나가지 않고,
본인에게 신호를 보내서 받은것 처럼 처리하게 됨 (그래서 루프백)
--------------------------------------------------------------------------------------
프로세스))
disk로 부터 메모리에 적재되어 '실행중인 프로그램'
이를 cpu가 차례로 가져가며 수행함
- 커널쓰레드 & User Level 프로세스 : 두개로 나뉨
프로세스확인)
ps aux (User Level 프로세스 만 출력)
ps -e (커널 쓰레드 만 출력 )
- Foreground 프로세스, Background 프로세스
상호 작용 user와 독립적으로 실행
* 명령어에 & 넣으면, background 프로세스로 동작
=> 더이상 '상호작용'이 불가능해짐
ex) vi &
or vi 수행한 후 crtl+z 사용
* forground로 다시 background를 꺼내오기
fg 명령어 입력 (가장 최근에 background로 이동한 프로세스부터 차례로 꺼내온다)
그
/var/tmp/test1.swp
/tmp/test1.swp
/var
-------------------------------------------------------------------
shell 스크립트 )
shell 스크립트 파일 생성 )
1. vi 파일명.sh 로 생성
2. 최상단에 #!/bin/sh 입력
3. 쉘명령어 입력 (출력은 echo)
shell 스크립트 파일 생성 )
4. . 파일명.sh 로 실행
또는 source 파일명.sh
또는 bash 파일명.sh
echo 출력명령어
read 입력명령어 ex) read input 하면 input 변수에 답이 저장됨
${input} 입력받은 변수 내용을 그대로 사용 _ 정규식
sleep 1 : 1초쉬기
clear
* 모든 값들은 문자열 취급
* 변수명=100 등 쓸 때 띄어쓰기 하면 오류 !!!!!!!
argument)
.sh 파일 실행명령어 뒤에 알맞는 숫자의 변수 넣으면 자동입력 받음
ex) source quest.sh 100 200 50
* 사용은 그냥 입력 받을 필요없이 바로 $아무변수명 하고 쓰면됨
사칙연산 )
변수명 = `expr $다른변수명 + 75`
* 만약 #!/bin/bash 썼으면 echo $((15+35)) 이런식으로 그냥 사용 가능 , 띄어쓰기도 가능 !!
주석)
#뒤에하고싶은말
if 문)
ex) if [ $a == $b ]
then
elif []
else
fi
bash))
printf "어쩌구 %d \n" $a
배열) arr=(10 20 30 40)
echo ${arr[0]}
for문)
ex) for ((i=0;i<10;i++))
do
done
함수)
선언 : abc(){ }
실행 : abc