shell의 실행과 내부명령어 with putty

감귤맛젤리·2023년 6월 6일
0

shell?

일종의 user level 프로그램이다. shell을 매개로 user와 linux kernel이 의사소통할 수 있다.
1. 명령어 실행기
2. 프로그래밍 언어

shell의 정체는 프로그램!

shell의 종류

bash (Born Again shell)

리눅스의 default shell이다. 로그인 순간 자동적으로 bash shell 실행!
GNU에서 만들었다.
bash도 shell이기 때문에 일종의 프로그램이다.
로그인 이외에 shell 또 실행시킬 수 있다.

실행파일의 위치

/bin/bash : bash shell version 1
/bin/bash2 : bash shell version 2

bash shell의 실행

로그인 시 자동적으로 shell이 실행된다.
시스템 관리자가 사용자의 기본 shell을 정한다.
/etc/passwd 파일에 사용자별 login shell이 명시되어 있다.

bash command를 직접 입력하여 실행한다.

bash가 사용하는 특별한 파일들

hidden file이기 때문에 ls -a로 확인한다.
로그인 혹은 새로운 터미널 생성 시 사용한다.
~/.profile : 로그인 시 실행 ; 자동 실행된다.

~/.bash_logout : 로그아웃 시 실행
~/.bashrc : shell이 시작될 때 실행 -> 로그인 외 bash 시작 시 실행
; ls -a 시 바로 보인다.

bash 입력하면, bash프로그램이 또 열린다. exit하면 원래 로그인된 창으로 돌아간다. 새로운 bash를 열면 변수는 유지되지 않는다. 독립적인 새로운 프로그램이기 때문이다.

새로운 bash 열기

변수가 유지되지 않는다!

새 bash 프로그램 열었을 때 구분하기


이렇게 vi .bashrc 해서 마지막에 echo 문자열 추가한다!

새로 bash 실행할 때, 이렇게 가시적으로 확인할 수 있다. 로그인 외 bash 실행 시 .bashrc파일이 실행되기 때문이다.

vi mode로 .profile, .bashrc 파일 수정 후 확인하기


새로 로그인했더니 .bashrc, .profile파일이 실행된 것을 확인할 수 있다!

Shell script

유닉스/리눅스의 실행 파일(executable file)

  • binary file : 고급언어 소스코드를 컴파일하여 만든 기계어 파일이라 읽을 수 없다.
    • a.out인 실행파일은 읽을 수 없는 binary file이다. cat해도 못읽음
  • script file : 일련의 statement를 담고 있는 텍스트 파일

script file

각 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이 실행한다.

script 실행파일의 생성 및 실행

binary 실행파일 : 컴파일러 -> 오브젝트파일 -> 링커 -> 바이너리코드(a.out)-> ./a.out순간, 로더가 메모리에 프로그램을 돌려서 실행해준다. gcc는 컴파일러 링커까지의 과정을 한꺼번해 처리해준다.

script 실행파일은 로더로 프로그램이 올라가고, interpreter 거친 후 실행이 된다.
$chmod +x program -> $./program

Shell 내부명령어(built in command)

별도의 실행 파일을 실행시키지 않고 shell이 자체적으로 수행하는 명령어

cd가 내부명령어가 아니라고 가정하면, 현재의 shell이 자식 프로세스를 생성하여 cd를 수행한 수 cd 프로세스가 종료된다. 그 후

내부명령어가 아닌, 자식프로세스 형태의 별도의 프로그램이 있는 것을 command로 수행시킨다면, 그 명령어는 shell에 자식 프로세스 형태로 shell이 만들어서 실행한다. 이렇게 되면, 자식 프로세스가 운영이 끝나고 종료가 되면 부모에게 자원을 반납하고 사라지게 되므로, 부모프로세스로 돌아오게 된다!

$pwd
/here
$cd /there
$pwd
/here
cd는 이미 종료되고 부모프로세스로 돌아왔기 때문에 /here으로 나오는 것이 아니라 /there로 나온다.
부모와 똑같은 /here이 나오는 것!
원래는 cd가 내부명령어이기때문에 cd상태로 남아있을 수 있어 pwd하게 되면 /there로 출력된다. 

help 명령

bash shell의 내부 명령어에 대한 도움말을 제공한다.
$help cd, $help readonly 등등,,,
man bash로 좀 더 상세한 설명이 가능하다.
help, ls는 내부명령어가 아닌 별도의 프로그램이다.

shell변수

임의의 문자열을 저장한다. 따라서, 자료형(int, float, char)을 지정할 필요가 없다.
값 할당은 변수명 = 값으로 할 수 있다. 공백은 있으면 안 된다!
변수에 저장된 값은 $변수명으로 한다.
현재 수행 중인 shell이 변수의 이름과 값의 쌍을 기억한다.

$c=/usr/include
$ls $c
$cp $c/signal.h .   // $c/signal.h 를 현재 디렉토리(.) 밑에 복사해줘!!! 


괄호없으면 전체를 변수로 인식한다!

환경변수

? 명령어 수행 시 사용자의 환경에 관한 정보가 필요하다.

  • 터미널의 유형 vi
  • 현재 작업 중인 디렉토리 경로 ls
    • 환경변수 형태로 shell에서 ls에 현재 디렉토리 정보가 전달돼서 출력되는 것!
  • 사용자가 선호하는 에디터의 종류

! 모든 커맨드 수행 시 이러한 정보를 argument로 직접 전달한다.

이건 좀 에바다... 너무 귀찮음

! 환경변수

shell에게 한번 명시한 후 호출한 command에 shell이 직접 전달한다.

특별한 종류의 shell변수이다. 부모 프로세스가 자식 프로세스에게 전달(export)한다. 일반적인 shell변수는 자식 프로세스에게 전달되지 않는다!
변수이름 = 값인데 의미와 이름이 이미 정해져 있다.

대표적인 환경 변수

환경변수설명
HOME현재 사용자의 홈 디렉토리
OLDPWD이전의 작업 디렉토리(현재 디렉토리 이동 전의 디렉토리 - cd이전의 작업디렉토리)
PATHbash가 실행파일을 찾기 위해서 사용되는 검색 경로! 경로에서 실행파일을 찾는다.
PS1명령어 라인에 출력되는 첫 번째 레벨의 프롬프트 : springcs23_836담고 있는 변수
PS2두 번째 레벨의 프롬프트(크게 중요하지 않다)
PWD현재 작업 디렉토리(pwd와는 다르다 얘는 환경변수임)
SECONDS현재의 bash 세션이 시작되고 난 뒤에 경과한 시간 - 이름과 의미도 저장되어 있다.

로그아웃 해주면 바뀐다!

PATH

:으로 구분한다. PATH에 존재해야 shell이 실행할 수 있다.
$a.out 만 적으면 실행이 안된다. 꼭 ./a.out처럼 현재 디렉토리를 써줘야 환경변수형태로 전달이 가능하다. 현재디렉토리 밑에 실행파일을 실행하는구나 알 수 있다. ./ 대신 절대경로를 써줘도 된다. 이렇게 써주는 이유는 shell이 경로를 알고 있어야 실행이 가능하기 때문이다!

근데 PATH에 현재디렉토리를 추가해주면 ./없이도 실행이 가능하다! 로그아웃 시 PATH는 다시 초기화된다. 초기화되는걸 원하지 않으면 .profile파일에 추가해주면 된다! 정확하게 실행파일이 있는 경로를 알고 있어야 실행이 가능하다!

set

현재 수행 중인 shell의 shell변수 표시

어떤 값 할당했는지 + 환경변수 모두 포함해준다.
너무 길다...
-> set | more통해 페이지로 볼 수 있다! set의 출력값을 more의 입력값으로 넣어주면 된다

env

현재 수행 중인 shell의 환경 변수 표시

환경변수와 환경변수가 아닌 그냥 shell변수의 가장 큰 차이점은 부모프로세스에서 자식프로세스로 전달이 되느냐 안 되느냐이다. 환경변수는 부모프로세스에서 자식프로세스로 전달되지만, 그냥 shell변수는 전달되지 않는다

부모프로세스가 자식프로세스에게 환경변수를 전달하지만, 반대는 성립하지 않는다.

alias ; alias name=command

명령문을 다른 이름으로 지정할 수 있게 한다.

한 단어가 아니면 ''으로 묶어줘야 한다. alias 지정하면 $표시를 해주지 않아도 된다.
되돌리고 싶을 땐, unalias name해주면 된다.
역시 항상 고정하고 싶을 땐, .profile에 추가해주면 된다.

history

직전 사용 명령어들 알려주는 명령어

처음부터 쭉 썼던 거 알려준다. 로그아웃해도 상관없다 다 기록이 된다!

0개의 댓글

관련 채용 정보