피시 (유닉스 셸)
"오늘의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 관련 정보]에 관한 문서 | |
|---|---|
| 기본 정보 | |
![]() | |
| 유형 | 유닉스 셸 |
| 라이선스 | 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와의 비교
글로브 해석 포함
스칼라
배열
공백으로 구분된 문자열로
"$(expression)" 또는 (expression | string collect) |교체
접두사 또는 접미사 패턴 제거, 탐욕적이지 않게 또는 탐욕적으로
모든 인수
인덱싱
길이
이동
printf 내장 함수는 모두 GNU printf 독립 실행형 프로그램과 호환됨.[10]이스케이프 시퀀스
