Differences between revisions 14 and 18 (spanning 4 versions)
Revision 14 as of 2011-09-05 22:46:40
Size: 4571
Editor: ormaaj
Comment: Some problems with this section: This isn't true of mksh; ksh88 doesn't have pre/post increment operators; and bash 4.2 has lastpipe. Added a "ksh93" comment for now.
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|Bourne shell]]. It is downward compatible, but adds many features intended to simplify programming. Most of the features are part of [[PosixShell|POSIX shell]], too, and therefore are available on any POSIX compliant system.

[[Bash]] also implements most of the Korn shell's functionality.

There are three primary version of the Korn shell in use today: the original (often dubbed '''ksh88'''), the successor ('''ksh93'''), and an open source version called '''pdksh''' ("Public Domain Korn Shell"). pdksh was developed before the source code for ksh93 was liberated.

The Korn shell (either ksh88 or ksh93, depending on the age of the system) is a standard part of any modern (commercial) Unix system, e.g. [[Solaris]], [[AIX]], [[HP-UX]]. pdksh is often available on BSD or GNU/Linux systems, and a growing number of GNU/Linux systems now offer ksh93, either instead of or in addition to pdksh.

Some of the features of the Korn shell are:
 * '''KornShellArrays''' provide arrays with numerical indexes
 * '''TypedVariables''' using the [[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 ((...)),
{{{
        # ksh93
        for ((i=0; i<10; ++i)); do
            print $i
        done
}}}

 * '''CommandSubstitution''' with $(_command_), which simplifies nesting. Compare e.g. the BourneShell command
{{{
        parent=`basename \`dirname "${PWD}"\``
}}}

  with its KornShell counterpart:

{{{
        parent=$(basename $(dirname "${PWD}"))
}}}

 * Powerful '''PatternMatching''' (for filename generation and for usage in {{{case}}} and {{{[[ ... ]]}}}, e.g.:
{{{
        case ${url} in
            http://*) print a browser can handle that;;
                   *) print maybe a browser can handle that, too;;
        esac

        if [[ ${pathname} == /* ]]; then
            print path is absolute;
        fi
}}}
 * '''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.
 * [[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.
 * '''[[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 [[GetoptsCommand|getopts]], and local [[TrapCommand|traps]]
 * Built-in [[TestOperator|[[]] ("test") with improved quoting behaviour and more conditional operators than the OldTestOperator
 * CommandLineEditing with [[ViEditor|vi]] or [[EmacsEditor|emacs]] command sequences

Other, smaller improvements over the BourneShell include
 * Earlier versions of the Bourne shell don't know yet signal names for the [[TrapCommand|trap]] command, e.g. {{{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 [[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:

  {{{
  #ksh93
  i=0
  ls -l | while read; do
    ((++i))
  done
  echo "$i lines"
  }}}

----
CategoryShell
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)