Komut dosyası özelliklerine bağlı kalacağım. Zengin etkileşimli özellikler (komut satırı sürümü, tamamlama, bilgi istemleri vb.) Çok farklı olma eğilimindedir ve tamamen uyumsuz şekillerde benzer efektler elde eder. Zsh'de hangi özellikler vardır ve bash'da yoktur veya tersi nedir? etkileşimli kullanım için birkaç işaret verir.
Bash'a en yakın şey ATT ksh93 veya mksh (Korn kabuğu ve bir klon) olacaktır. Zsh'ın bir dizi alt özelliği de vardır, ancak bunu zsh yerel modunda değil, ksh öykünme modunda çalıştırmanız gerekir.
POSIX özelliklerini (herhangi bir modern sh
kabukta bulunan) veya nispeten belirsiz özellikleri veya etkileşimli kullanım için yukarıda belirtildiği gibi listelemeyeceğim . Gözlemler, Debian wheezy'de bulunan bash 4.2, ksh 93u ve mksh 40.9.20120630'dan itibaren geçerlidir.
$'…'
(ters eğik çizgi enterpolasyonlu gerçek dizeler) ksh93 ve mksh'de kullanılabilir. "$"… "(Çevrilmiş dizeler) bash'a özgüdür.
Mksh ve ksh93 sahip ;&
bir yer düşmeye case
açıklamada, ancak ;;&
daha sonraki durumları test etmek. Mksh bunun ;|
için var ve son mksh ;;&
uyumluluğa izin veriyor .
((…))
aritmetik ifadeler ve [[ … ]]
testler ksh özellikleridir. Bazı koşullu işleçler farklıdır, aşağıdaki “koşullu ifadeler” konusuna bakın.
Ksh ve bash'ın her ikisi de ortak işlemlere sahiptir, ancak farklı çalışırlar.
Mksh ve ksh93 function name {…}
, standarda ek olarak fonksiyon tanımları için sözdizimini destekler name () {…}
, ancak function
ksh değişikliklerinde kapsam belirleme kurallarını kullanmak, bu nedenle name () …
uyumluluğu korumak için sadık kalın . İşlev adlarında izin verilen karakterler için kurallar değişir; alfanümeriklere bağlı kalmak ve _
.
Ksh93 ve mksh destek genişletmeyi destekler {foo,bar}
. Ksh93 sayısal aralıkları destekler {1..42}
ancak mksh desteklemez .
Ksh93 ve mksh destek alt dize ile ekstraksiyon ${VAR:offset}
ve ${VAR:offset:length}
ancak durum böyle katlanır ${VAR^}
, ${VAR,}
vb Sen durum dönüştürme yapabilirsiniz typeset -l
ve typeset -u
bash ve ksh hem de.
${VAR/PATTERN/STRING}
Veya ile değiştirmeyi desteklerler ${VAR/PATTERN//STRING}
. STRING için alıntı kuralları biraz farklıdır, bu nedenle STRING'de ters eğik çizgilerden (ve belki de diğer karakterlerden) kaçının (bir değişken oluşturun ve ${VAR/PATTERN/$REPLACEMENT}
yerine alıntı karakterleri içeriyorsa kullanın ).
Dizi genişleme ( ${ARRAY[KEY]}
, "${ARRAY[@]}"
, ${#ARRAY[@]}
, ${!ARRAY[@]}
ksh gibi bash) çalışır.
${!VAR}
Genişleyen ${OTHERVAR}
değeri zaman VAR
olduğu OTHERVAR
(dolaylı değişken referansı) bash özgü (Ksh ile birşeylerindeğiştiğini yapmasıdır ${!VAR}
). Bu çift genişletmeyi ksh olarak almak için, bunun yerine ( typeset -n VAR=OTHERVAR; echo "$VAR"
) bir ad başvurusu kullanmanız gerekir . ${!PREFIX*}
aynı şekilde çalışır.
Proses ikamesi <(…)
ve >(…)
ksh93'te desteklenir, ancak mksh'de desteklenmez.
shopt -s extglob
Bash'ta etkinleştirilmesi gereken ksh genişletilmiş glob kalıpları her zaman ksh93 ve mksh'de kullanılabilir.
Mksh gibi karakter sınıflarını desteklemez [[:alpha:]]
.
Bash ve ksh93 sözde dosyaları tanımlamak ve ancak mksh yok./dev/tcp/HOST/PORT
/dev/udp/HOST/PORT
Komut dosyalarında yeniden yönlendirmede joker karakterleri genişletmek ( bu dosya adı kalıp için tek eşleme ise var="*.txt"; echo hello >$a
yazılı olarak olduğu gibi a.txt
) bash'a özgü bir özelliktir (diğer kabuklar bunu komut dosyalarında asla yapmaz).
<<<
burada dizeler bash gibi ksh olarak çalışır.
>&
Sözdizimi hatalarını yeniden yönlendirme kısayolu da mksh tarafından desteklenir, ancak ksh93 tarafından desteklenmez.
[[ … ]]
çift parantez sözdizimi
Ksh'nin çift parantez sözdizimi bash'daki gibi ATT ksh93 ve mksh tarafından desteklenir.
Dosya operatörleri
Ksh93, mksh ve bash, -a
eski -e
, -k
(yapışkan), -G
( egid'e ait), (euid -O
sahibi), -ef
(aynı dosya), -nt
(daha yeni), -ot
(eski) eşanlamlıları da dahil olmak üzere POSIX ile aynı uzantıları destekler .
-N FILE
(son okunduğundan beri değiştirildi) mksh tarafından desteklenmiyor.
Mksh'de normal ifade eşleştirme operatörü yok =~
. Ksh93 bu operatöre sahiptir ve bash ile aynı eşleşmeyi gerçekleştirir, ancak BASH_REMATCH
daha sonra eşleşen grupları almak için eşdeğeri yoktur .
Dize işleçleri
Ksh93 ve aynı dize karşılaştırma operatörleri mksh destek <
ve >
Bash yanı sıra sıra ==
bir eş anlamlısı =
. Mksh, sözlük sırasını belirlemek için yerel ayarları kullanmaz, dizeleri bayt dizeleri olarak karşılaştırır.
Diğer operatörler
-v VAR
bir değişkenin tanımlanıp tanımlanmadığını bash'a özgü olup olmadığı Herhangi bir POSIX kabuğunda kullanabilirsiniz [ -z "${VAR+1}" ]
.
Takma adlardaki izin verilen karakter kümesi tüm kabuklarda aynı değildir. Bence bu işlevler ile aynıdır (yukarıya bakınız).
Ksh93 adlı bir yerleşik vardır builtin
, ancak yerleşik komut olarak bir ad yürütmez. command
Takma adları ve işlevleri atlamak için kullanın ; bu varsa, yerleşik bir çağrı, aksi takdirde harici bir komut çağıracaktır PATH= command error_out_if_this_is_not_a_builtin
.
Bu bash'e özgüdür. Sen benzer bir etkiyi elde edebilirsiniz .sh.fun
, .sh.file
ve .sh.lineno
ksh93 içinde. Mksh'de sonunda var LINENO
.
declare
ksh'lar için bash'a özgü bir isimdir typeset
. Kullanımı typeset
: bash da çalışır.
Mksh, local
için bir takma ad olarak tanımlar typeset
. Ksh93'te, kullanmanız typeset
(veya bir takma ad tanımlamanız) gerekir.
Mksh'nin ilişkilendirilebilir dizileri yoktur (henüz yayınlanmamış bir sürüm için sıralanmıştır).
typeset -t
Ksh'ta bash'ın (izleme fonksiyonu) tam bir eşdeğeri olduğunu sanmıyorum .
Ksh93 sahip değil -e
.
Ksh93 ve mksh -e
ve -n
bash gibi seçenekleri işler . Mksh da anlıyor -E
, ksh93 bunu bir seçenek olarak görmüyor. Ters eğik çizgi genişletmesi ksh93'te varsayılan olarak kapalı, mksh'de varsayılan olarak açıktır.
Ksh yerleşik komutları devre dışı bırakmanın bir yolunu sunmaz. Bir yerleşkeyi önlemek için, harici komutun yolunu arayın ve açıkça çağırın.
Ksh93 var -a
ama değil -l
. Mksh'ın hiçbiri yok.
Ne ksh93 ne de mksh yoktur export -n
. Kullanım typeset +x foo
bunun yerine, bash ve ksh çalışır.
Ksh, işlevleri çevre üzerinden dışa aktarmaz.
let
bash ve ksh için aynıdır.
Bu bash'a özgü bir özelliktir. Sen kullanabilirsiniz while read
bir dosyayı okumak ve çizgiler düzeni bölmek döngüler veya komut ikamesi. Özen IFS
ve globbing. İşte şuna eşdeğer mapfile -t lines </path/to/file
:
IFS=$'\n'; set -f
lines=($(</path/to/file))
unset IFS; set +f
printf
çok benzer. Bence ksh93 bash'ın tüm format direktiflerini destekliyor. mksh desteklemez %q
veya %(DATE_FORMAT)T
; bazı kurulumlarda printf
mksh yerleşik değildir ve bunun yerine harici komutu çağırır.
printf -v VAR
bash'a özgüdür, ksh her zaman standart çıktıya yazdırır.
Readline ile ilgili olanlar da dahil olmak üzere çeşitli seçenekler bash'a özgüdür. Seçenekleri -r
, -d
, -n
, -N
, -t
, -u
bash, ksh93 ve mksh aynıdır.
Bir değişkeni Ksh93 ve mksh'de aynı sözdizimiyle salt okunur olarak bildirebilirsiniz. Değişken bir diziyse, önce ona bir dizi atamanız, ardından onu salt okunur hale getirmeniz gerekir readonly VAR
. Fonksiyonlar ksh cinsinden salt okunur yapılamaz.
Tüm seçenekler set
ve set -o
POSIX veya Ksh özellikleridir.
shopt
bash'a özgüdür. Birçok seçenek yine de etkileşimli kullanımla ilgilidir. Globbing ve bazı seçeneklerin etkinleştirdiği diğer özellikler üzerindeki efektler için aşağıdaki “Seçenekler” bölümüne bakın.
Bu varyant çeşidi de .
ksh cinsindendir. Bash ve mksh'de source
geçerli dizinden sonra arar PATH
, ancak ksh93'te tam olarak eşdeğerdir .
.
DEBUG
Sinyalimsi mksh uygulanmadı. Ksh93'te, bilgiyi raporlamanın farklı bir yolu vardır, ayrıntılar için kılavuza bakın.
Ksh, type
için bir takma addır whence -v
. Mksh'de, type -p
yürütülebilir yolun yolunu değil, okunabilir bir iletiyi yazdırır; whence -p COMMAND
bunun yerine kullanmanız gerekir .
Seçenekler
shopt -s dotglob
- globbing'teki nokta dosyalarını yok saymayın
dotglob
Ksh93'deki seçeneği taklit etmek için ayarlayabilirsiniz FIGNORE='@(.|..)'
. Mksh'de böyle bir şey olduğunu sanmıyorum.
shopt -s extglob
- ksh genişletilmiş glob kalıpları
extglob
Opsiyon ksh hep etkili bir olduğunu.
shopt -s failglob
- bir küre deseni hiçbir şeyle eşleşmezse hata oluştu
Bunun mksh veya ksh93'te olduğunu sanmıyorum. Zsh ile yapılır ( null_glob
veya csh_null_glob
ayarlanmadığı sürece varsayılan davranış ).
Ksh93 ile birlikte **/
, özyinelemeli globbing vardır set -G
. Mksh'nin tekrarlayan bir küresi yoktur.
shopt -s lastpipe
- üst kabukta bir boru hattının son komutunu çalıştır
Ksh93, her zaman üst kabukta bir boru hattının son komutunu çalıştırır, bu da bash'da lastpipe
seçeneğin ayarlanmasını gerektirir . Mksh her zaman bir alt kabuktaki bir boru hattının son komutunu çalıştırır.
shopt -s nocaseglob
, shopt -s nocasematch
- büyük / küçük harfe duyarlı olmayan desenler
Mksh, büyük / küçük harfe duyarlı olmayan desen eşleşmesine sahip değildir. Ksh93 bunu desene göre destekler: desenin önüne önek ekler ~(i)
.
shopt -s nullglob
- hiçbir dosyayla eşleşen desenleri boş bir listeye genişletme
Mksh buna sahip değil. Ksh93 bunu desene göre destekler: desenin önüne önek ekler ~(N)
.
Açıkçası BASH_xxx
değişkenlerin çoğu ksh cinsinden yok. $BASHPID
pahalı ama taşınabilir özelliklerle taklit edilebilir sh -c 'echo $PPID'
ve son zamanlarda mksh'ye eklenmiştir. BASH_LINE
olduğu .sh.lineno
ksh93 ve LINENO
mksh içinde. BASH_SUBSHELL
olduğu .sh.subshell
ksh93 içinde.
Mksh ve ksh93 her ikisi de ENV
başlatıldıklarında verilen dosyayı kaynak eder .
EUID
ve UID
ksh93'te yoktur. Mksh onları arar USER_ID
ve KSH_UID
; yok GROUPS
.
FUNCNAME
ve FUNCNEST
ksh'ta yok. Ksh93 .sh.fun
ve vardır .sh.level
. function foo { …; }
(Parantez yok!) İle bildirilen işlevlerin kendi adları vardır $0
.
GLOBIGNORE
ksh93'te var, ancak farklı bir ad ve sözdizimiyle var: denir FIGNORE
ve iki nokta üst üste işaretli bir liste değil, tek bir modeldir. Bir @(…|…)
desen kullanın . Ksh'ın bash'ı FIGNORE
tamamen farklı bir sözdizimiyle geçer.
Ksh93 ve mksh gibi bir şey var HOSTTYPE
, MACHTYPE
ve OSTYPE
. Ne de SHELLOPTS
ya TIMEFORMAT
.
Mksh var PIPESTATUS
, ama ksh93 değil.
Mksh ve ksh93 var RANDOM
.