피쉬 쉘(Fish Shell) 한글화 문서 [비공식]

문서

자습서

디자인

명령

FAQ

라이센스

피쉬 쉘 (Fish Shell) 자습서 [입문, 강좌, 소개, 튜토리얼]

왜 피쉬(fish)인가?

[Fish:피쉬 또는 Fish Shell:피쉬 쉘 로 발음합니다. 원하실 경우 ‘물고기’로 불러도 됩니다]

  • 피쉬(fish)는 스마트하고 사용하기 쉬운 완벽히 준비된 명령행 쉘(Shell)입니다.
    • 잘 알려진 쉘에는 bash 또는 zsh 등이 있습니다.
  • 피쉬(fish)는 구문 강조, 자동 제안 및 탭 완성과 같은 강력한 기능을 지원하며, 사용하기 위하여 장시간 학습하거나 구성할 필요가 없습니다.
  • 복잡한 명령과 구성 옵션을 배우지 않고도, 명령줄(command line)을 보다 생산적으로 더 유용하고 재미있게 만들고 싶다면, 피쉬(fish)는 당신이 찾고 있는 것일 수도 있습니다.

피쉬 배우기 (Learning fish)

  • 이 자습서(튜토리얼)는 커맨드 라인 셸(Command Line Shell)과 유닉스 명령(Unix Command)에 대한 기본적인 지식을 당신이 가지고 있다고 가정합니다.
  • 다른 쉘(Shell)에 대해 잘 알고 있으며, 피쉬(fish)가 그들과 다르게 작동되는 것을 알고 싶다면, 타 쉘들과는 다른 마법의 구절을 찾으십시오. 이 쉘은 중요한 차이점을 호출하는데(call out) 사용됩니다.
  • 피쉬(fish)를 시작하면 다음과 같이 표시됩니다.
Welcome to fish, the friendly interactive shell
Type help for instructions on how to use fish
you@hostname ~>
  • 피쉬(fish)는 사용자 이름, 호스트 이름 및 작업 디렉토리를 보여주는 기본 프롬프트(default prompt)와 함께 제공됩니다. 또한 다음 경로에 프롬프트를 변경하는 방법을 기술하고 있습니다. https://fishshell.com/docs/current/tutorial.html#tut_prompt
  • 이제부터는 설명하는 공간을 절약하기 위해 프롬프트는 ‘>’ 인 것으로 가정하여 설명하겠습니다.

명령 실행 (Running Commands)

  • 피쉬(fish)는 다른 쉘과 같은 명령(command)을 실행합니다.
  • 명령을 입력하고 인수를 입력하면 됩니다. 백은 구분 기호입니다.
> echo hello world
hello world
  • 역 슬래시(\)가 있는 인수에 리터럴(literal) 공백을 포함하거나 작은 따옴표(‘) 나 큰 따옴표(“)를 사용할 수 있습니다.
> mkdir My\ Files
> cp ~/Some\ File 'My Files'
> ls "My Files"
Some File
  • 명령은 세미콜론(;)으로 연결될 수 있습니다.

도움 받기 (Getting Help)

  • 피쉬(fish)는 훌륭한 도움말과 맨(man) 페이지를 가지고 있습니다.
  • 웹 브라우저에서 help 을 실행하고 man 페이지에서 help 을 실행하십시오.
  • 특정 명령에 대한 도움을 요청할 수도 있습니다.
    • 예: 웹 브라우저에서 열기 위해서 help set, 터미널에서 보기 위해 man set 설정
> man set
set - handle shell variables
  Synopsis...

구문 강조 (Syntax Highlighting)

  • 입력하는 동안 피쉬(fish) 구문 강조를 수행한다는 것을 빨리 알 수 있습니다.
  • 잘못된 명령은 기본적으로 빨간색(Red)으로 표시됩니다.
> /bin/mkd
  • 명령이 존재하지 않거나 실행할 수 없는 파일을 참조하기 때문에 명령이 유효하지 않을 수 있습니다. 명령이 유효해지면 다른 색으로 표시됩니다.
> /bin/mkdir
  • 피쉬(fish)는 입력할 때 유효한 파일 경로에 밑줄을 긋습니다.
> cat ~/somefi
  • 이것은 ‘somefi’로 시작하는 파일이 있다는 것을 의미하며, 이는 입력할 때 유용한 피드백입니다.
  • 이러한 색상과 그 이상은 fish_config 를 실행하거나 변수를 직접 수정하여 변경할 수 있습니다.

와일드 카드 (Wildcards)

  • 피쉬(fish)는 익숙한 와일드 카드(*)를 지원합니다.
  • 모든 JPEG 파일(*.jpg)을 나열하려면 다음과 같이하십시오.
> ls *.jpg
 lena.jpg
 meena.jpg
 산타 마리아.jpg
  • 여러 개의 와일드 카드를 포함 할 수도 있습니다.
> ls l*.p*
 lena.png
 lesson.pdf
  • 특히 재귀적으로 디렉토리를 검색하는 재귀적 와일드 카드(**)가 강력합니다.
> ls /var/**.log
 /var/log/system.log
 /var/run/sntp.log
  • 해당 디렉토리 탐색에 오랜 시간이 걸리면 Ctrl + C 를 사용하여 중지할 수 있습니다.

파이프 및 방향 전환 (Pipes and Redirections)

  • 일반적인 세로 막대(|)를 사용하여 명령 사이를 파이프 할 수 있습니다.
> echo hello world | wc
       1       2      12
  • stdin 및 stdout는 익숙한 < 및 > 를 통해 리디렉션(redirection) 될 수 있습니다.
  • 다른 쉘과는 달리 stderr은 캐럿(^)으로 리디렉션됩니다.
> grep fish < /etc/shells > ~/output.txt ^ ~/errors.txt

자동 제안 (Auto-suggestions)

  • 피쉬(fish)는 사용자가 입력할 때 명령(command)을 제안하고, 커서 오른쪽에있는 제안을 회색으로 표시합니다.
> /bin/hostname
  • 피쉬는 경로 및 옵션에 대해 알고 있습니다.
> grep --ignore-case
  • 그리고 명령을 한 번 입력하면 기록(history)도 몇자를 입력하여 명령을 다시 불러올 수 있습니다.
> r<\@args{ync} \ ssh . myname@somelonghost.com:/some/long/path/doo/dee/doo/dee/doo}
  • 자동 제안을 수락하려면 → 또는 Control F 를 누르십시오.
  • 자동 제안의 한 단어를 수락하려면 Alt (오른쪽 화살표)를 누르십시오.
  • 자동 검색 기능이 원하는 기능이 아닌 경우에는 무시하십시오.

탭 완성 (Tab Completions)

  • 피쉬(fish)에는 탭(tab) 완성이 풍부하게 갖추어져 있으며, 이는 즉석에서 작동합니다.
  • Tab 키를 누르면 피쉬(fish)가 명령, 인수 또는 경로를 완료하려고 시도합니다.
> /pri @key{Tab} → /private/
  • 둘 이상의 가능성이 있는 경우 목록에 표시됩니다.
> ~/stuff/s @key{Tab}
~/stuff/script.sh  (Executable, 4.8kB)  ~/stuff/sources/</font>  (Directory)
  • Hit tab again to cycle through the possibilities.
  • fish can also complete many commands, like git branches:
> git merge pr @key{Tab} → git merge prompt_designer
> git checkout b @key{Tab}
builtin_list_io_merge (Branch) builtin_set_color (Branch) busted_events (Tag)
  • 탭을 치고 피쉬(fish)가 할 수 있는 것들을 보십시오!

변수 (Variables)

  • 다른 쉘과 마찬가지로 달러 기호는 변수 대체를 수행합니다.
> echo My home directory is $HOME
My home directory is /home/tutorial
  • 변수 대입은 큰 따옴표에서도 발생하지만 작은 따옴표에서는 발생하지 않습니다.
> echo "My current directory is $PWD"
My current directory is /home/tutorial
> echo 'My current directory is $PWD'
My current directory is $PWD
  • 다른 쉘과 달리 피쉬(fish)에는 변수 설정을 위한 전용 구문이 없습니다.
  • 대신 변수 이름과 그 값을 취하는 일반적인 명령 set 이 있습니다.
> set name 'Mister Noodle'
> echo $name
Mister Noodle
  • (따옴표를 주의 하십시오! : 그것들이 없으면 Mister와 Noodle은 별도의 인수가 되고 $name은 두 개의 요소 목록으로 만들어집니다.)
  • 다른 셸과 달리 변수는 대체 후에 더 이상 분리되지 않습니다.
> mkdir $name
> ls
Mister Noodle
  • bash에서는 두 개의 디렉토리 인 “Mister”와 “Noodle”을 만들었을 것입니다.
  • 피쉬(fish)에서는 단지 하나의 경로(Mister Noodle)를 만들었습니다.
  • 변수는 “Mister Noodle”이라는 값을 가졌으며, 그것은 mkdir 에 전달된 인수(argument)입니다.
  • 다른 셸에서는 목록이 아닌 “배열(array)”이라는 용어를 사용합니다.

종료 상태(Exit Status)

  • 다른 쉘과 달리 피쉬(fish)는 마지막 명령(last command)의 종료 상태를 $?. 대신 $status 에 저장합니다.
> false
> echo $status
1
  • 반환값이 0인 경우 성공(success)으로 간주되고, 0이 아닌 값은 실패(failure)입니다.

내보내기 (셸 변수)

  • 다른 쉘과 달리 피쉬(fish)에는 export 명령이 없습니다!
  • 대신 변수는 –export 또는 -x 중 하나를 set 하는 옵션을 통해 내보내집니다.
  • (set 명령어 활용을 권장합니다!)
> set -x MyVariable SomeValue
> env | grep MyVariable
MyVariablem=SomeValue
  • -e 또는—erase 를 사용하여 변수를 지울 수도 있습니다.
> set -e MyVariable
> env | grep MyVariable
(no output)

목록(List)

  • 위의 set 명령은 Mister Noodle 이 하나의 인수 Mister Noodle 인지 확인하기 위해 따옴표를 사용했습니다. 두 개의 인수가 있었다면 name 은 길이(length)가 2인 목록(list)이었을 것입니다.
  • 사실,피쉬(fish)의 모든 변수는 실제로 목록(list)이며, 값의 개수를 포함할 수도 있고, 전혀 포함하지 않을 수도 있습니다.
  • $PWD 와 같은 일부 변수에는 하나의 값만 있습니다. 규칙에 따라 변수의 값에 대해 이야기하지만 실제로는 첫 번째 값을 의미합니다.
  • $PATH 와 같은 다른 변수에는 실제로 여러 값이 있습니다. 변수 확장 중에는 변수가 확장되어 여러 인수가 됩니다. (경로들간에 콜론(:)이 없는 것을 주목하십시오!)
> echo $PATH
/usr/bin /bin /usr/sbin /sbin /usr/local/bin
  • 피쉬(fish)가 실행을 시작할 때 콜론(:)으로 분리된 세 개의 환경 변수인 PATH, CDPATH, MANPATH 가 있습니다.
  • 이는 반대로 하위 명령으로 내보낼 때 콜론에 조인됩니다.
  • 유사한 의미를 갖는 다른 모든 환경 변수(예: LD_LIBRARY_PATH)는 단순한 문자열로 취급됩니다.
  • 목록(list)에는 다른 목록을 포함할 수 없습니다. 목록은 재귀가 없습니다!
  • 변수는 문자열(string)의 목록(list)이며, 전체 정지입니다.
> count $PATH
5
  • 추가 인수를 사용하여 목록 자체를 설정하여 목록에 추가하거나 추가 할 수 있습니다.
  • 다음은 /usr/local/bin을 $PATH에 추가하는 예제입니다.
> set PATH $PATH /usr/local/bin
  • 대괄호([])로 개별 요소에 접근 할 수도 있습니다.
  • 인덱싱(indexing)은 처음부터 1에서 시작하고, 끝에서 부터는 -1에서 시작합니다.
 > echo $PATH
/usr/bin /bin /usr/sbin /sbin /usr/local/bin
> echo $PATH[1]
/usr/bin
> echo $PATH[-1]
/usr/local/bin
  • 그리고 “조각(slice:)” 이라고 하는 요소 범위에도 접근할 수도 있습니다.
> echo $PATH[1..2]
/usr/bin /bin
> echo $PATH[-1..2]
/usr/local/bin /sbin /usr/sbin /bin
  • 물론 for 루프(loop)를 사용하여 목록(또는 슬라이스)을 반복 할 수 있습니다.
> for val in $PATH
    echo "entry: $val"
  end
entry: /usr/bin/
entry: /bin
entry: /usr/sbin
entry: /sbin
entry: /usr/local/bin
  • 다른 목록이나 문자열에 인접한 목록은 따옴표가 붙지 않는 한 곱집합(cartesian products)으로 확장됩니다 (변수 확장 참조)
> set -l a 1 2 3
> set -l 1 a b c
> echo $a$1
1a 2a 3a 1b 2b 3b 1c 2c 3c
> echo $a" banana"
1 banana 2 banana 3 banana
> echo "$a banana"
1 2 3 banana
  • 이는 괄호 확장(Brace Expansion)과 유사합니다. https://fishshell.com/docs/current/index.html#expand-brace

명령 확장(Variable expansion)

  • 명령 확장은 한 명령의 출력을 다른 명령의 인수로 사용합니다.
  • 다른 쉘과는 달리, 피쉬(fish)는 명령 확장을 위해 백틱(`)을 사용하지 않습니다!
  • 대신 괄호()를 사용합니다.
> echo In (pwd), running (uname)
In /home/tutorial, running FreeBSD
  • 명령 변수의 출력을 캡처하는 것은 일반적인 관용입니다.
> set os (uname)
> echo $os
Linux
  • 명령 확장은 따옴표 안에 확장되지 않습니다.
  • 대신, 동일한 인수에서 따옴표를 임시로 닫고 명령 대체를 추가한 다음 다시 열 수 있습니다.
> touch "testing_"(date +%s)".txt"
> ls *.txt
testing_1360099791.txt
  • 다른 쉘과는 달리, 피쉬는 공백이나 공백 같은 명령 공백을 없애지 않습니다!
  • 이것은 pkg-config 와 같은 명령으로 한 줄에 여러 개의 인수를 의미하는 내용을 인쇄할 때 문제가 될 수 있습니다.
  • 공백으로 분할하려면 string split 을 사용하십시오.
> printf '%s\n' (pkg-config --libs gio-2.0)
-lgio-2.0 -lgobject-2.0 -lglib-2.0
> printf '%s\n' (pkg-config --libs gio-2.0 | string split " ")
-lgio-2.0
-lgobject-2.0
-lglib-2.0

명령 분리 (세미콜론)

  • 다른 쉘과 마찬가지로 피쉬(fish)는 별도의 줄 또는 동일한 줄에서 여러 명령을 허용합니다.
  • 같은 줄에 쓰려면 세미콜론(;)을 사용하십시오.
  • 이는 다음 두 예제가 동일함을 의미합니다
echo fish; echo chips
\# or
echo fish
echo chips

결합자 (And, Or, Not)

  • 다른 쉘과 달리 피쉬(fish)에는 && 또는 || 와 같은 특수 구문이 없습니다!
  • 대신에 and, or, not 명령을 가지고 있습니다.
> cp file1.txt file1_bak.txt; and echo "Backup successful"; or echo "Backup failed"
Backup failed
  • 세미콜론 장절에서 언급했듯이 다음과 같이 여러 줄로 작성할 수도 있습니다.
cp file1.txt file1_bak.txt
and echo "Backup successful"
or echo "Backup failed"

조건문 (If, Else, Switch)

  • If, else if 및 else 를 사용하여 명령(command)의 종료 상태에 따라 조건부로 코드를 실행 가능합니다.
if grep fish /etc/shells
    echo Found fish
else if grep bash /etc/shells
    echo Found bash
else
    echo Got nothing
end
  • 복합자(Combiners)는 또한 다음과 같이 더 복잡한 조건을 만드는 데 사용될 수 있습니다.
if grep fish /etc/shells; and command -sq fish
    echo fish is installed and configured
end
  • 더욱 복잡한 조건의 경우 begin 과 end 를 사용하여 그룹화하십시오.
    • switch 명령도 있습니다.
switch (uname)
case Linux
    echo Hi Tux!
case Darwin
    echo Hi Hexley!
case FreeBSD NetBSD DragonFly
    echo Hi Beastie!
case '*'
    echo Hi, stranger!
end
  • case 는 (다음 case 구문으로는) 작동되지 않으며(does not fall through), 여러 개의 인수 또는 와일드 카드(*)를 사용할 수 있습니다.
  • (예제에서 Linux Fish 인 경우, Hi Tux! 만 출력되며, MSYS Fish 인 경우 Hi, Stranger 가 출력됩니다.)

함수 (Function)

  • 피쉬 함수(function)는 선택적으로 인자(argument)를 취할 수 있는 명령 목록(list of commands)입니다.
  • 다른 쉘과 달리 인수는 $1 과 같은 '번호가 매겨진 변수'로 전달되지 않고, 단일 목록 $argv 됩니다!
  • 함수를 만들려면 내장 함수를 사용하십시오.
> function say_hello
          echo Hello $argv
  end
> say_hello
Hello
> say_hello everybody!
Hello everybody!
  • 다른 쉘과 달리 피쉬(fish)에는 별칭(alias)이나 특별한 프롬프트 구문(prompt syntax)이 없습니다. 함수가 그들의 자리를 잡습니다.
  • functions 키워드를 사용하여 모든 함수의 이름을 나열할 수 있습니다. (복수형(~s)임을 주의!).
  • 피쉬(fish)는 많은 함수를 제공합니다.
> functions
alias, cd, delete-or-exit, dirh, dirs, down-or-search, eval, export, fish_command_not_found_setup, fish_config, fish_default_key_bindings, fish_prompt, fish_right_prompt, fish_sigtrap_handler, fish_update_completions, funced, funcsave, grep, help, history, isatty, ls, man, math, nextd, nextd-or-forward-word, open, popd, prevd, prevd-or-backward-word, prompt_pwd, psub, pushd, seq, setenv, trap, type, umask, up-or-search, vared
  • 함수 이름을 functions 에 전달하면 모든 함수의 소스(source)를 볼 수 있습니다.
> functions ls
function ls --description 'List contents of directory'
    command ls -G $argv
end

루프 (Loop)

  • while 무한 루프 :
> while true
    echo "Loop forever"
end
Loop forever
Loop forever
Loop forever
...
  • For 루프는 목록을 반복하는 데 사용할 수 있습니다.
  • 예를 들어, 파일 목록 :
> for file in *.txt
    cp $file $file.bak
end
  • 명령 seq 을 사용하여 숫자 목록을 반복 할 수 있습니다.
> for x in (seq 5)
    touch file_$x.txt
end

프롬프트 (Prompt)

  • 피쉬는 다른 셸과 달리 프롬프트 변수는 없습니다! (PS1 처럼)
  • 프롬프트를 표시하기 위해 피쉬(fish)는 fish_prompt 라는 이름의 함수를 실행하고, 출력은 프롬프트로 사용됩니다.
  • 다음과 같은 나만의 프롬프트도 정의할 수 있습니다.
> function fish_prompt
    echo "New Prompt % "
end
New Prompt %
  • 여러 줄은 괜찮습니다.
  • set_color 를 통해 색상을 설정하고 ANSI 색상 또는 16 진수 RGB 값을 전달할 수도 있습니다.
> function fish_prompt
      set_color purple
      date "+%m/%d/%y"
      set_color FF0
      echo (pwd) '>'
      set_color normal
  end
02/06/13
/home/tutorial >
  • fish_config prompt 를 실행하여 몇 가지 샘플 프롬프트 중에서 선택할 수도 있습니다.
  • 피쉬(fish)는 또한 fish_right_prompt 를 통해 RPROMPT(오른쪽 정렬 프롬프트)를 지원합니다.

$PATH (경로 변수)

  • $PATH는 피쉬(fish)가 명령을 검색하는 디렉토리를 포함하는 환경 변수입니다. 다른 쉘과 달리 $PATH는 콜론으로 구분된 문자열이 아닌 목록(list)입니다.
  • /usr/local/bin 과 /usr/sbin 을 $PATH 앞에 추가하려면 다음과 같이 작성할 수 있습니다.
> set PATH /usr/local/bin /usr/sbin $PATH
  • $PATH 에서 /usr/local/bin 을 제거하려면 다음과 같이 작성할 수 있습니다.
> set PATH (string match -v /usr/local/bin $PATH)
  • .profile 파일을 가진 다른 쉘 에서처럼 피쉬는 config.fish 파일에서 직접 작업을 할 수 있습니다. (예제 참조)
  • 더 빠른 방법은 $fish_user_paths universal 변수 를 수정하는 $fish_user_paths 을 사용하여 자동으로 $PATH 앞에 추가하는 것입니다. 예를 들어 $PATH 에 /usr/local/bin 을 영구적으로 추가하려면 다음과 같이 작성할 수 있습니다.
> set -U fish_user_paths /usr/local/bin $fish_user_paths
  • 이러한 방법의 잇점은 파일에서 수정할 필요가 없다는 것입니다.
  • 명령줄에서 이 명령을 한 번 실행하면 현재 세션과 이후의 모든 인스턴스에도 영향을 미칩니다.
  • (주의: config.fish 에 이 줄을 추가하면 안됩니다. 그렇게 하면 피쉬를 실행할 때마다 환경 변수가 계속 더 길어집니다!)

초기화 (.bashrc는 어디 갔나요?)

  • 피쉬(fish) 는 ~/.config/fish/config.fish 파일에서 명령을 실행하여 시작합니다.
  • 만약 파일이 존재하지 않으면 신규로 생성할 수 있습니다.
  • 위에 표시된 명령을 사용하여 config.fish 파일에 함수 및 변수를 직접 작성할 수 있습니다.
> cat ~/.config/fish/config.fish

set -x PATH $PATH /sbin/

function ll
    ls -lh $argv
end

함수 자동 로딩 (Autoloading Functions)

  • 피쉬(fish) 가 명령을 만났을 때 ~/.config/fish/functions/ 파일에 있는 명령의 이름을 가진 파일을 찾아 해당 명령에 대한 함수를 자동으로 로드하려고 시도합니다.
  • 예를 들어, 함수 ll 을 만들고 싶다면(물론 ll이 없는 경우에 활용하는 방법입니다), ll 함수를 ~/.config/fish/functions 파일에 추가하면 됩니다.
> cat ~/.config/fish/functions/ll.fish
function ll
    ls -lh $argv
end
  • 이것은 프롬프트를 정의하는 기본 방법입니다.
> cat ~/.config/fish/functions/fish_prompt.fish
function fish_prompt
    echo (pwd) "> "
end
  • 이러한 파일을 자동으로 만드는 방법은 funced 및 funcsave 설명서를 참조하십시오.

범용 변수 (Universal Variables)

> set -U EDITOR vim
  • 이제 다른 쉘에서 다음 명령을 실행하여 보십시오.
> echo $EDITOR
vim

피쉬를 사용하실 준비되셨습니까?!

  • 피쉬에 대해 더 자세히 알고 싶다면 상세한 문서, 공식 메일링 리스트, IRC 채널 #fish (irc.oftc.net) 및 github 페이지가 있습니다. https://github.com/fish-shell/fish-shell/

번역 후기

  • 피쉬를 써보니 일단 편합니다!
  • 체감적으로 편하다는 것은 열번 정도 누를 키를 서너번만 눌러도 된다는 정도의 편함이라고 이해하시면 될 것 같습니다.
  • 시간날때 나머지 글도 번역 예정입니다

미러링된 글

라이센스 주의

  • 피쉬 쉘의 소스코드 및 자료는 모두 GPL 라이센스 2 입니다. 쉽게 이야기 해서 해당 코드 및 자료를 사용하면 공개하셔야 합니다.