스크립팅 기능을 고수하겠습니다. 풍부한 대화 형 기능 (명령 줄 버전, 완료, 프롬프트 등)은 매우 다른 경향이있어 완전히 호환되지 않는 방식으로 유사한 효과를 얻습니다. 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 () {…}하지만 functionksh에서 범위 지정 규칙을 변경 name () …하면 호환성을 유지 해야 합니다. 함수 이름에서 허용되는 문자에 대한 규칙은 다양합니다. 영숫자 및 _.
Ksh93 및 mksh는 괄호 확장을 지원 {foo,bar}합니다. Ksh93은 숫자 범위를 지원 {1..42}하지만 mksh는 지원 하지 않습니다.
경우 ksh93 및 mksh 지원 문자열로 추출 ${VAR:offset}하고 ${VAR:offset:length}, 아닌 경우처럼 접는 ${VAR^}, ${VAR,}등 당신과 대소 문자 변환을 수행 할 수 있습니다 typeset -l및 typeset -ubash는 ksh을 모두.
${VAR/PATTERN/STRING}또는로 대체 할 수 ${VAR/PATTERN//STRING}있습니다. STRING의 인용 규칙은 약간 다르므로 STRING에서 백 슬래시 (및 다른 문자)를 피하십시오 (변수를 작성하고 ${VAR/PATTERN/$REPLACEMENT}대체에 인용 문자가 포함 된 경우 대신 사용 ).
배열 확장 ( ${ARRAY[KEY]}, "${ARRAY[@]}", ${#ARRAY[@]}, ${!ARRAY[@]}KSH처럼 떠들썩한 파티에) 작동합니다.
${!VAR}is (간접 변수 참조) ${OTHERVAR}의 값 이 bash 특정 일 때 확장됩니다 (ksh는와 다른 일을 함 ). 이 이중 확장을 ksh로 가져 오려면 대신 이름 참조를 사용해야합니다 ( ). 동일하게 작동합니다.VAROTHERVAR${!VAR}typeset -n VAR=OTHERVAR; echo "$VAR"${!PREFIX*}
프로세스 대체 <(…)이며 >(…)ksh93에서는 지원되지만 mksh에서는 지원되지 않습니다.
shopt -s extglobbash에서 활성화 해야하는 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있습니다.
declareksh에 대한 bash 특정 이름입니다 typeset. 사용 typeset: 그것은 또한 bash에서 작동합니다.
Mksh는 local에 대한 별칭으로 정의합니다 typeset. ksh93에서는 typeset별명 을 사용해야 합니다.
Mksh에는 연관 배열이 없습니다 (아직 출시되지 않은 버전으로 예정되어 있음).
typeset -tksh 에 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; 일부 설치에서는 printfmksh 내장이 아니며 대신 외부 명령을 호출합니다.
printf -v VAR bash 특정이며, ksh는 항상 표준 출력으로 인쇄합니다.
readline에 대한 모든 옵션을 포함하여 몇 가지 옵션은 bash에 따라 다릅니다. 옵션은 -r, -d, -n, -N, -t, -ubash는, 경우 ksh93 및 mksh에서 동일하다.
동일한 구문을 사용하여 Ksh93 및 mksh에서 변수를 읽기 전용으로 선언 할 수 있습니다. 변수가 배열 인 경우 먼저 변수를 할당 한 다음을 사용하여 읽기 전용으로 만드십시오 readonly VAR. ksh에서는 함수를 읽기 전용으로 만들 수 없습니다.
모든에 옵션 set및 set -oPOSIX 또는 ksh 기능입니다.
shoptbash 특정입니다. 어쨌든 많은 옵션은 대화식 사용과 관련이 있습니다. 일부 옵션으로 사용 가능한 글 로빙 및 기타 기능에 대한 효과는 아래의 "옵션"섹션을 참조하십시오.
이 변형은 .ksh에도 존재합니다. bash 및 mksh에서, source이후의 현재 디렉토리를 검색 PATH하지만 ksh93에서는 정확히 ..
DEBUG의사 신호 mksh에서 구현되지 않는다. ksh93에는 정보를보고하는 다른 방법이 있습니다. 자세한 내용은 설명서를 참조하십시오.
ksh에서 type의 별칭입니다 whence -v. mksh에서는 type -p실행 파일의 경로를 인쇄하지 않지만 사람이 읽을 수있는 메시지를 인쇄합니다. whence -p COMMAND대신 사용해야 합니다.
옵션
dotglobksh93 의 옵션 을 에뮬레이트하기 위해을 설정할 수 있습니다 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과 LINENOmksh에. BASH_SUBSHELL인 .sh.subshell경우 ksh93에서.
Mksh 및 ksh93은 ENV시작할 때 제공된 파일을 모두 소싱합니다 .
EUID그리고 UID경우 ksh93에 존재하지 않습니다. Mksh는 그들을 호출 USER_ID하고 KSH_UID; 이 없습니다 GROUPS.
FUNCNAME및 FUNCNESTKSH에 존재하지 않습니다. Ksh93에는 .sh.fun및이 .sh.level있습니다. function foo { …; }괄호없이 선언 된 함수는에 고유 한 이름을 갖습니다 $0.
GLOBIGNOREksh93에 존재하지만 이름과 구문이 다릅니다.이라고 FIGNORE하며 콜론으로 구분 된 목록이 아닌 단일 패턴입니다. @(…|…)패턴을 사용하십시오 . Ksh FIGNORE는 완전히 다른 구문으로 bash를 사용합니다.
Ksh93 및 mksh에는 HOSTTYPE, MACHTYPE및 같은 것이 없습니다 OSTYPE. 도 아니다 SHELLOPTS나 TIMEFORMAT.
Mksh에는 PIPESTATUS이지만 ksh93에는 없습니다.
Mksh 및 ksh93에는 RANDOM.