docs/blog/2023-02-06-linux-begin-02.md
2026-08-29 22:09:51 +09:00

13 KiB

title description image authors
리눅스 입문 part 2 1장에 이어서 명령어, 이론, 요령을 알아본다. /assets/blog/02-linux-begin-02/Standard-unix-filesystem-hierarchy.svg
bitdori

권한

ln-s3

ls에 -l 옵션을 붙여서 파일 목록을 출력하면 여러 가지 정보가 나오는데 소유자명, 시각, 파일명 및 링크 포인터로 구성돼 있다는 건 대충 알아볼 수 있으나 첫 번째로 나오는 -rw-r--r-- 와 같은 문자는 어떤 뜻인지 알아보지 못 할 수도 있다.

이는 Symbolic notation라고 불리는 읽기/쓰기/실행 권한 표기문자 이다.

총 10글자로 돼 있는데, 맨 왼쪽 한 개를 뺀 아홉 개는 3개씩 끊어서 각각 소유자(u)/그룹(g)/기타(o)의 권한을 표시한다.

-rw-r--r-- 인 경우

  • 소유자: 읽기/쓰기 (read/write)
  • 해당 파일이 지정된 그룹: 읽기만 (read)
  • 소유자도 파일의 그룹도 아닌 기타 사용자: 읽기만 (read)

할 수 있는 상태인 것이다.

예를 하나 더 들어 lrwxrwxrwx 인 경우 파일소유자/그룹/기타 모두 모든 권한을 보유하고 있는 것이다. (read/write/execute)

맨 왼쪽 lSymbolic link 임을 알려주고 있는데, 다른 표현형으로는

가 있다.

  • cd ~/opt/cygwin-test
  • ls -l

file-type-directory

Symbolic notation의 r/w/x/- 문자는 각각 4/2/1/0 이 대입되는 8진수로 이루어져 있다.

따라서 예로 들고 있는 -rw-r--r--644 권한이 들어가 있는 것이다.

같은 방식으로 lrwxrwxrwx777 권한으로 치환할 수 있다.

유틸리티 part 2

cat /var/log/setup.log 로 Cygwin 설치 중 기록된 메세지를 확인할 수 있었는데, 내용이 길어서 head와 tail로 끊어보았다.

  • less /var/log/setup.log 실행

less

head/tail은 한 번만 출력하고 끝내는 명령인데, lessman과 마찬가지로 f / b 키를 누르면서 계속 본문을 탐색할 수 있다.

  • q 를 눌러서 less 종료

less 커맨드가 개발되기 전에 more 라는 명령어가 먼저 나왔는데 less가 기능이 더 좋지만 more는 도스에서도 기본 탑재하던 커맨드이기 때문에 less를 쓸 수 없는 아주 제한적인 환경에서는 more를 less 대신 사용할 수도 있을 것이다.


  • cat /var/log/setup.log | wc -l 실행

wc

어떤 숫자가 출력됐는데 setup.log 속 내용이 몇 줄이나 들어있는지 wc-l 옵션을 줘서 계산한 것이다.

cat과 wc 사이를 파이프라인으로 이어줬는데 서로 다른 프로그램이 마치 한 개로 합쳐진 것처럼 명령을 수행한다.

&&는 따로따로 실행하는 명령을 표기만 한 줄로 엮을 때 사용하기 때문에 위 명령을 cat /var/log/setup.log && wc -l 로 실행하면 예상과는 다른 결과가 나올 것이다.

and

Shell script

다음과 같은 명령을 실행한다고 해 보자

  • mkdir -p ~/opt/cygwin-test && touch testfile && echo "line1" >> testfile && cp testfile testfile2 && cat testfile2 && ls -l

특별할 것 없는 명령이긴하나

  1. 같은 커맨드를 또 다시 입력하고 싶지 않을 때
  2. 내용을 깔끔하게 작성하고 싶을 때
  3. 외우고 싶지 않을 때

세울 수 있는 대안책으로 shell script를 작성할 수 있다.

vi test-script.sh 를 실행해서 해당 내용을 입력한다.

#!/usr/bin/env bash
mkdir -p ~/opt/cygwin-test
touch testfile
echo "line1" >> testfile
cp testfile testfile2
cat testfile2
ls - l

shell-script-1 shell-script-2

  • ls -l
  • chmod +x test-script.sh
  • ls -l

shell-script-3

  • ./test-s 까지만 입력하고 Tab 키를 눌러서 나머지 자동완성
  • Enter를 눌러서 실행

shell-script-execute

위에서 입력한 명령을 연쇄적으로 실행하였다.

FHS에서 .. 으로 dot을 두 개 입력하면 상위 디렉토리를 가리키고, . 한 개만 입력하면 현재 디렉토리 를 가리킨다.

./test-script.sh 라고 입력한 부분은 현재 위치(pwd)에 있는 test-script.sh 파일을 실행하겠다는 뜻이 된다.

  • chmod -x test-script.sh
  • ./test-script.sh

permission-denied

실행을 거부하고 있다.

chmod 는 rwx 권한을 변경할 때 사용한다.

맨 처음 shell script를 저장하고 곧바로 chmod +x 라는 것을 실행했는데 x 권한을 덧붙여서 실행할 수 있는 상태로 만들었던 것이다.

이후 -x 를 하여 다시 실행권한이 없어졌기 때문에 Permission denied 를 출력하면서 실행을 거부했다.

./test-s 까지만 입력하고 탭 키를 눌렀을 때 나머지 ./test-script.sh 까지 자동완성이 됐는데,

"" 사이에 문자열을 입력할 때 처럼 자동완성을 할 수 없는 경우가 있지만 대부분 경우에는 지원을 해 주고 있다.

chmod -x 로 실행권한이 빠졌을 때 자동완성이 되지 않았을텐데 이러한 동작으로 실행 가능 파일인지 아닌지 짐작해 볼 수 있다.

스크립트 첫 줄에 입력한 #!/usr/bin/env bash 라인은 hashbang 또는 shebang 이라는 부분이며 이 스크립트를 어떻게 실행할 것인가 결정하는 부분이다.

env

ls /usr/bin 을 해 보면 env 라는 프로그램이 있는데 이 프로그램으로 bash가 있는 위치를 탐색하도록 조치한 것이다.

애플 맥OS에서는 zsh 을 기본 인터프리터로 설정해 놓았기 때문에 #!/usr/bin/env zsh 로 작성하게 될 것이다.

/usr/bin/env 가 없거나 이를 사용하지 않는 경우 어떤 스크립트에는 #!/bin/sh 가 입력되어 있는 경우도 있는데 /bin/sh는 POSIX sh이며 bash나 zsh이 아니기 때문에 동작방식이 다를 수도 있다.

파일 탐색

/usr/binenv 가 있다는 사실은 해당 문서를 통해서 또는 경험적으로 알게된 것이지만 경험해 본 적 없는 새로운 파일, 새로운 커맨드가 있는 위치를 찾아보는 명령어로 whichwhereis 가 있다.

command search

which envwhereis env 로 env의 위치를 탐색해보면 둘 다 env 위치를 출력하긴 하지만 which는 출력값이 단 하나인 것에 비해 whereis는 다른 값도 보여주고 있다.

  • which 찾는대상: 실행가능파일(executable)이 있는 위치 출력
  • whereis 찾는대상: 이진 파일, 소스, 매뉴얼이 있는 위치 출력

근데, which와 whereis는 커맨드를 어디에서 찾아야 할지 어떻게 알고 있는 걸까?

이들을 실행하면 PATH라는 환경 변수로부터 경로값을 읽고 명령을 수행한다.

echo $PATH 를 실행하면 PATH 에 어떤 값이 들어있는지 볼 수 있는데, 여기에서 /usr/bin 을 볼 수 있다.

커맨드의 위치를 찾아주는 which / whereis와 달리 find로는 특정 파일을 어떤 경로 내에서 찾을 수 있다.

  • cd /opt/cygwin-test
  • ls
  • find . -name "test*"

test 로 시작하는 파일 내역을 현재 위치에서부터 하위 디렉토리 내부까지 탐색했다.

find

bash 활용

다음과 같은 명령을 실행하려고 한다.

mkdir-p ~/opt/cygwin-test/subdir && cd $_ && touch newfile && echo "line1" >> newfile && ls && cat newfile

전체 커맨드의 앞 단계에서 띄어쓰기를 빼먹어서 에러를 발생시킬 것이다.

커서를 앞 부분으로 하나씩 하나씩 옮겨서 띄어쓰기를 넣고 다시 실행하면 정상적으로 진행이 되겠지만 Readline 단축키로 커서를 더 빠르게 이동시킬 수 있다.

  • 잘못된 커맨드 우선 실행
  • 윗 화살표로 커맨드 다시 표시
  • Ctrl a 로 커서 맨 앞으로 이동 후 잘못된 부분 수정

위/아래 화살표로 이전 커맨드를 찾는 대신 전체 내역을 보고 싶어질 수 있는데 history 커맨드로 예전 기록을 확인할 수 있다.

history-1

history가 출력되면 원하는 내용을 복사 후 붙여넣기해서 Readline 단축키로 수정하려는 부분을 바꾸면 된다.

  • Ctrl e: 커서를 맨 뒤로 이동 (end)
  • Alt b: 커서를 한 단어 왼쪽으로 이동 (backward)
  • Alt f: 커서를 한 단어 오른쪽으로 이동 (forward)

Readline 단축키는 infoemacs에서도 활용하고 있다.

이미 실행했던 커맨드가 많아서 하나하나 찾기 힘든 경우 history | grep -i 검색어 형식으로 grep을 이용해서 찾아낼 수도 있다.

grep의 -i 옵션은 대소문자에 상관 없이 같은 알파벳이면 결과를 보여주도록 하는 옵션이다 (case insensitive)

hist-grep

Cygwin 환경설정

Cygwin은 mintty라는 터미널 위에서 돌아가는데, 이 mintty 설정을 통해서 폰트 등을 변경할 수 있다.

https://fonts.google.com/download?family=Noto%20Sans%20Mono

에서 Noto Mono 계열 폰트를 받은 뒤 압축을 해제하면 NotoSansMono-VariableFont_wdth,wght 와 static 폴더가 있는데 VariableFont는 모든 폰트를 한 번에 설치하지만 용량이 그만큼 크다.

static에서는 필요한 폰트를 하나씩 설치하도록 되어 있다.

noto

Cygwin 우클릭 - Options...

cygwin-context-menu

Text 항목에서 Font를 Select...

cygwin-font-select

Font Size도 좀 더 크게 바꾸어 보았다.

cygwin-font-applied

https://fonts.google.com/specimen/Roboto+Mono

https://github.com/naver/d2codingfont/releases

https://github.com/be5invis/Sarasa-Gothic/releases

{/* Options - Text - Font: Noto Mono Font smoothing: default

.minttyrc FontChoice=CJK:5;Hangul:9 Font5=Sarasa Fixed K Font9=Sarasa Fixed K Emojis=noto CursorType=block CursorBlinks=no Font=Noto Mono Locale=C Charset=UTF-8 FontSmoothing=default FontHeight=12 Scrollbar=none Language=en_US BoldAsColour=no BoldAsFont=no Transparency=off OpaqueWhenFocused=yes Term=xterm-256color */}