내가 잊었거나 새로 알게된 것을 적음
==========
커맨드 라인
Ctrl+A : 처음
Ctrl+E : 끝
Ctrl+F : 앞으로 (오른쪽방향키)
Ctrl+B : 뒤로 (왼쪽방향키)
Ctrl+L : 현재 라인 제외 clear
Ctrl+K : 뒤 자르기
Ctrl+U : 앞 자르기
Ctrl+Y : 붙여넣기
Ctrl+C : 현재 행 취소
Ctrl+D : 어떠한 입력 그만
history
history : 보기
!정수 : 해당 history 실행
!! : 바로 이전 history 실행
!?문자열? : 문자열 찾아 실행
Ctrl+R : history에서 문자열 찾음
환경 변수 PATH
PATH=$PATH:$HOME/c ; export PATH
>>> PATH환경변수에 $HOME/c 추가하기
>>> .bashrc 에 넣으면 좋음
메타문자
| (파이프) : 왼쪽의 출력을 오른쪽의 입력으로
cat /etc/passwd | sort | less
;(세미콜론) : 해당 명령어 연속 사용
date; who
man 활용
man 1 : 사용자 명령어 검색 ( grep 명령어 )
man 2 : 운영체제 상호작용 라이브러리 검색 ( write() 함수 )
man 3 : 표준 std 검색 ( printf() 함수 )
man -k : 짧은 man pages 출력
vim 중에 man 활용하기
1. 해당 함수위에 Shift + K 누르기
>>> strcpy작성 중에 헷갈리면 strcpy를 커서로 옮기고 Shift + K
2. 모드 전환 후 :!man 사용하기
>>> :! man 3 -k strcpy
==========
vim 추가
i, a, o : 추가
dd : 삭제
5dd : 현재부터 현재+4까지 5행 삭제
H : 화면 맨 위
M : 화면 중간
L : 화면 맨 아래
yy : 현재줄 복사
3yy : 현재~현재+2까지 3행 복사
p : 현재 행 아래로 붙여넣기
u : 바로 전에 수행한 명령 취소
/name : 문자열 찾기 -> n/N으로 이동
:set nu : 행번호 보여주기
:set nonu : 취소
:%s/str/rep/g : 모든 str를 rep로 바꿈
==========
파일시스템 명령
chmod : 파일이나 디렉터리 권한 변경
chmod 777 test.txt
chmod [ugoa][-+][rwx] test.txt
chmod -R o-w $HOME/myapps : -R로 내부까지 재귀로
umask 비트 : 기본권한 설정 (해당 비트를 빼는 연산임)
umask 777 : 만든 파일은 000이 됨
umask 002 : 만든 파일은 775가 됨
chown [바꿀사용자] [파일명]
chown [바꿀사용자:그룹] [파일명]
마찬가지로 -R옵션은 재귀
메타문자
* : 개수에 상관없이 문자 대신
touch a apple banana
ls a*
>>> a apple 출력
? : 문자 하나를 대신
ls a???e
>>> apple 출력
[...] : 하나 고름
ls [abc]*
>>> a apple banana 출력
ls [0-9] 가능
< : 파일의 내용을 입력으로 보냄 (stdin < txt)
> : 표준 출력을 파일로 전환 (stdout)
2> : 표준 오류를 파일로 전환 (stderr)
&> : 표준 출력과 표준 오류를 파일로 전환
>> : 출력을 파일로 전환하되, 파일의 끝에 추가 (add)
<< [구분자] : 구분자가 나올 때 까지 입력을 키보드로 받음 (stdin)
중괄호 사용
touch memo{1,2,3,4,5}; ls
>>> memo1 memo2 memo3 memo4 memo5
여기에 점 개 사용
touch memo{1..5}; ls
>>> memo1 memo2 memo3 memo4 memo5
연속해서 사용
touch {a, b, c}-{1, 2}; ls
>>> a-1 a-2 b-1 b-2 c-1 c-2
cf) 삭제도 마찬가지로 사용하면 됨
ln -s [원본파일] [링크파일]
>>> 원본파일 == 링크파일
>>> 포인터파일만듬
>>> ls -l 로 확인하면 l로 나옴 (디렉터리는 d, 파일은 -)
ls 옵션
-t : 수정 순서
-F : 파일 종류 알려줌
-a : 숨긴 파일
--hide= : 해당은 숨김 >> ls --hide=g*
-d : 해당 정보 보기 >>> 담긴파일을 보는게 아님
>>> ls -ld ~ 하면 홈디렉터리 내부를 보는 게 아니라 홈디렉터리 정보를 봄
-R : 내부까지 싹다
-S : 크기 별로 출력
mkdir -p 로 깊어지는 서브 디렉터리 만듬
mv/cp/rm
mv : 이동 및 이름변경( 같은디렉터리 일 때 )
cp -r 재귀: -a : 권한 및 수정날짜 그대로 복붙
rm -r 재귀 : -f 강제
==========
vim 추가
w : 다음 단어
b : 이전 단어
0 : 현재 행 시작 위치
$ : 현재 행의 끝위치
dw : 현재 커서 위치의 단어 삭제 (delete word)
ZZ : 저장후 종료
u : 변경 취소 (ctrl + z)
Ctrl + R : 변경 취소를 취소 (shift + ctrl + z)
Ctrl + f : 한 페이지 넘기기 (front)
Ctrl + b : 한 페이지 올리기 (back)
Ctrl + d : 반 페이지 넘기기 (down)
Ctrl + u : 반 페이지 올리기 (up)
gg: 1행으로 이동
1G : 1행으로 이동
nG : n행으로 이동
G : 파일 마지막행으로 이동
/str1.*str2 : str1에서 str2로 거리를 두는 문자열을 찾음
vimtutor : 튜토리얼
==========
파일찾기
기본 : locate, find, grep
locate [문자열] : 이 문자열이 포함된 파일의 경로 출력
-> 데이터베이스(updatedb)를 검색하여 파일의 위치를 찾아냄
-> 그 결과 root권한이 없을 경우, 또는 데이터베이스안에 정보가 없을 경우 찾지 못하는 경우도 존재
-> 즉, 새로 파일을 만들고 실행하면 updatedb가 최신상태가 아니라서 sudo updatedb해야 함
locate -i : 대소문자 구분안함
find : 실시간으로 파일시스템 검색
기본 : find [경로] : 해당 경로의 모든 내용 검색
옵션
-ls : 해당 경로의 모든 내용을 ls로 검색
-name [파일명] : 해당 경로에서 파일명에 해당하는 내용 검색
-iname [파일명] : 해당 경로에서 파일명에 해당하는 내용을 대소문자 구분없이 검색
-> * . [] 사용가능
만약 find . -name ".txt" 를 하면 .txt만 찾고 a.txt도 안찾음 -> *같은 메타문자를 잘 섞어야 함
find . -name "*.txt"
-size [+-][정수][KMG] : 파일 크기로 찾음
find /bigdata -size +500M -size -5G -exec du -sh {} \;
-user [소유자] : 소유자 파일
-group [그룹명] : 그룹 파일
find /home -user malbong -or -user joe -ls
-perm [권한] : r:4 w:2 x:1 (setuid, setgid, stickybit는 따로 4자리수가 있을 것)
find /bin -perm 755 -ls : 정확히 755이어야 함
find /bin -perm -222 -ls : 적어도 222가 다 켜져있을 때
find /bin -perm +222 -ls : 어느 하나라도 2가 켜져있을 때
find /bin -perm -002 -ls : other가 2가 켜진 것, 나머진 상관없음
-[acm][min/time] [+-][시간]
a: 수정되지 않음, c: 소유권이나 권한 변경, m: 수정됨
min : 분, time : 날짜
+ 이상, - 이내
find /var/ftp -atime +300 : 300일 이상 수정되지 않은 것을 /var/ftp 에서 찾음
find /etc mmin -30 : 30분 전에 값 수정된 것을 /etc에서 찾음
-or -not -and: 사용가능
find /var/all -user joe -and -size +1M -ls
-exec 혹은 -ok
find [options...] -exec command {} \; : command 바로 실행, 확인 없음
find [options...] -ok command {} \; : command 실행하기 전 확인 받음
cf) {}는 찾은 값이 들어감
>>> find /etc -iname iptables -exec echo "I Found {}" \;
>>> find /var/allusers -user malbong -ok mv {} /tmp/malbong/ \;
cf) \; 필수
grep : 해당 문자열 찾기
grep [문자열] [파일명or입력값]
-i : 대소문자 구별 X
-v : 해당 문자열이 없는 행 출력
-rl : 해당 문자열이 담긴 파일 출력 (r은 정확히는 서브디렉터리까지, 재귀)
grep -i desktop /etc/services
grep -iv tcp /etc/services
파이프 처리
입력값을 파이프의 출력으로 받는 것임
cat a.txt | grep hello
grep hello << EOF
==========
프로세스 관리
ps
ps -ef
ps ax
ps axu
ps -eo [format]
ps -eo user,pid,vsz,rss,%cpu --sort=-%cpu;
top
여러 키가 존재, top을 활성화 시킨 상태로 h를 눌러 도움말 보기...
NI는 나이스 번호
백그라운드 명령
명령 + & : 백그라운드로 실행
[작업번호] PID 남김
jobs : 현재 백그라운드로 실행되고 있는 명령확인
-l 옵션이랑 같이써야 PID가 보임
Ctrl + Z : 현재 작업을 중지시키고 백그라운드로 옮겨놓음
jobs -l 로 확인 가능
fg: 포그라운드로 복귀시키기
fg % : 가장 최근에 백그라운드로 들어간 명령을 불러옴
fg %[작업번호]
fg %문자열
fg %-- : 가장 최근에 중지된 작업 바로 이전에 중지된 작업
bg: 백그라운드로 다시 실행시키기
fg와 동일 >> bg %5
프로세스 죽이기
kill [신호/번호] [PID]
killall [신호/번호] [PNAME]
-9 : 죽임
-15: 중단
나머지는 필요하면 찾아라
kill 10432 : 디폴트 신호는 15이므로 아래와 같음
kill -15 10432
kill -SIGKILL 10432 : 10432를 죽임, 아래와 같음
kill -9 10432
killall -9 testme
nice / renice : 우선순위 설정
실행할 명령에 우선순위 주는 것은 nice
실행중인 것을 변경할 때는 renice
-20 ~ 19 사이의 nice값을 가짐
낮을 수록 CPU접근 높음
일반사용자는 음수 X, 높이기밖에 안됨, 자신 프로세스만 접근가능
루트는 모두 가능
nice +5 updatedb &
renice -n -5 20284
==========
셸 스크립트
# : 주석
변수초기화
-> 변수명=값
-> 공백없음에 유의
-> PI=3.141592
명령의 결과를 변수에 넣기
-> MYDATE=$(date) (괄호 없으면 명령이 아닌 변수참조로 인식 $date)
-> MYDATE=`date`
-> NUM_FILES=$(/bin/ls | wc -l)
다른 변수를 담기
-> MYDATE2=$MYDATE
$는 값 참조임
-> MYDATE는 그냥 변수
-> $MYDATE는 변수의 값 참조
메타 문자로 표현하지 않고 문자그대로를 사용하려면
백슬레시 or 문자열전체를 ' '로 묶음
-> echo \$HOME
-> echo '$HOME'
-> echo "$HOME ***"
-> 큰따옴표는 *만 문자그대로 표현해줌...
커맨드라인인자
$n : n번째 파라미터 ($0은 스크립트의 경로임)
-> $0 $1 $2 ... $n
$# : 파라미터 개수 (경로 제외)
$@ : 입력된 인수 전체
$? : 마지막으로 실행된 명령의 종료 상태 (ex. main함수의 return 0)
read함수로 입력받기
-> read -p "input: " n1 n2 n3
-> echo "$n1, $n2, $n3"
파라미터 확장
${변수:-값} : 변수가 없으면 '값'으로 먹음 (1회용)
-> echo "${THIS:-Not Set}"
${변수#패턴} : 패턴을 앞부터 비교해 가장 짧은 것을 잘라냄
${변수##패턴} : 패턴을 앞부터 비교해 가장 긴 것을 잘라냄
${변수%패턴} : 패턴을 뒤부터 비교해 가장 짧은 것을 잘라냄
${변수%%패턴} : 패턴을 뒤부터 비교해 가장 긴 것을 잘라냄
-> MYFILENAME=/home/digby/myfile.txt
-> FILE=${MYFILENAME##*/} -> myfile.txt
-> DIR=${MYFILENAME%/*} -> /home/digby
-> NAME=${FILE%.*} -> myfile
-> EXTENSION=${FILE##*.} -> txt
배시는 변수를 declare로 선언하지 않는다면 글자들의 집합으로 봄 (타입 미지정)
산술 연산을 하기 위해서는 변수를 정수로 변환해야 함 (let, expr, bc)
-> NUM=1024
-> let RET=$NUM/16
-> RET=`expr $NUM / 16`
-> RET=`echo $NUM / 16 | bc`
변수 증감식 사용
-> N=0
-> $((++N))
-> $((N++))
if ... then ... fi 구문
VARIABLE=1
if [ $VARIABLE -eq 1 ] ; then
echo "The variable is 1"
elif [ $VARIABLE -eq 2 ] ; then
echo "The variable is 2"
else
echo "The variable is anything"
fi
수식판단용 연산자
-d : 디렉터리?
-e : 존재하나? (same as -a)
-f : 일반 파일? (디렉터리, 소켓, 파이프, 링크, 장치파일이 아닌 파일)
-r : readable?
-w : writable?
-x : excutable?
expr1 -a expr2 : 둘다 참? (and)
expr1 -o expr2 : 둘 중 하나 참? (or)
var1 = var2 : 비교 (특히 문자열)
var1 -eq var2 : 비교 (특히 정수)
var1 -ge var2 : var1이 var2보다 크거나 같은가
var1 -gt var2 : var1이 var2보다 큰가
var1 -le var2 : var1이 var2보다 작거나 같은가
var1 -lt var2 : var1이 var2보다 작은가
var1 != var2 : not eq
var1 -ne var2 : not eq
조건 검사와 || &&
[ 조건검사 ] || 동작
-> 조건이 만족되면 동작을하지 않음
-> [ -d "$dirname" ] || mkdir "$dirname"
-> short circuit (A참 || B판단x)
[ 조건검사 ] && 동작
-> 조건이 만족되면 동작을 함
-> [ $# -ge 3 ] && echo "There are at least 3..."
-> short circuit (A참 && B판단o)
[ 조건검사 ] && 동작1 || 동작2
-> 조건이 참이면 동작1 실행 -> 동작2 실행 X
-> 조건이 거짓이면 동작1 실행X -> 동작2 실행
->[ -e $dirname ] && echo $dirname already exit || mkdir $dirname
-> short circuit ( (A&&B) || C )
case ... esac 구문
case 변수 in
값1)
실행문 ;;
값2)
실행문 ;;
*)
실행문 ;;
esac
->
case `date +%a` in
"Mon" | "Tue")
echo "Today is monday or tuesday" ;;
*)
echo "Today is not monday and tuesday" ;;
esac
->
case $VAR in
"var1")
echo "var1" ;;
*)
echo "not var1" ;;
esac
for ... do ... done 구문
for 변수 in 리스트
do
실행문
done
-> 일반 예시
for NAME in John Paul Ringo George
do
echo $NAME is my favorite Beatle
done
-> ; do 활용
for FILE in `/bin/ls` ; do
echo $FILE
done
-> C 개발자를 위한 for문...
LIMIT=10
for((a=1; a <= LIMIT ; a++)) ; do
echo $a
done
while ... do ... done (조건이 참인 동안 실행)
until ... do ... done (조건이 참일 때까지 실행)
-> while 문
while [ 조건 ]
do
실행문
done
-> untile 문
until [ 조건 ]
do
실행문
done
-> ; do 활용가능
N=0
while [$N -lt 10] ; do
echo $N
let N=$N+1
done
grep (일반 정규식 파서)
grep <찾는 문자열(혹은 정규표현식)> <파일이나 입력>
-> env | grep ^HO
-> ^는 시작 메타 문자
-> $는 끝 메타 문자
cut (일정 영역의 텍스트행 제거)
-> grep /home /etc/passwd | cut -d':' -f6
-> /etc/passwd에서 /home을 찾아내고 그것을 딜리미터:으로 나눈 후 6번째 field출력
-> 해당 행에 딜리미터가 없어서 자르지 못했으면 그냥 그대로 출력
tr (문자 변환 / 삭제)
-> FOO="Mixed UppEr ANd oLWeR cAse"
-> echo $FOO | tr [A-Z] [a-z]
-> mixed upper and lower case 출력
->
-> for file in * ; do
-> f=`echo $file | tr [:blank:] [_]`
-> [ "$file" = "$f" ] || mv "$file" "$f"
-> done
->
-> echo $var | tr '_' ' '
sed (스트림 에디터)
sed -n '/home/p' /etc/passwd
sed 's/Mac/Linux/g' somefile.txt > fixed_file.txt
cat somefile.txt | sed 's/ *$//' > fixed_file.txt
grep cut tr sed bc 등 더 찾아봐야 할듯
==========
Makefile make
https://velog.io/@hidaehyunlee/Makefile-%EB%A7%8C%EB%93%A4%EA%B8%B0
CC = 컴파일러 // gcc 사용
CFLAGS = 옵션 // 옵션은 선택
SRCS = 소스파일명 // .o파일로 만들 .c 파일을 나열하면 됨
OBJS = $(SRCS:.c=.o) // OBJS가 판단될때 SRCS의 .c파일을 .o로 치환함
TARGET = 만들실행파일명
$(TARGET) : $(OBJS)
$(CC) $(CFLAGS) -o $@ $^
//변수 사용은 $(변수)로함
// $(TARGET)을 만들기 위해서 $(OBJS)가 필요함 (의존성 나열)
// $(OBJS)가 없으면 OBJS로 가서 만듬
// 즉, 의존성 나열로 순서를 정하는 것
//$@은 : 를 기준으로 왼쪽, $^은 오른쪽
//$@는 $(TARGET)이 되고 $^은 $(OBJS)가 됨
all : $(TARGET)
// make all 하면은 의존성으로 인해 $(TARGET)이 만들어져야하고
// $(TARGET)이 만들어 지려면 $(OBJS)가 만들어져야 함
// 즉, 이러한 순서로 인해 make all하면 실행파일이 만들어짐
clean :
rm -f $(OBJS)
// make clean
// OBJS파일을 모두 지움
fclean : clean
rm -f $(TARGET)
// make fclean
// clean을 실행하고 TARGET을 지움
// 그래서 make fclean하면 의존성 때문에 clean도 실행되는 것
re : fclean all
// 의존성으로 re가 실행되기전 fclean이 실행되어야 하고 그 이후 all이 실행되야 함
// fclean은 clean을 부름 -> 다 지움
// all은 TARGET을 필요함 -> 실행 파일을 만듦
'etc' 카테고리의 다른 글
42seoul - la piscine 후기 (울타리, 개인적인 생각) (3) | 2020.08.05 |
---|---|
집중 & 시간 (0) | 2020.06.03 |
Google Service는 왜 SHA-1 지문이 필요한가? (0) | 2020.02.27 |