2023.10.27 TIL
Bourne, Korn(ksh), C, bash, dash
사용자와 커널 사이에서 명령을 해석하여 전달하는 interpreter와 translator 기능
로그인 shell → /etc/passwd 파일에 사용자별로 지정, 사용자가 로그인하면 자동 실행
프롬프트 : shell이 사용자의 명령을 기다리고 있음을 나타내는 표시 $
shell 프로그램을 shell script라고 한다
사용자 환경을 설정할 수 있도록 초기화 파일 기능 제공
초기화 파일 → 명령을 찾아오는 경로 설정, 파일•디렉토리 기본 생성 권한 설정, 환경변수 설정 등
$ grep user1 /etc/passwd
chsh [option] [username]
chsh -s /bin/sh user1 → 지정한 shell을 dash로 변경
cat /etc/shells → 바꿀 수 있는 shell의 종류 확인
exit → 서브 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은 생략가능
현재 shell 뿐만 아니라 서브 shell로도 전달(전역변수) (shell변수: 지역변수)
$ set → shell 변수와 환경변수 모두 출력
$ env → 환경변수만 출력
$ echo $HISTSIZE → 히스토리 저장 크기
$ echo $HOME → 사용자 홈 디렉토리의 절대 경로
$ echo $LANG → 사용하는 언어
$ echo $LOGNAME →사용자 계정 이름
$ echo $PATH → 명령을 탐색할 경로
$ echo $PWD → 작업 디렉토리의 절대 경로
$ echo $SHELL → 로그인 shell
변수 이름과 문자열 사이에 공백이 있으면 안됨
$ SOME=test → SOME 안에 test라는 값 지정
먼저 shell 변수를 정의하고, export 명령을 사용하여 이를 환경 변수로 변경
$ export SOME
$ env | grep SOME → SOME 변수 찾아서 출력
$ export -n SOME
여러 명령을 연결하여 하나의 명령으로 만들 수도 있음
alias
alias ls='ls -aF --color=auto'
alias rm='rm -i'
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