맨위로가기

피시 (유닉스 셸)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

Fish는 POSIX 호환 셸과 유사하지만 독창적인 문법과 기능을 가진 유닉스 셸이다. 변수 할당에는 `set` 명령어를 사용하며, 모든 변수를 배열로 취급한다. 명령 대체는 `()`를 사용하며, 파이프라인, 함수, 루프 등에서 서브셸을 사용하지 않아 예기치 않은 동작을 방지한다. 유니버설 변수를 통해 모든 셸에서 변수를 영구적으로 사용할 수 있다. 자동 완성, 오류 검사, 웹 기반 구성, 클립보드 지원 등 사용자 친화적인 기능을 제공하며, Bash와 비교하여 차별화된 문법을 가진다.

더 읽어볼만한 페이지

  • 유닉스 셸 - 유닉스 계열
    유닉스 계열은 유닉스 운영체제의 특징과 설계를 공유하는 운영체제들을 지칭하며, 유전적, 상표, 기능적 유닉스로 분류되고 macOS는 상표 유닉스이자 유전적 유닉스에 해당하며 리눅스는 기능적 유닉스의 대표적인 예이다.
  • 유닉스 셸 - 본 셸
    본 셸은 스티븐 본이 개발하여 1979년 유닉스에 포함된 셸로, 셸 스크립트, 제어 흐름, 변수, 시그널 처리 등의 기능을 제공하며 여러 셸에 영향을 주었고 현재도 널리 사용된다.
  • 스크립트 언어 - Tcl
    Tcl은 존 오스터하우트가 개발한 명령어 기반의 프로그래밍 언어로, Tk 툴킷과 결합하여 GUI 스크립팅 환경으로 발전했으며, 다양한 운영체제에서 사용 가능하고 C, C++, Java 등 다른 언어와의 인터페이스를 지원한다.
  • 스크립트 언어 - PHP
    PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다.
  • C로 작성된 자유 소프트웨어 - PostgreSQL
    PostgreSQL은 캘리포니아 대학교 버클리 분교의 Ingres 프로젝트에서 시작되어 전 세계 개발자들의 협력을 통해 발전해온 객체 관계형 데이터베이스 관리 시스템(ORDBMS)이다.
  • C로 작성된 자유 소프트웨어 - 김프
    김프(GIMP)는 GNU 프로젝트에서 개발된 크로스 플랫폼 기반의 무료 오픈소스 래스터 그래픽 편집기로, 다양한 운영체제를 지원하며 풍부한 기능을 제공하지만 사용자 인터페이스에 대한 비판과 일부 기능의 부족함에 대한 평가도 존재한다.
피시 (유닉스 셸) - [IT 관련 정보]에 관한 문서
기본 정보
Fish 로고
Fish 로고
유형유닉스 셸
라이선스GPL-2.0-only
웹사이트Fish 공식 웹사이트
개발
개발자Fish-shell 개발팀
작성자Axel Liljencrantz
프로그래밍 언어Rust
운영 체제유닉스 계열
첫 번째 릴리스2005년 2월 13일
최신 릴리스 날짜|df=yes}}

2. 문법

피시(Fish)의 구문은 POSIX 호환 셸(예: Bash)과 유사하지만 여러 면에서 차이가 있다.[8]

== 변수 할당 및 사용 ==

Fish에서는 `set` 명령어를 사용하여 변수를 할당한다. `=` 연산자는 사용하지 않으며, 공백으로 변수명과 값을 구분한다. 예를 들어, `foo` 변수에 `bar` 값을 할당하려면 `set foo bar`와 같이 작성한다.

변수를 사용할 때는 `$` 기호를 변수명 앞에 붙인다. 예를 들어, `foo` 변수의 값을 출력하려면 `echo $foo`와 같이 작성한다.

명령의 출력을 변수에 할당할 수도 있다. 예를 들어, `pwd` 명령어의 출력을 `wd` 변수에 할당하려면 `set wd (pwd)` 또는 `set wd $(pwd)` (3.4 버전 이후)와 같이 작성한다.

Fish는 모든 변수를 배열로 취급한다. 예를들어,`set A 3 5 7 9 12`는 `A`라는 배열 변수에 5개의 값을 할당한다. 배열의 특정 요소에 접근하거나 슬라이싱할 수 있다. 예를 들어 `echo $A[1 2]`는 A배열의 첫번째 두번째 값을 출력한다. `set --erase A[$B]`와 같이 특정 배열 요소를 지울수도 있다.

fish의 문법은 다른 셸 스크립트 언어와 조금 다르다. 배시에 대표되는 다른 셸 스크립트 언어와의 명확한 차이점은, 변수는 토큰을 필요로 하지 않는다는 것이다. 즉, 따옴표를 사용하여 문자열을 묶는다는 것을 거의 하지 않는다.

다른 언어에서는 파이프라인, 함수, 루프와 같은 많은 작업들을 서브 셸을 호출하여 구현한다. 그러나 Fish에서는 서브 셸을 절대 호출하지 않으므로, 변수 할당 및 여러 내장 함수가 예상대로 작동하게 된다.

== 명령 대체 ==

다른 셸에서 백틱 (``)이나 `$()`를 사용하는 명령 대체는 Fish에서 `()`를 사용하여 수행된다. 이를 통해 중첩된 명령 대체가 더 가독성이 좋아진다.

```fish

# 명령 할당: 변수 wd에 pwd 명령의 출력을 할당한다.

# 여기서 ``를 사용해서는 안 된다. 이것은 중첩이 불가능할 뿐만 아니라, ''와 매우 혼동되기 때문이다.

# 그리고 $()도 사용해서는 안 된다. fish에서는 $는 변수를 전개할 때만 사용된다.

> set wd (pwd)

> echo $wd

~

```

== 파이프라인과 서브셸 ==

Fish는 파이프라인, 함수, 루프 등에서 서브셸을 사용하지 않는다. 이는 변수 할당과 같은 작업이 메인 셸에서 직접 수행됨을 의미하며, 다른 셸에서 발생할 수 있는 예기치 않은 동작을 방지한다.

다른 많은 셸에서는 `read` 내장 명령어가 자체 서브셸에서 실행되기 때문에 파이프라인의 오른쪽에 부작용이 있을 수 없다. 예를 들어, Bash에서는 이러한 동작이 제한되지만, ksh에서는 파이프의 왼쪽에 부작용이 있을 수 없다. 하지만 Fish와 zsh에서는 양쪽 모두 부작용이 있을 수 있다.

```fish

# 이 작업은 다른 많은 셸에서는 작동하지 않습니다. 'read' 내장 명령어가 자체 서브셸에서 실행되기 때문입니다.

# Bash에서는 파이프의 오른쪽에 부작용이 있을 수 없습니다.

# ksh에서는 아래 명령이 작동하지만 왼쪽에 부작용이 있을 수 없습니다.

# fish와 zsh에서는 양쪽에 모두 부작용이 있을 수 있습니다.

> cat *.txt | read line

```

Fish는 언어 기능에 대해 서브셸을 생성하지 않으며, 모든 셸 내장 명령어는 상위 셸 내에서 발생한다.

== 유니버설 변수 ==

피시는 유니버설 변수라는 기능을 제공하는데, 사용자는 이를 통해 모든 실행 중인 피시 셸에서 변수에 값을 영구적으로 할당할 수 있다. 유니버설 변수 값은 로그아웃 및 재부팅 후에도 유지되며, 모든 실행 중인 셸에 즉시 반영된다.

```fish

# emacs를 기본 텍스트 편집기로 설정한다. '--universal'(또는 '-U') 옵션은 피시에게

# 이것을 유니버설 변수로 만들라고 지시한다.

> set --universal EDITOR emacs

# 이 명령은 현재 작업 디렉토리를 모든 실행 중인 피시 인스턴스에서 파란색으로 표시되도록 한다.

> set --universal fish_color_cwd blue

```

`set -U` 명령어를 사용하여 유니버설 변수를 설정할 수 있다.

```fish

# 기본 텍스트 편집기를 emacs로 설정한다.

# -U 옵션을 통해 유니버설 변수로 취급한다.

> set -U EDITOR emacs

# 이 명령어는 모든 fish 셸에 대해 프롬프트를 파란색으로 설정한다.

> set -U fish_color_cwd blue

```

2. 1. 변수 할당 및 사용

Fish에서는 `set` 명령어를 사용하여 변수를 할당한다. `=` 연산자는 사용하지 않으며, 공백으로 변수명과 값을 구분한다. 예를 들어, `foo` 변수에 `bar` 값을 할당하려면 `set foo bar`와 같이 작성한다.

변수를 사용할 때는 `$` 기호를 변수명 앞에 붙인다. 예를 들어, `foo` 변수의 값을 출력하려면 `echo $foo`와 같이 작성한다.

명령의 출력을 변수에 할당할 수도 있다. 예를 들어, `pwd` 명령어의 출력을 `wd` 변수에 할당하려면 `set wd (pwd)` 또는 `set wd $(pwd)` (3.4 버전 이후)와 같이 작성한다.

Fish는 모든 변수를 배열로 취급한다. 예를들어,`set A 3 5 7 9 12`는 `A`라는 배열 변수에 5개의 값을 할당한다. 배열의 특정 요소에 접근하거나 슬라이싱할 수 있다. 예를 들어 `echo $A[1 2]`는 A배열의 첫번째 두번째 값을 출력한다. `set --erase A[$B]`와 같이 특정 배열 요소를 지울수도 있다.

fish의 문법은 다른 셸 스크립트 언어와 조금 다르다. 배시에 대표되는 다른 셸 스크립트 언어와의 명확한 차이점은, 변수는 토큰을 필요로 하지 않는다는 것이다. 즉, 따옴표를 사용하여 문자열을 묶는다는 것을 거의 하지 않는다.

다른 언어에서는 파이프라인, 함수, 루프와 같은 많은 작업들을 서브 셸을 호출하여 구현한다. 그러나 Fish에서는 서브 셸을 절대 호출하지 않으므로, 변수 할당 및 여러 내장 함수가 예상대로 작동하게 된다.

2. 2. 명령 대체

다른 셸에서 백틱 (``)이나 `$()`를 사용하는 명령 대체는 Fish에서 `()`를 사용하여 수행된다. 이를 통해 중첩된 명령 대체가 더 가독성이 좋아진다.

```fish

# 명령 할당: 변수 wd에 pwd 명령의 출력을 할당한다.

# 여기서 ``를 사용해서는 안 된다. 이것은 중첩이 불가능할 뿐만 아니라, ''와 매우 혼동되기 때문이다.

# 그리고 $()도 사용해서는 안 된다. fish에서는 $는 변수를 전개할 때만 사용된다.

> set wd (pwd)

> echo $wd

~

2. 3. 파이프라인과 서브셸

Fish는 파이프라인, 함수, 루프 등에서 서브셸을 사용하지 않는다. 이는 변수 할당과 같은 작업이 메인 셸에서 직접 수행됨을 의미하며, 다른 셸에서 발생할 수 있는 예기치 않은 동작을 방지한다.

다른 많은 셸에서는 `read` 내장 명령어가 자체 서브셸에서 실행되기 때문에 파이프라인의 오른쪽에 부작용이 있을 수 없다. 예를 들어, Bash에서는 이러한 동작이 제한되지만, ksh에서는 파이프의 왼쪽에 부작용이 있을 수 없다. 하지만 Fish와 zsh에서는 양쪽 모두 부작용이 있을 수 있다.

```fish

# 이 작업은 다른 많은 셸에서는 작동하지 않습니다. 'read' 내장 명령어가 자체 서브셸에서 실행되기 때문입니다.

# Bash에서는 파이프의 오른쪽에 부작용이 있을 수 없습니다.

# ksh에서는 아래 명령이 작동하지만 왼쪽에 부작용이 있을 수 없습니다.

# fish와 zsh에서는 양쪽에 모두 부작용이 있을 수 있습니다.

> cat *.txt | read line

```

Fish는 언어 기능에 대해 서브셸을 생성하지 않으며, 모든 셸 내장 명령어는 상위 셸 내에서 발생한다.

2. 4. 유니버설 변수

피시는 유니버설 변수라는 기능을 제공하는데, 사용자는 이를 통해 모든 실행 중인 피시 셸에서 변수에 값을 영구적으로 할당할 수 있다. 유니버설 변수 값은 로그아웃 및 재부팅 후에도 유지되며, 모든 실행 중인 셸에 즉시 반영된다.

```fish

# emacs를 기본 텍스트 편집기로 설정한다. '--universal'(또는 '-U') 옵션은 피시에게

# 이것을 유니버설 변수로 만들라고 지시한다.

> set --universal EDITOR emacs

# 이 명령은 현재 작업 디렉토리를 모든 실행 중인 피시 인스턴스에서 파란색으로 표시되도록 한다.

> set --universal fish_color_cwd blue

```

`set -U` 명령어를 사용하여 유니버설 변수를 설정할 수 있다.

```fish

# 기본 텍스트 편집기를 emacs로 설정한다.

# -U 옵션을 통해 유니버설 변수로 취급한다.

> set -U EDITOR emacs

# 이 명령어는 모든 fish 셸에 대해 프롬프트를 파란색으로 설정한다.

> set -U fish_color_cwd blue

3. 주요 기능

피시는 사용자가 입력할 때 명령 기록과 현재 디렉토리를 기반으로 점진적 제안을 표시한다. 이는 Bash의 기록 검색과 유사하게 작동하지만 항상 켜져 있어 사용자가 명령을 입력하는 동안 지속적인 피드백을 제공한다. 피시는 또한 파일 경로( 와일드카드 및 중괄호 확장 포함), 환경 변수 및 명령별 자동 완성을 지원하는 기능이 풍부한 탭 자동 완성을 포함한다. 옵션과 설명을 포함한 명령별 자동 완성은 어느 정도 명령의 man 페이지에서 생성될 수 있지만, 사용자 정의 자동 완성은 소프트웨어와 함께 포함되거나 셸 사용자가 작성할 수도 있다.[6]

피시의 제작자는 구문보다는 명령으로 새로운 기능을 추가하는 것을 선호했다. 이를 통해 내장 기능은 옵션 및 도움말 텍스트가 있는 명령을 검색할 수 있으므로 기능을 더 쉽게 발견할 수 있었다. 함수는 사람이 읽을 수 있는 설명을 포함할 수도 있다. 특수 ''help'' 명령은 사용자의 웹 브라우저에서 모든 피시 설명서에 액세스할 수 있도록 한다.[7]


  • 고급 탭 완성 (사용자 지정 완성을 지원).
  • 광범위한 오류 검사를 통한 구문 강조.
  • X 클립보드 지원.
  • 터미널을 terminfo 기반으로 스마트하게 처리.
  • 검색 가능한 명령어 기록.
  • 웹 기반 구성.
  • 확장된 탭 자동 완성
  • 확장된 오류 검사 및 구문 강조
  • X 윈도 시스템 클립보드 지원
  • terminfo 기반의 터미널 처리
  • 검색 가능한 명령 기록

3. 1. 사용자 친화적 기능

Fish는 사용자 친화적인 오류 메시지를 제공하여, 무엇이 잘못되었는지, 어떻게 수정해야 하는지를 명확하게 알려준다. 예를 들어, `foo=bar`와 같이 명령어가 잘못된 경우, "set 변수 값"을 사용해야 함을 안내하고, `help set` 명령어를 통해 도움말을 참조하도록 유도한다. 또한, 변수 사용 시 `$` 기호의 사용법이나 명령어 대체 시 `$(명령)` 형식의 문제점을 지적하고, `help expand-variable` 및 `help expand-command-substitution` 명령어를 통해 관련 정보를 얻을 수 있도록 안내한다.

`help` 명령어를 입력하면 웹 브라우저에서 Fish의 전체 문서를 확인할 수 있는 기능도 제공한다.

3. 2. 기타 기능

X 윈도 시스템 클립보드를 지원한다.terminfo 기반의 스마트한 터미널 처리를 제공한다.검색 가능한 명령어 기록을 제공한다.

4. Bash와의 비교

글로브 해석 포함POSIX 호환 셸 언어에서 버그의 주요 원인으로 확인됨변수 확장:
스칼라모든 변수는 배열임변수 확장:
배열"${var[@]}"$var단어 분할 및 글로브 해석을 억제하기 위해 따옴표를 사용할 필요가 없음. 대신 따옴표는 직렬화를 의미함.변수 확장:
공백으로 구분된 문자열로"${var[*]}""$var"텍스트 편집기에서 줄 편집,호출 시 줄 입력을 텍스트 편집기로 이동줄 입력 평가[9]라인 편집기에서 식을 즉시 평가히스토리 완성히스토리 대체발견할 수 없음명시적 하위 셸fish -c expression명령 대체"$(expression)" 또는 (expression | string collect) |프로세스 대체(expression | psub) | 구문이 아닌 명령논리 연산자cmd && echo FAILecho OK변수 할당var=value |문자열 처리:
교체"${HOME/alice/bob}"string replace alice bob $HOME문자열 처리:
접두사 또는 접미사 패턴 제거, 탐욕적이지 않게 또는 탐욕적으로class="nowrap"|변수 내보내기set --export var | 탭 완성을 통해 발견 가능한 옵션함수-로컬 변수스코프-로컬 변수 | set --local var변수 제거set --erase var변수가 존재하는지 확인set --query var배열 초기화var=( a b c ) |모든 변수는 배열임배열 반복|인수 벡터:
모든 인수$argv인수 벡터:
인덱싱$argv[1]인수 벡터:
길이(count $argv)인수 벡터:
이동환경 변수의 배열 표현PATH="$PATH:$HOME/.local/bin"set PATH $PATH $HOME/.local/binfish는 환경으로의 변수를 변환하고 환경에서 변수를 변환하기 위해 콜론을 배열 구분 기호로 간주함. 이는 $PATH 및 $LS_COLORS와 같은 많은 배열과 같은 환경 변수와 일치함.내보내기 및 실행env LANG=C.UTF-8 python3 | env LANG=C.UTF-8 python3는 env가 독립 실행형 프로그램이므로 모든 셸에서 작동함.산술 연산$((10/3))expr 10 / 3는 expr이 독립 실행형 프로그램이므로 모든 셸에서 작동함.이스케이프 시퀀스$\eprintf \e는 두 셸 모두에서 작동함. printf 내장 함수는 모두 GNU printf 독립 실행형 프로그램과 호환됨.[10]작은 따옴표로 묶인 문자열:
이스케이프 시퀀스


4. 1. Bash/Fish 번역 표

단어 분할 및 글로브 해석 포함posix 호환 셸 언어에서 버그의 주요 원인으로 확인됨변수 확장:
스칼라모든 변수는 배열입니다변수 확장:
배열"${var[@]}"$var단어 분할 및 글로브 해석을 억제하기 위해 따옴표를 사용할 필요가 없습니다. 대신 따옴표는 직렬화를 의미합니다.변수 확장:
공백으로 구분된 문자열로"${var[*]}""$var"텍스트 편집기에서 줄 편집,호출 시 줄 입력을 텍스트 편집기로 이동줄 입력 평가[9]라인 편집기에서 식을 즉시 평가히스토리 완성히스토리 대체발견할 수 없음명시적 하위 셸fish -c expression명령 대체"$(expression)" 또는 (expression | string collect) |프로세스 대체(expression | psub)구문이 아닌 명령논리 연산자cmd && echo FAILecho OK변수 할당문자열 처리:
교체"${HOME/alice/bob}"string replace alice bob $HOME문자열 처리:
접두사 또는 접미사 패턴 제거, 탐욕적이지 않게 또는 탐욕적으로변수 내보내기set --export var탭 완성을 통해 발견 가능한 옵션함수-로컬 변수스코프-로컬 변수 | set --local var변수 제거set --erase var변수가 존재하는지 확인set --query var배열 초기화모든 변수는 배열입니다배열 반복인수 벡터:
모든 인수$argv인수 벡터:
인덱싱$argv[1]인수 벡터:
길이(count $argv)인수 벡터:
이동shift
>환경 변수의 배열 표현PATH="$PATH:$HOME/.local/bin"set PATH $PATH $HOME/.local/binfish는 환경으로의 변수를 변환하고 환경에서 변수를 변환하기 위해 콜론을 배열 구분 기호로 간주합니다. 이는 $PATH 및 $LS_COLORS와 같은 많은 배열과 같은 환경 변수와 일치합니다.내보내기 및 실행env LANG=C.UTF-8 python3 | env LANG=C.UTF-8 python3는 env가 독립 실행형 프로그램이므로 모든 셸에서 작동합니다.산술 연산$((10/3))expr 10 / 3는 expr이 독립 실행형 프로그램이므로 모든 셸에서 작동합니다.이스케이프 시퀀스$\eprintf \e는 두 셸 모두에서 작동합니다. printf 내장 함수는 모두 GNU printf 독립 실행형 프로그램과 호환됩니다.[10]작은 따옴표로 묶인 문자열:
이스케이프 시퀀스


5. 한국 사용자들을 위한 추가 정보

5. 1. 더불어민주당과 관련된 인물 및 사건

5. 2. 한국의 IT 환경

5. 3. 한글 지원

6. 결론

참조

[1] 웹사이트 fish shell team members https://github.com/f[...] GitHub.com 2021-07-28
[2] 웹사이트 fish-shell 4.0b1, now in Rust https://fishshell.co[...] 2024-12-18
[3] 웹사이트 License for fish http://fishshell.com[...]
[4] 웹사이트 Fish - A user-friendly shell https://lwn.net/Arti[...] Linux Weekly News 2005-05-17
[5] 웹사이트 Fish docs: design https://fishshell.co[...] 2021-04-09
[6] 웹사이트 Writing your own completions https://fishshell.co[...]
[7] 뉴스 CLI Magic: Enhancing the shell with fish https://www.linux.co[...] Linux.com 2010-03-24
[8] 웹사이트 An in-depth look at fish: the friendly interactive shell https://arstechnica.[...] 2005-12-19
[9] 웹사이트 RFC: Add binding to expand/evaluate tokens on commandline https://github.com/f[...] 2013-05-16
[10] 웹사이트 printf does not support \e https://github.com/f[...] 2013-07-11
[11] 웹사이트 License for fish http://fishshell.com[...]
[12] 웹인용 fish shell team members https://github.com/f[...] GitHub.com 2021-07-28
[13] 웹사이트 License for fish http://fishshell.com[...]
[14] 웹인용 Fish - A user-friendly shell https://lwn.net/Arti[...] Linux Weekly News 2005-05-17
[15] 웹인용 Fish docs: design https://fishshell.co[...] 2021-04-09



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com