12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004 |
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
- <HTML>
- <HEAD>
- <META name="generator" content="mm2html (AT&T Research) 2012-01-11">
- <TITLE> general shell </TITLE>
- <META name="author" content="gsf+dgk+kpv">
- <SCRIPT type="text/javascript">
- var A, P, Q;
- function FAQ_mark(mark) {
- P = null;
- for (var i = 0; i < A.length; i++)
- A[i].className = mark;
- }
- function FAQ_init() {
- Q = document.getElementsByTagName("dt");
- A = document.getElementsByTagName("dd");
- FAQ_mark("hide");
- for (var i = 0; i < Q.length; i++) {
- Q[i].onclick=function() {
- var next = this.nextSibling;
- while (next.nodeType != 1)
- next = next.nextSibling;
- if (P != null && P != next)
- P.className = "hide";
- if (next.className == "hide") {
- next.className = "show";
- P = next;
- }
- else {
- next.className = "hide";
- P = null;
- }
- }
- }
- }
- window.onload = FAQ_init;
- </SCRIPT>
- <STYLE type="text/css">
- div.FI { padding-left:2em; text-indent:0em; }
- div.HI { padding-left:4em; text-indent:-2em; }
- dt { margin: 15px 40px 5px; cursor: pointer; }
- dt:before {
- content: "Q";
- font-family: Georgia, "Times New Roman", Times, serif;
- margin-right: 7px;
- padding: 2px 6px 5px;
- color: #FFD87D;
- background-color: teal;
- font-weight: normal;
- margin-left: -35px;
- position: relative;
- }
- dd { margin: 25px 70px 0px; }
- li { padding: 2px 0; }
- .show { display: block; }
- .hide { display: none; }
- </STYLE>
- </HEAD>
- <BODY bgcolor=white link=slateblue vlink=teal >
- <TABLE border=0 align=center width=96%>
- <TBODY><TR><TD valign=top align=left>
- <!--INDEX--><!--/INDEX-->
- <P>
- <P><CENTER><FONT color=red><FONT face=courier><H3><A name="general">general</A></H3></FONT></FONT></CENTER>
- <DIV class=SH>
- <DL>
- <DT>What is KornShell?<DD>
- KornShell is a command and scripting language that is a superset of the System V UNIX shell,
- aka, BourneShell (or
- <EM>sh</EM>).
- <DT>What is ksh?<DD>
- ksh is the name of the program that implements the KornShell language.
- <DT>What is the history of ksh?<DD>
- ksh was written by David Korn at Bell Telephone Laboratories.
- David Korn is currently at AT&T Research.
- The first version of ksh was in 1983.
- It was the first shell to have command line editing with both emacs and vi style interaction.
- The 1986 version was the first to offer multibyte support.
- The 1988 version of ksh is the version that was adopted by System V Release 4 UNIX
- and was a source document for the IEEE POSIX and ISO shell standards.
- The 1993 version is a major rewrite of the 1988 version and focuses more on scripting.
- <DT>Where is the official description of the KornShell language?<DD>
- The Bolsky and Korn book,
- <EM>The KornShell Command and Programming Language</EM>,
- published by Prentice Hall, defines the 1988 version.
- The newer Bolsky and Korn book,
- <EM>The New KornShell Command and Programming Language</EM>,
- also published by Prentice Hall, describes the 1993 version.
- There are many new features since this book was published and
- the man page for ksh93 is kept up to date.
- <DT>What are the major new features of KornShell 1993?<DD>
- The only major new interactive features are key binding and tab completion.
- Major new language features are floating point arithmetic,
- associative arrays, complete ANSI-C printf, name reference
- variables, new expansion operators, dynamic loading of
- built-in commands, active variables, and compound variables.
- Active and compound variables allow shell variables to
- behave like objects. The ability to define types was added in 2009.
- In addition, ksh93 has been written to be
- extensible with an C language API for programming extensions.
- <DT>Are any further releases of ksh planned?<DD>
- Yes, the KornShell language and ksh implementation are in active development.
- Most of the focus will be on scripting and reusability.
- <DT>Why are newer release of ksh still called ksh93?<DD>
- We started the AST/ksh OpenSource release process in the late 90's.
- At that point ksh93 was the well-known name for ksh.
- The OpenSource release was finally granted in March 2000.
- No one has since volunteered to repeat that process for ksh<EM>XX</EM>.
- <DT>How can I determine the release or version of a particular ksh?<DD>
- The current version and release string may be accessed by
- <STRONG>${.sh.version}</STRONG>
- and
- <STRONG>$KSH_VERSION</STRONG>.
- The format is <STRONG>Version</STRONG> <EM>features</EM> 93<EM>version</EM>[-/+] <EM>release</EM>:
- <UL type=square>
- <LI>
- <EM>features</EM> --
- compile time features, typically enabled by <STRONG>SHOPT_</STRONG><EM>foo</EM> state variables in the
- ksh93 Makefile.
- A single letter represents each feature:
- <UL type=circle>
- <LI>
- <STRONG>A</STRONG>
- (<EM>SHOPT_AUDIT</EM>)
- <LI>
- <STRONG>B</STRONG>
- (<EM>SHOPT_BASH</EM>)
- bash compatibility mode.
- <LI>
- <STRONG>J</STRONG>
- (<EM>SHOPT_COSHELL</EM>)
- <STRONG>-lcoshell</STRONG> job pools.
- <LI>
- <STRONG>j</STRONG>
- (<EM>SHOPT_BGX</EM>)
- <LI>
- <STRONG>L</STRONG>
- (<EM>SHOPT_ACCT</EM>)
- <LI>
- <STRONG>M</STRONG>
- (<EM>SHOPT_MULTIBYTE</EM>)
- <LI>
- <STRONG>P</STRONG>
- (<EM>SHOPT_PFSH</EM>)
- <LI>
- <STRONG>R</STRONG>
- (<EM>SHOPT_REGRESS</EM>)
- </UL>
- <LI>
- <EM>version</EM>--
- a lower-case letter signifying major release points.
- An optional <STRONG>-</STRONG> following <EM>features</EM> signifies an alpha release.
- The first stable release has no <STRONG>-</STRONG>.
- An optional <STRONG>+</STRONG> signifies a stable release with bug patches and minor enhancements.
- <LI>
- <EM>release</EM>--
- the release date in <EM>YYYY-MM-DD</EM> form.
- This date corresponds to AST package and git repository releases.
- </UL>
- <STRONG>KSH_VERSION</STRONG>
- in a numeric context is an integer that encodes the release
- <EM>YYYYMMDD</EM>.
- <DT>What new features are planned for ksh?<DD>
- We are in the early stage of planning but the likely additions
- are namespaces, ability to read xml and json object into shell variables,
- and handling of queued signals.
- Support for multi-threading is also being considered.
- <DT>Is KornShell public domain?<DD>
- Yes, the language description is public domain and
- can be reimplemented.
- Some of the KornShell language features have been reimplemented
- in the GNU shell, bash, in zsh and mksh, and in pdksh, a public domain
- implementation.
- <DT>Is ksh public domain?<DD>
- No, earlier versions were owned by both AT&T and Novell.
- The 1993 version is owned by both Lucent and AT&T.
- <DT>Is source code available?<DD>
- Starting in March 2000, the ksh93 source is available
- as part of a larger collection of software called
- the ast-open software package which can be downloaded
- from the
- <A href="https://github.com/att/ast" target=_top>github page.</A>
- <DT>What are the licensing terms?<DD>
- The exact license terms can be found on the
- <A href="https://github.com/att/ast/blob/master/LICENSE.md" target=_top>licence page.</A>
- <DT>Does the license allow binaries to be freely redistributed?<DD>
- Yes, provided you make the license terms available to
- everyone you distribute binaries to.
- <DT>If I make changes to the code, do I have to make them public?<DD>
- No, you do not have to make them public.
- However, if you distribute the changes, you must allow us to be able
- to get these changes and distribute them along with the source.
- <DT>Why do some vendors still ship ksh88, not ksh93?<DD>
- Since ksh88 was included in System V release 4, most vendors
- have just included this version. However most Linux systems
- and Mac OS provide ksh93 version 's' or later. Solaris11 uses
- ksh93 as /bin/sh.
- <DT>Do you provide support for ksh?<DD>
- No, we will try to fix any bugs we hear about in future
- releases, but we do not provide any official support.
- <DT>Is ksh supported commercially?<DD>
- Software vendors that supply ksh with
- their systems typically support it for that system.
- <DT>What is pdksh and is it related to ksh or KornShell?<DD>
- pdksh is a public domain version of a UNIX shell that is
- unrelated to ksh.
- It supports most of the 1988 KornShell language features and some of the 1993 features.
- Some KornShell scripts will not run with pdksh.
- <DT>How is the MKS Toolkit KornShell related to KornShell?<DD>
- MKS Toolkit KornShell is a completely independent implementation
- that supports a subset of the 1988 KornShell language.
- <DT>What systems does ksh run on?<DD>
- ksh has been written to be portable.
- It has been ported to virtually run on every known UNIX system.
- In addition it runs on non-UNIX systems such as IBM's MVS using OpenEdition, and
- Microsoft's Windows 9X, Windows NT and Windows 2000.
- ksh is part of the UWIN (Unix for Windows)</A>
- software,
- <DT>Does ksh conform to the IEEE POSIX and ISO shell standard?<DD>
- The 1993 version should conform to the 1992 standard.
- At one point it had passed the test suite created by X/OPEN.
- <DT>Will KornShell 88 scripts run with KornShell 93?<DD>
- In almost all cases, the answer is yes.
- However, the IEEE POSIX and ISO standards required a few
- changes that could cause scripts to fail.
- There is a separate document that lists all known incompatibilities.
- <DT>Can ksh run as /bin/sh?<DD>
- We have installed ksh as /bin/sh on several systems without
- encountering any problems. It is /bin/sh on Solaris11.
- Our Linux systems use this instead of bash.
- </DL>
- </DIV>
- <P>
- <P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="interactive">interactive</A></H3></FONT></FONT></CENTER>
- <DIV class=SH>
- <DL>
- <DT>How do I get separate history files for shell?<DD>
- ksh uses a shared history file for all shells that
- use the same history file name.
- This means that commands entered in one window will be seen by
- shells in other windows.
- To get separate windows, the HISTFILE variable needs to be set to different name
- before the first history command is created.
- <DT>How do I get the time of day in my prompt?<DD>
- You can use printf with supports the %T format for time and date formatting.
- For example, the format %(%H:%M:%S)T specifies time in hour, minute, second
- format and if no argument is specified, the current time is used. Thus setting
- PS1='$(printf "%(%H:%M:%S)T" $' will output the time of day before the
- $ prompt.
- <DT>Why does the screen width not function correctly when non-printing characters are in my prompt?<DD>
- The shell computes the screen width by subtracting the width of the prompt from the screen width.
- To account for non-printing characters, for example escape sequences that display in the title
- bar, follow these characters with a carriage return.
- The shell starts recomputing the width after each carriage return.
- <DT>What is the PS4 prompt and how is it used?<DD>
- The PS4 prompt is evaluated and displayed before each line when
- running an execution trace.
- If unset, a + and a <space> will
- be output before each line in the trace.
- Putting '$LINENO' inside PS4 will cause the line number to be displayed.
- Putting '$SECONDS' in the PS4 prompt will cause the elapsed time
- to be displayed before each line.
- Note that single quotes are used to prevent the expansion from happening
- when PS4 is defined.
- <DT>How is keybinding done?<DD>
- ksh93 provides a KEYBD trap that gets executed whenever a key
- is entered from the keyboard.
- Using this trap, and the associative
- array feature of ksh93, a keybind function can easily be written
- which will map any entered key sequence to another key sequence.
- <DT>How do I get the arrow keys to work?<DD>
- Starting with the 'h' point release, on most keyboards you
- do not have to do anything to get the arrow keys to work.
- However, if they do not generate standard escape sequences,
- then you will have to use a keybinding function to get them
- to work.
- <DT>Does ksh support file name completion?<DD>
- Yes, it does.
- The default key binding is <ESC><ESC>
- however, starting with the 'g' point release, <TAB> also works
- for completion.
- <DT>Does ksh support command completion?<DD>
- If you perform completion on the first word of a command,
- ksh will do completion using aliases, functions, and commands.
- <DT>Is completion programmable?<DD>
- Yes, using the key binding mechanism, you can script the behavior
- of any key and therefore cause the current contents of any
- line to be replaced by any other line.
- <DT>Is there any way to get the command-line editor to go to more than a single line?<DD>
- The multiline option (now on by default) allows lines longer than the width
- of the screen to be displayed on multiple lines on the screen.
- Also in vi-mode, if you hit 'v' while in control mode, it will bring
- up a full screen version of vi on the current command.
- The command
- will execute when you exit vi.
- <DT>What is predictive editing?<DD>
- In 2010, a compile option was added that cause the shell to try to predict
- what you were trying to type by looking in the history file for all lines
- that matched and presenting them as a menu. Any line starting with # would
- use the characters you type to find matching lines from the history file.
- If you find the line you wanted, you can enter the number followed by
- <TAB> or newline. However bugs in earlier version led to core dumps.
- <DT>Can I use the shell line editor on other commands?<DD>
- The command ie, that comes along with shell, can be used
- to run line input oriented commands with command line editing.
- <DT>When I do echo $?, I am getting 267. What does this mean?<DD>
- ksh93 reports process that terminate with a signal as 256+signo.
- Earlier versions used 128+signo but this makes it impossible
- to distinguish from a command exit with that value.
- If you run
- <DIV class=FI>
- <PRE>
- kill -l $?
- </DIV>
- </PRE>
- on this signal number, it will give the the name of the signal
- that caused this exit.
- <DT>When I type builtin, I notice that some of these are full pathnames. What does this mean?<DD>
- Builtins that are not bound to pathnames are always searched
- for before doing a path search.
- Builtins that are bound
- to pathnames are only executed when the path search would
- bind to this pathname.
- <DT>What is a self generating man page?<DD>
- A self generating man page is one that is generated by the
- option parser within that command using an extended version
- of the getopts function.
- The man page can be generated in html,
- troff, or directly for the terminal.
- Most builtin commands
- in the shell have self generating man pages so that you
- can run for example,
- <STRONG>kill --man</STRONG>
- or
- <STRONG>kill --html</STRONG>
- to get
- the description of kill to the screen or as an html file.
- All self-documenting output is to the standard error,
- so you must redirect 2>... to capture the output.
- <P>
- This same method can also be used for shell scripts.
- Run
- <STRONG>getopts --man</STRONG>
- for more details.
- <DT>What is autoloading?<DD>
- Autoloading was a method used in ksh88, and still permitted in ksh93
- to declare that a name corresponded to a function.
- The function
- would be loaded and executed when first referenced.
- This was
- necessary since FPATH was always searched after PATH with ksh88
- and therefore if you defined a function whose name was the same
- as that of a program on your path, the program on your path
- would have been executed.
- With ksh93, when a pathname is
- encountered that is on PATH, but also is in FPATH, this directory
- is assumed to be a function directory.
- Thus, you can have
- function directories searched before program directories so
- that autoloading is no longer needed.
- <DT>Why does the output from 'time command 2> file' come out on the screen?<DD>
- The time command is a compound command in ksh and time is a reserved
- word It can be followed by any pipeline. Thus, redirections applied
- at the end are for the command, not to time itself. You can use
- time {...;} 2> file to capture the timing output to a file. Note,
- that with ksh, time works with all commands, for example,
- time for i; do xxx;done.
- <DT>When I run 'mv * ../elsewhere' I so that get '-ksh: mv: cannot execute [Arg list too long]', what causes this?<DD>
- UNIX systems have a limit to the space consumed by command arguments and
- environment variables when running commands that are not built into
- the shell. The configuration parameter ARG_MAX defines this limit.
- You can run 'getconf ARG_MAX' to find the limit for your system. Note
- that the shell expands * to the list of files in the current directory
- before running mv. In many case the xargs or tw command can be
- used to work around this problem by splitting the line into chunks
- and invoking the command. Another way to work around this limit
- is to make the command a builtin. On systems in which the cmd
- library is installed, you can invoke 'builtin -f cmd mv' to make
- mv a shell builtin in which case the line length limit no longer
- applies. Another alternative is to use a for loop and invoke
- the mv command for each file, for exampe,
- 'for i in *;do mv $i ../elsewhere;done'.
- Starting with ksh93o+, a new feature was added to ksh to overcome
- this limit in some cases. If a command is preceded by
- 'command -x', and it fails because there are two many arguments,
- the command will be run multiple times with subsets of the arguments.
- However, the change in ksh93o+ does not work in the above case
- because the ../elsewhere is not used for each subset. This problem
- was resolved starting in ksh93p so that
- command -x mv * ../elsewhere
- should work. Note that it is possible to do alias mv='command -x mv'
- <DT>Is there any way to generate the list of .c files in the current directory and all the subdirectories?<DD>
- Starting with ksh93o+, the globstar option (set -G or set -o globstar)
- was added. With globstar enabled, ** by itself matches zero or more
- directories or files, and **/ matches zero or more directories so that
- **/*.c will match all .c files under the current directory.
- <DT>Is there any way to prevent sending a HUP signal to a job when I log out if I didn't nohup the job?<DD>
- Yes, the disown command tells ksh not to forward the HUP signal
- to the specified jobs when it disconnects.
- </DL>
- </DIV>
- <P>
- <P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="programming">programming</A></H3></FONT></FONT></CENTER>
- <DIV class=SH>
- <DL>
- <DT>What is the difference between * and @, for example, and ?<DD>
- When used outside of "", they are equivalent.
- However, within
- double quotes, "$@" produces one argument for each positional
- parameter, and "$* produces a single argument.
- Note that "$@"
- preserves arguments lists, whereas $* may not unless both
- word splitting and pathname expansion are disabled.
- <DT>Why do I need spaces around { and } but not around ( and )?<DD>
- The characters ( and ) are shell metacharacters and are always
- treated specially.
- For historical reasons, { and } were
- treated as reserved words and are only special as separate
- words at locations in which a command can begin.
- <DT>How do I get read to maintain the \ characters?<DD>
- Use read -r instead.
- <DT>How can I a write a ksh script that responds directly to each character so that you user just has to enter y, not y<return>?<DD>
- There are two ways to do this.
- The easiest is to use
- <DIV class=FI>
- <PRE>
- read -n1 x
- </DIV>
- </PRE>
- Alternatively, you could do
- <DIV class=FI>
- <PRE>
- function keytrap
- {
- .sh.edchar=${sh.edchar}$'
- }
- trap keytrap KEYBD
- </DIV>
- </PRE>
- and then
- <DIV class=FI>
- <PRE>
- read x
- </DIV>
- </PRE>
- <DT>What is the purpose of $'...'?<DD>
- The $'...' string literal syntax was added to ksh93 to solve the problem
- of entering special characters in scripts.
- It uses
- ANSI-C rules to translate the string between the '...'.
- It would have been cleaner to have all "..." strings handle
- ANSI-C escapes, but that would not be backward compatible.
- <DT>What is the -n option used for?<DD>
- You should always run ksh -n on each script you write.
- The -n
- option will check for syntax errors on paths that might not
- even be checked when you run the script.
- It also produces
- a number of warning messages.
- <DT>Why are both `...` and $(...) used for command substitution?<DD>
- The `...` method has some rather strange quoting rules
- and does not nest easily.
- $(...) was added to ksh88 to
- make command substitution easy to use.
- `...` is provided
- for backwards compatibility only.
- <DT>How can I tell if all the commands of a pipeline have succeeded?<DD>
- The pipefail option was added to the 'g' point release of ksh93.
- With pipefail set, a pipeline will fail if any element of the
- pipeline fails.
- The exit status will be that of the first
- command that has failed.
- <DT>What is the difference between [...] and [[...]]?<DD>
- The [[...]] is processed as part of the shell grammar
- whereas [...] is processed like any other command.
- Operators and operands are detected when the command is
- read, not after expansions are performed.
- The shell does not
- do word splitting or pathname generation inside [[...]].
- This allows patterns to be specified for string matching
- purposes. You should use [[...]] instead of [...] and test.
- <DT>How come [[ $foo == $bar ]] is true and [[ $bar == $foo ]] is false?<DD>
- The == operator is not symmetrical.
- It takes a string on the left
- and a pattern on the right.
- However, if you double quote the right
- hand side, which removes the special meaning of pattern match
- characters, then this becomes a string comparison so that
- [[ "$foo" == "bar" ]] and [[ "$bar" == "$foo" ]] are equivalent.
- <DT>Why does ksh93 have print since echo already exists is is widely used?<DD>
- The behavior of echo varies from system to system.
- The POSIX standard does not define the behavior of echo when
- the first argument beings with a - or when any argument
- contains a character.
- This makes echo pretty useless for
- use in portable scripts.
- <DT>What is $bar after running 'echo foo | read bar'?<DD>
- The answer is foo.
- ksh runs the last component of a pipeline
- in the current process.
- Some shells run it as a subshell
- as if you had invoked it as echo foo | (read bar).
- <DT>How can I access a substring of a variable?<DD>
- The syntax ${varname:offset:len} can be used to generate
- the string of length len starting at the the specified
- offset. String offsets start at 0. If :len is omitted,
- then the remainder of the string will be used. Both offset
- and len can be arithmetic expressions. A negative offset is
- subtracted from the last offset.
- <DT>What is the difference between ((expr)) and $((expr))?<DD>
- ((expr)) is a command that evaluates an arithmetic expression.
- The exit status of this command is 0 if the expression
- evaluates to non-zero and is 1 if it evaluates to 0.
- 0 is an string expansion that expands to a string
- representation of the value of this arithmetic expression.
- It can be used anywhere a variable substitution is permitted.
- <P>
- <DT>What is the difference between $((x*y)) and $(($x*$y))?<DD>
- In the first case the value of x and the value of y are multiplied
- together, and then their result is converted to a string.
- In the
- second case variables $x, *, and $y are concatenated to form
- an arithmetic expression which is then evaluated.
- This can
- yield different results, for example,
- <DIV class=FI>
- <PRE>
- x=2+3 y=4+5
- print $((x*y)) \$(($x*$y))
- 45 19
- When x and y are numeric the first form is recommended for better
- performance.
- </DIV>
- </PRE>
- <DT>How do I handle filenames with spaces in them?<DD>
- To be POSIX conforming, ksh has to do word splitting and
- pathname expansion the results of substitutions.
- You can
- enclose variable substitutions in "..." to prevent both
- word splitting and pathname expansion.
- Alternatively,
- you can disable word splitting by setting IFS='' and
- pathname generation with set -o noglob.
- <DT>What are active variables?<DD>
- By default shell variables are passive.
- They hold values
- given to them on assignment, and return values on reference.
- Active variables allow the assignment and reference (and
- other actions) be controlled by functions specific to that
- variable.
- At the shell level, a 'get', 'set', or 'unset'
- shell function can be defined for any variable to make them
- active, so that the function foo.set will be invoked whenever
- the variable foo is assigned a value.
- At the C interface
- level, several functions can be stacked together for an
- active variable.
- <DT>What is the difference between function name and name()?<DD>
- In ksh88 these were the same.
- However, the POSIX standard
- choose foo() for functions and defined System V Release 2
- semantics to them so that there are no local variables
- and so that traps are not scoped.
- ksh93 keeps the ksh88
- semantics for functions defined as function name, and
- has changed the name() semantics to match the POSIX
- semantics.
- Clearly,
- <STRONG>function</STRONG>
- <EM>name</EM>
- is more useful.
- <DT>What is the naming conventions for files in FPATH and can one file contain more than one function definition?<DD>
- You can have more than one function defined in each file defined
- in FPATH and all of them will be added to the list of known
- functions. Any commands placed in this file outside of function
- definitions will be invoked first. The name of the file must be
- that of the first function you invoke. If you have several functions
- defined in one file, then you should create a link to each of the
- function names that can potentially be invoked first.
- <DT>What are name reference variables and how are they used?<DD>
- Reference variables are variables in which all references
- and assignments refer to the variable that they reference.
- For example,
- <DIV class=FI>
- <PRE>
- typeset -n name=$1
- name=value
- </DIV>
- </PRE>
- is equivalent to
- <DIV class=FI>
- <PRE>
- eval \$1='value'
- </DIV>
- </PRE>
- References are most useful for passing arguments such as
- arrays to functions.
- <DT>If i=1 and var1=some value, how do I print var$i to get its value?<DD>
- Either use
- <DIV class=FI>
- <PRE>
- eval print var\$i
- </DIV>
- </PRE>
- or
- <DIV class=FI>
- <PRE>
- typeset -n x=var$i
- print $x
- </DIV>
- </PRE>
- <DT>How can I shift the elements of an array?<DD>
- The shift special builtin-command only works for positional
- parameters.
- However, noting that array subscripts start at 0, you can use
- <DIV class=FI>
- <PRE>
- typeset -A name "${name[@]:1}"
- </DIV>
- </PRE>
- to shift the array.
- <DT>Why are the braces required with array references, e.g. ${x[1]}?<DD>
- It would be nice to do $x[1], but the POSIX shell would expand $x
- and then search for the file pattern resulting by concatenating [1].
- ksh is POSIX compatible.
- <DT>How do I get the list of subscript names for an associative array?<DD>
- The prefix operator ! in variable expansions can be used to get names.
- To get the names of subscripts for an array, associative
- or indexed, use ${!var[@]}.
- <DT>How do I do global substitutions on the contents of shell variables?<DD>
- Use // instead of / for global substitution, ${var//aa/bb} will
- expand to the value of with each "aa" replace by "bb".
- <DT>How can I convert %XX values to ascii?<DD>
- You can convert this to a sequence of ANSI C strings and then eval that
- string, for example suppose the variable 'foo' contains %XX strings, then
- <DIV class=FI>
- <PRE>
- eval print -r -- "\$'${foo//'%'@(??)/'\x\1"'\$'"}'"
- </DIV>
- </PRE>
- will print out the string in ascii.
- <DT>I want to use exec to open a file. How do I prevent the script from exiting if the exec fails?<DD>
- If you run
- <DIV class=FI>
- <PRE>
- command exec ... || error ...
- </DIV>
- </PRE>
- then error will be executed if the exec fails, but the script
- will not terminate.
- The command builtin will prevent the shell
- from exiting when special built-ins fail.
- <DT>How do I execute a builtin inside a function of the same name?<DD>
- You use the command builtin for this.
- For example,
- <DIV class=FI>
- <PRE>
- function cd
- {
- command cd "$@" && title "$PWD"
- }
- </DIV>
- </PRE>
- will run the builtin command cd from within the function cd
- rather than calling the function cd recursively.
- <DT>How are variables scoped in ksh?<DD>
- The scoping of variables was not defined for ksh88 but in ksh93
- static scoping was specified.
- For example the output from
- <DIV class=FI>
- <PRE>
- function f1
- {
- print foo=$foo
- }
- function f2
- {
- typeset foo=local
- f1
- }
- foo=global
- f2
- </DIV>
- </PRE>
- will be "global".
- To get f2 to cause f1 to print the local
- value of foo, f2 can run "foo=$foo f1" instead.
- <DT>Can you write a self reproducing program in KornShell?<DD>
- Yes, the following program is self reproducing.
- Any shorter ones?
- <DIV class=FI>
- <PRE>
- n="
- " q="'" x="cat <<-!" y=! z='n="$n" q="$q" x="$x" y=$y z=$q$z$q$n$x$n$z$n$y'
- cat <<-!
- n="$n" q="$q" x="$x" y=$y z=$q$z$q$n$x$n$z$n$y
- !
- </DIV>
- </PRE>
- </DL>
- </DIV>
- <P>
- <P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="redirections">redirections</A></H3></FONT></FONT></CENTER>
- <DIV class=SH>
- <DL>
- <DT>How do I redirect both standard input and standard output to a file?<DD>
- Add the following redirections to the command.
- > file 2> &1.
- This will redirect standard output (file descriptor 1) to "file" and
- standard error (file descriptor 2) to the same place as file descriptor 1.
- ksh redirection allows you to redirect any single digit file descriptor
- by putting the descriptor number in front of the redirection operator
- with no intervening space.
- <DT>Is there a way for the shell to pick the file number when I open a file?<DD>
- Yes, a redirection operator operator can be preceded by {n} without any
- intervening space where n is the name of a variable. The file descriptor
- will be placed in variable n.
- <DT>How do I connect to a socket from a shell script?<DD>
- exec 3<> /dev/tcp/hostname/portnum
- will open a tcp connection to portnum on hostname for
- reading and writing on file descriptor 3.
- You can then
- use read and print statements with file descriptor 3,
- or redirection operators <&3 or >&3 to use these connections.
- <DT>How do I seek to a given location in a file?<DD>
- The redirection operators <# and ># allow you to seek to a specified
- location in a file. The operator can be followed by an arithmetic
- expression contained in ((...)). The variables CUR and EOF can be used
- in the arithmetic expression to get relative locations or locations
- relative to the end of file respectively.
- Alternatively, <# and ># can be followed by a shell pattern. In this
- case, the file will be positioned to beginning of the next line
- containing this pattern.
- <DT>What is the the <<< redirection operator?<DD>
- It denotes a here-document in which the document is contained the
- argument that follows <<< and therefore there is no delimiter.
- <DT>What is the the >; redirection operator?<DD>
- This operator writes the output into a temporary file in the same
- directory as the file specified after >;. If the command completes
- successfully, then the the file is replaced. Otherwise, the
- original file is unchanged and the temporary file removed.
- <DT>What is the the <>; redirection operator?<DD>
- The file is opened for reading and writing as with <>. However,
- when the file is closed it is truncated to the its current location.
- </DL>
- </DIV>
- <P>
- <P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="extensions">extensions</A></H3></FONT></FONT></CENTER>
- <DIV class=SH>
- <DL>
- <DT>Is there a shell compiler?<DD>
- There is a separate command named shcomp that will convert
- a script into an intermediate machine independent form.
- The shell will detect this format whenever it runs a script and execute
- directly from this intermediate format.
- <DT>What is the advantage of making commands built-in?<DD>
- The startup time is reduced by a couple of orders of magnitude.
- In addition, built-in commands can access ksh internals.
- <DT>What is the disadvantage of making commands built-in?<DD>
- Errors in these built-ins can cause the shell to crash.
- <DT>How do I add built-in commands?<DD>
- There are two ways to do this.
- One is write a shared library
- with functions whose names are b_xxxx where xxxx is the name of
- the builtin.
- The function b_xxxx takes three arguments.
- The first
- two are the same as a mail program.
- The third parameter is
- a pointer argument which will point to the current shell context.
- The second way is to write a shared library with a function named
- lib_init().
- This function will be called with an argument of 0
- after the library is loaded.
- This function can add built-ins
- with the sh_addbuiltin() API function.
- In both cases, the
- library is loaded into the shell with the "builtin" utility.
- <DT>Can ksh93 be embedded?<DD>
- Yes, ksh93 can be compiled as a shared or dynamically linked
- library which can be embedded into applications.
- There is
- an API for interfacing to shell variables and to several of
- the internal shell functions.
- <DT>Can I write GUI applications with ksh?<DD>
- There are two extensions to ksh that can be used to write
- GUI applications as shell script.
- One is dtksh which
- was written by Steve Pendergrast at Novell and is
- included with the Common Desktop Environment, CDE.
- The other is
- tksh which was written by Jeff Korn.
- tksh combines the tk graphics
- package with ksh93 and reimplements the tcl language
- as an extension so that both tcl and ksh scripts
- can run in the same address space.
- The source for tksh
- is included in the ast-open package.
- </DL>
- </DIV>
- <TABLE cellpadding=4>
- <TR>
- <TD bgcolor=teal><A href='#' onclick='FAQ_mark("show")'><FONT color="#FFD87D">show all answers</FONT></A></TD>
- <TD bgcolor=teal><A href='#' onclick='FAQ_mark("hide")'><FONT color="#FFD87D">hide all answers</FONT></A></TD>
- </TR>
- </TABLE>
- <P>
- <HR>
- <TABLE border=0 align=center width=96%>
- <TR>
- <TD align=left></TD>
- <TD align=center></TD>
- <TD align=right>June 19, 2012</TD>
- </TR>
- </TABLE>
- <P>
- </TD></TR></TBODY></TABLE>
- </BODY>
- </HTML>
|