입력된 명령어 또는 스크립트 파일에서 읽어 들이는 명령어들을 해석하여 사용자와 커널 중계 역할을 담당한다
리눅스 안에 들어있는 또 하나의 운영체제 라고 봐도 될 정도로 중요함
ps -f
->
UID PID PPID C STIME TTY TIME CMD
root 9042 9018 0 19:01 pts/0 00:00:00 bash
root 9759 9042 0 19:06 pts/0 00:00:00 ps -f
ps -f 는 bash 라는 shell 에서 처리하고 있음.
사용자 입력 -------------- 쉘 ---------------- 커널
ls -l /tmp -> 해석 -> 0101010101
이런식으로 처리가 됨. 대표적으로 가장 많이 사용하는 쉘이 bash 쉘이다.
chsh -l
->
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
사용할 수 있는 쉘은 2개 , 나머지 2개는 소프트링크용
cat /etc/passwd
->
root:x:0:0:root:/root:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash
user2:x:1002:1002::/home/user2:/bin/bash
를 보면 root나 user1,user2로 로그인 하면 bash 을 사용하겠다는거임
1) 파이프
| : 앞에 실행한 명령어 결과를 파이프 다음 명령어로 넘겨준다. 만약, 따옴표, 소괄호 안에 있다면, OR 개념이다.
[root@Client1 /root/test]# cat /etc/passwd | head -3
[root@Client1 /root/test]# cat /etc/services | more
[root@Client1 /root/test]# cat /etc/passwd | egrep "^root|^user1|^user2"
2) 세미콜론, 더블 앰퍼샌드, 더블 버티컬바
; 여러개의 명령어를 순차적으로 수행하도록 한다.(앞에 명령이 실패되어도, 뒤에 명령이 실행됨)
&& 여러개의 명령어를 순차적으로 수행하도록 한다.(단, 앞에 명령이 성공되면, 뒤에 명령이 실행됨)
|| 앞에 명령이 성공되면, 다음 명령이 수행 안된다. (맊약, 앞에 명령이 실패되면, 다음 명령이 실행됨)
[root@Client1 /root/test]# date ; cal
[root@Client1 /root/test]# dat ; cal
[root@Client1 /root/test]# date && cal
[root@Client1 /root/test]# dat && cal
[root@Client1 /root/test]# date || cal
[root@Client1 /root/test]# dat || cal
[root@Client1 /root/test]# cat /etc/passwd | head -1 ; cat /etc/passwd | tail -2
[root@Client1 /root/test]# ps -ef | head -1 ; ps -ef | grep sshd
3) 애스터리스크 : * 전체를 의미한다.
[root@Client1 /root/test]# find /etc -name pass*
[root@Client1 /root/test]# find /etc -name *conf
[root@Client1 /root/test]# rm -rf /root/test/*
4) 캐럿 : ^ 라인 시작을 의미한다.
[root@Client1 /root/test]# cat /etc/passwd | grep ^root
5) 달러 : 라인 끝을 의미한다
[root@Client1 /root/test]# cat /etc/passwd | grep bash$
$ 변수 지정(Ex : echo 명령어를 이용하면 환경 변수 값을 보여준다.)
[root@Client1 /root/test]# env
[root@Client1 /root/test]# env | grep PATH
[root@Client1 /root/test]# env | grep HOSTNAME
[root@Client1 /root/test]# env | grep SHELL
[root@Client1 /root/test]# echo $PATH
[root@Client1 /root/test]# echo $HOSTNAME
[root@Client1 /root/test]# echo $SHELL
6) 작은 따옴표 : ' ' 쉘이 메타캐릭터를 해석할 수 없도록 처리한다.(메타캐릭터를 일반 문자로 처리함)
[root@Client1 /root/test]# echo $PATH
[root@Client1 /root/test]# echo '$PATH'
[root@Client1 /root/test]# echo $HOSTNAME $SHELL
[root@Client1 /root/test]# echo '$HOSTNAME $SHELL'
7) 큰 따옴표 : " " 쉘이 메타캐릭터를 해석할 수 없도록 처리한다. 단, $, ``, \은 쉘이 해석한다.
[root@Client1 /root/test]# echo $PATH
[root@Client1 /root/test]# echo "$PATH"
8) 역 따옴표, $( ) :
, $( ) 쉘이 해석할 때 역 따옴표 안에 있는 문자열을 명령어로 처리한다.
[root@Client1 /root/test]# echo date
[root@Client1 /root/test]# echo `date`
[root@Client1 /root/test]# echo `ls -l /tmp`
[root@Client1 /root/test]# echo date
[root@Client1 /root/test]# echo $(date)
[root@Client1 /root/test]# echo $(ls -l /tmp)
9) 역슬래쉬 : \ 역슬래쉬 다음에 나오는 메타캐릭터를 쉘이 해석할 수 없도록 처리한다.
[root@Client1 /root/test]# echo $PATH
[root@Client1 /root/test]# echo \$PATH
10) 브래킷 : [ ] 안에 있는 문자/숫자을 OR 로 처리하거나, 범위를 지정한다.
[root@Client1 /root/test]# cat /etc/passwd | grep user[12]
[root@Client1 /root/test]# cat /etc/passwd | grep user[1-2]
11) 피리어드 : . 한자리 모든 문자/숫자를 의미한다.
[root@Client1 /root/test]# cat /etc/passwd | grep ^user.
ls -l /tmp
-> 표준 입력
합계 36
drwx------. 2 root root 4096 2022-03-04 18:50 keyring-r0MVLh -> 표준 출력
drwx------. 2 gdm gdm 4096 2022-03-04 18:50 orbit-gdm
drwx------. 2 root root 4096 2022-03-04 18:52 orbit-root
-rw-r--r--. 1 root root 1576 2022-03-03 19:01 passwd
drwx------. 2 root root 4096 2022-03-04 18:50 pulse-eQ8pBcqmbauc
drwx------. 2 gdm gdm 4096 2022-03-04 18:51 pulse-oU6LUTVnzMgH
drwxr-xr-x. 2 root root 4096 2022-03-03 19:04 test
drwx------. 2 root root 4096 2022-02-22 20:17 virtual-root.UQzjWD
drwx------. 2 root root 4096 2022-03-04 18:51 virtual-root.hjlr35
-rw-------. 1 root root 0 2022-02-23 04:57 yum.log
ls -l /abc
->
ls: cannot access /abc: 그런 파일이나 디렉터리가 없습니다 -> 표준 에러
1) 출력 재지정
> : 출력 내용을 파일로 덮어쓰기하여 저장한다.
echo 1111
echo 1111 1> file1 -> 1 은 기본값이기 때문에 생략 가능하다.
cat file1
-> 1111
echo 2222 > file1
cat file1
-> 1111
>> : 출력 내용을 파일로 이어쓰기하여 저장한다.
echo 3333 >> file1
echo 4444 >> file1
cat file1
2222
3333
4444
2) 에러 재지정
2> 에러 내용을 파일로 덮어쓰기하여 저장한다.
2>> 에러 내용을 파일로 이어쓰기하여 저장한다.
ls -l /abc
ls -l /abc > errfile -> '2'가 없으면, 출력 재지정으로 처리한다.
- 에러 재지정을 의미하는 '2'를 포함하여 지정하지 않았기 때문에 에러는 모니터로 출력되고 파일에
저장되어 있지 않다.
cat errfile
- 그렇기 때문에 다음과 같이 에러 재지정은 반드시 '2'를 포함시켜서 지정해야한다.
ls -l /xyz 2>> errfile
cat errfile
-> ls: cannot access '/xyz': 그런 파일이나 디렉터리가 없습니다.
- 다음과 같이 에러가 맋이 뜨는 경우, 별도의 파일에 저장하지 않고 모니터에 출력되지 않게 하라면
'/dev/null'로 에러를 지정하면된다.
find / -perm -4000
->
find: ‘/proc/11054/task/11054/fd/5’: 그런 파일이나 디렉터리가 없습니다
find: ‘/proc/11054/task/11054/fdinfo/5’: 그런 파일이나 디렉터리가 없습니다
find: ‘/proc/11054/fd/6’: 그런 파일이나 디렉터리가 없습니다
find: ‘/proc/11054/fdinfo/6’: 그런 파일이나 디렉터리가 없습니다
find / -perm -4000 2> /dev/null
-> 아무것도 안뜸 ㅇㅇ
/dev/null은 Unix 및 Unix 기반 시스템에서 사용되는 특별한 파일 경로입니다.
이 파일은 모든 데이터를 기록하지 않고 버릴 수 있는 가상의 장소를 나타냅니다.
여러 가지 용도로 사용됩니다.
3) 입력 재지정
< : 인자값을 키보드 입력이 아닌 파일로 받는다.
cat 0< /etc/issue -> 0 은 기본값이기 때문에 생략 가능하다.
<< : 특정 문자열까지맊 입력을 받는다.
cat << EOF
1111
2222
3333
EOF
->
1111
2222
3333
- 다음은 EOF 전까지 입력받은 문자열을 'file2'에 이어쓰기하여 저장한다.
cat << EOF >> file2
-> EOF 전까지 입력했던 것이 file2 들어감
1.ps -ef | head -1 ; ps -ef | grep sleep
2.rpm -qa | grep openssh
head -1 > file1.txt ; ps -ef | grep sleep >> file1.txt ; rpm -qa | grep openssh >> file1.txt
-> 이렇게 풀이함
ps -ef | head -1 ; ps -ef | grep sleep > file1.txt
-> 실수로 이렇게 하면 앞에건 안들어가고 뒤에것만 들어감
ind / -perm -4000 2> file2.txt
root@Client1 /root/test]# cat << EOF > file3.txt
> 1111
> 2222
> 3333
> EOF
[root@Client1 /root/test]#
[root@Client1 /root/test]# cat file3.txt
1111
2222
3333
root@Client1 /root/test]# cat << EOF >> file3.txt
> 4444
> 5555
> 6666
> EOF
[root@Client1 /root/test]#
[root@Client1 /root/test]# cat file3.txt
1111
2222
3333
4444
5555
6666