SH(1)

명칭
sh - 명령 인터프리터 (쉘)

서식
sh [-/+abCEefIimnPpsTuVvx] [-/+o longname] [-c string] [arg ...]

해설
sh 유틸리티 (은)는 시스템의 표준 명령 인터프리터입니다. 현재 sh 하 p1003.2 의 쉘 규약에 대응하는 도상에 있습니다. 본버젼의 쉘은, 견해에 따라서는 Korn shell 와 같게 보이는 기능을 다수 가지고 있습니다만, pdksh(1) (와)과 같은 Korn shell 클론이 아닙니다. 이 쉘에는, POSIX 로 규정된 사양 물어 구두인가의 Berkeley 확장만이 받아들여지고 있습니다. 본메뉴얼은, shell 의 튜토리얼에서는 않고, 사양을 완전하게 기술하는 것이기도 하지 않습니다.

  개요
쉘은, 파일 또는 단말로부터 1 행씩 읽어들여, 그것을 해석해, 명령을 실행합니다. 쉘은 유저가 시스템에 로그인했을 때에 기동 되는 프로그램입니다 (다만, 유저는 chsh(1) 명령에 의해 다른 쉘을 선택할 수도 있습니다). 쉘은, 제어 구문을 가지는 언어이며, 데이터 기억을 시작으로 해 다양한 기능을 제공하는 매크로 펑션, 역사, 행 편집 기능도 내장하고 있습니다. 이 쉘은 대화적으로 사용할 때에 편리한 기능을 많이 거두어 들이고 있어 대화적으로 이용할 때도 비대화적으로 (셸 스크립트로서) 이용할 때도, 공통의 인터프리터 언어를 이용할 수가 있는 이점이 있습니다. 즉, 명령명을 쉘에 직접 타이프 친다 일도, 명령명을 파일에 써 두어 그 파일을 쉘에 직접 실행시킬 수도 있습니다.

  기동
인수가 주어지지 않고, 한편 쉘의 표준 입력이 단말의 경우 (또는 -i 플래그가 지정 되었을 경우), 쉘은 대화적으로 동작합니다. 대화적 쉘는, 통상, 명령 입력시에 prompt를 표시해, 문법적인 에러와 명령 에러를 다른 방법으로 처리합니다 (후술 합니다). 기동시에, 쉘은 0 번째의 인수를 검사합니다. 만약 그것이 마이너스 기호 (-) 그리고 시작되어 있다면, 쉘은 로그인 쉘로서 동작합니다. 유저가 시스템에 로그인했을 경우는 자동적으로 이 상황에 됩니다. 로그인 쉘은, 우선 (이하의 각 파일이 존재하는 경우), /etc/profile (와)과 다음에 .profile 파일로부터 명령을 읽어들입니다. 쉘 기동시에, 혹은 로그인 쉘로 .profile (을)를 실행중에 환경 변수 ENV 하지만 설정되어 있다면, 쉘은, 그 다음에 환경 변수 ENV 그리고 나타난 파일로부터 명령을 읽어들입니다. 즉, 유저는 로그인시에게만 실행하고 싶은 명령을 .profile 에 써, 쉘이 기동될 때마다 실행하고 싶은 명령을 환경 변수 ENV 그리고 가리키는 파일에 쓰게 됩니다. 환경 변수 ENV (을)를 설정하려면 , 홈 디렉토리하의 파일 .profile 에 이하와 같이 기술합니다. 여기서 .shinit 의 것인지 비교적 좋아하는 이름을 지정할 수가 있습니다.

    ENV=$HOME/.shinit; export ENV

명령행 인수로 지정된 옵션 이외의 최초의 것을, 쉘은 명령을 읽어들여야 할 파일 (셸 스크립트)의 이름이다고 해석해, 그것 이후의 인수는 쉘의 위치 파라미터 ($1, $2, ...)(으)로 설정합니다. 그 이외의 경우, 쉘은 명령을 표준 입력으로부터 읽어들입니다.

낡은 버젼의 sh 과는 달리, 환경 변수 ENV 그리고 지정한 스크립트가 실행되는 것은, 대화적 쉘의 호출시만입니다. 이것에 의해, 적당히 쓰여졌다 ENV 스크립트에 기인한다, 간단하게 먹이로 되는 것이 많은 유명한 보안 홀이 채워진 것이 됩니다.

  인수 리스트 프로세싱
sh 의 1 캐릭터로부터 되는 옵션은 각각 대응하는 긴 이름을 가지고 있습니다. 다만 -c (와)과 -/+o (은)는 예외입니다. 다음의 해설에서는, 긴 이름은 단일 캐릭터 옵션의 근처에 나타나고 있습니다. 어느 옵션의 긴 이름은, sh(1) 의 -/+o 옵션에의 인수로서 지정 가능합니다. 쉘이 기동되고 나서는, 옵션의 긴 이름을 set 편입 명령 (후술의 편입 명령 그리고 설명)의 -/+o 옵션에의 인수로서 지정 가능합니다. 마이너스 기호 (-) 그리고 옵션을 지정하는 것은, 그 옵션을 유효하게 하는 것을 의미해, 플러스 기호 (+) 그리고 옵션을 지정하는 것은, 그 옵션을 무효로 하는 것을 의미합니다. “--” 또는, 단순한 “-” (은)는 옵션 처리를 종료시켜, 명령행의 나머지의 말을 인수로서 해석하는 것을 강제합니다. -/+o (와)과 -c 의 옵션은 긴 이름을 가지지 않습니다.

-a allexport
    값이 대입되었을 때에 변수를 export 하도록, 변수에 플래그를 붙입니다.

-b notify
    백그라운드 작업 실행의 완료를, 명령이 실행중에서도 즉석에서 보고 섬 (미실장입니다).

-C noclobber
    벌써 존재하는 파일을 “>” 리디렉트로 덧쓰기하지 않습니다.

-E emacs
    편입의 emacs(1) 바람의 명령행 편집 기능을 유효하게 합니다 (그 이전에 -V 옵션이 지정되어 있었을 경우, 그것을 무효로 합니다).

-e errexit
    비대화 모드로, 테스트 상태에 없는 명령의 실행에 실패했을 경우, 즉시 쉘을 종료합니다. 명령은, if, elif, while, until 구문을 제어하는데 이용되고 있는 경우에, 테스트 상태이다고 보입니다. 또, “&&” (이)나 “||” 의 좌변치로서 이용되고 있는 명령도, 테스트 상태로 간주해집니다.

-f noglob
    패스명 전개를 실시하지 않습니다.

-I ignoreeof
    대화적 쉘의 경우, 입력의 EOF (을)를 무시합니다.

-i interactive
    쉘이 대화적으로 동작하도록(듯이) 강제합니다.

-m monitor
    작업 제어를 가능하게 합니다 (대화적 쉘의 경우는 자동적으로 설정됩니다).

-n noexec
    비대화적 쉘의 경우, 명령을 읽어들입니다만, 그 커멘드의 실행은 하지 않습니다. 셸 스크립트의 문법을 검사하는 경우에 편리합니다.

-P physical
    cd (와)과 pwd 명령에 있어서의 디폴트를 -L (논리적인 디렉토리 레이아웃)(으)로부터 -P (물리적인 디렉토리 레이아웃)에 변경합니다.

-p privileged
    특권 모드를 유효하게 합니다. 기동시에 실효 유저 ID 혹은 실효 그룹 ID 가, 열매 유저 ID 나 열매 아교 프 ID 와 일치하고 있지 않으면, 이 모드가 유효하게 됩니다. 이 모드를 무 효과화하면(자), 실효 유저 ID 및 실효 그룹 ID 는, 열매 유저 ID 및 열매 그룹 ID 로 설정됩니다. 대화적 쉘로 이 모드가 유효하게 되어 있으면(자), /etc/profile 의 다음에 ~/.profile 에 대신해, /etc/suid_profile (을)를 읽어들입니다. 한편, 환경 변수 ENV 의 내용은 무시됩니다.

-s stdin
    명령을 표준 입력으로부터 읽어들입니다 (인수로 파일명이 지정되어 있지 않다 경우에는, 이 옵션이 자동적으로 설정됩니다). 쉘이 실행되고 나서 본옵션을 ( set 등에 의해) 설정해도 효과는 없습니다.

-T asynctraps
    아이를 기다릴 때, 즉석에서 트랩을 실행합니다. 본옵션이 설정되어 있지 않으면 p1003.2 그리고 지정되어 있도록(듯이), 아이가 종료한 후에 트랩이 실행됩니다. 이 비표준 옵션은, 시그널을 블록 하는 아이의 주위에 보호 쉘을 두기 위해서(때문에) 유용합니다. 주위의 쉘은 아이를 죽이거나 다음과 같이, 제어를 tty 에 되돌려 아이만을 남기거나 할 수 있습니다:

        sh -T -c "trap 'exit 1' 2 ; some-blocking-program"

-u nounset
    값이 설정되어 있지 않은 변수를 전개하려고 했을 경우, 표준 에러 출력에 에러 메세지를 출력해, 한층 더 비대화적 쉘라면, 즉시 쉘을 종료합니다.

-V vi
    편입의 vi(1) 바람의 행 편집 기능을 유효하게 합니다 (그 이전에 -E 옵션이 지정되어 있었을 경우, 그것은 무효가 됩니다).

-v verbose
    입력을 읽어들일 때 마다 표준 에러 출력에 써냅니다. 디버그 때에 편리합니다.

-x xtrace
    각 명령을 실행하기 전에, 그 커멘드를 표준 에러 출력에 ( 각 커멘드의 전에 “+ ” (을)를 부가해) 써냅니다. 디버그 때에 편리합니다.

-c 옵션은, 쉘의 입력으로서 해석시키는 캐릭터 라인 인수를 건네주기 위해서(때문에) 사용 가능합니다. 이 옵션은 인수로서 캐릭터 라인을 하나만 받는 것에 주의해 주세요. 그러니까, 복수의 단어로부터 되는 캐릭터 라인은 인용부호로 둘러쌀 필요가 있습니다.

-/+o 옵션은, 옵션의 긴 이름만을 인수로서 취해, 옵션의 유효화와 무효화를 실시합니다. 예를 들면, 다음의 2 개의 sh 기동 방법에서는 편입의 emacs(1) 명령행 에디터를 유효화합니다:

    set -E
    set -o emacs

-o 옵션이 인수없이 사용되었을 경우, 현재의 옵션 설정을 사람이 읽을 수 있는 형식에서 표시합니다. +o 하지만 인수없이 사용되었을 경우는, 현재의 옵션 설정을 쉘에 재입력하는데 적합한 형식에서 출력합니다.

  구문 구조
쉘은, 파일을 행 단위로 읽어들여, 공백 캐릭터 (공백 및 탭)나 쉘에 있어 특별한 의미를 가지는 특정의 캐릭터 라인 ( “연산자” (으)로 불리는 것입니다) (을)를 단락으로서 복수의 단어에 분할합니다. 연산자에는, 제어 연산자와 리 다이렉트 연산자의 2 종류가 있습니다 (이러한 의미에 대해서는 후술 합니다). 이하에, 그러한 일람을 나타냅니다.

제어 연산자:
    & | && | (|) | \n
    ;; |; | | | ||

리디렉트 연산자:
    < | > | << | >> | <>
    <& | >& | <<- | >|

  인용 (쿼트)
인용은, 특수한 의미를 가지는 캐릭터나 단어 (연산자, 공백, 키워드등)의 의미 (을)를 지우기 위해서(때문에) 이용합니다. 인용에는, 싱글 쿼트 캐릭터의 페어를 사용하는 방법, 더블 쿼트 캐릭터의 페어를 사용하는 방법, backslash 캐릭터를 사용하는 방법 의 3 종류가 있습니다.

싱글 쿼트 캐릭터
    싱글 쿼트의 페어로 둘러싸인 캐릭터는, 모두 그 캐릭터 그대로 (리터럴) (으)로서 다루어집니다 (다만 싱글 쿼트는 별도입니다. 싱르크트 그리고 둘러싼 캐릭터 라인안에 싱글 쿼트를 포함할 수 없습니다).

더블 쿼트 캐릭터
    더블 쿼트의 페어로 둘러싸인 캐릭터는, 달러 기호 캐릭터 ($) , 박크크트 캐릭터 (`) , backslash 캐릭터 (\) (을)를 제외해, 모두 리터럴로서 다루어집니다. 더블 쿼트 캐릭터에 의한 인용안에 있는 backslash 캐릭터는, 역사 목표 경위에 의해 조금 바뀐 취급을 받습니다. 다음의 캐릭터의 전에 있는 경우는 쿼트가 됩니다만, 그 이외에서는 리터럴인 채됩니다:
    $ | ` | " | \ | \n

backslash
    backslash는, 그 뒤의 1 캐릭터를, 리터럴로서 취급하도록(듯이) 지시 합니다. 다만 개행 캐릭터 (\n) (은)는 별도입니다. 개행 캐릭터의 직전의 backslash는, 행 의 계속이다고 보입니다.

  예약어(reserved word)
예약어(reserved word)는 쉘에 있어 특별한 의미를 가지는 단어로, 행의 선두 또는 제어 연산자 의 직후에서만 예약어(reserved word)로서 인식됩니다. 이하에 예약어(reserved word)의 일람을 듭니다.
! | { | } | case | do
done | elif | else | esac | fi
for | if | then | until | while

  앨리어스(alias)
앨리어스(alias)는, 이름과 그것과 대응하는 값이 대가 된 것으로, 편입 명령 alias 에 의해 정의됩니다. 쉘은, 예약어(reserved word)가 나타날 가능성이 있는 장소 (상기를 참조)에서, 어느 단어에 대해서, 그것이 예약어(reserved word)인지 어떤지의 검사를 끝마친 후, 그것이 앨리어스(alias)에 일치하는지 어떤지를 검사합니다. 만약 일치했다면, 입력행 중(안)에서, 그 단어를 앨리어스(alias)의 값에 옮겨놓습니다. 예를 들어, “lf” (이)라는 이름으로 “ls -F” 그렇다고 하는 값을 가지는 앨리어스(alias)가 존재했다고 하면(자), 다음의 입력행

    lf foobar

(은)는, 이하와 같이 치환됩니다.

    ls -F foobar

앨리어스(alias)는, 초보자에 대해, 인수 첨부의 함수를 생성하는 귀찮음을 요구하는 일 없이, 짧은 명령을 만들어 내는 편리한 방법을 제공하는 것입니다. 그러나, 구문적으로 애매한 코드를 만들어 내게도 연결될 수 있습니다. 그러한 사용법은 추천할 수 없습니다.

  명령
쉘은, 읽어들인 단어를, 문법에 따라 해석합니다. 본메뉴얼에서는 문법에 대해서는 해설하지 않습니다. p1003.2 의 BNF 표기를 참조해 주세요. 요컨데, 행을 1 행을 읽어들여, 읽어들였다 행의 최초의 단어 (제어 연산자가 있는 경우는, 그 후의 최초의 단어)가 예약어(reserved word) (이)가 아닌 경우, 쉘은 그 행을 단순 명령로서 해석합니다. 그 이외의 장소 합, 복합 명령 혹은 특수 구조이다고 해석합니다.

  단순 명령
단순 명령을 해석하는 경우, 쉘은 이하와 같은 동작을 합니다.

1.  단어의 전에 있다 “name=value” 의 형식의 단어를 없애, 단순 명령의 환경에 대입합니다. 리디렉트 연산자와 그 인수 (후술)를 없애, 나중에 처리할 수 있도록(듯이) 보존합니다.

2.  남은 단어를, 단어 전개 시에로 설명하는 방법으로 전개합니다. 전개 후의 최초의 단어를 명령명으로 간주해, 커멘드의 위치를 탐색합니다. 나머지의 단어는 명령에의 인수로 간주해집니다. 처리의 결과, 명령명이 남지 않았던 경우, 순서 1)으로 꺼냈다 “name=value” 의 변수 대입을, 현재의 쉘의 환경에 반영합니다.

3.  차절로 설명하는 방법으로, 리디렉트를 실시합니다.

  리디렉트
리디렉트는, 명령이 어디에서 입력하는지, 어디에 출력할까를 변경할 경우에 이용합니다. 일반적으로는, 리디렉트에서는, 파일의 오픈, 클로우즈, 또는 파일에의 참조의 복제 (duplicate)를 실시합니다. 리디렉트로 이용되는 전반적인 형식은, 이하대로입니다.

    [n] redir-op file

여기서, ‘redir-op’ (은)는 전술한 리디렉트 연산자의 머지않아인가입니다. 이러한 연산자를 어떻게 이용할까의 예를 몇개인가 이하에 듭니다.

[n]> file
    표준 출력 (또는 파일 기술자 n)을 file 에 리디렉트 합니다

[n]>| file
    위와 같이. 다만 -C 옵션의 효과를 지웁니다.

[n]>> file
    표준 출력 (또는 파일 기술자 n)을 file 에 추가합니다.

[n]< file
    표준 입력 (또는 파일 기술자 n)을 file 로부터 리디렉트 합니다.

[n]<> file
    표준 입력 (또는 파일 기술자 n)을 file 로부터/에, 리디렉트 합니다.

[n1]<&n2
    파일 기술자 n2 를 표준 입력 (또는 파일 기술자 n1)에 복제합니다.

[n]<&-
    표준 입력 (또는 파일 기술자 n)을 클로우즈 합니다.

[n1]>&n2
    표준 출력 (또는 파일 기술자 n1)을 파일 기술자 n2 에 복제합니다. (역주: 통상은 「파일 기술자 n2 를 표준 출력 (또는 파일 기술자 n1)에 복제」라고 표현합니다. 결과는, 표준 출력 (또는 n1 에의 출력)의 n2 에의 리디렉트입니다. )

[n]>&-
    표준 출력 (또는 n)을 클로우즈 합니다.

이하의 리디렉트는, 자주 “히아·문서 (here-document)” (와)과 불립니다.

    [n]<< delimiter
    	here-doc-text
    	...
    delimiter

쉘은, delimiter 까지의 행을 보존해, 명령에의 표준 입력 또는 파이 르 기술자 n 에 리디렉트 합니다. 최초의 행의 delimiter 가 인용 (쿼트) 되고 있었을 경우, here-doc-text 의 내용을 리터럴로서 취급합니다. 그렇지 않은 경우, 파라미터 전개, 명령 치환, 수치 연산 ( 단어 전개 시에로 설명합니다)를 적용합니다. 연산자가 ( “<<” (이)가 아니고) “<<-” 의 경우는, here-doc-text 의 각 행의 줄머리의 탭을 없앱니다.

  명령 검색과 실행
명령에는, 쉘 함수, 편입 커멘드, 통상 프로그램의 3 종류가 있어, 명령을 검색하려면 , 쉘은 이름의 검색을 이 순서로 실시합니다. 3 종류의 명령은 다른 방법으로 실행됩니다.

쉘 함수를 실행할 때,$0 를 제외하는 모든 위치 파라미터 ($1, $2,..) (을)를 쉘 함수에의 인수로서 설정합니다. $0 (은)는 변경되지 않습니다. 쉘 함수 의 환경으로서 지정된 변수 (함수명의 직전에 “name=value” (을)를 두어 지정 된 것)는, 그 함수에 국소적인 변수가 되어, 지정된 초기치가 설정함. 그리고, 쉘은 함수 정의로 주어진 명령을 실행합니다. 팽이 드의 실행이 완료하면(자), 위치 파라미터를 원래의 값에 되돌립니다. 이것은 모두현 재의 쉘 중(안)에서 처리됩니다.

쉘의 편입 명령은, 새로운 프로세스를 작성하지 않고 쉘 내부에서 실행됩니다.

명령이 함수에서도 짜넣어 커멘드도 아닌 경우는, 통상의 프로그램으로 간주해 (차절로 설명하는 대로) 파일 시스템 중(안)에서 그 명령을 검색합니다. 통상의 프로그램을 실행하는 경우, 쉘은 인수와 환경을 프로그램에 건네주어, 그 프로그램을 실행합니다. 프로그램이 통상의 실행 파일 형식이 아닌 경우 (즉, ASCII 표현으로 "#!" 된다 "magic number" 그리고 파일이 시작되지 않고, execve(2) 하지만 ENOEXEC (을)를 돌려주는 경우), 서브 쉘 중(안)에서 그 프로그램을 해석 실행합니다. 이 경우, 마치 새롭게 쉘이 기동된 것 같은 효과를 얻기 위해서(때문에), 아이 쉘은 자기 자신을 재초기화합니다. 다만, child process는, 친쉘중의 해시 된 명령 위치 정보를 기억하고 있어 이것은 재초기화되지 않습니다.

본문서의 낡은 버젼이나 낡은 원시 코드에서는, 때때로, magic number가 없는 셸 스크립트를 "쉘 수속" (이)라고 부르고 있어, 헷갈린 경우가 있기 때문에 주의해 주세요.

  패스 검색
명령을 검색할 때, 쉘은, 우선, 그 이름의 쉘 함수가 있는지 어떤지를 조사합니다. 다음에, 그 이름의 편입 명령이 있는지 어떤지를 조사합니다. 편입 명령도 아닌 경우, 이하의 몇개의 처리를 합니다:

1.  명령명에 slash가 포함되어 있으면, 검색은 실시하지 않고, 단지 그 명령이 실행됩니다.

2.  변수 PATH 에 포함되는 각 엔트리에 대해서, 순서에 그 명령을 검색합니다. 변수 PATH 의 값은 코론으로 단락지어진 엔트리의 열이 아니면 안됩니다. 각 엔트리는, 각각 디렉토리명 하나에 대응합니다. 커런트 디렉토리는, 하늘의 디렉토리명을 지정하는 것으로 암묵적으로, 혹은 1 개의 피리어드를 지정하는 것으로 명시적으로 지시할 수가 있습니다.

  명령의 종료 스테이터스
각 명령은 종료 스테이터스를 가져, 그것에 의해 다른 쉘 커멘드의 동작에 영향을 줄 수가 있습니다. 기본적인 생각으로서 종료 스테이터스 0 은 통상의 종료 또는 성공을 나타냅니다. 0 이외의 종료 스테이터스는 실패, 에러를 의미합니다. 각 명령의 메뉴얼에 각각의 종료 스테이터스가 어느듯 의미를 가질지가 기술되고 있을 것입니다. 편입 명령와 (실행되었다) 함수도 종료 스테이터스를 돌려줍니다.

명령이 시그널에 의해 종료 (terminate) 당했을 경우, 종료 스테이터스는 128 에 시그널 번호를 더한 것이 됩니다. 시그널 번호는 헤더 파일 <sys/signal.h> 에 정의되고 있습니다.

  복합 명령 (Complex Commands)
복합 명령은, 단순 커멘드의 편성으로 만듭니다. 제어 연산자 또는 예약어(reserved word)와 조합하는 것으로, 보다 큰 복합 명령을 생 이룹니다. 일반적으로, 명령은 이하 중 머지않아인가입니다.

단순 명령

파이프라인

리스트 또는 합성 리스트 (compound-list)

합성 명령 (compound command)

함수 정의

특히 지정이 없는 경우, 명령의 종료 스테이터스는 마지막에 실행되었다 단순 명령의 종료 스테이터스가 됩니다.

  파이프라인
파이프라인은, 복수의 명령을 제어 연산자 `|'에 의해 이은 것입니다. 마지막 명령을 제외한 모든 커멘드의 표준 출력은, 다음의 커멘드의 표준 입력에 접속됩니다. 마지막 명령의 표준 출력은, 통상 대로, 쉘로부터 계승해집니다.

파이프라인의 형식은 다음과 같습니다.

    [!] command1 [| command2 ...]

command1 의 표준 출력은 command2 의 표준 입력에 접속됩니다. 명령의 안표 준입출력을 파이프라인에 의해 할당할 수 있는 것은, 각 명령에 속한다 리디렉트 연산자로 지정된 리디렉트를 처리하기 전라고 생각해 주세요.

파이프라인이 백그라운드 (후술)가 아니면, 쉘은 모든 명령이 종료하는 것을 기다립니다.

파이프라인의 직전에 예약어(reserved word) `! '가 놓여지지 않았던 경우, 종료 스테이터스는 파이프라인의 마지막 명령의 종료 스테이터스가 됩니다. `! '가 전치 되었을 경우, 종료 스테이터스는 파이프라인의 마지막 명령의 종료 스테이터스의 논리 부정을 취한 값이 됩니다. 즉, 마지막 명령이 0 을 돌려주었을 경우, 파이프라인의 종료 스테이터스는 1 에, 마지막 명령이 0 보다 큰 값을 돌려주었을 경우, 종료 스테이터스는 0 이 됩니다.

파이프라인에 의한 표준 입출력의 접속은 리디렉트에 앞서 행해지기 (위해)때문에, 파이프라인의 접속을 리디렉트에 의해 수정할 수가 있습니다. 예를 들어,

    $ command1 2>&1 | command2

‘command1’ 의 표준 출력과 표준 에러 출력의 양쪽 모두를 ‘command2’ 의 표준 입력에 접속합니다.

“”; 또는 개행 캐릭터를 종단으로서 이용하는 것으로, 직전의 AND-OR 리스트 ( 합선 리스트 연산자 그리고 후술)을 차례차례 실행합니다. “&” (은)는, 직전의 AND-OR 리스트를 비동기에게 실행합니다.

주: 다른 몇개의 쉘과 달리, sh 그럼 파이프라인의 각 프로세스는 기동했다 sh 의 child process가 됩니다. 쉘의 편입 명령이다 때는 별도입니다. 그 경우는 현재의 쉘로 실행됩니다만, 환경에 대한 조작은 영향을 주지 않습니다.

  백그라운드 명령 (&)
명령이 제어 연산자가 ampersand(&) (&) 그리고 종료하고 있는 경우, 쉘은 그 명령을 비동기에게 실행합니다. 즉, 쉘은 그 명령의 종료를 기다리지 않고 , 다음의 명령의 실행을 개시합니다.

명령을 백그라운드에서 실행시키기 위한 형식은 이하대로입니다.

    command1 & [command2 & ...]

쉘이 대화적이지 않은 경우, 비동기 명령의 표준 입력에는 /dev/null 가 접속됩니다.

  리스트 (일반적인 이야기)
리스트는 0 개 또는 그 이상의 명령을 개행 캐릭터, 세미콜론 캐릭터, 안 파산드 캐릭터 (&)로 단락지은 열입니다. 리스트는, 이것들 3 개의 기호의 어느쪽이든으로 종료시킬 수도 있습니다. 리스트중의 명령은 늘어놓을 수 있었던 순서에 실행 됩니다. 만약, 명령에 이어 ampersand(&) 캐릭터가 놓여져 있는 경우, 쉘은 그 명령을 기동한 뒤, 곧바로 다음의 커멘드의 처리를 개시합니다. 그 외의 경우, 그 명령의 종료를 기다리고 나서 다음의 커멘드의 처리를 개시합니다.

  합선 리스트 연산자 (Short-Circuit List Operators)
“&&” (와)과 “||” (은)는 AND-OR 리스트 연산자입니다. “&&” (은)는 최초의 명령 (을)를 실행해, 만약 최초의 명령의 종료 스테이터스가 0 이라면 다음의 커멘드를 실행합니다. “||” 도 같습니다만, 최초의 명령의 종료 스테이터스가 0 (이)가 아닌 경우에, 다음의 명령을 실행합니다. “&&” (와)과 “||” 의 우선 순위는 같습니다.

  제어 구조 (if, while, for, case)
if 명령의 문법은 이하대로입니다.
    if list
    then list
    [elif list
    then list] ...
    [else list]
    fi

while 명령의 문법은 이하대로입니다.
    while list
    do list
    done

최초의 리스트의 종료 스테이터스가 0 인 한, 2 개의 리스트를 반복해 실행합니다. until 명령도 이와 같이 실행합니다만, 단어 while 대신에 단어 until (을)를 사용하는 것으로, 최초의 리스트의 종료 스테이터스가 0 이 될 때까지, 2 개의 리스트를 반복해 실행하는 것이 다릅니다.

for 명령의 문법은 이하대로입니다.
    for variable in word ...
    do list
    done

각 word 는 전개되어 변수 variable 에 word 를 순서로 설정하면서 리스트를 반복 실행합니다. do (와)과 done 하 “{” (와)과 “}” 그리고 옮겨놓을 수가 있습니다.

break (와)과 continue 명령의 문법은 이하대로입니다.
    break [num]
    continue [num]

break (은)는 안쪽으로부터 num 개의 for 루프 또는 while 루프를 종료합니다. continue (은)는 안쪽으로부터 num 개의 루프의 다음의 반복에 제어를 옮깁니다. 이러한 명령은 짜넣어 커멘드로서 실장되고 있습니다.

case 명령의 문법은 이하대로입니다.
    case word in
    pattern) list ;;
    ...
    esac

pattern 는, 1 개(살) 혹은 복수의 패턴 (후술의 Sherpa 턴 (을)를 참조)를 “|” 그리고 접속한 것입니다.

  복수의 명령의 그룹화
명령은, 이하의 몇개의 방법에 의해 그룹화 할 수가 있습니다.

    (list)

또는,

    { list; }

최초의 형식에서는, 명령은 서브 쉘상에서 실행됩니다. 이 편입 명령은 현재의 쉘에는 영향을 주지 않는 것에 주의해 주세요. 2 개째의 형식에서는 새로운 쉘을 fork 하지 않기 때문에, 약간 효율이 좋아집니다. 이와 같이 해 복수 명령을 그룹화 하는 것으로, 마치 단일 프로그램인것 같이, 그러한 출력을 정리해 리디렉트 할 수가 있습니다.

    { echo -n "hello"; echo " world"; } > greeting

  함수
함수 정의의 구문은 이하대로입니다.

    name ( ) command

함수 정의는 실행 가능문의 일종입니다. 실행되면(자), 이름 name 의 함수 하지만 정의되어 종료 스테이터스로서 0 을 돌려줍니다. command 는 통상, “{” (와)과 “}” 그리고 둘러싸인 리스트입니다.

local 명령을 이용해 함수에 국소적인 변수를 선언할 수가 있습니다. 이것은 함수 정의중의 최초의 문장으로 실시하지 않으면 안됩니다. 구문은 다음과 같습니다.

local [variable ...] [-]

local 명령은, 편입 커멘드로서 실장되고 있습니다.

변수를 국소 변수로 하는 경우, 함수를 호출한 환경에 같은 이름의 변수가 있으면, 새로운 국소 변수는 값과 export, readonly 플래그를 계승합니다. 만약 같은 이름의 변수가 없으면, 국소 변수는 초기치를 가지지 않습니다. 쉘은 동적 스코프 (을)를 이용합니다. 즉, 함수 f 에 국소적인 변수 x (을)를 작성해, 함수 f (으)로부터 함수 g (을)를 호출했을 경우, 함수 g 내부에서의 변수 x 에 대한 조작은 광역 변수 x (이)가 아니고, 함수 f 그리고 선언된 변수 x 에의 조작이 됩니다.

특수 파라미터 중 국소 선언할 수 있는 것은 “-” 뿐입니다. “-” (을)를 국소 선언하면(자), 함수내에서 set 명령을 이용해 쉘 옵션을 변경해도, 함수가 종료하면(자) 그러한 옵션은 원래의 값으로 돌아옵니다.

return 명령의 문법은 이하대로입니다.

return [exitstatus]

return (은)는 현재 실행중의 함수를 종료시킵니다. return (은)는 편입 명령로서 실장되고 있습니다.

  변수와 파라미터
쉘은 파라미터의 집합을 관리하고 있습니다. 이름을 가지는 파라미터를 변수라고 부릅니다. 쉘은, 기동시에 모든 환경 변수를 셸 변수에 수중에 넣습니다. 새로운 변수는, 다음의 형식에 의해 설정할 수 있습니다.

    name=value

유저가 설정하는 변수는, 알파벳, 숫자, 언더스코어 (_) 마셔 (으)로부터 되는 이름을 가질 필요가 있습니다. 또, 최초의 캐릭터가 숫자여 안됩니다. 파라미터는, 이하에 나타내는 숫자 또는 특수 기호에 의해 참조할 수도 있습니다.

  위치 파라미터
위치 파라미터는, 0 보다 대단한 숫자에 의해 참조되는 파라미터입니다. 쉘은 위치 파라미터의 초기치로서 셸 스크립트명에 계속되는 인수를 설정합니다. 편입 명령 set 에 의해 재설정이나 소거를 할 수 있습니다.

  특수 파라미터
특수 파라미터는, 이하에 드는 특수 캐릭터의 어느 쪽인가에보다 참조된다 파라미터입니다. 각 파라미터의 값의 설명을 각 캐릭터의 뒤로 나타냅니다.

*   위치 파라미터 1,2,... 에 전개됩니다. 더블 쿼트 캐릭터 라인 내부에서 전개 되는 경우, 전개 결과는 여러분치파라미터의 사이를 변수 IFS 의 선두의 캐릭터 ( IFS 하지만 설정되어 있지 않은 경우는 <공백 캐릭터> )(으)로 단락지은 단일의 캐릭터 라인이 됩니다.

@   위치 파라미터 1,2,... 에 전개됩니다. 더블 쿼트 인용의 내부에서 전개 되는 경우, 여러분치파라미터는 다른 인수가 됩니다. 만약, 위치 파라미터가 설정되어 있지 않은 경우에는, @ 의 전개 결과는 0 개의 인수가 됩니다 (더블 쿼트 인용의 내부에서 만나도). 즉,$1 이 “abc” ,$2 (이)가 “def ghi” 에서 만났을 경우, "$@" 하 다음의 2 개의 인수에 전개됩니다.

        "abc"   "def ghi"

#   위치 파라미터의 수에 전개됩니다.

?   마지막에 실행한 파이프라인의 종료 스테이터스에 전개됩니다.

-   (하이픈) 현재의 옵션 플래그 (1 캐릭터 옵션명을 이은 캐릭터 라인) 에 전개됩니다. 기동시로 지정된 것, 편입 명령 set 로 지정했다 것, 쉘이 암묵으로 설정했지만 모든 것을 포함합니다.

$   기동된 쉘의 프로세스 ID 에 전개됩니다. 서브 쉘도 친쉘과 같은 값을 가집니다.

!   현재의 쉘이 마지막에 백그라운드에서 실행한 명령의 프로세스 ID 에 전개됩니다. 파이프라인의 경우, 파이프라인의 마지막 명령의 프로세스 ID 가 됩니다.

0   (제로) 쉘의 이름 또는 셸 스크립트명에 전개됩니다.

  단어 전개
본절에서는, 단어에 대해서 적용되는 다양한 전개에 대해 설명합니다. 나중에 말하도록(듯이), 모든 전개가 모든 단어에 대해서 적용되는 것은 아닙니다.

단일의 단어에 대해서 적용된 치르다 전개, 파라미터 전개, 명령 치환, 수식 전개, 쿼트 삭제의 결과는 단일의 필드가 됩니다. 단일의 단어가 복수의 필드에 분할될 가능성이 있는 것은, 필드 분할 또는 패스명 전개의 경우 뿐입니다. 이 규칙의 유일한 예외는, 더블 쿼트중의 파라미터 @ 의 전개입니다 (전술).

단어 전개의 순서는 이하대로입니다.

1.  치르다 전개, 파라미터 전개, 명령 치환, 수식 전개 (이것들은 모두 동시에 행해집니다)

2.  변수 IFS 의 값이 하늘이 아니면, (1)의 결과의 각 필드에 대해서 필드 분할을 한다

3.  패스명 전개 ( -f 옵션이 무효의 경우)

4.  쿼트 삭제

캐릭터 “$” (은)는 파라미터 전개, 명령 치환, 수식 평가를 실시하는 계기가 됩니다.

  치르다 전개 (유저의 홈 디렉토리명에의 치환)
인용되어 있지 않은 치르다 캐릭터 (~) 그리고 시작되는 단어는, 치르다 전개의 대상이 됩니다. 치르다 캐릭터로부터 slash 캐릭터 (/) 또는 단어의 종단까지의 모든 캐릭터가 유저명 (으)로 간주해져 그 유저의 홈 디렉토리에 치환됩니다. 만약 유저명이 생략 되었을 경우 (예를 들어 ~/foobar), 치르다 캐릭터는 변수 HOME 의 값 (현재의 유저의 홈 디렉토리)에 치환됩니다.

  파라미터 전개
파라미터 전개의 형식은 이하대로입니다.

    ${expression}

여기서, expression 는 대응했다 “}” 까지의 모든 캐릭터입니다. 대응한다 “}” (을)를 조사할 때에, backslash 캐릭터에 의해 이스케이프 되거나 쿼트 캐릭터에 좁아질 수 있었다 “}” (이)나, 수식 전개에 파묻히고 있는 캐릭터나, 명령 치환이나 변수 전개중에 어느 캐릭터는 조사하는 대상이 되지 않습니다.

파라미터 전개의 형식 중 좀 더도 단순한 것은 이하대로입니다.

    ${parameter}

그 파라미터에 값이 존재하는 경우, 그 값으로 옮겨집니다.

파라미터명이나 심볼을 안괄호 ({})로 둘러싸도 상관하지 않습니다. 이 안괄호는, 숫자 2 캐릭터 이상으로부터 되는 위치 파라미터의 경우나, 파라미터명의 직후에 파라미터명의 일부이라고 간주 얻는 캐릭터가 계속되는 경우를 제외해, 생략 가능합니다. 더블 쿼트 인용중의 파라미터 전개는 이하 (와)과 같이 됩니다.

1.  파라미터 전개를 실시한 결과의 단어에 대해서는, 패스명 전개는 적용되지 않습니다.

2.  파라미터가 특수 파라미터 @ 의 경우를 제외해, 필드 분할은 적용되지 않습니다.

게다가 이하의 형식을 이용하는 것으로, 파라미터 전개의 결과에 수정을 더한다 일이 생깁니다.

${parameter:-word}
    기본값에의 치환: 파라미터 parameter 가 설정되어 있지 않은가 하늘의 값 (을)를 가지는 경우, word 를 전개한 결과에 치환됩니다. 아주 없으면, 파라메이 타 parameter 의 값에 치환됩니다.

${parameter:=word}
    기본값의 대입: 파라미터 parameter 가 설정되어 있지 않은가 하늘의 값을 가지는 경우, word 를 전개 한 결과가 parameter 에 대입됩니다. 최종적으로 파라미터 parameter 의 값 에 치환됩니다. 위치 파라미터나 특수 파라미터는, 이 방법으로 대입하는 것 (은)는 할 수 없습니다.

${parameter:? [word]}
    하늘이나 설정되어 있지 않을 때에 에러로 한다: 파라미터 parameter 가 설정되어 있지 않은가 하늘의 값을 가지는 경우, word 를 전개 한 결과 (word 가 생략 되었을 경우에는 파라미터가 설정되어 있지 않은 것을 나타낸다 디폴트의 메세지)가 표준 에러 출력에 써내져 쉘은 비 0 의 종료 스테이터스로 종료합니다. 그 이외의 경우, 파라미터 parameter 의 값에 치환됩니다. 대화적 쉘의 경우는 반드시 종료하지 않습니다.

${parameter:+word}
    대체치의 사용: 파라미터 parameter 가 설정되어 있지 않은가 하늘의 값을 가지는 경우, 하늘의 값에 치환됩니다. 아주 없으면, word 를 전개한 결과에 치환됩니다.

    이상의 파라미터 전개에 대해,`:'를 이용했을 경우는 파라미터가 설정되어 있지 않다 가마타는 하늘의 값인 것이 검사되어`:'를 생략 하면(자) 파라미터가 설정되어 있지 않은 것만을 검사합니다.

${#parameter}
    캐릭터 라인의 길이: 파라미터의 값의 (캐릭터 라인으로서의) 길이에 치환됩니다.

이하의 4 방법의 파라미터 전개는 부분 캐릭터 라인 시작 처리를 실시합니다. 각 경우 에 두어, 패턴은 정규 표현이 아니고, 패턴 매치 기법 ( Sherpa 턴 의 항을 참조)가 이용됩니다. 파라미터가 * 또는 @ 의 경우, 전개의 결과 하지만 어떻게 될까는 규정하지 않습니다 (unspecified). 파라미터 전개 전체를 더블 쿼트로 둘러싸도 패턴은 인용되지 않습니다. 안괄호 속에서 인용하는 것으로써 패턴을 인용할 수가 있습니다.

${parameter%word}
    최단 후치패턴의 삭제: 우선 word 가 전개되어 그 결과를 패턴으로서 취급합니다. 파라미터 parameter 의 오른쪽으로부터, 패턴에 일치하는 최단의 부분을 삭제한 캐릭터 라인에 치환됩니다.

${parameter%%word}
    최장 후치패턴의 삭제: 우선 word 가 전개되어 그 결과를 패턴으로서 취급합니다. 파라미터 parameter 의 오른쪽으로부터, 패턴에 일치하는 최장의 부분을 삭제한 캐릭터 라인에 치환됩니다.

${parameter#word}
    최단전 치패턴의 삭제: 우선 word 가 전개되어 그 결과를 패턴으로서 취급합니다. 파라미터 parameter 의 왼쪽으로부터, 패턴에 일치하는 최단의 부분을 삭제한 캐릭터 라인에 치환됩니다.

${parameter##word}
    최장전치패턴의 삭제: 우선 word 가 전개되어 그 결과를 패턴으로서 취급합니다. 파라미터 parameter 의 왼쪽으로부터, 패턴에 일치하는 최장의 부분을 삭제한 캐릭터 라인에 치환됩니다.

  명령 치환
명령 치환에 의해, 커멘드명 자신을 커멘드의 출력으로 옮겨놓을 수가 있습니다. 명령 치환은, 이하와 같이, 커멘드 command 를 둘러쌌을 경우,

    $(command)

또는 박크크트바젼

    `command`

(으)로 했을 경우에 행해집니다. 쉘은, 명령 command 를 서브 쉘의 환경에서 실행해, command 가 표준 출력 에 출력한 것으로부터 마지막 개행 캐릭터를 삭제한 결과로 치환합니다. 최후 이외의 개행은 삭제하지 않습니다. 다만, 필드 분할 시에, IFS 의 값이나 인용이 되고 분에 따라서는, 여기서 남은 개행 캐릭터가 결국은 공백에 치환되는 일도 있습니다.

  수식 전개
수식 전개란, 수식을 평가해, 그 값에 치환하는 구조입니다. 수식 전개의 형식은 이하 대로입니다.

    $((expression))

수식 expression 는, 그 중의 더블 쿼트 캐릭터가 특별 취급을 받지 않는다고 한다 점을 제외해서는, 더블 쿼트 캐릭터로 둘러싸여 있는 캐릭터 라인과 같게 다루어집니다. 쉘은 expression 중의 모든 토큰에 파라미터 전개, 명령 치환, 쿼트 삭제를 적용합니다.

다음에 쉘은 그 결과를 수식으로서 취급해, 그 값에 치환합니다.

  공백 캐릭터에 의한 분할 (필드 분할)
파라미터 전개, 명령 치환, 수식 전개뒤, 쉘은 전개 결과를 조사해, 더블 쿼트의 밖에 있는 부분에 대해서 필드 분할을 적용합니다. 그 결과, 복수의 필드가 되는 경우도 있습니다.

쉘은, 변수 IFS (으)로 설정되어 있는 캐릭터 각각 단락지어 캐릭터로 간주해, 파라미터 전개의 결과, 및 명령 치환의 결과를 필드에 분할합니다.

  패스명 전개 (파일명 생성)
-f 플래그가 설정되어 있지 않으면, 필드 분할을 한 뒤, 파일명 생성 (을)를 합니다. 각 단어는, slash로 단락지어진 패턴의 열이다고 보지 않음. 패스명 전개 처리에 대해, 단어는, 조건을 채우는 파일 모든 파일명의 열로 치환됩니다. 이 각 파일명은, 단어의 각 패턴 부분을, 그 패턴에 일치하는 캐릭터 라인에 치환하는 것으로 생성되는 것입니다. 이것에는 2 개의 제한이 있습니다: 우선, 패턴은 slash를 포함한 캐릭터 라인에는 일치하지 않습니다. 다음에, 패턴은, 그 패턴이 피리어드로 시작되지 않는 한, 피리어드로 시작되는 캐릭터 라인에 일치하지 않습니다. 차절에서는, 패스명 전개와 case 명령로 이용되는 패턴에 대해 설명합니다.

  Sherpa 턴
패턴은, 통상의 캐릭터와 메타캐라크타로부터 됩니다. 통상의 캐릭터는, 그 캐릭터 그 자체에 일치합니다. 메타캐라크타는 “”!, “*”, “”?, “[” 입니다. 이러한 캐릭터를 인용 그러자(면), 각각의 특수한 의미를 잃습니다. 명령 치환이나 변수 치환에 대해, 달러 기호나 박크크트 캐릭터가 더블 쿼트 캐릭터안에 없는 경우에는, 변수의 값이나 명령의 출력안에, 이러한 특수한 캐릭터가 존재하는지 어떤지가 조사할 수 있어 그것들이 있으면, 메타캐라크타로서 다루어집니다.

asterisk 캐릭터 (*) (은)는, 어떠한 캐릭터 라인과도 일치합니다. 의문 부호 캐릭터 ()? (은)는, 임의의 캐릭터 1 캐릭터와 일치합니다. 좌대괄호 ([) (은)는 캐릭터 클래스를 개시합니다. 캐릭터 클래스의 최후는 우대괄호 ()] 입니다. “”] 하지만 없는 경우는, “[” (은)는 캐릭터 그 자체에 일치해, 캐릭터 클래스의 개시라고는 보여지지 않습니다. 캐릭터 클래스는 대괄호내에 출현하는 모든 캐릭터에 일치합니다. 마이너스 기호를 이용하면, 캐릭터의 범위를 지정할 수가 있습니다. 캐릭터 클래스의 최초로 느낌표 ()! (을)를 두는 것으로, 캐릭터 클래스의 의미를 반전시킬 수가 있습니다.

캐릭터 클래스에 캐릭터 “”] (을)를 포함하려면 , “”] (을)를 캐릭터 클래스의 최초 ( “”! (을)를 두는 경우는 그 후)에 둡니다. 캐릭터 클래스에 “-” (을)를 포함할 때도 마찬가지로, 리스트의 최초 혹은 마지막에 둡니다.

  쉘 편입 명령
본절에서는, 별프로세스에서는 실행할 수 없는 처리를 실시하기 위해서(때문에) 짜넣어지고 있다 명령을 열거합니다. 게다가 짜넣어 버젼의 printf(1) (와)과 test(1) 하지만 효율을 올리기 위해서(때문에) 제공되고 있습니다.

:   종료 스테이터스 0 (진)을 돌려주는 누르코만드입니다.

. file
    지정된 파일 file 에 기술된 명령이 쉘에 읽혀 실행됩니다. file 에 “/” 캐릭터를 포함한 경우, 그대로 다루어집니다. 그렇지 않으면, 쉘은 PATH (을)를 사용해, 파일을 검색합니다. PATH (을)를 사용해도 발견되지 않는 경우, 커런트 디렉토리를 검색합니다.

alias [name ...]

alias [name=string ...]
    name=string 하지만 지정되어 있는 경우, 쉘은 이름 name (을)를 가지는 값 string 의 앨리어스(alias)를 정의합니다. 단지 “name” 만이 지정되었을 경우, 앨리어스(alias) “name” 의 값이 표시됩니다. 인수가 지정되지 않는 경우, alias (은)는 정의 떠날 수 있어 모든 앨리어스(alias)의 이름과 값을 표시합니다 ( unalias 도 참조). 앨리어스(alias)의 값은 적절히 쿼트 되고 있어 쉘에 재입력하는데 적합합니다.

bg [job ...]
    지정된 작업 (지정되지 않았던 경우는 현재의 작업)을, 계속해 백그라운드에서 실행시킵니다.

builtin cmd [arg ...]
    지정된 편입 명령 cmd (을)를 실행합니다. 쉘 함수를 동명의 편입 명령로 오바라이드 하고 싶은 경우에 유용합니다.

bind [-aeklrsv] [key [command]]
    행 편집 기능의 키 바인드를 표시 혹은 변경합니다. 이 명령에 대해서는 editrc(5) 그리고 설명되고 있습니다.

cd [-LP] [directory]
    지정된 디렉토리 directory (으)로 이동합니다. directory 무지정시는 HOME 그리고 지정되는 디렉토리로 이동합니다. directory 하지만 /,.,.. 의 머지않아에서도 개시하지 않는 경우, 지정되었다 directory (을)를 CDPATH 변수중의 디렉토리 리스트로부터 검색합니다. CDPATH 하지만 설정되어 있지 않은 경우, 커런트 디렉토리를 검색합니다. CDPATH 의 형식은 PATH (와)과 같습니다. 대화적 쉘에서는, 유저 하지만 지정한 디렉토리와 다른 장소로 이동했을 경우, cd (은)는, 이동처의 디렉토리명을 표시합니다. 이것은, CDPATH 의 기구가 동작했을 경우와 기호 연결을 더듬었을 경우에 발생합니다.

    -P 옵션이 지정되었을 경우,.. (은)는 물리적으로 취급해져 기호 연결은.. 부분이 처리되기 전에 해결됩니다. -L 옵션이 지정되었을 경우는,.. (은)는 논리적으로 다루어집니다. 이쪽이 디폴트가 되어 있습니다.

chdir
    cd 편입 명령의 별명입니다.

command [-p] [utility [argument ...]]
    지정되었다 utility (을)를 단순 명령로서 실행합니다 ( 단순 명령 섹션을 참조).

    -p 옵션이 지정되었을 경우, 명령 검색은, PATH 의 기본값을 이용해 행해집니다. 이것에 의해 모든 표준 유틸리티를 찾아내는 것이 프로텍션됩니다.

echo [-e | -n] [string]
    string 의 후에 개행 캐릭터를 붙여, 표준 출력에 표시합니다.

    -n  마지막 개행 캐릭터를 억제합니다.

    -e  C 풍의 backslash escape sequence를 처리합니다. echo (은)는 다음의 캐릭터 이스케이프를 이해합니다:

        \a  경고 (단말 벨을 울린다)

        \b  백 스페이스

        \c  마지막 개행 캐릭터를 억제합니다 (개행 캐릭터가 마지막 캐릭터가 아닌 경우, 행이 줄어들어 버린다고 하는 부작용이 있습니다)

        \e  ESC 캐릭터 (ASCII 0x1b)

        \f  form feed

        \n  개행

        \r  복개

        \t  수평 탭

        \v  수직 탭

        \\  backslash 캐릭터

        \0nnn
            (이 0 은 제로입니다) 8 진수치가 nnn 인 캐릭터

        string 하지만 쿼트로 괄라고 없는 경우, 쉘로부터 이스케이프 하기 위해서는, backslash 자신을 backslash로 이스케이프 할 필요가 있습니다. 예를 들면 다음과 같습니다:

            $ echo -e "a\vb"
            a
             b
            $ echo -e a\\vb
            a
             b
            $ echo -e "a\\b"
            a\b
            $ echo -e a\\\\b
            a\b

    -e (와)과 -n 옵션 가운데, 어느 쪽인지 다른 한쪽만을 지정할 수 있습니다.

eval string ...
    지정된 모든 인수를 공백에서 결합해, 그 결과를 다시 해석하고 나서 명령로서 실행합니다.

exec [command [arg ...]]
    commmand 하지만 생략 되지 않는 경우, 그 쉘 프로세스는 지정된 프로그램에 옮겨놓을 수 있습니다 ( command (은)는, 쉘 편입 명령나 함수는 아닌, 진짜의 프로그램이 아니면 안됩니다). exec 명령에 있어서의 리디렉트는, 영구성을 가진다고 보여져 exec 명령 완료 후에도 계속해 효력을 가집니다.

exit [exitstatus]
    쉘을 종료합니다. exitstatus 하지만 지정되었을 경우, 이것은 쉘의 종료 스테이터스가 됩니다. 그렇지 않은 경우, 직전에 실행한 명령의 종료 스테이터스가 쉘의 종료 스테이터스가 됩니다.

export [-p] [name ...]
    그것 이후에 쉘로부터 실행되는 명령의 환경에, 지정된 이름의 변수가 포함되도록(듯이) 합니다 (변수의 export). 변수의 export를 취소하는 유일한 방법은, 변수를 unset 하는 것입니다. 이하와 같이 기술하는 것으로, export 하면(자) 동시에 변수의 값을 설정할 수가 있습니다.

        export name=value

    인수를 지정하지 않는 경우, 모든 export 되고 있는 이름과 값이 표시됩니다. -p 옵션이 지정되었을 경우, export 되고 있는 변수는, 일행마다 “export name=value” 그렇다고 하는 형식에서 표시됩니다. 이것은 쉘에 재입력하는데 적합합니다.

fc [-e editor] [first [last]]

fc -l [-nr] [first [last]]

fc -s [old=new] [first]
    fc 편입 명령은, 대화적 쉘에 그 이전에 입력된 커멘드의 내용을, 표시, 편집, 재실행합니다.

    -e editor
        편집에 즈음해, 지정된 에디터 editor (을)를 사용합니다. editor (은)는 변수 PATH (을)를 통해 검색할 수 있는 명령명입니다. -e 하지만 지정되지 않았던 경우는, 변수 FCEDIT 의 값이 이용됩니다. FCEDIT 하지만 설정되어 있지 않은가 하늘로 설정되어 있는 경우는 EDITOR의 값이 이용되어 그것도 설정되어 있지 않은가 하늘이라면 ed(1) 하지만 이용됩니다.

    -l (ell)
        (소문자의 엘) 에디터를 기동하지 않고 , 명령 히스토리의 내용을 일람 출력합니다. 파라미터 first 와 last 로 지정한 범위의 명령이 순서에 (출력의 차례는 -r 옵션의 영향을 받는) 출력됩니다. 각 명령의 출력 시에는 커멘드 번호가 부가됩니다.

    -n  -l 그리고 일람 출력할 때에 명령 번호를 부가하지 않습니다.

    -r  명령 일람시 ( -l 옵션지정시)나 편집시 ( -l 도 -s 도 지정되지 않았던 경우)의 순서를 반전합니다.

    -s  에디터를 기동하지 않고 명령을 재실행합니다.

    first

    last
        일람 출력이나 편집의 대상이 되는 명령을 선택합니다. 액세스 가능한 커멘드 의 수는 변수 HISTSIZE 의 값으로 정해집니다. first 또는 last , 또는 양쪽 모두의 값은, 이하의 몇개의 형식에서 지정합니다.

        [+]num
            정의 수로, 명령 번호를 지정합니다. 커멘드 번호는 -l 옵션으로 표시시켜 조사할 수가 있습니다.

        -num
            부의 수는, num 개만 현재부터 거슬러 올라간 명령을 지정합니다. 예를 들어, -1 (은)는 직전에 실행된 명령을 지정합니다.

        string
            캐릭터 라인 string 는, 과거에 실행된 명령 가운데, 그 캐릭터 라인으로부터 시작되는 최신의 것을 지정합니다. 만약 -s 옵션이 지정되어 old=new 하지만 지정되어 있지 않으면, 최초의 오퍼랜드에 이콜 기호 (을)를 포함할 수 없습니다.

    fc 명령의 실행에 해당해, 이하의 환경 변수의 영향을 받습니다.

    FCEDIT
        사용하는 에디터명

    HISTSIZE
        액세스 가능한 명령수

fg [job]
    지정된 작업 job 또는 현재의 작업을 foreground로 이동합니다.

getopts optstring var
    POSIX 에 준거했다 getopts 명령입니다. 이 getopts 명령에 의해, 이전의 getopt(1) 명령의 필요성은 감소했습니다. 최초의 인수는 캐릭터의 열입니다. 각 캐릭터의 뒤에는 코론을 붙일 수가 있어 그 옵션이 인수를 취하는 것을 지시합니다. 지정된 변수에, 해석되고 발견된 옵션이 설정됩니다. 발견된 옵션의 다음의 인수의 인덱스는 셸 변수 OPTIND 에 격납됩니다. 어느 옵션이 인수를 취하는 경우, 그 인수는 셸 변수 OPTARG 에 놓여집니다. 유효하지 않은 옵션을 당하면(자), 변수 var 에는 “”? 하지만 세트 됩니다. getopts 는 옵션군의 말미에 도달하면(자) 가짜의 값 (1)을 돌려줍니다.

hash [-rv] [command ...]
    쉘은, 명령의 위치를 보관 유지하는 해시 테이블을 유지 관리하고 있습니다. hash 명령에 인수가 지정되지 않았던 경우, 이 테이블의 내용이 출력됩니다. 마지막에 cd 명령이 실행되고 나서 참조되어 있지 않은 항목에는 asterisk 캐릭터 하지만 표시됩니다. 이 항목은 무효가 되어 있을지도 모릅니다.

    인수를 지정했을 경우, hash 명령은 지정했다 command (을)를 해시 테이블에서 삭제해 ( command 하지만 함수가 아닌 경우), 그 후로 그 명령을 검색합니다. -v 옵션을 지정했을 경우, hash (은)는 발견한 명령의 위치를 표시합니다. -r 옵션을 지정했을 경우, hash (은)는 함수 이외의 모든 엔트리를 해시 테이블에서 삭제합니다.

jobid [job]
    작업 job 안의 각 프로세스의 프로세스 ID 를 표시합니다. 인수 job 하지만 생략 되었을 경우, 현재의 작업에 대해서 처리를 실시합니다.

jobs [-ls] [job ...]
    지정된 작업의 정보를 표시합니다. job 인수가 지정되지 않았던 경우는, 모든 작업의 정보를 표시합니다. 정보에는, 작업 ID, 스테이터스, 명령명이 포함됩니다.

    -l 옵션이 지정되었을 경우, 각각의 작업의 PID 도 표시됩니다. -s 옵션이 지정되었을 경우, 일행마다 작업의 PID 만이 표시됩니다.

pwd [-LP]
    커런트 디렉토리의 패스를 표시합니다. 편입 명령판은 커런트 디렉토리명을 기억하고 있어 표시할 경우에 재계산하지 않기 때문에, 편입 명령판은 동명의 프로그램과는 다른 표시를 하는 경우가 있습니다. 이 때문에 처리는 고속으로 가, 커런트 디렉토리 의 이름을 변경했을 경우에서도, 편입판의 pwd(1) (은)는 이전의 디렉토리명을 계속 표시합니다.

    -P 옵션이 지정되었을 경우, 기호 연결은 해결됩니다. -L 옵션이 지정되었을 경우, 커런트 디렉토리는 쉘의 표기로 표시됩니다 (기호 연결은 해결되지 않습니다). 이쪽이 디폴트입니다.

read [-p prompt] [-t timeout] [-er] variable ...
    -p 옵션이 지정되어 한편 표준 입력이 단말의 경우, prompt (을)를 prompt로서 표시합니다. 그리고 표준 입력으로부터 1 행 입력합니다. 행단의 개행 캐릭터를 삭제해, 행을 전술의 공백 캐릭터에 의한 분할 (필드 분할) 방법에 따라 분할해, 각 단어를, valiable... 그리고 지정하는 각 변수에 순서에 대입합니다. 만약, 지정된 변수의 수부터 분할된 단어의 수가 많으면, 마지막 변수에 나머지의 단어 모두 ( IFS 의 캐릭터를 단락으로 해 그것들도 함께)가 대입됩니다. 분할된 단어의 수보다 많은 변수가 지정되어 아픈들 , 남은 변수에는 공문자열이 설정됩니다.

    -r 옵션이 지정되었을 경우를 제외해, backslash는 특별히 다루어집니다. backslash 캐릭터가 개행 캐릭터의 직전에 있는 경우, backslash 캐릭터와 개행 캐릭터는 삭제됩니다. 그 외의 캐릭터의 직전에 backslash가 있는 경우, backslash는 삭제되어 캐릭터가 IFS 에 포함되어 있어도, IFS 의 캐릭터가 아닌 것처럼 다루어집니다.

    -t 옵션이 지정되어 한편 입력이 이루어지기 전에 timeout 하지만 경과하면(자), read 명령은 값을 할당 하지않고서 돌아옵니다. timeout 값의 뒤에는 옵션으로 “s”, “m”, “h” 의 몇개의 한 글자 (을)를 붙일 수가 있어 각각 초·분·시간을 햇빛으로 지정합니다. 어느 것도 지정하지 않는 경우에는 “s” 인 것으로 합니다.

    -e 옵션은, 낡은 스크립트와의 후방 호환성 (을) 위해서만 있습니다.

readonly [-p] [name ...]
    그리고 지정된 변수를 읽어내기 전용으로 해, 나중에 값을 변경하거나 unset 했다 할 수가 없게 합니다. 이하와 같이 기술하는 것으로, 변수를 읽어내기 전용이라고 선언하는 것과 동시에 값을 설정하는 일도 가능합니다.

        readonly name=value

    인수가 지정되지 않는 경우, readonly 명령은, 읽어내기 전용이 되어 있는 변수의 이름의 일람을 표시합니다. -p 옵션이 지정되었을 경우, 읽어내기 전용이 되어 있는 변수를, 일행마다 “readonly name=value” 의 형식에서 표시합니다. 이것은 쉘에 재입력하는데 적합합니다.

set [-/+abCEefIimnpTuVvx] [-/+o longname] [
    -c string] [-- arg ...] set 명령은 3 방법이 다른 기능을 가집니다.

    인수를 지정하지 않았던 경우, 단보람 형식에서도 길다 “-/+o longname” 그렇다고 하는 형식이어도, 인수 리스트의 처리 시에로 설명되고 있도록(듯이), 지정된 옵션의 설정 또는 클리어를 실시합니다.

    “--” 옵션이 지정되었을 경우, set (은)는 쉘의 위치 파라미터를, 계속하는 인수로 옮겨놓습니다. “--” 옵션의 뒤에 인수가 계속되지 않는 경우, 모든 위치 파라미터는 클리어 되어 “shift $#” 명령을 실행하는 것이라고 등가가 됩니다. 위치 치환 파라미터로서 인수를 지정할 때, “--” 플래그는 생략 가능합니다. 이것은 추천할 수 없습니다. 왜냐하면, 최초의 인수는 마이너스 기호 (-) 또는 플러스 기호 (+) 그리고 개시할지도 모르기 때문입니다. 이것들은, set 명령이, 옵션의 유효화 또는 무효화의 요구이다고 해석해 버립니다.

setvar variable value
    변수 variable 에 값 value (을)를 대입합니다. ( setvar (은)는, 함수내에서, 파라미터로서 건네받은 이름을 가진다 변수에 값을 대입하기 위한의 것입니다. 일반적으로, setvar (을)를 사용하는 것보다도

        variable=value

    (이)라고 쓰는 편이 바람직하다고 말할 수 있습니다. )

shift [n]
    위치 파라미터를 n 회쉬프트 합니다. n (을)를 지정하지 않는 경우 1 회 쉬프트 합니다. 1 회의 쉬프트에 의해,$2 의 값이 $1 에,$3 의 값이 $2 에 대입됩니다 (이하 같이). 또,$# 의 값은 1 감소합니다. 위치 파라미터가 없는 경우, shift 는 아무것도 하지 않습니다.

trap [action] signal ...
    쉘이 지정된 시그널 signal (을)를 받았을 때에, action (을)를 해석해 실행하도록(듯이) 설정합니다. 시그널은 시그널 번호로 지정합니다. action (은)는 공문자열에 하거나 생략 하거나 할 수가 있습니다. 공문자열의 경우, 지정된 시그널은 무시되어 생략 했을 경우는, 지정한 시그널을 받았을 때 디폴트의 처리를 실시합니다. 쉘이 서브 쉘을 기동할 때, trap 로 지정되었다 (가 무시되어 있지 않다) 시그널을 디폴트의 동작에 재설정합니다. 쉘이 기동했을 때에 벌써 무시되도록(듯이) 설정되어 있던 시그널에 대해서 trap 명령을 사용해도 효과는 없습니다.

type [name ...]
    각 name (을)를 명령로서 해석해, 커멘드 검색의 결과를 출력합니다. 출력함 결과는 이하의 것이 있습니다. 쉘의 키워드, 앨리어스(alias), 쉘 의 편입 명령, 커멘드, 흔적 다하고 앨리어스(alias) (tracked alias), 마지막에 not found (발견되지 않고)가 있습니다. 앨리어스(alias)에 대해서는, 앨리어스(alias) 전개 의 결과가 출력됩니다. 명령와 흔적 다하고 앨리어스(alias)에 대해서는, 그 커멘드의 완전한 패스명이 인쇄됩니다.

ulimit [-HSabcdflmnstuv] [limit]
    리소스의 제한치 (리밋트치에 대해서는 getrlimit(2) 참조)를 설정 혹은 표시합니다. limit 하지만 지정되어 있는 경우, 지정된 리소스가 설정됩니다. 그 이외의 경우, 현재의 리소스 설정치가 표시됩니다.

    -H 하지만 지정되었을 경우, 하드 제한이 설정내지 표시됩니다. 하드 제한값을 내리는 것은 누구라도 할 수 있습니다만, 그것을 늘릴 수가 있는 것은 슈퍼 유저 뿐입니다. 옵션 -S (을)를 지정했을 경우는 소프트 제한이 됩니다. 제한치를 표시하는 경우, -S 인가 -H 의 어느쪽이든 한편밖에 지정할 수 없습니다. 디폴트에서는, 표시는 소프트 제한, 설정은 하드/소프트 리밋트 양쪽 모두입니다.

    옵션 -a (을)를 지정하면(자) ulimit 명령은 전리소스의 설정치를 표시합니다. 이 경우, 파라미터 limit (은)는 지정할 수 없습니다.

    이 다른 옵션은, 표시 혹은 설정하는 리소스의 종류를 지정하는 것입니다. 이것들은 서로 배타적입니다.

    -b sbsize
        소켓 버퍼 사이즈의 최대치. 바이트 단위.

    -c coredumpsize
        코어덤프 파일의 최대 사이즈. 512 바이트의 블록 단위.

    -d datasize
        프로세스의 데이터 세그먼트의 최대 사이즈. 킬로바이트 단위.

    -f filesize
        파일의 최대 사이즈. 512 바이트 블록 단위.

    -l lockedmem
        프로세스를 잠글 수 있는 메모 리사이즈의 최대치. 킬로바이트 단위.

    -m memoryuse
        프로세스의 상주 세트 사이즈의 최대치. 킬로바이트 단위.

    -n nofiles
        어느 프로세스를 오픈할 수 있는 파일 기술자의 최대수.

    -s stacksize
        스택 세그먼트 사이즈의 최대치. 킬로바이트 단위.

    -t time
        각 프로세스로 소비할 수 있는 CPU 시간의 최대치. 초단위.

    -u userproc
        이 유저 ID 로 동시에 달리게 한 파는 최대 프로세스수.

    -v virtualmem
        1 개의 프로세스의 최대 프로세스 사이즈. 킬로바이트 단위.

umask [mask]
    파일 작성 마스크의 값 ( umask(2) (을)를 참조)를, mask 그리고 지정된 8 진수의 값으로 설정합니다. 인수가 생략 되었을 경우, 현재의 마스크의 값이 표시됩니다.

unalias [-a] [name]
    name 하지만 지정되었을 경우, 지정된 이름의 앨리어스(alias)를 삭제합니다. -a 옵션이 지정되었을 경우, 모든 앨리어스(alias)를 삭제합니다.

unset [-fv] name ...
    지정된 변수 또는 함수를 unset 해, export되어 있지 않은 상태로 합니다. -v 옵션이 지정되는지, 옵션이 아무것도 지정되지 않았던 경우, name 인수는 변수명으로서 다루어집니다. -f 옵션이 지정되었을 경우, name 인수는 함수명으로서 다루어집니다.

wait [job]
    지정된 작업 job (이)가 종료되는 것을 기다려, 작업내의 마지막 프로세스의 종료 스테이터스를 돌려줍니다. 인수가 생략 되었을 경우, 모든 작업이 종료한다 까지 기다려, 종료 스테이터스 0 을 돌려줍니다.

  명령행 편집
sh 하지만 단말로부터 대화적으로 실행되고 있는 경우, 현재 입력중의 명령 및 명령 히스토리 ( 편입 명령 의 fc 참조)를 vi 모드의 명령행 편집 기능 에 의해 편집할 수가 있습니다. 이 모드에서는, vi 의 메뉴얼에 나타나고 있는 명령의 부분집합을 이용합니다. 명령 “set -o vi” (또는 “set -V”) 에 의해 vi 모드가 유효하게 되어, sh (은)는 vi 의 삽입 모드로 이행합니다. vi 모드중에서는, 삽입 모드와 명령 모드의 양쪽 모두를 자유롭게 바꾸는 것이 가능합니다. vi 모드는 vi 와 같고, <ESC> 키 에 의해 명령 모드로 이행해, 커멘드 모드로 <return> 키를 두드리는 것으로, 행의 내용이 쉘에게 건네집니다.

같이 명령 “set -o emacs” 에 의해 emacs 풍의 명령행 편집 기능의 부분집합을 사용할 수가 있게 됩니다.

관련 항목
builtin(1), echo(1), expr(1), printf(1), pwd(1), test(1)

역사
sh 명령은, AT&T UNIX 그리고 등장했습니다.