Home

Awesome

KornShell 93u+m

This repository is used to develop bugfixes to the last stable release (93u+ 2012-08-01) of ksh93, formerly developed by AT&T Software Technology (AST). The sources in this repository were forked from the GitHub AST repository which is no longer under active development.

For user-visible fixes, see NEWS and click on commit messages for full details. For all fixes, see the commit log. To see what's left to fix, see the issue tracker.

Policy

  1. Fixing bugs is main focus of the 1.0 series. Major feature development is for future versions (1.1 and up).
  2. No major rewrites. No refactoring code that is not fully understood.
  3. Maintain documented behaviour. Changes required for compliance with the POSIX shell language standard are implemented for the posix mode only to avoid breaking legacy scripts.
  4. No 100% bug compatibility. Broken and undocumented behaviour gets fixed.
  5. No bureaucracy, no formalities. Just fix it, or report it: create issues, send pull requests. Every interested party is invited to contribute.
  6. To help increase everyone's understanding of this code base, fixes and significant changes should be fully documented in commit messages.
  7. Code style varies somewhat in this historic code base. Your changes should match the style of the code surrounding them. Indent with tabs, assuming an 8-space tab width. Opening braces are on a line of their own, at the same indentation level as their corresponding closing brace. Comments always use /*...*/.
  8. Good judgment may override this policy.

Why?

Between 2017 and 2020 there was an ultimately unsuccessful attempt to breathe new life into the KornShell by extensively refactoring the last unstable AST beta version (93v-). While that ksh2020 effort is now abandoned and still has many critical bugs, it also had a lot of bugs fixed. More importantly, the AST issue tracker now contains a lot of documentation on how to fix those bugs, which made it possible to backport many of them to the last stable release instead. This ksh 93u+m reboot now incorporates many of these bugfixes, plus patches from OpenSUSE, Red Hat, and Solaris, as well as many new fixes from the community (1, 2). Though there are many bugs left to fix, we are confident at this point that 93u+m is already the least buggy version of ksh93 ever released. As of late 2021, distributions such as Debian and Slackware have begun to package it as their default version of ksh93.

Build

To build ksh with a custom configuration of features, edit src/cmd/ksh93/SHOPT.sh.

On systems such as NetBSD and OpenBSD, where /bin/ksh is not ksh93 and the preinstalled /etc/ksh.kshrc profile script is incompatible with ksh93, you'll want to disable SHOPT_SYSRC to avoid loading it on startup -- unless you can edit it to make it compatible with ksh93. This geneerally involves differences in the declaration and usage of local variables in functions.

Then cd to the top directory and run:

bin/package make

To suppress compiler output, use quiet make instead of make. In some non-POSIX shells you might need to prepend sh to all calls to bin/package.

Parallel building is supported by appending -j followed by the desired maximum number of concurrent jobs, e.g., bin/package make -j4. This speeds up building on systems with more than one CPU core. (Type bin/package host cpu to find out how many CPU cores your system has.)

The compiled binaries are stored in the arch directory, in a subdirectory that corresponds to your architecture. The command bin/package host type outputs the name of this subdirectory.

Dynamically linked binaries, if supported for your system, are stored in dyn/bin and dyn/lib subdirectories of your architecture directory. If built, they are built in addition to the statically linked versions. Export AST_NO_DYLIB to deactivate building dynamically linked versions.

If you have trouble or want to tune the binaries, you may pass additional compiler and linker flags. It is usually best to export these as environment variables before running bin/package as they could change the name of the build subdirectory of the arch directory, so exporting them is a convenient way to keep them consistent between build and test commands. Note that this system uses CCFLAGS instead of the usual CFLAGS. An example that makes Solaris Studio cc produce a 64-bit binary:

export CCFLAGS="-m64 -O" LDFLAGS="-m64"
bin/package make

Alternatively you can append these to the command, and they will only be used for that command. You can also specify an alternative shell in which to run the build scripts this way. For example:

bin/package make SHELL=/bin/bash CCFLAGS="-O2 -I/opt/local/include" LDFLAGS="-L/opt/local/lib"

Note: Do not add compiler flags that cause the compiler to emit terminal escape codes, such as -fdiagnostics-color=always; this will cause the build to fail as the probing code greps compiler diagnostics. Additionally, do not add the -ffast-math compiler flag; arithmetic bugs will occur when using that flag.

For more information run

bin/package help

Many other commands in this repo self-document via the --help, --man and --html options; those that do have no separate manual page.

Test

After compiling, you can run the regression tests. To run the default test sets for ksh and the build system, use:

bin/package test

For ksh, use the shtests command directly to control the regression test runs. Start by reading the information printed by:

bin/shtests --man

To hand-test ksh (as well as the utilities and the autoloadable functions that come with it) without installing, run:

bin/package use

Install

Usage: bin/package install destination_directory [ command ... ]

Any command from the arch directory can be installed. If no command is specified, ksh and shcomp are assumed.

The destination_directory is created if it does not exist. Commands are installed in its bin subdirectory and each command's manual page, if available, is installed in share/man.

Destination directories with whitespace or shell pattern characters in their pathnames are not yet supported.

If a dynamically linked version of ksh and associated commands has been built, then the install subcommand will prefer that: commands, dynamic libraries and associated header files will be installed then. To install the statically linked version instead (and skip the header files), either delete the dyn subdirectory, or export AST_NO_DYLIB=y before building to prevent it from being created in the first place.

What is ksh93?

The following is the official AT&T description from 1993 that came with the ast-open distribution. The text is original, but hyperlinks were added here.


KSH-93 is the most recent version of the KornShell Language described in "The KornShell Command and Programming Language," by Morris Bolsky and David Korn of AT&T Bell Laboratories, ISBN 0-13-182700-6. The KornShell is a shell programming language, which is upward compatible with "sh" (the Bourne Shell), and is intended to conform to the IEEE P1003.2/ISO 9945.2 Shell and Utilities standard. KSH-93 provides an enhanced programming environment in addition to the major command-entry features of the BSD shell "csh". With KSH-93, medium-sized programming tasks can be performed at shell-level without a significant loss in performance. In addition, "sh" scripts can be run on KSH-93 without modification.

The code should conform to the IEEE POSIX 1003.1 standard and to the proposed ANSI C standard so that it should be portable to all such systems. Like the previous version, KSH-88, it is designed to accept eight bit character sets transparently, thereby making it internationally compatible. It can support multi-byte characters sets with some characteristics of the character set given at run time.

KSH-93 provides the following features, many of which were also inherent in KSH-88:

Documentation for KSH-93 consists of an "Introduction to KSH-93", "Compatibility with the Bourne Shell" and a manual page and a README file. In addition, the "New KornShell Command and Programming Language" book is available from Prentice Hall.