mirror of
				git://git.code.sf.net/p/cdesktopenv/code
				synced 2025-03-09 15:50:02 +00:00 
			
		
		
		
	A column of whitespace in the NEWS file was removed for consistent formatting. Most of the spelling errors were found with this codespell dictionary: https://github.com/orbitcowboy/codespell_dictionary (cherry picked from commit 0e36b17abe5609c461a3e4da7041eb0fdf9991b7)
		
			
				
	
	
		
			1004 lines
		
	
	
	
		
			33 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			1004 lines
		
	
	
	
		
			33 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!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>
 |