Saya akan tetap menggunakan fitur scripting. Fitur-fitur interaktif yang kaya (edisi baris perintah, penyelesaian, konfirmasi, dll.) Cenderung sangat berbeda, mencapai efek yang sama dengan cara yang sepenuhnya tidak kompatibel. Fitur apa yang ada di zsh dan hilang dari bash, atau sebaliknya? memberikan beberapa petunjuk tentang penggunaan interaktif.
Hal terdekat dengan bash adalah ATT ksh93 atau mksh (shell Korn dan klon). Zsh juga memiliki subset fitur, tetapi Anda harus menjalankannya dalam mode emulasi ksh, bukan dalam mode asli zsh.
Saya tidak akan mencantumkan fitur POSIX (yang tersedia di sh
shell modern ), atau fitur yang relatif tidak jelas, atau seperti yang disebutkan di atas untuk penggunaan interaktif. Pengamatan valid pada bash 4.2, ksh 93u dan mksh 40.9.20120630 seperti yang ditemukan di Debian wheezy.
$'…'
(string literal dengan interpolasi backslash) tersedia dalam ksh93 dan mksh. `$" ... "(string yang diterjemahkan) adalah khusus untuk bash.
Mksh dan ksh93 harus ;&
melalui case
pernyataan, tetapi tidak ;;&
untuk menguji kasus selanjutnya. Mksh memiliki ;|
untuk itu, dan mksh baru-baru ini memungkinkan ;;&
untuk kompatibilitas.
((…))
ekspresi dan [[ … ]]
tes aritmatika adalah fitur ksh. Beberapa operator kondisional berbeda, lihat “ekspresi kondisional” di bawah.
Ksh dan bash keduanya memiliki proses ulang tetapi mereka bekerja secara berbeda.
Mksh dan ksh93 mendukung function name {…}
sintaks untuk definisi fungsi di samping standar name () {…}
, tetapi menggunakan function
dalam ksh mengubah aturan pelingkupan, jadi pertahankan name () …
untuk menjaga kompatibilitas. Aturan untuk karakter yang diizinkan dalam nama fungsi bervariasi; tetap menggunakan alfanumerik dan _
.
Ksh93 dan mksh mendukung ekspansi brace {foo,bar}
. Ksh93 mendukung rentang numerik {1..42}
tetapi mksh tidak.
Ksh93 dan mksh dukungan ekstraksi substring dengan ${VAR:offset}
dan ${VAR:offset:length}
, tetapi tidak terjadi lipat seperti ${VAR^}
, ${VAR,}
, dll Anda dapat melakukan konversi kasus dengan typeset -l
dan typeset -u
di kedua bash dan ksh.
Mereka mendukung penggantian dengan ${VAR/PATTERN/STRING}
atau ${VAR/PATTERN//STRING}
. Aturan kutip untuk STRING sedikit berbeda, jadi hindari garis miring terbalik (dan mungkin karakter lain) di STRING (buat variabel dan gunakan ${VAR/PATTERN/$REPLACEMENT}
sebagai gantinya jika pengganti berisi karakter kutip).
Ekspansi Array ( ${ARRAY[KEY]}
, "${ARRAY[@]}"
, ${#ARRAY[@]}
, ${!ARRAY[@]}
) bekerja di bash seperti di ksh.
${!VAR}
meluas ke ${OTHERVAR}
saat nilai VAR
is OTHERVAR
(referensi variabel tidak langsung) spesifik-bash (ksh melakukan sesuatu yang berbeda dengan ${!VAR}
). Untuk mendapatkan ekspansi ganda dalam ksh, Anda harus menggunakan referensi nama sebagai gantinya ( typeset -n VAR=OTHERVAR; echo "$VAR"
). ${!PREFIX*}
bekerja sama.
Proses substitusi <(…)
dan >(…)
didukung dalam ksh93 tetapi tidak dalam mksh.
Pola ksh extended glob yang perlu shopt -s extglob
diaktifkan dalam bash selalu tersedia di ksh93 dan mksh.
Mksh tidak mendukung kelas karakter seperti [[:alpha:]]
.
Bash dan ksh93 mendefinisikan pseudo-file dan , tetapi mksh tidak./dev/tcp/HOST/PORT
/dev/udp/HOST/PORT
Memperluas wildcard dalam pengalihan dalam skrip (seperti dalam var="*.txt"; echo hello >$a
penulisan a.txt
jika nama file itu satu-satunya yang cocok dengan pola) adalah fitur khusus bash (shell lain tidak pernah melakukannya dalam skrip).
<<<
di sini-string bekerja di ksh seperti di bash.
Jalan pintas >&
untuk mengarahkan ulang kesalahan sintaks juga didukung oleh mksh tetapi tidak oleh ksh93.
[[ … ]]
sintaks braket ganda
Sintaks braket ganda dari ksh didukung oleh ATT ksh93 dan mksh seperti pada bash.
Operator file
Ksh93, mksh dan bash mendukung ekstensi yang sama untuk POSIX, termasuk -a
sebagai sinonim usang -e
, -k
(sticky), -G
(dimiliki oleh egid), -O
(pemilik oleh euid), -ef
(file yang sama), -nt
(lebih baru dari), -ot
(lebih tua dari).
-N FILE
(dimodifikasi sejak baca terakhir) tidak didukung oleh mksh.
Mksh tidak memiliki operator pencocokan regexp =~
. Ksh93 memiliki operator ini, dan melakukan pencocokan yang sama seperti di bash, tetapi tidak memiliki yang setara dengan BASH_REMATCH
untuk mengambil grup yang cocok setelahnya.
Operator string
Ksh93 dan mksh mendukung operator perbandingan string yang sama <
dan >
juga bash serta ==
sinonim dari =
. Mksh tidak menggunakan pengaturan lokal untuk menentukan urutan leksikografis, ia membandingkan string sebagai string byte.
Operator lain
-v VAR
untuk menguji apakah suatu variabel didefinisikan spesifik-bash. Di setiap shell POSIX, Anda dapat menggunakan [ -z "${VAR+1}" ]
.
Set karakter yang diizinkan dalam nama alias tidak sama di semua shell. Saya pikir itu sama dengan fungsi (lihat di atas).
Ksh93 memiliki builtin yang dipanggil builtin
, tetapi tidak menjalankan nama sebagai perintah built-in. Gunakan command
untuk memotong alias dan fungsi; ini akan memanggil builtin jika ada, jika tidak, perintah eksternal (Anda dapat menghindari ini dengan PATH= command error_out_if_this_is_not_a_builtin
).
Ini khusus untuk bash. Anda bisa mendapatkan efek serupa dengan .sh.fun
, .sh.file
dan .sh.lineno
di ksh93. Di mksh akhirnya ada LINENO
.
declare
adalah nama spesifik-bash untuk ksh typeset
. Gunakan typeset
: ini juga bekerja di bash.
Mksh mendefinisikan local
sebagai alias untuk typeset
. Di ksh93, Anda perlu menggunakan typeset
(atau mendefinisikan alias).
Mksh tidak memiliki array asosiatif (mereka dijadwalkan untuk versi yang belum dirilis).
Saya tidak berpikir ada yang sama persis dengan typeset -t
(fungsi jejak) bash di ksh.
Ksh93 tidak punya -e
.
Ksh93 dan mksh memproses -e
dan -n
opsi seperti di bash. Mksh juga mengerti -E
, ksh93 tidak memperlakukannya sebagai opsi. Ekspansi Backslash dimatikan secara default di ksh93, diaktifkan secara default di mksh.
Ksh tidak menyediakan cara untuk menonaktifkan perintah builtin. Untuk menghindari builtin, cari jalur perintah eksternal dan aktifkan secara eksplisit.
Ksh93 memiliki -a
tetapi tidak -l
. Mksh tidak memiliki keduanya.
Baik ksh93 maupun mksh tidak export -n
. Gunakan typeset +x foo
sebagai gantinya, ia bekerja di bash dan ksh.
Ksh tidak mengekspor fungsi melalui lingkungan.
let
sama di bash dan ksh.
Ini adalah fitur khusus bash. Anda dapat menggunakan while read
loop atau substitusi perintah untuk membaca file dan membaginya menjadi array baris. Jaga IFS
dan globbing. Ini setara dengan mapfile -t lines </path/to/file
:
IFS=$'\n'; set -f
lines=($(</path/to/file))
unset IFS; set +f
printf
sangat mirip. Saya pikir ksh93 mendukung semua arahan format bash. mksh tidak mendukung %q
atau %(DATE_FORMAT)T
; pada beberapa instalasi, printf
bukan mksh builtin dan memanggil perintah eksternal sebagai gantinya.
printf -v VAR
spesifik-bash, ksh selalu mencetak ke output standar.
Beberapa opsi spesifik untuk bash, termasuk semua opsi tentang readline. Pilihan -r
, -d
, -n
, -N
, -t
, -u
identik di bash, ksh93 dan mksh.
Anda bisa mendeklarasikan variabel sebagai read-only di Ksh93 dan mksh dengan sintaks yang sama. Jika variabelnya adalah array, Anda harus menetapkannya terlebih dahulu, kemudian membuatnya hanya-baca readonly VAR
. Fungsi tidak dapat dibuat hanya-baca dalam ksh.
Semua opsi ke set
dan set -o
merupakan fitur POSIX atau ksh.
shopt
spesifik untuk bash. Banyak pilihan yang menyangkut penggunaan interaktif. Untuk efek pada penggumpalan dan fitur lain yang diaktifkan oleh beberapa opsi, lihat bagian "Opsi" di bawah ini.
Varian ini .
ada di ksh juga. Di bash dan mksh, source
cari direktori saat ini setelahnya PATH
, tetapi di ksh93, ini persis sama dengan .
.
The DEBUG
pseudo-sinyal tidak dilaksanakan di mksh. Di ksh93, ia ada dengan cara berbeda untuk melaporkan informasi, lihat manual untuk detailnya.
Di ksh, type
adalah alias untuk whence -v
. Di mksh, type -p
tidak mencetak path ke executable, tetapi pesan yang bisa dibaca manusia; Anda harus menggunakannya whence -p COMMAND
sebagai gantinya.
Pilihan
shopt -s dotglob
- jangan abaikan file dot di globbing
Untuk meniru dotglob
opsi dalam ksh93, Anda dapat mengatur FIGNORE='@(.|..)'
. Saya tidak berpikir ada yang seperti ini di mksh.
shopt -s extglob
- ksh diperpanjang pola gumpalan
The extglob
pilihan adalah efektif selalu di ksh.
shopt -s failglob
- Kesalahan jika pola glob tidak cocok dengan apa pun
Saya tidak berpikir ini ada di mksh atau ksh93. Itu dalam zsh (perilaku default kecuali null_glob
atau csh_null_glob
diatur).
Ksh93 memiliki globbing rekursif dengan **/
, diaktifkan dengan set -G
. Mksh tidak memiliki globbing rekursif.
shopt -s lastpipe
- Jalankan perintah terakhir dari sebuah pipa di shell induk
Ksh93 selalu menjalankan perintah terakhir dari sebuah pipeline di shell induk, yang dalam bash membutuhkan lastpipe
opsi untuk diatur. Mksh selalu menjalankan perintah terakhir dari sebuah pipa dalam sebuah subkulit.
shopt -s nocaseglob
, shopt -s nocasematch
- pola case-insensitive
Mksh tidak memiliki pencocokan pola case-insensitive. Ksh93 mendukungnya berdasarkan pola-demi-pola: awali pola dengan ~(i)
.
shopt -s nullglob
- perluas pola yang tidak cocok dengan file ke daftar kosong
Mksh tidak punya ini. Ksh93 mendukungnya berdasarkan pola-demi-pola: awali pola dengan ~(N)
.
Jelas sebagian besar BASH_xxx
variabel tidak ada di ksh. $BASHPID
dapat ditiru dengan mahal tapi portabel sh -c 'echo $PPID'
, dan baru-baru ini ditambahkan ke mksh. BASH_LINE
ada .sh.lineno
di ksh93 dan LINENO
di mksh. BASH_SUBSHELL
ada .sh.subshell
di ksh93.
Mksh dan ksh93 keduanya sumber file yang diberikan ENV
ketika mereka memulai.
EUID
dan UID
tidak ada di ksh93. Mksh memanggil mereka USER_ID
dan KSH_UID
; tidak ada GROUPS
.
FUNCNAME
dan FUNCNEST
tidak ada di ksh. Ksh93 memiliki .sh.fun
dan .sh.level
. Fungsi yang dideklarasikan dengan function foo { …; }
(tanpa tanda kurung!) Memiliki nama sendiri di $0
.
GLOBIGNORE
ada di ksh93 tetapi dengan nama dan sintaks yang berbeda: itu disebut FIGNORE
, dan itu adalah pola tunggal, bukan daftar yang dipisahkan titik dua. Gunakan @(…|…)
pola. Ksh FIGNORE
mengelompokkan bash, dengan sintaks yang sama sekali berbeda.
Ksh93 dan mksh tidak ada yang suka HOSTTYPE
, MACHTYPE
dan OSTYPE
. Atau SHELLOPTS
atau TIMEFORMAT
.
Mksh punya PIPESTATUS
, tapi ksh93 tidak.
Mksh dan ksh93 miliki RANDOM
.