스크립팅 기능을 고수하겠습니다. 풍부한 대화 형 기능 (명령 줄 버전, 완료, 프롬프트 등)은 매우 다른 경향이있어 완전히 호환되지 않는 방식으로 유사한 효과를 얻습니다. zsh의 어떤 기능이 bash에서 누락되었거나 그 반대입니까? 대화식 사용에 대한 몇 가지 지침을 제공합니다.
bash에 가장 가까운 것은 ATT ksh93 또는 mksh (Korn 쉘 및 복제본)입니다. Zsh에는 기능의 하위 세트가 있지만 zsh 기본 모드가 아닌 ksh 에뮬레이션 모드에서 실행해야합니다.
POSIX 기능 (현대 sh
셸 에서 사용 가능 ), 상대적으로 모호한 기능 또는 대화식 사용을위한 위에서 언급 한 기능은 나열하지 않습니다 . 관찰은 데비안 wheezy에있는 bash 4.2, ksh 93u 및 mksh 40.9.20120630부터 유효합니다.
$'…'
ksh93 및 mksh에서 백 슬래시 보간이 포함 된 리터럴 문자열을 사용할 수 있습니다. `$ "…"(번역 된 문자열)은 bash에 따라 다릅니다.
Mksh 및 ksh93의는이 ;&
A의를 통해 가을에 case
문 있지만 ;;&
이후의 경우를 테스트 할 수 있습니다. Mksh는이를 ;|
위해 있으며 최근 mksh는 ;;&
호환성을 허용 합니다.
((…))
산술 표현식과 [[ … ]]
테스트는 ksh 기능입니다. 일부 조건부 연산자는 다릅니다 (아래의 "조건부 표현식"참조).
Ksh와 bash는 모두 공동 프로세스를 가지고 있지만 다르게 작동합니다.
Mksh 및 ksh93 function name {…}
은 표준 외에도 함수 정의에 대한 구문을 지원 name () {…}
하지만 function
ksh에서 범위 지정 규칙을 변경 name () …
하면 호환성을 유지 해야 합니다. 함수 이름에서 허용되는 문자에 대한 규칙은 다양합니다. 영숫자 및 _
.
Ksh93 및 mksh는 괄호 확장을 지원 {foo,bar}
합니다. Ksh93은 숫자 범위를 지원 {1..42}
하지만 mksh는 지원 하지 않습니다.
경우 ksh93 및 mksh 지원 문자열로 추출 ${VAR:offset}
하고 ${VAR:offset:length}
, 아닌 경우처럼 접는 ${VAR^}
, ${VAR,}
등 당신과 대소 문자 변환을 수행 할 수 있습니다 typeset -l
및 typeset -u
bash는 ksh을 모두.
${VAR/PATTERN/STRING}
또는로 대체 할 수 ${VAR/PATTERN//STRING}
있습니다. STRING의 인용 규칙은 약간 다르므로 STRING에서 백 슬래시 (및 다른 문자)를 피하십시오 (변수를 작성하고 ${VAR/PATTERN/$REPLACEMENT}
대체에 인용 문자가 포함 된 경우 대신 사용 ).
배열 확장 ( ${ARRAY[KEY]}
, "${ARRAY[@]}"
, ${#ARRAY[@]}
, ${!ARRAY[@]}
KSH처럼 떠들썩한 파티에) 작동합니다.
${!VAR}
is (간접 변수 참조) ${OTHERVAR}
의 값 이 bash 특정 일 때 확장됩니다 (ksh는와 다른 일을 함 ). 이 이중 확장을 ksh로 가져 오려면 대신 이름 참조를 사용해야합니다 ( ). 동일하게 작동합니다.VAR
OTHERVAR
${!VAR}
typeset -n VAR=OTHERVAR; echo "$VAR"
${!PREFIX*}
프로세스 대체 <(…)
이며 >(…)
ksh93에서는 지원되지만 mksh에서는 지원되지 않습니다.
shopt -s extglob
bash에서 활성화 해야하는 ksh 확장 글로브 패턴 은 항상 ksh93 및 mksh에서 사용 가능합니다.
Mksh는와 같은 문자 클래스를 지원하지 않습니다 [[:alpha:]]
.
Bash와 ksh93은 의사 파일 과를 정의 하지만 mksh는 정의 하지 않습니다./dev/tcp/HOST/PORT
/dev/udp/HOST/PORT
스크립트에서 리디렉션으로 와일드 카드를 확장 하면 (파일 이름이 패턴과 유일한 일치 var="*.txt"; echo hello >$a
하는 a.txt
경우 에 쓰는 것처럼) bash 관련 기능입니다 (다른 쉘은 스크립트에서 수행하지 않습니다).
<<<
here-strings는 bash와 마찬가지로 ksh에서 작동합니다.
>&
구문 오류를 리디렉션 하는 바로 가기 는 mksh에서도 지원되지만 ksh93에서는 지원되지 않습니다.
[[ … ]]
이중 괄호 구문
ksh의 이중 대괄호 구문은 bash에서와 같이 ATT ksh93 및 mksh에서 모두 지원됩니다.
파일 연산자
Ksh93, mksh 및 bash -a
는 -e
, -k
(sticky), -G
(egid가 소유 한), -O
(euid가 소유 한 ), -ef
(동일한 파일), -nt
(보다 -ot
오래된 ), ( 보다 오래된) 동의어를 포함하여 POSIX에 대한 동일한 확장을 지원합니다 .
-N FILE
mksh는 (마지막 읽기 이후 수정)를 지원하지 않습니다.
Mksh에는 정규 표현식 일치 연산자가 없습니다 =~
. Ksh93에는이 연산자가 있으며 bash에서와 동일한 일치를 수행하지만 BASH_REMATCH
나중에 일치하는 그룹을 검색 하는 것과 동등한 기능은 없습니다 .
문자열 연산자
Ksh93 및 mksh는 동일한 문자열 비교 연산자 <
와 >
bash 및 ==
동의어를 지원 =
합니다. Mksh는 사전 설정 순서를 판별하기 위해 로케일 설정을 사용하지 않고 문자열을 바이트 문자열로 비교합니다.
다른 연산자
-v VAR
변수가 정의되어 있는지 테스트하는 것은 bash마다 다릅니다. 모든 POSIX 셸에서을 사용할 수 있습니다 [ -z "${VAR+1}" ]
.
별명에서 허용되는 문자 세트는 모든 쉘에서 동일하지 않습니다. 기능과 동일하다고 생각합니다 (위 참조).
Ksh93에는이라는 내장 기능이 builtin
있지만 내장 명령 으로 이름을 실행하지는 않습니다. command
별명 및 기능을 무시하는 데 사용 합니다. 내장 명령이 있으면 내장 함수를 호출하고 그렇지 않으면 외부 명령을 사용합니다 (로 피할 수 있음 PATH= command error_out_if_this_is_not_a_builtin
).
이것은 bash 특정입니다. 당신과 비슷한 효과를 얻을 수 있습니다 .sh.fun
, .sh.file
그리고 .sh.lineno
경우 ksh93있다. mksh에는 마침내 LINENO
있습니다.
declare
ksh에 대한 bash 특정 이름입니다 typeset
. 사용 typeset
: 그것은 또한 bash에서 작동합니다.
Mksh는 local
에 대한 별칭으로 정의합니다 typeset
. ksh93에서는 typeset
별명 을 사용해야 합니다.
Mksh에는 연관 배열이 없습니다 (아직 출시되지 않은 버전으로 예정되어 있음).
typeset -t
ksh 에 bash (추적 기능) 와 정확히 동등한 것으로 생각하지 않습니다 .
Ksh93에는 없습니다 -e
.
Ksh93 및 mksh 는 bash에서 -e
와 -n
같이 및 옵션을 처리합니다 . Mksh도 이해합니다 -E
. ksh93 은이를 옵션으로 취급하지 않습니다. ksh93에서는 백 슬래시 확장이 기본적으로 꺼져 있고 mksh에서는 기본적으로 켜져 있습니다.
Ksh는 내장 명령을 비활성화하는 방법을 제공하지 않습니다. 내장을 피하려면 외부 명령의 경로를 찾아 명시 적으로 호출하십시오.
Ksh93에는 -a
있지만 없습니다 -l
. MKSH도 없습니다.
ksh93도 mksh도 없습니다 export -n
. 를 사용 typeset +x foo
하는 대신, 그것은 떠들썩한 파티와 KSH에서 작동합니다.
Ksh는 환경을 통해 기능을 내 보내지 않습니다.
let
bash와 ksh에서 동일합니다.
이것은 bash 특정 기능입니다. while read
루프 나 명령 대체를 사용 하여 파일을 읽고 여러 줄로 나눌 수 있습니다. 조심 IFS
하고 낀다. 다음은 다음과 같습니다 mapfile -t lines </path/to/file
.
IFS=$'\n'; set -f
lines=($(</path/to/file))
unset IFS; set +f
printf
매우 비슷합니다. ksh93은 모든 bash의 형식 지시문을 지원한다고 생각합니다. mksh는 지원하지 않습니다 %q
또는 %(DATE_FORMAT)T
; 일부 설치에서는 printf
mksh 내장이 아니며 대신 외부 명령을 호출합니다.
printf -v VAR
bash 특정이며, ksh는 항상 표준 출력으로 인쇄합니다.
readline에 대한 모든 옵션을 포함하여 몇 가지 옵션은 bash에 따라 다릅니다. 옵션은 -r
, -d
, -n
, -N
, -t
, -u
bash는, 경우 ksh93 및 mksh에서 동일하다.
동일한 구문을 사용하여 Ksh93 및 mksh에서 변수를 읽기 전용으로 선언 할 수 있습니다. 변수가 배열 인 경우 먼저 변수를 할당 한 다음을 사용하여 읽기 전용으로 만드십시오 readonly VAR
. ksh에서는 함수를 읽기 전용으로 만들 수 없습니다.
모든에 옵션 set
및 set -o
POSIX 또는 ksh 기능입니다.
shopt
bash 특정입니다. 어쨌든 많은 옵션은 대화식 사용과 관련이 있습니다. 일부 옵션으로 사용 가능한 글 로빙 및 기타 기능에 대한 효과는 아래의 "옵션"섹션을 참조하십시오.
이 변형은 .
ksh에도 존재합니다. bash 및 mksh에서, source
이후의 현재 디렉토리를 검색 PATH
하지만 ksh93에서는 정확히 .
.
DEBUG
의사 신호 mksh에서 구현되지 않는다. ksh93에는 정보를보고하는 다른 방법이 있습니다. 자세한 내용은 설명서를 참조하십시오.
ksh에서 type
의 별칭입니다 whence -v
. mksh에서는 type -p
실행 파일의 경로를 인쇄하지 않지만 사람이 읽을 수있는 메시지를 인쇄합니다. whence -p COMMAND
대신 사용해야 합니다.
옵션
dotglob
ksh93 의 옵션 을 에뮬레이트하기 위해을 설정할 수 있습니다 FIGNORE='@(.|..)'
. mksh에는 이와 같은 것이 없다고 생각합니다.
이 extglob
옵션은 항상 ksh에서 유효합니다.
나는 이것이 mksh 또는 ksh93에 존재하지 않는다고 생각한다. zsh에서 수행됩니다 ( null_glob
또는 csh_null_glob
설정 하지 않은 경우 기본 동작 ).
Ksh93은을 (를 **/
) 사용하여 재귀 적 globbing을 사용합니다 set -G
. Mksh에는 재귀 적 globbing이 없습니다.
Ksh93은 항상 상위 쉘에서 파이프 라인의 마지막 명령을 실행하며, bash에서는 lastpipe
옵션을 설정 해야합니다 . Mksh는 항상 서브 쉘에서 파이프 라인의 마지막 명령을 실행합니다.
shopt -s nocaseglob
, shopt -s nocasematch
- 대소 문자를 구분하지 않는 패턴
Mksh에는 대소 문자를 구분하지 않는 패턴 일치가 없습니다. Ksh93은 패턴별로 패턴을 지원 ~(i)
합니다. 패턴 앞에 접두사를 붙입니다 .
Mksh는 이것을 가지고 있지 않습니다. Ksh93은 패턴별로 패턴을 지원 ~(N)
합니다. 패턴 앞에 접두사를 붙입니다 .
분명히 대부분의 BASH_xxx
변수는 ksh에 존재하지 않습니다. $BASHPID
비용이 많이 들지만 휴대용으로 에뮬레이션 할 수 있으며 sh -c 'echo $PPID'
최근 mksh에 추가되었습니다. BASH_LINE
인 .sh.lineno
경우 ksh93과 LINENO
mksh에. BASH_SUBSHELL
인 .sh.subshell
경우 ksh93에서.
Mksh 및 ksh93은 ENV
시작할 때 제공된 파일을 모두 소싱합니다 .
EUID
그리고 UID
경우 ksh93에 존재하지 않습니다. Mksh는 그들을 호출 USER_ID
하고 KSH_UID
; 이 없습니다 GROUPS
.
FUNCNAME
및 FUNCNEST
KSH에 존재하지 않습니다. Ksh93에는 .sh.fun
및이 .sh.level
있습니다. function foo { …; }
괄호없이 선언 된 함수는에 고유 한 이름을 갖습니다 $0
.
GLOBIGNORE
ksh93에 존재하지만 이름과 구문이 다릅니다.이라고 FIGNORE
하며 콜론으로 구분 된 목록이 아닌 단일 패턴입니다. @(…|…)
패턴을 사용하십시오 . Ksh FIGNORE
는 완전히 다른 구문으로 bash를 사용합니다.
Ksh93 및 mksh에는 HOSTTYPE
, MACHTYPE
및 같은 것이 없습니다 OSTYPE
. 도 아니다 SHELLOPTS
나 TIMEFORMAT
.
Mksh에는 PIPESTATUS
이지만 ksh93에는 없습니다.
Mksh 및 ksh93에는 RANDOM
.