[Linux] Shell, Bash | alias | history | prompt

pos++·2023년 11월 2일
post-thumbnail

2023.10.27 TIL

Shell의 종류와 기능

🐣 Shell의 종류

Bourne, Korn(ksh), C, bash, dash

🐣 명령어 해석기 기능

사용자와 커널 사이에서 명령을 해석하여 전달하는 interpreter와 translator 기능

로그인 shell → /etc/passwd 파일에 사용자별로 지정, 사용자가 로그인하면 자동 실행

프롬프트 : shell이 사용자의 명령을 기다리고 있음을 나타내는 표시 $

🐣 프로그래밍 기능

shell 프로그램을 shell script라고 한다

🐣 사용자 환경 설정 기능

사용자 환경을 설정할 수 있도록 초기화 파일 기능 제공

초기화 파일 → 명령을 찾아오는 경로 설정, 파일•디렉토리 기본 생성 권한 설정, 환경변수 설정 등

Shell 기본 사용법

🐣 사용자 정보 확인(기본 shell 확인)

$ grep user1 /etc/passwd

🐣 기본 shell 바꾸기

chsh [option] [username]
chsh -s /bin/sh user1 → 지정한 shell을 dash로 변경

cat /etc/shells → 바꿀 수 있는 shell의 종류 확인

🐣 로그인 shell과 서브 shell

  • 프롬프트에서 다른 shell을 실행할 수 있음 : 서브 shell
  • 서브 shell은 또 다른 서브 shell 생성 가능
  • exit → 서브 shell 종료, 이전 shell 환경으로 복귀

🐣 shell 내장 명령

별도의 실행 파일 없이 shell 안에 포함 (ex: cd)

  • 일반 명령(실행 파일)의 경우, 바이너리 파일이므로 cat 명령으로 내용 확인 가능

🐣 출력 명령

echo linuxxx → linuxxx 출력

-n : newline 없이 출력

공백이 포함된 문자열은 “” 사용

변수값 찍어볼때 유용
printf "d\n" 100 → 100 출력

특수문자 사용하기

*

ls * → 현재 디렉토리의 모든 파일과 서브 디렉토리 나열, 서브 디렉토리 내용도 출력

cp * /tmp → 현재 디렉토리의 모든 파일을 /tmp 디렉토리 아래로 복사

ls -F t* → 파일명이 t로 시작하는 모든 파일의 이름과 파일 종류를 출력

ls -l h*d → 파일명이 h로 시작하고 d로 끝나는 모든 파일의 상세 정보 출력

cp *.txt ../ch3 → 확장자가 txt인 모든 파일을 상위 디렉토리 아래의 ch3 디렉토리로 복사

? []

ls t?.txt → t 다음에 임의의 한 문자가 오고 확장자가 txt인 모든 파일의 이름 출력

ls -l tmp[1-3].txt → tmp1.txt, tmp2.txt, tmp3.txt 가 있다면 상세 정보 출력

ls [0-9]* → 파일명이 숫자로 시작하는 모든 파일의 목록 출력

ls [A-Za-z]*[0-9] → 파일명이 영문자로 시작하고 숫자로 끝나는 모든 파일의 목록 출력

~ -

~→ 현재 작업중인 사용자의 홈 디렉토리

~[로그인ID] → 해당 사용자의 홈 디렉토리

- → cd 명령, 디렉토리를 이전하기 직전의 작업 디렉토리

cp *.txt ~/ch3 → 확장자가 txt인 모든 파일을 현재 작업중인 사용자의 홈 디렉토리 아래

cp ~user2/linux.txt . → user2의 홈 디렉토리 아래에서 linux.txt를 현재 디렉토리로 복사

cd - → 이전 작업 디렉토리로 이동

; |

date; ls; pwd → 연결된 명령을 왼쪽부터 차례대로 실행

ls -al/| more → 왼쪽 명령의 실행 결과를 오른쪽 명령의 입력으로 전달

' ' " "

' ' → 모든 특수문자를 일반 문자열로

" " → $, ` `, \ 를 제외한 모든 특수문자를 일반 문자열로

echo '$SHELL' → $SHELL 문자열 화면에 출력

echo "$SHELL" → shell 환경 변수인 SHELL에 저장된 값인 현재 shell의 종류 출력

` `

문자열을 명령어로 해석

echo "Today is `date`" → Today is 2023.10.27(Thu) 출력

ls /usr/bin/`uname -m` → uname -m 명령의 실행결과를 문자열로 바꿔 파일명으로 사용

**\**

ls -l t\* → t* 라는 이름을 가진 파일의 상세 정보 출력

echo \$SHELL → $SHELL 문자열 화면에 출력

> < >>

입출력의 방향을 바꾸는 특수문자

ls -l>res → ls -l 명령의 실행 결과를 화면이 아닌 res 파일에 저장

🐣 입출력 방향 바꾸기

표준 입력 장치 : 키보드
표준 출력 장치 : 모니터
표준 오류 장치 : 모니터

🐣 파일 디스크립터

파일 관리를 위해 붙이는 일련 번호

redirection : 표준 입출력 장치를 파일로 바꾸는 것
표준 입출력 장치를 변경할 때 파일 디스크립터를 이용

🐣 출력 리다이렉션

> → 기존 파일의 내용을 삭제하고 새로 결과를 저장, 파일이 없으면 생성

>> → 기존 파일의 내용 뒤에 결과를 추가, 파일이 없으면 생성

ls -al > out1 → 명령의 수행 결과를 out1 이라는 파일에 (덮어)쓰기

표준 출력은 1> 처럼 파일 디스크립터 번호 1을 쓰지만 생략가능

#예상치 않게 파일의 내용이 겹쳐 쓰이는 상황 방지하기

set -o noclobber (해제: set +o noclobber)

#cat 명령으로 파일 생성하기

cat > out1 → 표준 입력을 받아 out1 파일에 저장 (입력종료: ^D)

date >> out1 → date를 out1에 계속해서 이어서 저장

🐣 오류 리다이렉션

ls /abc 2> ls.err → 표준 오류를 리다이렉션한다

#표준 출력과 표준 오류를 한 번에 리다이렉션

ls . /abc > ls.out 2> ls.err

#오류 메세지 버리기

ls /abc 2> /dev/null → /dev는 장치파일, /dev/null에 기록하면 버리기

#표준 출력과 표준 오류를 한 파일로 리다이렉션

ls . /abc > ls.out 2>&1 → &1은 표준 출력 파일

🐣 입력 리다이렉션

cat < out1 → out1의 내용을 cat으로 준다

#표준 입력은 0< 이지만 0은 생략가능

🐣 Bash Shell 환경설정

현재 shell 뿐만 아니라 서브 shell로도 전달(전역변수) (shell변수: 지역변수)

$ set → shell 변수와 환경변수 모두 출력

$ env → 환경변수만 출력

🐣 주요 shell 환경변수

$ echo $HISTSIZE → 히스토리 저장 크기

$ echo $HOME → 사용자 홈 디렉토리의 절대 경로

$ echo $LANG → 사용하는 언어

$ echo $LOGNAME →사용자 계정 이름

$ echo $PATH → 명령을 탐색할 경로

$ echo $PWD → 작업 디렉토리의 절대 경로

$ echo $SHELL → 로그인 shell

🐣 shell 변수 설정하기

변수 이름과 문자열 사이에 공백이 있으면 안됨

$ SOME=test → SOME 안에 test라는 값 지정

🐣 환경 변수 설정하기

먼저 shell 변수를 정의하고, export 명령을 사용하여 이를 환경 변수로 변경

$ export SOME

$ env | grep SOME → SOME 변수 찾아서 출력

🐣 환경 변수를 다시 shell 변수로 바꾸기

$ export -n SOME

alias

여러 명령을 연결하여 하나의 명령으로 만들 수도 있음

🐣 alias 확인하기

alias

🐣 alias 설정하기

alias ls='ls -aF --color=auto'

alias rm='rm -i'


🐣alias 해제하기

unalias ls

Honey Tip

alias ls='ls -aF --color=auto'
alias ll='ls -aFl --time-style=long-iso'
alias l='ls -aFlh --time-style=long-iso'
alias ps='ps -ef'
alias gr='grep -rni --color=auto'
alias psg='ps | grep '
alias psgt='ps -efT | grep '
alias nsg='netstat -nap | grep '
PATH=.:$PATH; export PATH
PS1='\u@\h:$PWD> '
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u\[\033[01;36m\]@\[\033[01;34m\]\h\[\033[00m\]:\[\033[01;33m\]$PWD>\[\033[01;00m\]'

히스토리

사용자가 이전에 입력한 명령을 다시 불러 사용하는것

$ history

$ !! → 바로 직전에 실행한 명령을 재실행

$ !번호 → 히스토리에서 해당 번호의 명령을 재실행

$ !문자열 → 히스토리에서 해당 문자열로 시작하는 마지막 명령을 재실행

프롬프트에서 화살표 🔼 키를 누르면 방금 실행한 명령이 나타난다

프롬프트에서 control+r → 사용했던 명령 검색 가능

more ~/.bash_history → 히스토리 파일 안의 내용을 보여준다


🐣히스토리 저장하기

로그아웃할 때 홈 디렉토리 아래의 숨김 파일인 .bash_history에 히스토리가 저장됨

프롬프트 설정

프롬프트 설정 변수 : PS1

echo $PS1


🐣 이스케이프 문자와 프롬프트 해석하기

\로 시작하는 특별한 문자가 이스케이프 문자

\u 와 같이 \로 시작하는 이스케이프 문자는 두 글자가 아니라 한 글자로 처리

\h → 첫 번째 . 까지의 호스트 이름 (ex: server.co.kr 에서 server)

\H →전체 호스트 이름

\u → 사용자 이름

\w → 현재 작업 디렉토리

\W → 현재 작업 디렉토리의 절대 경로에서 마지막 디렉토리명


🐣 프롬프트 변경

간단한 문자열로 변경 : 프롬프트의 끝을 표시하기 위해 마지막에 ]나 $ 같은 표시를 하고 공백 문자를 둠

user1@myubuntu:~/linux_ex/ch4$ PS1='LINUX ]'
LINUX ] 

🐣 환경 변수를 사용 : 프롬프트에 현재 작업 디렉토리가 출력

LINUX ] PS1='[$PWD]'
[/home/user1/linux_ex/ch4] cd ..
[/home/user1/linux_ex]

🐣 명령의 실행 결과를 사용 : 특수문자 를 이용, uname -n 명령은 호스트 이름을 출력

[/home/user1/linux_ex] PS1='`uname -n`$'
myubuntu $

🐣 이스케이프 문자 \u, \T, \!를 사용

myubuntu $ PS1='[\u \T] \!$'
[user1 10:54:50] 103$

🐣컬러 프롬프트 설정하기

형식 : PS1= ‘\[\e[x;y;nm\] 프롬프트|\[\e[x;y;0m\]’



환경 설정 파일

사용자가 로그인할 때마다 자동으로 실행되는 명령을 저장한 것


🐣시스템 환경 설정 파일

시스템을 사용하는 전체 사용자의 공통 환경을 설정하는 파일

/etc/profile


🐣사용자 환경 설정 파일

각 사용자의 홈 디렉터리에 숨김 파일로 생성, 사용자가 내용 수정하고 관리 가능

!/.profile

$ vi .profile


🐣 사용자 환경 설정 파일 만들기

$ vi .bash_aliases → 적용할 내용 쓰고 저장


🐣사용자 환경 설정 파일 적용하기

$ source .bash_aliases 또는 $ . .bash_aliases

profile
밀린 TIL 업로드 조금씩 정리중...

0개의 댓글