-
Notifications
You must be signed in to change notification settings - Fork 30
/
README
318 lines (245 loc) · 14.4 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
This directory, and its subdirectories contain the source code
for ksh-93; the language described in the second edition of
the book, "The KornShell Command and Programming Language," by
Morris Bolsky and David Korn which is published by Prentice Hall.
ksh-93 has been compiled and run on several machines with several
operating systems. The end of this file contains a partial list of
operating systems and machines that ksh-93 has been known to run on.
Most of the source code for ksh is in the src/cmd/ksh93/sh
directory. For information on what's where, see the file DESIGN.
#### COMPILE-TIME OPTIONS ####
The SHOPT.sh file contains several compilation options that can be set
before compiling ksh. Options are of the form SHOPT_option and become
#define inside the code. These options are set to their recommended
value and some of these may disappear as options in future releases.
A value of 0 represents off, 1 represents on, no value means probe. For
options where no feature probe is available, probe is the same as off.
The options have the following defaults and meanings:
ACCT off Shell accounting.
Noted by "L" in the version string when enabled.
See README-AUDIT.md.
ACCTFILE off Enable per user accounting info.
See README-AUDIT.md.
ALL_LIBCMD off Enables all of the available /opt/ast/bin builtin commands
in src/lib/libcmd (excludes vmstate if vmalloc is not
enabled).
AUDIT on For auditing specific users.
Noted by "A" in the version string when enabled.
See README-AUDIT.md.
AUDITFILE "/etc/ksh_audit"
See README-AUDIT.md.
BGX on Enables background job extensions. Noted by "J" in the
version string when enabled. (1) JOBMAX=n limits the
number of concurrent background jobs to n; the (n+1)th
background job will block until a running background job
completes. (2) SIGCHLD traps are queued so that each
completing background job gets its own trap; $! is set to
the job PID and $? is set to the job exit status at the
beginning of the trap.
BRACEPAT on Brace expansion. Expands abc{d,e}f to abcdf abcef.
This feature was inspired by the C shell.
CMDLIB_HDR "<cmdlist.h>"
The header in which you can provide a custom list of
libcmd commands to provide as path-bound built-ins.
CMDLIB_DIR "\"/opt/ast/bin\""
The default virtual directory prefix for path-bound
built-ins. The value must include double quotes.
CRNL off <cr><nl> treated as <nl> in shell grammar.
DEVFD Use the more secure /dev/fd mechanism instead of FIFOs for
process substitutions. On by default on OSs with /dev/fd.
DYNAMIC off Dynamic loading of builtins. Requires dlopen() interface
and dynamic libshell, libdll and libast libraries.
ECHOPRINT off Make echo equivalent to print.
ESH on Compile with emacs command line editing. The original
emacs line editor code was provided by Mike Veach at IH.
FILESCAN on Allows fast reading of files using:
while < file; do ...; done
Each line is stored in $REPLY and fields in each
line can be accessed as positional parameters.
FIXEDARRAY on When using typeset, a name in the format NAME[N]
creates a fixed-size array and any attempt to access a
subscript N or higher is an error. Multidimensional
fixed-size arrays NAME[N1][N2]... are also supported.
GLOBCASEDET Adds the 'globcasedetect' shell option. When this shell
option is turned on, pathname expansion (globbing)
and file name listing and completion automatically become
case-insensitive on file systems where the difference
between upper- and lowercase is ignored for file names.
This compile-time option is enabled by default on operating
systems that can support case-insensitive file systems.
HISTEXPAND on Enable !-style history expansion similar to csh(1).
This is turned on by the -H/--histexpand shell option and
can be modified using --histreedit and --histverify.
KIA off Allow generation of shell cross-reference database with -R.
As of 2021-05-10, no tool that can parse this database is
known. If you know of any, please contact us.
MULTIBYTE Multibyte character handling. This is on by default unless
the flag -DAST_NOMULTIBYTE is passed to the compiler via
CCFLAGS. The UTF-8 character set is fully supported.
NAMESPACE on Adds a 'namespace' reserved word that allows defining name
spaces. Variables and functions defined within a block like
namespace ExampleSpace { commandlist; }
all have their names automatically prefixed with
'.ExampleSpace.' when defining or using them, creating a
separate space of names unique to the block. Outside of
the namespace block, they can be accessed using
.ExampleSpace.function or ${.ExampleSpace.variable}.
Name spaces within name spaces are also supported.
MKSERVICE off Enables the 'mkservice' builtin which creates a TCP or UDP
server that is implemented by shell functions, and the
'eloop' builtin which causes the shell to block waiting for
events to process. Experimental and probably insecure.
NOECHOE off Disable the '-e' option to the 'echo' command,
unless SHOPT_ECHOPRINT is enabled.
OLDTERMIO off Use either termios or termio at runtime.
OPTIMIZE on Optimize loop invariants for with for and while loops.
P_SUID 0 If set, all real UIDs greater than or equal to this value
will require the -p option to run the shell setuid/setgid.
REGRESS off Enable the __regress__ built-in command and instrumented
intercepts for testing.
REMOTE off Set --rc (read profile scripts) even if ksh was invoked
with standard input on a socket, i.e. as a remote shell.
SCRIPTONLY off Compile out the interactive shell, resulting in a smaller
ksh binary that can only run scripts. Noted by "s" in the
version string when enabled. The option makes it an error
to invoke ksh as an interactive shell. The command history
mechanism, the fc/hist built-in, and the '-s' options to
the 'read' and 'print' built-ins are also compiled out.
SPAWN on Use posix_spawn(3) as combined fork/exec if job control
is not active. Improves speed.
STATS on Add .sh.stats compound variable.
SUID_EXEC on Execute /etc/suid_exec for setuid, setgid script.
SYSRC Source /etc/ksh.kshrc on initializing an interactive
shell. This is on by default if /etc/ksh.kshrc or
/etc/bash.bashrc exists at compile time.
TEST_L Add 'test -l' as an alias for 'test -L'. This is on by
default if the OS's external 'test' command supports it.
TIMEOUT off Set this to the number of seconds for timing out and
exiting the shell when you don't enter a command. If
non-zero, TMOUT can not be set larger than this value.
VSH on Compile with vi command line editing. The original vi
line editor code was provided by Pat Sullivan at CB.
#### BUILDING KSH 93U+M ####
To build ksh (as well as libcmd and libast libraries on which ksh depends),
cd to the top directory and run:
bin/package make
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.
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.
If you are certain that you don't need support for UTF-8 and other multibyte
character locales and really want to save some memory and CPU cycles, add
'-DAST_NOMULTIBYTE' to CCFLAGS to compile out all multibyte character
handling in ksh and supporting libraries. Not recommended for most users.
To install, use: 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.
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.
The build should also generate shcomp, a program that will precompile
a script. ksh93 is able to recognize files in this format and process
them as scripts. You can use shcomp to send out scripts when you
don't want to give away the original script source.
To be able to run setuid/setgid shell scripts, or scripts without read
permission, the SUID_EXEC compile option must be on, and ksh must be installed
in the /bin directory, the /usr/bin directory, the /usr/lbin directory,
or the /usr/local/bin directory and the name must end in sh. The program
suid_exec must be installed in the /etc directory, must be owned by root,
and must be an SUID program. If you must install ksh in some other directory
and want to be able to run setuid/setgid and execute only scripts, then
you will have to change the source code file sh/suid_exec.c explicitly.
If you do not have ksh in one of these secure locations, /bin/sh will
be invoked with the -p options and will fail when you execute a setuid/setgid
and/or execute only script. Note that ksh does not read the .profile
or $ENV file when the real and effective user/group IDs are not equal.
#### TESTING KSH ####
The tests subdirectory contains a number of regression tests for ksh.
To run all these tests with the shell you just built, run the command
bin/shtests
For help and more options, type
bin/shtests --man
#### OTHER DOCUMENTATION ####
The file PROMO.mm is an advertisement that extolls the virtues of ksh.
The file sh.1 contains the troff (man) description of this Shell.
The file nval.3 contains the troff (man) description of the name-value
pair library that is needed for writing built-ins that need to
access shell variables.
The file sh.memo contains a draft troff (mm) memo describing ksh. The
file builtins.mm is a draft troff (mm) memo describing how to write
built-in commands that can be loaded at run time.
The file NEWS in the top-level directory contains bug fixes and other
changes made in the ksh 93u+m fork and supporting libraries. The file
COMPATIBILITY contains a list of potential incompatibilities.
#### TESTED SYSTEMS ####
ksh 93u+m 1.0.0.beta-1 has been compiled and tested on the following.
An asterisk signifies minor regression test failures (one or two minor
things amiss), two asterisks signify moderate regression test failures
(some functionality does not work), and three asterisks signify serious
failures (crashes, and/or important functionality does not work).
* AIX 7.1 on RISC (PowerPC)
* DragonFly BSD 5.8 on x86_64
FreeBSD 12.2 on x86_64
FreeBSD 13.0 on x86_64
FreeBSD 12.2 on arm64 (thanks to hyenias for donating access to a Pi)
GNU/Linux: Alpine 3.12.3 (musl C library) on x86_64
GNU/Linux: CentOS 8.2 on x86_64
GNU/Linux: Debian 10.7 on x86_64
GNU/Linux: Gentoo 2.7 on i386
GNU/Linux: NixOS 19.09 on x86_64
GNU/Linux: Slackware 14.2 on x86_64
GNU/Linux: Ubuntu 16.04 on x86_64
GNU/Linux: Ubuntu 18.04 on armv7l (32-bit)
GNU/Linux: Ubuntu 20.04 on arm64
GNU/Linux: Void Linux (musl C library) on x86_64
*** Haiku R1/beta3 on x86_64
*** HP-UX B.11.11 on pa-risc
* illumos: OmniOS 2020-08-19 (gcc) on x86_64
illumos: OmniOS r151040 (gcc) on x86_64
macOS 10.13.6 (High Sierra) on x86_64
macOS 10.14.6 (Mojave) on x86_64
* macOS 12.0.1 (Monterey) on arm64
* NetBSD 8.1 on x86_64
* NetBSD 9.2 on x86_64
* OpenBSD 6.8 on x86_64
OpenBSD 7.0 on x86_64
* QNX Neutrino 6.5.0 on i386
* Solaris 11.4 (gcc) on x86_64
Solaris 11.4 (Solaris Studio 12.5 cc) on x86_64
* UnixWare 7.1.4 on x86
*** Windows 7 using Cygwin on x86
*** Windows 10 using Cygwin on x86_64
*** Windows 11 using Cygwin on x86_64
Windows 11 using WSL 2 with Ubuntu 20.04 on x86_64
#### REPORTING BUGS ####
Please report any problems or suggestions by opening an issue at:
https://github.com/ksh93/ksh
Alternatively, email martijn@inlv.org (timely response *not* promised).
Good luck!!
The ksh 93u+m contributors
https://github.com/ksh93/ksh
Originally written by:
David Korn
dgk@research.att.com