j2doll
660
2018-04-03 20:40:10 작성 2018-05-16 13:02:30 수정됨
3
2805

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


피쉬 쉘 (Fish Shell) 자습서 한글 번역


원본: https://fishshell.com/docs/current/tutorial.html

번역https://j2doll.github.io/fish-shell-docs-kor/tutorial/

Ver 0.2.5 : 초기 번역(180405)

번역 문의는 댓글 또는 메일

 

왜 피쉬(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 - 쉘 변수를 처리한다.
 개요...



구문 강조 (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


해당 디렉토리 탐색에 오랜 시간이 걸리면 Control 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/  (Directory)




> 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 는 목록의 길이를 가져옵니다.


 > 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)으로 확장됩니다 (변수 확장 참조).

https://fishshell.com/docs/current/index.html#cartesian-product

 

> 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/



 [ 번역 후기 ] 

 피쉬를 써보니 일단 편합니다! 

 체감적으로 편하다는 것은 열번 정도 누를 키를 서너번만 눌러도 된다는 정도의 편함이라고 이해하시면 될 것 같습니다.

 시간날때 나머지 글도 번역 예정입니다. : 피쉬 설치법, 오 마이 피쉬 사용법 등

 그리고 okky 에서 강좌글을 처음 써보는데, 작성 인터페이스가 불편한 점이 많네요.

 markdown 지원이나 문서 업로드 같은 것이 지원되었으면 좋겠습니다.

 

3
1
  • 댓글 3

  • yukariko
    625
    2018-04-04 17:42:57

    오늘 처음 설치해서 사용해보는데 괜찮은 점이 많네요

    특히 구문강조와 자동완성이 마음에 듭니다.

    감사합니다.

    0
  • j2doll
    660
    2018-04-05 13:35:39
    0
  • yukariko
    625
    2018-04-05 16:12:51

    저도 oh my fish 설치해서 커스터마이징하여 사용하고 있습니다.

    다만 사용하면서 편한점이 많았지만 불편한점도 보이는군요

    예를들면 fish -c 명령으로 argument가 전달되지 않습니다.

    bash 쉘 같은 경우 bash -c "echo $1" 3

    하면 3이 출력되는데 fish론 안되네요. 제가 방법을 모르고 있는것 같습니다만..

    여튼 이런 부분이 필요할땐 지금은 그냥 fish 내에서 bash -c로 사용하고 있습니다.

    사족이지만 okky로고가 fish와 비슷하네요 ㅎㅎ

    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.