Differences between revisions 13 and 14
Revision 13 as of 2009-09-20 08:45:23
Size: 4561
Editor: 78-105-75-22
Comment:
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.
Deletions are marked like this. Additions are marked like this.
Line 68: Line 68:
  #ksh93

Korn Shell

The KornShell is a reimplementation of the Bourne shell. It is downward compatible, but adds many features intended to simplify programming. Most of the features are part of 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:

        # ksh93
        for ((i=0; i<10; ++i)); do
            print $i
        done

        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.

  • 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.

  • 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 getopts, and local traps

  • Built-in [[ ("test") with improved quoting behaviour and more conditional operators than the OldTestOperator

  • CommandLineEditing with vi or emacs command sequences

Other, smaller improvements over the BourneShell include

  • Earlier versions of the Bourne shell don't know yet signal names for the 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 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

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