Differences between revisions 1 and 18 (spanning 17 versions)
Revision 1 as of 2005-08-07 19:12:53
Size: 4030
Editor: GreyCat
Comment: copied and converted from heiner's wiki
Revision 18 as of 2016-03-22 10:42:58
Size: 341
Editor: LaurenKell
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
= Korn Shell =
The KornShell is a reimplementation of the BourneShell. It is downward compatible, but adds many features intented to simplify programming. Most of the features are part of PosixShell, too, and therefore are available on any PosixSystem.

The BashShell also implements most of the functionality.

The KornShell is part of any modern (commercial) Unix system, e.g. ["Solaris"], ["AIX"], ["HP-UX"]. An OpenSource version called PdKsh ("Public Domain Korn Shell") is available e.g. for ["Linux"].

The successor to the KornShell is KornShell93, which adds even more features. The source for KornShell93 was recently liberated, and some GNU/Linux distributions now offer it in addition to (or instead of) PdKsh.

 * '''KornShellArrays''' provide arrays with numerical indexes
 * '''TypedVariables''' using the [wiki:Self:TypedefCommand typedef] command. It can be used to print strings left- or right-aligned, print integer numbers with leading zeros, or provide LocalVariables for a function
 * '''ArithmeticExpressions''' in ((...)),
{{{
        ((i=i+1))
        while ((i<10))
        do
            echo "$i"
            ((i=i+1))
        done
}}}

 * '''CommandSubstitution''' with $(_command_), which simplifies nesting. Compare e.g. the BourneShell command
{{{
        lines=`echo \`wc -l < /etc/passwd\``
}}}

  with its KornShell counterpart:

{{{
        lines=$(echo $(wc -l < /etc/passwd))
}}}

 * Powerful '''PatternMatching''' (for filename generation and for usage in {{{case}}} and {{{[[ ... ]]}}}
 * '''ParameterSubstitution''' like {{{${var%pattern}}}}, {{{${var%%pattern}}}} to remove (last/largest) {{{pattern}}} from the end of variable {{{var}}}, and {{{${var#pattern}}}}, {{{${var##pattern}}}} to remove (first/largest) {{{pattern}}} from the front of the variable.
 * [wiki:Self:CoProcess Co-processes], e.g. {{{bc |&}}} to start the "bc" command as a co-process. "{{{read -p}}}" and "{{{print -p}}}" are used to read from or write to the co-process. Other shells (e.g. ["BASH"]) require the user to use e.g. NamedPipes (FiFos) for that purpose
 * built-in '''{{{print}}}''' command. This doesn't sound like a big innovation, but it allows for reliably printing arbitrary characters. Most important uses are "{{{print -n --}}}" to print without trailing NewLine character, and "{{{print -r --}}}" to print arbitrary strings, possibly including EscapeSequences or a BackSlash character.
 * '''[wiki:Self:SelectComand select]''' command for easy menus. {{{select}}} is used like {{{for}}}, but prints an simple interactive menu where a user can select one out of several choices.
 * '''KornShellFunctions''' are similar to traditional BourneShell functions, but can have local variables, local argument handling using [wiki:Self:GetoptsCommand getopts], and local [wiki:Self:TrapCommand traps]
 * Built-in [wiki:Self:TestOperator [[] ("test") with improved quoting behaviour and more conditional operators than the OldTestOperator
 * CommandLineEditing with [wiki:Self:ViEditor vi] or [wiki:Self:EmacsEditor emacs] command sequences

Other, smaller improvements over the BourneShell include
* SignalNames for the [wiki:Self:TrapCommand trap] command, e.g. for {{{trap 'rm temp' EXIT}}} instead of {{{trap 'rm temp' 0}}}
* TildeSubstitution, '''~''' is replaced with the user's HomeDirectory, ~_user_ is replaced with the HomeDirectory of the user _user_, e.g. {{{echo ~root}}}



Most of the features of the KornShell are available in the BashShell, too. The following features are '''not''' found in the BashShell:

 * co-processes (process |&)
 * built-in "print" command
 * some of the [wiki:Self:TypedefCommand typedef] options

And everyone's favorite KornShell feature that's not in Bash:

 * The last command in a pipe is executed in the current shell instead of a subshell. So the following works the way a naive user would expect:

  {{{
  i=0
  ls -l | while read line; do
    ((i=$i+1))
  done
  echo "$i lines"
  }}}
59 yr old Building Inspector Grant Hanzely from La Ronge, loves grip strength, upstore premium link generator and sky diving. Identified some amazing spots after spending 7 weeks at Royal Hill of Ambohimanga.<<BR>><<BR>>
<<BR>><<BR>>
Here is my website ... [[https://www.wattpad.com/user/upstorepremiumlink|upstore.net account password]]

59 yr old Building Inspector Grant Hanzely from La Ronge, loves grip strength, upstore premium link generator and sky diving. Identified some amazing spots after spending 7 weeks at Royal Hill of Ambohimanga.



Here is my website ... upstore.net account password

KornShell (last edited 2022-06-20 20:47:27 by emanuele6)