Ich bleibe bei den Skriptfunktionen. Umfangreiche interaktive Funktionen (Befehlszeilenausgabe, Vervollständigung, Eingabeaufforderungen usw.) sind in der Regel sehr unterschiedlich und erzielen ähnliche Effekte auf völlig inkompatible Weise. Welche Funktionen sind in zsh enthalten und fehlen in bash oder umgekehrt? gibt einige Hinweise zur interaktiven Verwendung.
Am nächsten an Bash wäre ATT ksh93 oder mksh (die Korn-Shell und ein Klon). Zsh hat auch eine Teilmenge von Funktionen, aber Sie müssten es im ksh-Emulationsmodus ausführen, nicht im nativen zsh-Modus.
Ich werde weder POSIX- Funktionen (die in einer modernen sh
Shell verfügbar sind ) noch relativ undurchsichtige Funktionen oder wie oben erwähnt Funktionen für die interaktive Verwendung auflisten. Die Beobachtungen gelten ab Bash 4.2, ksh 93u und mksh 40.9.20120630, wie sie auf Debian Wheezy zu finden sind.
$'…'
(Literalstrings mit Backslash-Interpolation) ist in ksh93 und mksh verfügbar. `$" ... "(übersetzte Zeichenfolgen) ist bash-spezifisch.
Mksh und ksh93 müssen ;&
in einer case
Anweisung durchfallen , aber ;;&
nachfolgende Fälle nicht testen. Mksh hat ;|
dafür und aktuelles Mksh ermöglicht ;;&
Kompatibilität.
((…))
arithmetische Ausdrücke und [[ … ]]
Tests sind ksh-Merkmale. Einige bedingte Operatoren unterscheiden sich, siehe „Bedingte Ausdrücke“ weiter unten.
Ksh und Bash haben beide Coprozesse, aber sie funktionieren unterschiedlich.
Mksh und ksh93 unterstützen function name {…}
zusätzlich zum Standard die Syntax für Funktionsdefinitionen. Die name () {…}
Verwendung function
in ksh ändert jedoch die Gültigkeitsbereichsregeln. name () …
Halten Sie sich daher an die Kompatibilität. Die Regeln für zulässige Zeichen in Funktionsnamen variieren. halte dich an alphanumerische Zeichen und _
.
Ksh93 und mksh unterstützen die Erweiterung der Zahnspange {foo,bar}
. Ksh93 unterstützt numerische Bereiche {1..42}
, mksh jedoch nicht.
Ksh93 und mksh Unterstützung Teilzeichenfolge Extraktion mit ${VAR:offset}
und ${VAR:offset:length}
, aber nicht Fall Falten wie ${VAR^}
, ${VAR,}
usw. Sie können mit Fall Konvertierung zu tun typeset -l
und typeset -u
in beiden bash und ksh.
Sie unterstützen den Ersatz durch ${VAR/PATTERN/STRING}
oder ${VAR/PATTERN//STRING}
. Die Anführungszeichen für STRING unterscheiden sich geringfügig. Vermeiden Sie daher Backslashes (und möglicherweise andere Zeichen) in STRING (erstellen Sie eine Variable und verwenden Sie sie ${VAR/PATTERN/$REPLACEMENT}
stattdessen, wenn die Ersetzung Anführungszeichen enthält).
Array - Erweiterung ( ${ARRAY[KEY]}
, "${ARRAY[@]}"
, ${#ARRAY[@]}
, ${!ARRAY[@]}
) Arbeit in bash wie in KSH.
${!VAR}
Erweitern auf, ${OTHERVAR}
wenn der Wert von VAR
is OTHERVAR
(indirekte Variablenreferenz) bash-spezifisch ist (ksh macht etwas anderes mit ${!VAR}
). Um diese doppelte Erweiterung in ksh zu erhalten, müssen Sie stattdessen eine Namensreferenz verwenden ( typeset -n VAR=OTHERVAR; echo "$VAR"
). ${!PREFIX*}
funktioniert genauso.
Prozessersetzung <(…)
und >(…)
wird in ksh93, aber nicht in mksh unterstützt.
Die erweiterten ksh-Glob-Muster, shopt -s extglob
die in bash aktiviert werden müssen , sind immer in ksh93 und mksh verfügbar.
Mksh unterstützt keine Charakterklassen wie [[:alpha:]]
.
Bash und ksh93 definieren Pseudodateien und , mksh jedoch nicht./dev/tcp/HOST/PORT
/dev/udp/HOST/PORT
Das Erweitern von Platzhaltern in einer Umleitung in Skripten (wie beim var="*.txt"; echo hello >$a
Schreiben, a.txt
wenn dieser Dateiname die einzige Übereinstimmung mit dem Muster ist) ist eine Bash-spezifische Funktion (andere Shells tun dies niemals in Skripten).
<<<
Here-Strings funktionieren in ksh wie in bash.
Die Verknüpfung >&
zum Umleiten von Syntaxfehlern wird auch von mksh unterstützt, nicht jedoch von ksh93.
[[ … ]]
Syntax mit doppelten Klammern
Die Double-Bracket-Syntax von ksh wird sowohl von ATT ksh93 als auch von mksh wie in bash unterstützt.
Dateibetreiber
Ksh93, mksh und Bash unterstützt die gleichen Erweiterungen POSIX, darunter -a
als veraltet Synonym für -e
, -k
(klebrig), -G
(von egid Besitz), -O
(Inhaber von euid), -ef
(gleicher Datei), -nt
(neuer als), -ot
(älter als).
-N FILE
(geändert seit dem letzten Lesen) wird von mksh nicht unterstützt.
Mksh hat keinen Regexp-Matching-Operator =~
. Ksh93 hat diesen Operator und führt den gleichen Abgleich wie in bash durch, hat jedoch nicht das Äquivalent BASH_REMATCH
, um übereinstimmende Gruppen anschließend abzurufen.
String-Operatoren
Ksh93 und mksh unterstützen dieselben Zeichenfolgenvergleichsoperatoren <
und >
als bash sowie das ==
Synonym von =
. Mksh verwendet keine Gebietsschemaeinstellungen, um die lexikografische Reihenfolge zu bestimmen, sondern vergleicht Zeichenfolgen als Bytezeichenfolgen.
Andere Betreiber
-v VAR
zu testen, ob eine Variable definiert ist, ist bash-spezifisch. In jeder POSIX-Shell können Sie verwenden [ -z "${VAR+1}" ]
.
Der Satz zulässiger Zeichen in Aliasnamen ist nicht in allen Shells gleich. Ich denke, es ist das gleiche wie für Funktionen (siehe oben).
Ksh93 hat einen eingebauten Befehl builtin
, führt jedoch keinen Namen als eingebauten Befehl aus. Verwenden Sie command
diese Option, um Aliase und Funktionen zu umgehen. Dies ruft ein eingebautes auf, falls eines vorhanden ist, andernfalls einen externen Befehl (Sie können dies mit vermeiden PATH= command error_out_if_this_is_not_a_builtin
).
Dies ist bash-spezifisch. Sie können einen ähnlichen Effekt mit bekommen .sh.fun
, .sh.file
und .sh.lineno
in ksh93. In mksh gibt es endlich LINENO
.
declare
ist ein bash-spezifischer Name für ksh's typeset
. Verwendung typeset
: Es funktioniert auch in Bash.
Mksh definiert local
als Alias für typeset
. In ksh93 müssen Sie typeset
einen Alias verwenden (oder definieren).
Mksh hat keine assoziativen Arrays (sie sind für eine noch nicht veröffentlichte Version vorgesehen).
Ich glaube nicht, dass es typeset -t
in ksh ein genaues Äquivalent zu bashs (Trace-Funktion) gibt.
Ksh93 hat nicht -e
.
Ksh93 und mksh verarbeiten die Optionen -e
und -n
wie in bash. Mksh versteht auch -E
, dass ksh93 es nicht als Option behandelt. Die Backslash-Erweiterung ist in ksh93 standardmäßig deaktiviert, in mksh standardmäßig aktiviert.
Ksh bietet keine Möglichkeit, integrierte Befehle zu deaktivieren. Um eine integrierte Funktion zu vermeiden, suchen Sie den Pfad des externen Befehls und rufen Sie ihn explizit auf.
Ksh93 hat -a
aber nicht -l
. Mksh hat keine.
Weder ksh93 noch mksh haben export -n
. Verwenden Sie typeset +x foo
stattdessen, es funktioniert in bash und ksh.
Ksh exportiert keine Funktionen durch die Umgebung.
let
ist das gleiche in bash und ksh.
Dies ist eine Bash-spezifische Funktion. Sie können while read
Schleifen oder Befehlssubstitution verwenden, um eine Datei zu lesen und in ein Array von Zeilen aufzuteilen. Pass auf dich auf IFS
und globbing. Hier ist das Äquivalent von mapfile -t lines </path/to/file
:
IFS=$'\n'; set -f
lines=($(</path/to/file))
unset IFS; set +f
printf
ist sehr ähnlich. Ich denke, ksh93 unterstützt alle Formatanweisungen von bash. mksh unterstützt nicht %q
oder %(DATE_FORMAT)T
; Bei einigen Installationen printf
ist kein mksh integriert und ruft stattdessen den externen Befehl auf.
printf -v VAR
ist bash-spezifisch, ksh druckt immer auf Standardausgabe.
Einige Optionen sind bash-spezifisch, einschließlich aller Optionen für readline. Die Optionen -r
, -d
, -n
, -N
, -t
, -u
sind identisch in bash, ksh93 und mksh.
Sie können eine Variable in Ksh93 und mksh mit derselben Syntax als schreibgeschützt deklarieren. Wenn es sich bei der Variablen um ein Array handelt, müssen Sie sie zuerst zuweisen und dann schreibgeschützt machen readonly VAR
. Funktionen können in ksh nicht schreibgeschützt werden.
Alle Optionen für set
und set -o
sind POSIX- oder ksh-Funktionen.
shopt
ist bash-spezifisch. Viele Optionen betreffen ohnehin die interaktive Nutzung. Informationen zu Auswirkungen auf das Globbing und andere Funktionen, die durch einige Optionen aktiviert werden, finden Sie im Abschnitt „Optionen“ weiter unten.
Diese Variante von .
existiert auch in ksh. source
Durchsucht in bash und mksh das aktuelle Verzeichnis nach PATH
, in ksh93 ist es jedoch genau das Äquivalent von .
.
Das DEBUG
Pseudosignal ist in mksh nicht implementiert. In ksh93 gibt es eine andere Möglichkeit, Informationen zu melden. Weitere Informationen finden Sie im Handbuch.
In ksh type
ist ein Alias für whence -v
. Gibt in mksh type -p
nicht den Pfad zur ausführbaren Datei aus, sondern eine für Menschen lesbare Nachricht. Sie müssen whence -p COMMAND
stattdessen verwenden.
Optionen
shopt -s dotglob
- Punktdateien beim Globbing nicht ignorieren
Um die dotglob
Option in ksh93 zu emulieren , können Sie festlegen FIGNORE='@(.|..)'
. Ich glaube nicht, dass es so etwas in mksh gibt.
Die extglob
Option ist in ksh effektiv immer aktiviert.
shopt -s failglob
- Fehler aus, wenn ein Glob-Muster mit nichts übereinstimmt
Ich glaube nicht, dass dies in mksh oder ksh93 existiert. Dies geschieht in zsh (Standardverhalten, sofern nicht festgelegt null_glob
oder csh_null_glob
festgelegt).
Ksh93 hat rekursives Globbing mit **/
, aktiviert mit set -G
. Mksh hat kein rekursives Globbing.
shopt -s lastpipe
- Führen Sie den letzten Befehl einer Pipeline in der übergeordneten Shell aus
Ksh93 führt immer den letzten Befehl einer Pipeline in der übergeordneten Shell aus, für die in bash die lastpipe
Option festgelegt werden muss. Mksh führt immer den letzten Befehl einer Pipeline in einer Subshell aus.
shopt -s nocaseglob
, shopt -s nocasematch
- Muster ohne Berücksichtigung der Groß- und Kleinschreibung
Mksh hat keinen Mustervergleich, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird. Ksh93 unterstützt es Muster für Muster: Stellen Sie dem Muster das Präfix vor ~(i)
.
shopt -s nullglob
- Erweitern Sie Muster, die keiner Datei entsprechen, mit einer leeren Liste
Mksh hat das nicht. Ksh93 unterstützt es Muster für Muster: Stellen Sie dem Muster das Präfix vor ~(N)
.
Offensichtlich existieren die meisten BASH_xxx
Variablen nicht in ksh. $BASHPID
kann mit dem teuren, aber tragbaren sh -c 'echo $PPID'
Gerät emuliert werden und wurde kürzlich zu mksh hinzugefügt. BASH_LINE
ist .sh.lineno
in ksh93 und LINENO
in mksh. BASH_SUBSHELL
ist .sh.subshell
in ksh93.
Mksh und ksh93 beziehen beide die ENV
beim Start angegebene Datei .
EUID
und UID
existieren nicht in ksh93. Mksh nennt sie USER_ID
und KSH_UID
; es hat nicht GROUPS
.
FUNCNAME
und FUNCNEST
existieren nicht in ksh. Ksh93 hat .sh.fun
und .sh.level
. Mit function foo { …; }
(keine Klammern!) Deklarierte Funktionen haben ihren eigenen Namen in $0
.
GLOBIGNORE
existiert in ksh93, aber mit einem anderen Namen und einer anderen Syntax: Es heißt FIGNORE
und es ist ein einzelnes Muster, keine durch Doppelpunkte getrennte Liste. Verwenden Sie ein @(…|…)
Muster. Ksh's fasst FIGNORE
Bashs mit einer völlig anderen Syntax zusammen.
Ksh93 und mksh haben nichts Vergleichbares HOSTTYPE
, MACHTYPE
und OSTYPE
. Noch SHELLOPTS
oder TIMEFORMAT
.
Mksh hat PIPESTATUS
, aber ksh93 nicht.
Mksh und ksh93 haben RANDOM
.