일종의 user level 프로그램이다. shell을 매개로 user와 linux kernel이 의사소통할 수 있다.
1. 명령어 실행기
2. 프로그래밍 언어
shell의 정체는 프로그램!
리눅스의 default shell이다. 로그인 순간 자동적으로 bash shell 실행!
GNU에서 만들었다.
bash도 shell이기 때문에 일종의 프로그램이다.
로그인 이외에 shell 또 실행시킬 수 있다.
/bin/bash : bash shell version 1
/bin/bash2 : bash shell version 2
로그인 시 자동적으로 shell이 실행된다.
시스템 관리자가 사용자의 기본 shell을 정한다.
/etc/passwd 파일에 사용자별 login shell이 명시되어 있다.
bash command를 직접 입력하여 실행한다.
hidden file이기 때문에 ls -a로 확인한다.
로그인 혹은 새로운 터미널 생성 시 사용한다.
~/.profile
: 로그인 시 실행 ; 자동 실행된다.
~/.bash_logout
: 로그아웃 시 실행
~/.bashrc
: shell이 시작될 때 실행 -> 로그인 외 bash 시작 시 실행
; ls -a 시 바로 보인다.
bash 입력하면, bash프로그램이 또 열린다. exit하면 원래 로그인된 창으로 돌아간다. 새로운 bash를 열면 변수는 유지되지 않는다. 독립적인 새로운 프로그램이기 때문이다.
이렇게 vi .bashrc 해서 마지막에 echo 문자열 추가한다!
새로 bash 실행할 때, 이렇게 가시적으로 확인할 수 있다. 로그인 외 bash 실행 시 .bashrc파일이 실행되기 때문이다.
새로 로그인했더니 .bashrc
, .profile
파일이 실행된 것을 확인할 수 있다!
각 statement는 command 또는 다른 script file이다.
script file의 실행을 위해서는 각 line을 읽고 번역하기 위한 interpreter process가 필요하다. 여기에는 shell이 그 일을 담당하므로 shell script라고 부른다.
script file의 첫줄은 #!pathname
으로 시작하며, 이 때 pathname은 누가 그 파일을 번역해야 하는지 알려준다. 예를 들어, bash shell인 경우, #!/bin/bash
라고 한다.(/bin/bash는 bash의 실행파일 경로이다. )
스크립트 파일을 만들어서 실행권한을 주고(chmod통해 준다) 실행 시 한줄한줄 shell이 실행한다.
binary 실행파일 : 컴파일러 -> 오브젝트파일 -> 링커 -> 바이너리코드(a.out)-> ./a.out순간, 로더가 메모리에 프로그램을 돌려서 실행해준다. gcc는 컴파일러 링커까지의 과정을 한꺼번해 처리해준다.
script 실행파일은 로더로 프로그램이 올라가고, interpreter 거친 후 실행이 된다.
$chmod +x program
-> $./program
별도의 실행 파일을 실행시키지 않고 shell이 자체적으로 수행하는 명령어
cd가 내부명령어가 아니라고 가정하면, 현재의 shell이 자식 프로세스를 생성하여 cd를 수행한 수 cd 프로세스가 종료된다. 그 후
내부명령어가 아닌, 자식프로세스 형태의 별도의 프로그램이 있는 것을 command로 수행시킨다면, 그 명령어는 shell에 자식 프로세스 형태로 shell이 만들어서 실행한다. 이렇게 되면, 자식 프로세스가 운영이 끝나고 종료가 되면 부모에게 자원을 반납하고 사라지게 되므로, 부모프로세스로 돌아오게 된다!
$pwd
/here
$cd /there
$pwd
/here
cd는 이미 종료되고 부모프로세스로 돌아왔기 때문에 /here으로 나오는 것이 아니라 /there로 나온다.
부모와 똑같은 /here이 나오는 것!
원래는 cd가 내부명령어이기때문에 cd상태로 남아있을 수 있어 pwd하게 되면 /there로 출력된다.
bash shell의 내부 명령어에 대한 도움말을 제공한다.
$help cd
, $help readonly
등등,,,
man
bash로 좀 더 상세한 설명이 가능하다.
help, ls는 내부명령어가 아닌 별도의 프로그램이다.
임의의 문자열을 저장한다. 따라서, 자료형(int, float, char)을 지정할 필요가 없다.
값 할당은 변수명 = 값
으로 할 수 있다. 공백은 있으면 안 된다!
변수에 저장된 값은 $변수명
으로 한다.
현재 수행 중인 shell
이 변수의 이름과 값의 쌍을 기억한다.
$c=/usr/include
$ls $c
$cp $c/signal.h . // $c/signal.h 를 현재 디렉토리(.) 밑에 복사해줘!!!
괄호없으면 전체를 변수로 인식한다!
vi
ls
이건 좀 에바다... 너무 귀찮음
shell에게 한번 명시한 후 호출한 command에 shell이 직접 전달한다.
특별한 종류의 shell변수
이다. 부모 프로세스가 자식 프로세스에게 전달(export)한다. 일반적인 shell변수는 자식 프로세스에게 전달되지 않는다!
변수이름 = 값
인데 의미와 이름이 이미 정해져 있다.
환경변수 | 설명 |
---|---|
HOME | 현재 사용자의 홈 디렉토리 |
OLDPWD | 이전의 작업 디렉토리(현재 디렉토리 이동 전의 디렉토리 - cd이전의 작업디렉토리) |
PATH | bash가 실행파일을 찾기 위해서 사용되는 검색 경로! 경로에서 실행파일을 찾는다. |
PS1 | 명령어 라인에 출력되는 첫 번째 레벨의 프롬프트 : springcs23_836담고 있는 변수 |
PS2 | 두 번째 레벨의 프롬프트(크게 중요하지 않다) |
PWD | 현재 작업 디렉토리(pwd와는 다르다 얘는 환경변수임) |
SECONDS | 현재의 bash 세션이 시작되고 난 뒤에 경과한 시간 - 이름과 의미도 저장되어 있다. |
로그아웃 해주면 바뀐다!
:
으로 구분한다. PATH에 존재해야 shell이 실행할 수 있다.
$a.out
만 적으면 실행이 안된다. 꼭 ./a.out
처럼 현재 디렉토리를 써줘야 환경변수형태로 전달이 가능하다. 현재디렉토리 밑에 실행파일을 실행하는구나 알 수 있다. ./
대신 절대경로를 써줘도 된다. 이렇게 써주는 이유는 shell이 경로를 알고 있어야 실행이 가능하기 때문이다!
근데 PATH에 현재디렉토리를 추가해주면 ./
없이도 실행이 가능하다! 로그아웃 시 PATH는 다시 초기화된다. 초기화되는걸 원하지 않으면 .profile
파일에 추가해주면 된다! 정확하게 실행파일이 있는 경로를 알고 있어야 실행이 가능하다!
현재 수행 중인 shell의 shell변수 표시
어떤 값 할당했는지 + 환경변수 모두 포함해준다.
너무 길다...
-> set | more
통해 페이지로 볼 수 있다! set의 출력값을 more의 입력값으로 넣어주면 된다
현재 수행 중인 shell의 환경 변수 표시
환경변수와 환경변수가 아닌 그냥 shell변수의 가장 큰 차이점은 부모프로세스에서 자식프로세스로 전달이 되느냐 안 되느냐이다. 환경변수는 부모프로세스에서 자식프로세스로 전달되지만, 그냥 shell변수는 전달되지 않는다
부모프로세스가 자식프로세스에게 환경변수를 전달하지만, 반대는 성립하지 않는다.
명령문을 다른 이름으로 지정할 수 있게 한다.
한 단어가 아니면 ''
으로 묶어줘야 한다. alias 지정하면 $
표시를 해주지 않아도 된다.
되돌리고 싶을 땐, unalias name
해주면 된다.
역시 항상 고정하고 싶을 땐, .profile
에 추가해주면 된다.
직전 사용 명령어들 알려주는 명령어
처음부터 쭉 썼던 거 알려준다. 로그아웃해도 상관없다 다 기록이 된다!