From: Chet Ramey Date: Mon, 30 Dec 2013 14:39:07 +0000 (-0500) Subject: commit bash-20131227 snapshot X-Git-Tag: bash-4.4-alpha~108 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6e51e0d00de18928a6b1d7e44c377797e664082b;p=thirdparty%2Fbash.git commit bash-20131227 snapshot --- diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog index fca955098..0abfed874 100644 --- a/CWRU/CWRU.chlog +++ b/CWRU/CWRU.chlog @@ -5499,3 +5499,29 @@ expr.c - exp2: save token pointer before calling readtok(), arrange to use saved token pointer when printing error token on a division by 0 error + + 12/27 + ----- +lib/readline/display.c + - rl_redisplay: when calculating effects of invisible characters in a + prompt that is split across physical screen lines to set the indices + of linebreaks, don't bother testing local_prompt_prefix (line 751). + That prefix doesn't matter when calculating prompt visible and + invisible characters. Fixes problem reported by Jinesh Choksi + + +Makefile.in + - install: make sure to use $(DESTDIR) when installing OTHER_DOCS. + Report and fix from Matthias Klose + +doc/texinfo.tex + - updated to version of 2013-09-11 + + 12/28 + ----- +lib/readline/undo.c + - rl_do_undo: if we are undoing from a history entry (rl_undo_list == + current_history()->data), make sure the change to rl_line_buffer is + reflected in the history entry. We use the guts of + rl_maybe_replace_line to do the work. Fixes problem reported by + gregrwm diff --git a/CWRU/CWRU.chlog~ b/CWRU/CWRU.chlog~ index ea418ea91..be37625d4 100644 --- a/CWRU/CWRU.chlog~ +++ b/CWRU/CWRU.chlog~ @@ -5494,3 +5494,25 @@ execute_cmd.c - execute_for_command: make sure to set line_number before expanding the word list, so expansion errors have the right line number. From a report from Ben Okopnik + +expr.c + - exp2: save token pointer before calling readtok(), arrange to use + saved token pointer when printing error token on a division by 0 + error + + 12/27 + ----- +lib/readline/display.c + - rl_redisplay: when calculating effects of invisible characters in a + prompt that is split across physical screen lines to set the indices + of linebreaks, don't bother testing local_prompt_prefix (line 751). + That prefix doesn't matter when calculating prompt visible and + invisible characters. Fixes problem reported by Jinesh Choksi + + +Makefile.in + - install: make sure to use $(DESTDIR) when installing OTHER_DOCS. + Report and fix from Matthias Klose + +doc/texinfo.tex + - updated to version of 2013-09-11 diff --git a/Makefile.in b/Makefile.in index c3780f7b4..310f0d2c7 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,4 +1,4 @@ -# Makefile for bash-4.3, version 4.10 +# Makefile for bash-4.3, version 4.11 # # Copyright (C) 1996-2012 Free Software Foundation, Inc. @@ -766,7 +766,7 @@ installdirs: install: .made installdirs $(INSTALL_PROGRAM) $(INSTALLMODE) $(Program) $(DESTDIR)$(bindir)/$(Program) $(INSTALL_SCRIPT) $(INSTALLMODE2) bashbug $(DESTDIR)$(bindir)/bashbug - $(INSTALL_DATA) $(OTHER_DOCS) $(docdir) + $(INSTALL_DATA) $(OTHER_DOCS) $(DESTDIR)$(docdir) -( cd $(DOCDIR) ; $(MAKE) $(MFLAGS) \ man1dir=$(man1dir) man1ext=$(man1ext) \ man3dir=$(man3dir) man3ext=$(man3ext) \ diff --git a/doc/bashref.aux b/doc/bashref.aux index d2b3ba08f..4dadc1b93 100644 --- a/doc/bashref.aux +++ b/doc/bashref.aux @@ -155,11 +155,11 @@ @xrdef{Modifying Shell Behavior-snt}{Section@tie 4.3} @xrdef{The Set Builtin-title}{The Set Builtin} @xrdef{The Set Builtin-snt}{Section@tie 4.3.1} -@xrdef{Modifying Shell Behavior-pg}{59} -@xrdef{The Set Builtin-pg}{59} +@xrdef{Modifying Shell Behavior-pg}{58} +@xrdef{The Set Builtin-pg}{58} @xrdef{The Shopt Builtin-title}{The Shopt Builtin} @xrdef{The Shopt Builtin-snt}{Section@tie 4.3.2} -@xrdef{The Shopt Builtin-pg}{63} +@xrdef{The Shopt Builtin-pg}{62} @xrdef{Special Builtins-title}{Special Builtins} @xrdef{Special Builtins-snt}{Section@tie 4.4} @xrdef{Special Builtins-pg}{68} @@ -186,11 +186,11 @@ @xrdef{What is an Interactive Shell?-title}{What is an Interactive Shell?} @xrdef{What is an Interactive Shell?-snt}{Section@tie 6.3.1} @xrdef{Interactive Shells-pg}{83} +@xrdef{What is an Interactive Shell?-pg}{83} @xrdef{Is this Shell Interactive?-title}{Is this Shell Interactive?} @xrdef{Is this Shell Interactive?-snt}{Section@tie 6.3.2} @xrdef{Interactive Shell Behavior-title}{Interactive Shell Behavior} @xrdef{Interactive Shell Behavior-snt}{Section@tie 6.3.3} -@xrdef{What is an Interactive Shell?-pg}{84} @xrdef{Is this Shell Interactive?-pg}{84} @xrdef{Interactive Shell Behavior-pg}{84} @xrdef{Bash Conditional Expressions-title}{Bash Conditional Expressions} @@ -209,29 +209,29 @@ @xrdef{The Directory Stack-snt}{Section@tie 6.8} @xrdef{Directory Stack Builtins-title}{Directory Stack Builtins} @xrdef{Directory Stack Builtins-snt}{Section@tie 6.8.1} -@xrdef{The Directory Stack-pg}{91} -@xrdef{Directory Stack Builtins-pg}{91} +@xrdef{The Directory Stack-pg}{90} +@xrdef{Directory Stack Builtins-pg}{90} @xrdef{Controlling the Prompt-title}{Controlling the Prompt} @xrdef{Controlling the Prompt-snt}{Section@tie 6.9} @xrdef{Controlling the Prompt-pg}{92} @xrdef{The Restricted Shell-title}{The Restricted Shell} @xrdef{The Restricted Shell-snt}{Section@tie 6.10} -@xrdef{The Restricted Shell-pg}{93} @xrdef{Bash POSIX Mode-title}{Bash POSIX Mode} @xrdef{Bash POSIX Mode-snt}{Section@tie 6.11} +@xrdef{The Restricted Shell-pg}{93} @xrdef{Bash POSIX Mode-pg}{94} @xrdef{Job Control-title}{Job Control} @xrdef{Job Control-snt}{Chapter@tie 7} @xrdef{Job Control Basics-title}{Job Control Basics} @xrdef{Job Control Basics-snt}{Section@tie 7.1} -@xrdef{Job Control-pg}{98} -@xrdef{Job Control Basics-pg}{98} +@xrdef{Job Control-pg}{97} +@xrdef{Job Control Basics-pg}{97} @xrdef{Job Control Builtins-title}{Job Control Builtins} @xrdef{Job Control Builtins-snt}{Section@tie 7.2} -@xrdef{Job Control Builtins-pg}{99} +@xrdef{Job Control Builtins-pg}{98} @xrdef{Job Control Variables-title}{Job Control Variables} @xrdef{Job Control Variables-snt}{Section@tie 7.3} -@xrdef{Job Control Variables-pg}{101} +@xrdef{Job Control Variables-pg}{100} @xrdef{Command Line Editing-title}{Command Line Editing} @xrdef{Command Line Editing-snt}{Chapter@tie 8} @xrdef{Introduction and Notation-title}{Introduction to Line Editing} @@ -240,145 +240,145 @@ @xrdef{Readline Interaction-snt}{Section@tie 8.2} @xrdef{Readline Bare Essentials-title}{Readline Bare Essentials} @xrdef{Readline Bare Essentials-snt}{Section@tie 8.2.1} -@xrdef{Command Line Editing-pg}{102} -@xrdef{Introduction and Notation-pg}{102} -@xrdef{Readline Interaction-pg}{102} +@xrdef{Command Line Editing-pg}{101} +@xrdef{Introduction and Notation-pg}{101} +@xrdef{Readline Interaction-pg}{101} @xrdef{Readline Movement Commands-title}{Readline Movement Commands} @xrdef{Readline Movement Commands-snt}{Section@tie 8.2.2} @xrdef{Readline Killing Commands-title}{Readline Killing Commands} @xrdef{Readline Killing Commands-snt}{Section@tie 8.2.3} -@xrdef{Readline Bare Essentials-pg}{103} -@xrdef{Readline Movement Commands-pg}{103} +@xrdef{Readline Bare Essentials-pg}{102} +@xrdef{Readline Movement Commands-pg}{102} @xrdef{Readline Arguments-title}{Readline Arguments} @xrdef{Readline Arguments-snt}{Section@tie 8.2.4} @xrdef{Searching-title}{Searching for Commands in the History} @xrdef{Searching-snt}{Section@tie 8.2.5} -@xrdef{Readline Killing Commands-pg}{104} -@xrdef{Readline Arguments-pg}{104} -@xrdef{Searching-pg}{104} +@xrdef{Readline Killing Commands-pg}{103} +@xrdef{Readline Arguments-pg}{103} +@xrdef{Searching-pg}{103} @xrdef{Readline Init File-title}{Readline Init File} @xrdef{Readline Init File-snt}{Section@tie 8.3} @xrdef{Readline Init File Syntax-title}{Readline Init File Syntax} @xrdef{Readline Init File Syntax-snt}{Section@tie 8.3.1} -@xrdef{Readline Init File-pg}{105} -@xrdef{Readline Init File Syntax-pg}{105} +@xrdef{Readline Init File-pg}{104} +@xrdef{Readline Init File Syntax-pg}{104} @xrdef{Conditional Init Constructs-title}{Conditional Init Constructs} @xrdef{Conditional Init Constructs-snt}{Section@tie 8.3.2} -@xrdef{Conditional Init Constructs-pg}{112} +@xrdef{Conditional Init Constructs-pg}{111} @xrdef{Sample Init File-title}{Sample Init File} @xrdef{Sample Init File-snt}{Section@tie 8.3.3} -@xrdef{Sample Init File-pg}{113} +@xrdef{Sample Init File-pg}{112} @xrdef{Bindable Readline Commands-title}{Bindable Readline Commands} @xrdef{Bindable Readline Commands-snt}{Section@tie 8.4} @xrdef{Commands For Moving-title}{Commands For Moving} @xrdef{Commands For Moving-snt}{Section@tie 8.4.1} @xrdef{Commands For History-title}{Commands For Manipulating The History} @xrdef{Commands For History-snt}{Section@tie 8.4.2} -@xrdef{Bindable Readline Commands-pg}{116} -@xrdef{Commands For Moving-pg}{116} -@xrdef{Commands For History-pg}{117} +@xrdef{Bindable Readline Commands-pg}{115} +@xrdef{Commands For Moving-pg}{115} +@xrdef{Commands For History-pg}{116} @xrdef{Commands For Text-title}{Commands For Changing Text} @xrdef{Commands For Text-snt}{Section@tie 8.4.3} -@xrdef{Commands For Text-pg}{118} +@xrdef{Commands For Text-pg}{117} @xrdef{Commands For Killing-title}{Killing And Yanking} @xrdef{Commands For Killing-snt}{Section@tie 8.4.4} -@xrdef{Commands For Killing-pg}{119} +@xrdef{Commands For Killing-pg}{118} @xrdef{Numeric Arguments-title}{Specifying Numeric Arguments} @xrdef{Numeric Arguments-snt}{Section@tie 8.4.5} -@xrdef{Numeric Arguments-pg}{120} +@xrdef{Numeric Arguments-pg}{119} @xrdef{Commands For Completion-title}{Letting Readline Type For You} @xrdef{Commands For Completion-snt}{Section@tie 8.4.6} -@xrdef{Commands For Completion-pg}{121} +@xrdef{Commands For Completion-pg}{120} @xrdef{Keyboard Macros-title}{Keyboard Macros} @xrdef{Keyboard Macros-snt}{Section@tie 8.4.7} -@xrdef{Keyboard Macros-pg}{122} +@xrdef{Keyboard Macros-pg}{121} @xrdef{Miscellaneous Commands-title}{Some Miscellaneous Commands} @xrdef{Miscellaneous Commands-snt}{Section@tie 8.4.8} -@xrdef{Miscellaneous Commands-pg}{123} +@xrdef{Miscellaneous Commands-pg}{122} @xrdef{Readline vi Mode-title}{Readline vi Mode} @xrdef{Readline vi Mode-snt}{Section@tie 8.5} @xrdef{Programmable Completion-title}{Programmable Completion} @xrdef{Programmable Completion-snt}{Section@tie 8.6} -@xrdef{Readline vi Mode-pg}{125} -@xrdef{Programmable Completion-pg}{125} +@xrdef{Readline vi Mode-pg}{124} +@xrdef{Programmable Completion-pg}{124} @xrdef{Programmable Completion Builtins-title}{Programmable Completion Builtins} @xrdef{Programmable Completion Builtins-snt}{Section@tie 8.7} -@xrdef{Programmable Completion Builtins-pg}{127} +@xrdef{Programmable Completion Builtins-pg}{126} @xrdef{A Programmable Completion Example-title}{A Programmable Completion Example} @xrdef{A Programmable Completion Example-snt}{Section@tie 8.8} -@xrdef{A Programmable Completion Example-pg}{131} +@xrdef{A Programmable Completion Example-pg}{130} @xrdef{Using History Interactively-title}{Using History Interactively} @xrdef{Using History Interactively-snt}{Chapter@tie 9} @xrdef{Bash History Facilities-title}{Bash History Facilities} @xrdef{Bash History Facilities-snt}{Section@tie 9.1} @xrdef{Bash History Builtins-title}{Bash History Builtins} @xrdef{Bash History Builtins-snt}{Section@tie 9.2} -@xrdef{Using History Interactively-pg}{134} -@xrdef{Bash History Facilities-pg}{134} -@xrdef{Bash History Builtins-pg}{134} +@xrdef{Using History Interactively-pg}{133} +@xrdef{Bash History Facilities-pg}{133} +@xrdef{Bash History Builtins-pg}{133} @xrdef{History Interaction-title}{History Expansion} @xrdef{History Interaction-snt}{Section@tie 9.3} @xrdef{Event Designators-title}{Event Designators} @xrdef{Event Designators-snt}{Section@tie 9.3.1} -@xrdef{History Interaction-pg}{136} +@xrdef{History Interaction-pg}{135} +@xrdef{Event Designators-pg}{135} @xrdef{Word Designators-title}{Word Designators} @xrdef{Word Designators-snt}{Section@tie 9.3.2} -@xrdef{Event Designators-pg}{137} -@xrdef{Word Designators-pg}{137} +@xrdef{Word Designators-pg}{136} @xrdef{Modifiers-title}{Modifiers} @xrdef{Modifiers-snt}{Section@tie 9.3.3} -@xrdef{Modifiers-pg}{138} +@xrdef{Modifiers-pg}{137} @xrdef{Installing Bash-title}{Installing Bash} @xrdef{Installing Bash-snt}{Chapter@tie 10} @xrdef{Basic Installation-title}{Basic Installation} @xrdef{Basic Installation-snt}{Section@tie 10.1} @xrdef{Compilers and Options-title}{Compilers and Options} @xrdef{Compilers and Options-snt}{Section@tie 10.2} -@xrdef{Installing Bash-pg}{139} -@xrdef{Basic Installation-pg}{139} +@xrdef{Installing Bash-pg}{138} +@xrdef{Basic Installation-pg}{138} @xrdef{Compiling For Multiple Architectures-title}{Compiling For Multiple Architectures} @xrdef{Compiling For Multiple Architectures-snt}{Section@tie 10.3} @xrdef{Installation Names-title}{Installation Names} @xrdef{Installation Names-snt}{Section@tie 10.4} @xrdef{Specifying the System Type-title}{Specifying the System Type} @xrdef{Specifying the System Type-snt}{Section@tie 10.5} -@xrdef{Compilers and Options-pg}{140} -@xrdef{Compiling For Multiple Architectures-pg}{140} -@xrdef{Installation Names-pg}{140} -@xrdef{Specifying the System Type-pg}{140} +@xrdef{Compilers and Options-pg}{139} +@xrdef{Compiling For Multiple Architectures-pg}{139} +@xrdef{Installation Names-pg}{139} +@xrdef{Specifying the System Type-pg}{139} @xrdef{Sharing Defaults-title}{Sharing Defaults} @xrdef{Sharing Defaults-snt}{Section@tie 10.6} @xrdef{Operation Controls-title}{Operation Controls} @xrdef{Operation Controls-snt}{Section@tie 10.7} @xrdef{Optional Features-title}{Optional Features} @xrdef{Optional Features-snt}{Section@tie 10.8} -@xrdef{Sharing Defaults-pg}{141} -@xrdef{Operation Controls-pg}{141} -@xrdef{Optional Features-pg}{141} +@xrdef{Sharing Defaults-pg}{140} +@xrdef{Operation Controls-pg}{140} +@xrdef{Optional Features-pg}{140} @xrdef{Reporting Bugs-title}{Reporting Bugs} @xrdef{Reporting Bugs-snt}{Appendix@tie @char65{}} -@xrdef{Reporting Bugs-pg}{146} +@xrdef{Reporting Bugs-pg}{145} @xrdef{Major Differences From The Bourne Shell-title}{Major Differences From The Bourne Shell} @xrdef{Major Differences From The Bourne Shell-snt}{Appendix@tie @char66{}} -@xrdef{Major Differences From The Bourne Shell-pg}{147} +@xrdef{Major Differences From The Bourne Shell-pg}{146} @xrdef{GNU Free Documentation License-title}{GNU Free Documentation License} @xrdef{GNU Free Documentation License-snt}{Appendix@tie @char67{}} -@xrdef{GNU Free Documentation License-pg}{153} +@xrdef{GNU Free Documentation License-pg}{152} @xrdef{Indexes-title}{Indexes} @xrdef{Indexes-snt}{Appendix@tie @char68{}} @xrdef{Builtin Index-title}{Index of Shell Builtin Commands} @xrdef{Builtin Index-snt}{Section@tie @char68.1} -@xrdef{Indexes-pg}{161} -@xrdef{Builtin Index-pg}{161} +@xrdef{Indexes-pg}{160} +@xrdef{Builtin Index-pg}{160} @xrdef{Reserved Word Index-title}{Index of Shell Reserved Words} @xrdef{Reserved Word Index-snt}{Section@tie @char68.2} @xrdef{Variable Index-title}{Parameter and Variable Index} @xrdef{Variable Index-snt}{Section@tie @char68.3} -@xrdef{Reserved Word Index-pg}{162} -@xrdef{Variable Index-pg}{162} +@xrdef{Reserved Word Index-pg}{161} +@xrdef{Variable Index-pg}{161} @xrdef{Function Index-title}{Function Index} @xrdef{Function Index-snt}{Section@tie @char68.4} -@xrdef{Function Index-pg}{164} +@xrdef{Function Index-pg}{163} @xrdef{Concept Index-title}{Concept Index} @xrdef{Concept Index-snt}{Section@tie @char68.5} -@xrdef{Concept Index-pg}{166} +@xrdef{Concept Index-pg}{165} diff --git a/doc/bashref.bt b/doc/bashref.bt index 069b2ae02..9a297c688 100644 --- a/doc/bashref.bt +++ b/doc/bashref.bt @@ -30,30 +30,30 @@ \entry{help}{53}{\code {help}} \entry{let}{53}{\code {let}} \entry{local}{53}{\code {local}} -\entry{logout}{54}{\code {logout}} -\entry{mapfile}{54}{\code {mapfile}} +\entry{logout}{53}{\code {logout}} +\entry{mapfile}{53}{\code {mapfile}} \entry{printf}{54}{\code {printf}} \entry{read}{55}{\code {read}} \entry{readarray}{56}{\code {readarray}} -\entry{source}{57}{\code {source}} -\entry{type}{57}{\code {type}} +\entry{source}{56}{\code {source}} +\entry{type}{56}{\code {type}} \entry{typeset}{57}{\code {typeset}} \entry{ulimit}{57}{\code {ulimit}} \entry{unalias}{58}{\code {unalias}} -\entry{set}{59}{\code {set}} -\entry{shopt}{63}{\code {shopt}} -\entry{dirs}{91}{\code {dirs}} +\entry{set}{58}{\code {set}} +\entry{shopt}{62}{\code {shopt}} +\entry{dirs}{90}{\code {dirs}} \entry{popd}{91}{\code {popd}} -\entry{pushd}{92}{\code {pushd}} -\entry{bg}{99}{\code {bg}} -\entry{fg}{99}{\code {fg}} -\entry{jobs}{99}{\code {jobs}} -\entry{kill}{100}{\code {kill}} -\entry{wait}{100}{\code {wait}} -\entry{disown}{100}{\code {disown}} -\entry{suspend}{100}{\code {suspend}} -\entry{compgen}{127}{\code {compgen}} -\entry{complete}{128}{\code {complete}} -\entry{compopt}{131}{\code {compopt}} -\entry{fc}{134}{\code {fc}} -\entry{history}{135}{\code {history}} +\entry{pushd}{91}{\code {pushd}} +\entry{bg}{98}{\code {bg}} +\entry{fg}{98}{\code {fg}} +\entry{jobs}{98}{\code {jobs}} +\entry{kill}{99}{\code {kill}} +\entry{wait}{99}{\code {wait}} +\entry{disown}{99}{\code {disown}} +\entry{suspend}{99}{\code {suspend}} +\entry{compgen}{126}{\code {compgen}} +\entry{complete}{127}{\code {complete}} +\entry{compopt}{130}{\code {compopt}} +\entry{fc}{133}{\code {fc}} +\entry{history}{134}{\code {history}} diff --git a/doc/bashref.bts b/doc/bashref.bts index 5c182f5b5..410a55713 100644 --- a/doc/bashref.bts +++ b/doc/bashref.bts @@ -7,7 +7,7 @@ \initial {A} \entry {\code {alias}}{48} \initial {B} -\entry {\code {bg}}{99} +\entry {\code {bg}}{98} \entry {\code {bind}}{48} \entry {\code {break}}{41} \entry {\code {builtin}}{49} @@ -15,14 +15,14 @@ \entry {\code {caller}}{50} \entry {\code {cd}}{42} \entry {\code {command}}{50} -\entry {\code {compgen}}{127} -\entry {\code {complete}}{128} -\entry {\code {compopt}}{131} +\entry {\code {compgen}}{126} +\entry {\code {complete}}{127} +\entry {\code {compopt}}{130} \entry {\code {continue}}{42} \initial {D} \entry {\code {declare}}{50} -\entry {\code {dirs}}{91} -\entry {\code {disown}}{100} +\entry {\code {dirs}}{90} +\entry {\code {disown}}{99} \initial {E} \entry {\code {echo}}{52} \entry {\code {enable}}{52} @@ -31,28 +31,28 @@ \entry {\code {exit}}{43} \entry {\code {export}}{43} \initial {F} -\entry {\code {fc}}{134} -\entry {\code {fg}}{99} +\entry {\code {fc}}{133} +\entry {\code {fg}}{98} \initial {G} \entry {\code {getopts}}{43} \initial {H} \entry {\code {hash}}{44} \entry {\code {help}}{53} -\entry {\code {history}}{135} +\entry {\code {history}}{134} \initial {J} -\entry {\code {jobs}}{99} +\entry {\code {jobs}}{98} \initial {K} -\entry {\code {kill}}{100} +\entry {\code {kill}}{99} \initial {L} \entry {\code {let}}{53} \entry {\code {local}}{53} -\entry {\code {logout}}{54} +\entry {\code {logout}}{53} \initial {M} -\entry {\code {mapfile}}{54} +\entry {\code {mapfile}}{53} \initial {P} \entry {\code {popd}}{91} \entry {\code {printf}}{54} -\entry {\code {pushd}}{92} +\entry {\code {pushd}}{91} \entry {\code {pwd}}{44} \initial {R} \entry {\code {read}}{55} @@ -60,16 +60,16 @@ \entry {\code {readonly}}{44} \entry {\code {return}}{45} \initial {S} -\entry {\code {set}}{59} +\entry {\code {set}}{58} \entry {\code {shift}}{45} -\entry {\code {shopt}}{63} -\entry {\code {source}}{57} -\entry {\code {suspend}}{100} +\entry {\code {shopt}}{62} +\entry {\code {source}}{56} +\entry {\code {suspend}}{99} \initial {T} \entry {\code {test}}{45} \entry {\code {times}}{46} \entry {\code {trap}}{47} -\entry {\code {type}}{57} +\entry {\code {type}}{56} \entry {\code {typeset}}{57} \initial {U} \entry {\code {ulimit}}{57} @@ -77,4 +77,4 @@ \entry {\code {unalias}}{58} \entry {\code {unset}}{48} \initial {W} -\entry {\code {wait}}{100} +\entry {\code {wait}}{99} diff --git a/doc/bashref.cp b/doc/bashref.cp index ba23de504..a36156e1e 100644 --- a/doc/bashref.cp +++ b/doc/bashref.cp @@ -72,8 +72,8 @@ \entry{signal handling}{38}{signal handling} \entry{shell script}{39}{shell script} \entry{special builtin}{68}{special builtin} -\entry{login shell}{82}{login shell} -\entry{interactive shell}{82}{interactive shell} +\entry{login shell}{81}{login shell} +\entry{interactive shell}{81}{interactive shell} \entry{startup files}{82}{startup files} \entry{interactive shell}{83}{interactive shell} \entry{shell, interactive}{83}{shell, interactive} @@ -85,34 +85,34 @@ \entry{arithmetic evaluation}{87}{arithmetic evaluation} \entry{alias expansion}{88}{alias expansion} \entry{arrays}{89}{arrays} -\entry{directory stack}{91}{directory stack} +\entry{directory stack}{90}{directory stack} \entry{prompting}{92}{prompting} \entry{restricted shell}{93}{restricted shell} \entry{POSIX Mode}{94}{POSIX Mode} -\entry{job control}{98}{job control} -\entry{foreground}{98}{foreground} -\entry{background}{98}{background} -\entry{suspending jobs}{98}{suspending jobs} -\entry{Readline, how to use}{101}{Readline, how to use} -\entry{interaction, readline}{102}{interaction, readline} -\entry{notation, readline}{103}{notation, readline} -\entry{command editing}{103}{command editing} -\entry{editing command lines}{103}{editing command lines} -\entry{killing text}{104}{killing text} -\entry{yanking text}{104}{yanking text} -\entry{kill ring}{104}{kill ring} -\entry{initialization file, readline}{105}{initialization file, readline} -\entry{variables, readline}{106}{variables, readline} -\entry{programmable completion}{125}{programmable completion} -\entry{completion builtins}{127}{completion builtins} -\entry{History, how to use}{133}{History, how to use} -\entry{command history}{134}{command history} -\entry{history list}{134}{history list} -\entry{history builtins}{134}{history builtins} -\entry{history expansion}{136}{history expansion} -\entry{event designators}{137}{event designators} -\entry{history events}{137}{history events} -\entry{installation}{139}{installation} -\entry{configuration}{139}{configuration} -\entry{Bash installation}{139}{Bash installation} -\entry{Bash configuration}{139}{Bash configuration} +\entry{job control}{97}{job control} +\entry{foreground}{97}{foreground} +\entry{background}{97}{background} +\entry{suspending jobs}{97}{suspending jobs} +\entry{Readline, how to use}{100}{Readline, how to use} +\entry{interaction, readline}{101}{interaction, readline} +\entry{notation, readline}{102}{notation, readline} +\entry{command editing}{102}{command editing} +\entry{editing command lines}{102}{editing command lines} +\entry{killing text}{103}{killing text} +\entry{yanking text}{103}{yanking text} +\entry{kill ring}{103}{kill ring} +\entry{initialization file, readline}{104}{initialization file, readline} +\entry{variables, readline}{105}{variables, readline} +\entry{programmable completion}{124}{programmable completion} +\entry{completion builtins}{126}{completion builtins} +\entry{History, how to use}{132}{History, how to use} +\entry{command history}{133}{command history} +\entry{history list}{133}{history list} +\entry{history builtins}{133}{history builtins} +\entry{history expansion}{135}{history expansion} +\entry{event designators}{135}{event designators} +\entry{history events}{135}{history events} +\entry{installation}{138}{installation} +\entry{configuration}{138}{configuration} +\entry{Bash installation}{138}{Bash installation} +\entry{Bash configuration}{138}{Bash configuration} diff --git a/doc/bashref.cps b/doc/bashref.cps index d954fc085..a4fb3bab3 100644 --- a/doc/bashref.cps +++ b/doc/bashref.cps @@ -5,17 +5,17 @@ \entry {arithmetic, shell}{87} \entry {arrays}{89} \initial {B} -\entry {background}{98} -\entry {Bash configuration}{139} -\entry {Bash installation}{139} +\entry {background}{97} +\entry {Bash configuration}{138} +\entry {Bash installation}{138} \entry {Bourne shell}{5} \entry {brace expansion}{21} \entry {builtin}{3} \initial {C} -\entry {command editing}{103} +\entry {command editing}{102} \entry {command execution}{36} \entry {command expansion}{35} -\entry {command history}{134} +\entry {command history}{133} \entry {command search}{36} \entry {command substitution}{28} \entry {command timing}{8} @@ -28,17 +28,17 @@ \entry {commands, shell}{8} \entry {commands, simple}{8} \entry {comments, shell}{7} -\entry {completion builtins}{127} -\entry {configuration}{139} +\entry {completion builtins}{126} +\entry {configuration}{138} \entry {control operator}{3} \entry {coprocess}{15} \initial {D} -\entry {directory stack}{91} +\entry {directory stack}{90} \initial {E} -\entry {editing command lines}{103} +\entry {editing command lines}{102} \entry {environment}{37} \entry {evaluation, arithmetic}{87} -\entry {event designators}{137} +\entry {event designators}{135} \entry {execution environment}{36} \entry {exit status}{3, 38} \entry {expansion}{21} @@ -54,37 +54,37 @@ \entry {field}{3} \entry {filename}{3} \entry {filename expansion}{29} -\entry {foreground}{98} +\entry {foreground}{97} \entry {functions, shell}{17} \initial {H} -\entry {history builtins}{134} -\entry {history events}{137} -\entry {history expansion}{136} -\entry {history list}{134} -\entry {History, how to use}{133} +\entry {history builtins}{133} +\entry {history events}{135} +\entry {history expansion}{135} +\entry {history list}{133} +\entry {History, how to use}{132} \initial {I} \entry {identifier}{3} -\entry {initialization file, readline}{105} -\entry {installation}{139} -\entry {interaction, readline}{102} -\entry {interactive shell}{82, 83} +\entry {initialization file, readline}{104} +\entry {installation}{138} +\entry {interaction, readline}{101} +\entry {interactive shell}{81, 83} \entry {internationalization}{7} \initial {J} \entry {job}{3} -\entry {job control}{3, 98} +\entry {job control}{3, 97} \initial {K} -\entry {kill ring}{104} -\entry {killing text}{104} +\entry {kill ring}{103} +\entry {killing text}{103} \initial {L} \entry {localization}{7} -\entry {login shell}{82} +\entry {login shell}{81} \initial {M} \entry {matching, pattern}{30} \entry {metacharacter}{3} \initial {N} \entry {name}{3} \entry {native languages}{7} -\entry {notation, readline}{103} +\entry {notation, readline}{102} \initial {O} \entry {operator, shell}{3} \initial {P} @@ -100,13 +100,13 @@ \entry {process group}{3} \entry {process group ID}{3} \entry {process substitution}{29} -\entry {programmable completion}{125} +\entry {programmable completion}{124} \entry {prompting}{92} \initial {Q} \entry {quoting}{6} \entry {quoting, ANSI}{6} \initial {R} -\entry {Readline, how to use}{101} +\entry {Readline, how to use}{100} \entry {redirection}{31} \entry {reserved word}{3} \entry {restricted shell}{93} @@ -121,16 +121,16 @@ \entry {signal handling}{38} \entry {special builtin}{4, 68} \entry {startup files}{82} -\entry {suspending jobs}{98} +\entry {suspending jobs}{97} \initial {T} \entry {tilde expansion}{22} \entry {token}{4} \entry {translation, native languages}{7} \initial {V} \entry {variable, shell}{18} -\entry {variables, readline}{106} +\entry {variables, readline}{105} \initial {W} \entry {word}{4} \entry {word splitting}{29} \initial {Y} -\entry {yanking text}{104} +\entry {yanking text}{103} diff --git a/doc/bashref.dvi b/doc/bashref.dvi index 71e01d72a..8972366e0 100644 Binary files a/doc/bashref.dvi and b/doc/bashref.dvi differ diff --git a/doc/bashref.fn b/doc/bashref.fn index ad3e78c05..18917b4f1 100644 --- a/doc/bashref.fn +++ b/doc/bashref.fn @@ -1,106 +1,106 @@ -\entry{beginning-of-line (C-a)}{116}{\code {beginning-of-line (C-a)}} -\entry{end-of-line (C-e)}{116}{\code {end-of-line (C-e)}} -\entry{forward-char (C-f)}{116}{\code {forward-char (C-f)}} -\entry{backward-char (C-b)}{116}{\code {backward-char (C-b)}} -\entry{forward-word (M-f)}{116}{\code {forward-word (M-f)}} -\entry{backward-word (M-b)}{116}{\code {backward-word (M-b)}} -\entry{shell-forward-word ()}{116}{\code {shell-forward-word ()}} -\entry{shell-backward-word ()}{116}{\code {shell-backward-word ()}} -\entry{clear-screen (C-l)}{116}{\code {clear-screen (C-l)}} -\entry{redraw-current-line ()}{116}{\code {redraw-current-line ()}} -\entry{accept-line (Newline or Return)}{117}{\code {accept-line (Newline or Return)}} -\entry{previous-history (C-p)}{117}{\code {previous-history (C-p)}} -\entry{next-history (C-n)}{117}{\code {next-history (C-n)}} -\entry{beginning-of-history (M-<)}{117}{\code {beginning-of-history (M-<)}} -\entry{end-of-history (M->)}{117}{\code {end-of-history (M->)}} -\entry{reverse-search-history (C-r)}{117}{\code {reverse-search-history (C-r)}} -\entry{forward-search-history (C-s)}{117}{\code {forward-search-history (C-s)}} -\entry{non-incremental-reverse-search-history (M-p)}{117}{\code {non-incremental-reverse-search-history (M-p)}} -\entry{non-incremental-forward-search-history (M-n)}{117}{\code {non-incremental-forward-search-history (M-n)}} -\entry{history-search-forward ()}{117}{\code {history-search-forward ()}} -\entry{history-search-backward ()}{117}{\code {history-search-backward ()}} -\entry{history-substr-search-forward ()}{117}{\code {history-substr-search-forward ()}} -\entry{history-substr-search-backward ()}{118}{\code {history-substr-search-backward ()}} -\entry{yank-nth-arg (M-C-y)}{118}{\code {yank-nth-arg (M-C-y)}} -\entry{yank-last-arg (M-. or M-_)}{118}{\code {yank-last-arg (M-. or M-_)}} -\entry{delete-char (C-d)}{118}{\code {delete-char (C-d)}} -\entry{backward-delete-char (Rubout)}{118}{\code {backward-delete-char (Rubout)}} -\entry{forward-backward-delete-char ()}{118}{\code {forward-backward-delete-char ()}} -\entry{quoted-insert (C-q or C-v)}{118}{\code {quoted-insert (C-q or C-v)}} -\entry{self-insert (a, b, A, 1, !, ...{})}{118}{\code {self-insert (a, b, A, 1, !, \dots {})}} -\entry{transpose-chars (C-t)}{119}{\code {transpose-chars (C-t)}} -\entry{transpose-words (M-t)}{119}{\code {transpose-words (M-t)}} -\entry{upcase-word (M-u)}{119}{\code {upcase-word (M-u)}} -\entry{downcase-word (M-l)}{119}{\code {downcase-word (M-l)}} -\entry{capitalize-word (M-c)}{119}{\code {capitalize-word (M-c)}} -\entry{overwrite-mode ()}{119}{\code {overwrite-mode ()}} -\entry{kill-line (C-k)}{119}{\code {kill-line (C-k)}} -\entry{backward-kill-line (C-x Rubout)}{119}{\code {backward-kill-line (C-x Rubout)}} -\entry{unix-line-discard (C-u)}{119}{\code {unix-line-discard (C-u)}} -\entry{kill-whole-line ()}{119}{\code {kill-whole-line ()}} -\entry{kill-word (M-d)}{119}{\code {kill-word (M-d)}} -\entry{backward-kill-word (M-DEL)}{120}{\code {backward-kill-word (M-\key {DEL})}} -\entry{shell-kill-word ()}{120}{\code {shell-kill-word ()}} -\entry{shell-backward-kill-word ()}{120}{\code {shell-backward-kill-word ()}} -\entry{unix-word-rubout (C-w)}{120}{\code {unix-word-rubout (C-w)}} -\entry{unix-filename-rubout ()}{120}{\code {unix-filename-rubout ()}} -\entry{delete-horizontal-space ()}{120}{\code {delete-horizontal-space ()}} -\entry{kill-region ()}{120}{\code {kill-region ()}} -\entry{copy-region-as-kill ()}{120}{\code {copy-region-as-kill ()}} -\entry{copy-backward-word ()}{120}{\code {copy-backward-word ()}} -\entry{copy-forward-word ()}{120}{\code {copy-forward-word ()}} -\entry{yank (C-y)}{120}{\code {yank (C-y)}} -\entry{yank-pop (M-y)}{120}{\code {yank-pop (M-y)}} -\entry{digit-argument (M-0, M-1, ...{} M--)}{120}{\code {digit-argument (\kbd {M-0}, \kbd {M-1}, \dots {} \kbd {M--})}} -\entry{universal-argument ()}{120}{\code {universal-argument ()}} -\entry{complete (TAB)}{121}{\code {complete (\key {TAB})}} -\entry{possible-completions (M-?)}{121}{\code {possible-completions (M-?)}} -\entry{insert-completions (M-*)}{121}{\code {insert-completions (M-*)}} -\entry{menu-complete ()}{121}{\code {menu-complete ()}} -\entry{menu-complete-backward ()}{121}{\code {menu-complete-backward ()}} -\entry{delete-char-or-list ()}{121}{\code {delete-char-or-list ()}} -\entry{complete-filename (M-/)}{121}{\code {complete-filename (M-/)}} -\entry{possible-filename-completions (C-x /)}{121}{\code {possible-filename-completions (C-x /)}} -\entry{complete-username (M-~)}{122}{\code {complete-username (M-~)}} -\entry{possible-username-completions (C-x ~)}{122}{\code {possible-username-completions (C-x ~)}} -\entry{complete-variable (M-$)}{122}{\code {complete-variable (M-$)}} -\entry{possible-variable-completions (C-x $)}{122}{\code {possible-variable-completions (C-x $)}} -\entry{complete-hostname (M-@)}{122}{\code {complete-hostname (M-@)}} -\entry{possible-hostname-completions (C-x @)}{122}{\code {possible-hostname-completions (C-x @)}} -\entry{complete-command (M-!)}{122}{\code {complete-command (M-!)}} -\entry{possible-command-completions (C-x !)}{122}{\code {possible-command-completions (C-x !)}} -\entry{dynamic-complete-history (M-TAB)}{122}{\code {dynamic-complete-history (M-\key {TAB})}} -\entry{dabbrev-expand ()}{122}{\code {dabbrev-expand ()}} -\entry{complete-into-braces (M-{\tt \char 123})}{122}{\code {complete-into-braces (M-{\tt \char 123})}} -\entry{start-kbd-macro (C-x ()}{122}{\code {start-kbd-macro (C-x ()}} -\entry{end-kbd-macro (C-x ))}{122}{\code {end-kbd-macro (C-x ))}} -\entry{call-last-kbd-macro (C-x e)}{122}{\code {call-last-kbd-macro (C-x e)}} -\entry{print-last-kbd-macro ()}{123}{\code {print-last-kbd-macro ()}} -\entry{re-read-init-file (C-x C-r)}{123}{\code {re-read-init-file (C-x C-r)}} -\entry{abort (C-g)}{123}{\code {abort (C-g)}} -\entry{do-uppercase-version (M-a, M-b, M-x, ...{})}{123}{\code {do-uppercase-version (M-a, M-b, M-\var {x}, \dots {})}} -\entry{prefix-meta (ESC)}{123}{\code {prefix-meta (\key {ESC})}} -\entry{undo (C-_ or C-x C-u)}{123}{\code {undo (C-_ or C-x C-u)}} -\entry{revert-line (M-r)}{123}{\code {revert-line (M-r)}} -\entry{tilde-expand (M-&)}{123}{\code {tilde-expand (M-&)}} -\entry{set-mark (C-@)}{123}{\code {set-mark (C-@)}} -\entry{exchange-point-and-mark (C-x C-x)}{123}{\code {exchange-point-and-mark (C-x C-x)}} -\entry{character-search (C-])}{123}{\code {character-search (C-])}} -\entry{character-search-backward (M-C-])}{123}{\code {character-search-backward (M-C-])}} -\entry{skip-csi-sequence ()}{123}{\code {skip-csi-sequence ()}} -\entry{insert-comment (M-#)}{124}{\code {insert-comment (M-#)}} -\entry{dump-functions ()}{124}{\code {dump-functions ()}} -\entry{dump-variables ()}{124}{\code {dump-variables ()}} -\entry{dump-macros ()}{124}{\code {dump-macros ()}} -\entry{glob-complete-word (M-g)}{124}{\code {glob-complete-word (M-g)}} -\entry{glob-expand-word (C-x *)}{124}{\code {glob-expand-word (C-x *)}} -\entry{glob-list-expansions (C-x g)}{124}{\code {glob-list-expansions (C-x g)}} -\entry{display-shell-version (C-x C-v)}{124}{\code {display-shell-version (C-x C-v)}} -\entry{shell-expand-line (M-C-e)}{124}{\code {shell-expand-line (M-C-e)}} -\entry{history-expand-line (M-^)}{124}{\code {history-expand-line (M-^)}} -\entry{magic-space ()}{125}{\code {magic-space ()}} -\entry{alias-expand-line ()}{125}{\code {alias-expand-line ()}} -\entry{history-and-alias-expand-line ()}{125}{\code {history-and-alias-expand-line ()}} -\entry{insert-last-argument (M-. or M-_)}{125}{\code {insert-last-argument (M-. or M-_)}} -\entry{operate-and-get-next (C-o)}{125}{\code {operate-and-get-next (C-o)}} -\entry{edit-and-execute-command (C-xC-e)}{125}{\code {edit-and-execute-command (C-xC-e)}} +\entry{beginning-of-line (C-a)}{115}{\code {beginning-of-line (C-a)}} +\entry{end-of-line (C-e)}{115}{\code {end-of-line (C-e)}} +\entry{forward-char (C-f)}{115}{\code {forward-char (C-f)}} +\entry{backward-char (C-b)}{115}{\code {backward-char (C-b)}} +\entry{forward-word (M-f)}{115}{\code {forward-word (M-f)}} +\entry{backward-word (M-b)}{115}{\code {backward-word (M-b)}} +\entry{shell-forward-word ()}{115}{\code {shell-forward-word ()}} +\entry{shell-backward-word ()}{115}{\code {shell-backward-word ()}} +\entry{clear-screen (C-l)}{115}{\code {clear-screen (C-l)}} +\entry{redraw-current-line ()}{115}{\code {redraw-current-line ()}} +\entry{accept-line (Newline or Return)}{116}{\code {accept-line (Newline or Return)}} +\entry{previous-history (C-p)}{116}{\code {previous-history (C-p)}} +\entry{next-history (C-n)}{116}{\code {next-history (C-n)}} +\entry{beginning-of-history (M-<)}{116}{\code {beginning-of-history (M-<)}} +\entry{end-of-history (M->)}{116}{\code {end-of-history (M->)}} +\entry{reverse-search-history (C-r)}{116}{\code {reverse-search-history (C-r)}} +\entry{forward-search-history (C-s)}{116}{\code {forward-search-history (C-s)}} +\entry{non-incremental-reverse-search-history (M-p)}{116}{\code {non-incremental-reverse-search-history (M-p)}} +\entry{non-incremental-forward-search-history (M-n)}{116}{\code {non-incremental-forward-search-history (M-n)}} +\entry{history-search-forward ()}{116}{\code {history-search-forward ()}} +\entry{history-search-backward ()}{116}{\code {history-search-backward ()}} +\entry{history-substr-search-forward ()}{116}{\code {history-substr-search-forward ()}} +\entry{history-substr-search-backward ()}{117}{\code {history-substr-search-backward ()}} +\entry{yank-nth-arg (M-C-y)}{117}{\code {yank-nth-arg (M-C-y)}} +\entry{yank-last-arg (M-. or M-_)}{117}{\code {yank-last-arg (M-. or M-_)}} +\entry{delete-char (C-d)}{117}{\code {delete-char (C-d)}} +\entry{backward-delete-char (Rubout)}{117}{\code {backward-delete-char (Rubout)}} +\entry{forward-backward-delete-char ()}{117}{\code {forward-backward-delete-char ()}} +\entry{quoted-insert (C-q or C-v)}{117}{\code {quoted-insert (C-q or C-v)}} +\entry{self-insert (a, b, A, 1, !, ...{})}{117}{\code {self-insert (a, b, A, 1, !, \dots {})}} +\entry{transpose-chars (C-t)}{118}{\code {transpose-chars (C-t)}} +\entry{transpose-words (M-t)}{118}{\code {transpose-words (M-t)}} +\entry{upcase-word (M-u)}{118}{\code {upcase-word (M-u)}} +\entry{downcase-word (M-l)}{118}{\code {downcase-word (M-l)}} +\entry{capitalize-word (M-c)}{118}{\code {capitalize-word (M-c)}} +\entry{overwrite-mode ()}{118}{\code {overwrite-mode ()}} +\entry{kill-line (C-k)}{118}{\code {kill-line (C-k)}} +\entry{backward-kill-line (C-x Rubout)}{118}{\code {backward-kill-line (C-x Rubout)}} +\entry{unix-line-discard (C-u)}{118}{\code {unix-line-discard (C-u)}} +\entry{kill-whole-line ()}{118}{\code {kill-whole-line ()}} +\entry{kill-word (M-d)}{118}{\code {kill-word (M-d)}} +\entry{backward-kill-word (M-DEL)}{119}{\code {backward-kill-word (M-\key {DEL})}} +\entry{shell-kill-word ()}{119}{\code {shell-kill-word ()}} +\entry{shell-backward-kill-word ()}{119}{\code {shell-backward-kill-word ()}} +\entry{unix-word-rubout (C-w)}{119}{\code {unix-word-rubout (C-w)}} +\entry{unix-filename-rubout ()}{119}{\code {unix-filename-rubout ()}} +\entry{delete-horizontal-space ()}{119}{\code {delete-horizontal-space ()}} +\entry{kill-region ()}{119}{\code {kill-region ()}} +\entry{copy-region-as-kill ()}{119}{\code {copy-region-as-kill ()}} +\entry{copy-backward-word ()}{119}{\code {copy-backward-word ()}} +\entry{copy-forward-word ()}{119}{\code {copy-forward-word ()}} +\entry{yank (C-y)}{119}{\code {yank (C-y)}} +\entry{yank-pop (M-y)}{119}{\code {yank-pop (M-y)}} +\entry{digit-argument (M-0, M-1, ...{} M--)}{119}{\code {digit-argument (\kbd {M-0}, \kbd {M-1}, \dots {} \kbd {M--})}} +\entry{universal-argument ()}{119}{\code {universal-argument ()}} +\entry{complete (TAB)}{120}{\code {complete (\key {TAB})}} +\entry{possible-completions (M-?)}{120}{\code {possible-completions (M-?)}} +\entry{insert-completions (M-*)}{120}{\code {insert-completions (M-*)}} +\entry{menu-complete ()}{120}{\code {menu-complete ()}} +\entry{menu-complete-backward ()}{120}{\code {menu-complete-backward ()}} +\entry{delete-char-or-list ()}{120}{\code {delete-char-or-list ()}} +\entry{complete-filename (M-/)}{120}{\code {complete-filename (M-/)}} +\entry{possible-filename-completions (C-x /)}{120}{\code {possible-filename-completions (C-x /)}} +\entry{complete-username (M-~)}{121}{\code {complete-username (M-~)}} +\entry{possible-username-completions (C-x ~)}{121}{\code {possible-username-completions (C-x ~)}} +\entry{complete-variable (M-$)}{121}{\code {complete-variable (M-$)}} +\entry{possible-variable-completions (C-x $)}{121}{\code {possible-variable-completions (C-x $)}} +\entry{complete-hostname (M-@)}{121}{\code {complete-hostname (M-@)}} +\entry{possible-hostname-completions (C-x @)}{121}{\code {possible-hostname-completions (C-x @)}} +\entry{complete-command (M-!)}{121}{\code {complete-command (M-!)}} +\entry{possible-command-completions (C-x !)}{121}{\code {possible-command-completions (C-x !)}} +\entry{dynamic-complete-history (M-TAB)}{121}{\code {dynamic-complete-history (M-\key {TAB})}} +\entry{dabbrev-expand ()}{121}{\code {dabbrev-expand ()}} +\entry{complete-into-braces (M-|a)}{121}{\code {complete-into-braces (M-{\tt \char 123})}} +\entry{start-kbd-macro (C-x ()}{121}{\code {start-kbd-macro (C-x ()}} +\entry{end-kbd-macro (C-x ))}{121}{\code {end-kbd-macro (C-x ))}} +\entry{call-last-kbd-macro (C-x e)}{121}{\code {call-last-kbd-macro (C-x e)}} +\entry{print-last-kbd-macro ()}{122}{\code {print-last-kbd-macro ()}} +\entry{re-read-init-file (C-x C-r)}{122}{\code {re-read-init-file (C-x C-r)}} +\entry{abort (C-g)}{122}{\code {abort (C-g)}} +\entry{do-uppercase-version (M-a, M-b, M-x, ...{})}{122}{\code {do-uppercase-version (M-a, M-b, M-\var {x}, \dots {})}} +\entry{prefix-meta (ESC)}{122}{\code {prefix-meta (\key {ESC})}} +\entry{undo (C-_ or C-x C-u)}{122}{\code {undo (C-_ or C-x C-u)}} +\entry{revert-line (M-r)}{122}{\code {revert-line (M-r)}} +\entry{tilde-expand (M-&)}{122}{\code {tilde-expand (M-&)}} +\entry{set-mark (C-@)}{122}{\code {set-mark (C-@)}} +\entry{exchange-point-and-mark (C-x C-x)}{122}{\code {exchange-point-and-mark (C-x C-x)}} +\entry{character-search (C-])}{122}{\code {character-search (C-])}} +\entry{character-search-backward (M-C-])}{122}{\code {character-search-backward (M-C-])}} +\entry{skip-csi-sequence ()}{122}{\code {skip-csi-sequence ()}} +\entry{insert-comment (M-#)}{123}{\code {insert-comment (M-#)}} +\entry{dump-functions ()}{123}{\code {dump-functions ()}} +\entry{dump-variables ()}{123}{\code {dump-variables ()}} +\entry{dump-macros ()}{123}{\code {dump-macros ()}} +\entry{glob-complete-word (M-g)}{123}{\code {glob-complete-word (M-g)}} +\entry{glob-expand-word (C-x *)}{123}{\code {glob-expand-word (C-x *)}} +\entry{glob-list-expansions (C-x g)}{123}{\code {glob-list-expansions (C-x g)}} +\entry{display-shell-version (C-x C-v)}{123}{\code {display-shell-version (C-x C-v)}} +\entry{shell-expand-line (M-C-e)}{123}{\code {shell-expand-line (M-C-e)}} +\entry{history-expand-line (M-^)}{123}{\code {history-expand-line (M-^)}} +\entry{magic-space ()}{124}{\code {magic-space ()}} +\entry{alias-expand-line ()}{124}{\code {alias-expand-line ()}} +\entry{history-and-alias-expand-line ()}{124}{\code {history-and-alias-expand-line ()}} +\entry{insert-last-argument (M-. or M-_)}{124}{\code {insert-last-argument (M-. or M-_)}} +\entry{operate-and-get-next (C-o)}{124}{\code {operate-and-get-next (C-o)}} +\entry{edit-and-execute-command (C-xC-e)}{124}{\code {edit-and-execute-command (C-xC-e)}} diff --git a/doc/bashref.fns b/doc/bashref.fns index 7ea034d33..3136d52e4 100644 --- a/doc/bashref.fns +++ b/doc/bashref.fns @@ -1,126 +1,126 @@ \initial {A} -\entry {\code {abort (C-g)}}{123} -\entry {\code {accept-line (Newline or Return)}}{117} -\entry {\code {alias-expand-line ()}}{125} +\entry {\code {abort (C-g)}}{122} +\entry {\code {accept-line (Newline or Return)}}{116} +\entry {\code {alias-expand-line ()}}{124} \initial {B} -\entry {\code {backward-char (C-b)}}{116} -\entry {\code {backward-delete-char (Rubout)}}{118} -\entry {\code {backward-kill-line (C-x Rubout)}}{119} -\entry {\code {backward-kill-word (M-\key {DEL})}}{120} -\entry {\code {backward-word (M-b)}}{116} -\entry {\code {beginning-of-history (M-<)}}{117} -\entry {\code {beginning-of-line (C-a)}}{116} +\entry {\code {backward-char (C-b)}}{115} +\entry {\code {backward-delete-char (Rubout)}}{117} +\entry {\code {backward-kill-line (C-x Rubout)}}{118} +\entry {\code {backward-kill-word (M-\key {DEL})}}{119} +\entry {\code {backward-word (M-b)}}{115} +\entry {\code {beginning-of-history (M-<)}}{116} +\entry {\code {beginning-of-line (C-a)}}{115} \initial {C} -\entry {\code {call-last-kbd-macro (C-x e)}}{122} -\entry {\code {capitalize-word (M-c)}}{119} -\entry {\code {character-search (C-])}}{123} -\entry {\code {character-search-backward (M-C-])}}{123} -\entry {\code {clear-screen (C-l)}}{116} -\entry {\code {complete (\key {TAB})}}{121} -\entry {\code {complete-command (M-!)}}{122} -\entry {\code {complete-filename (M-/)}}{121} -\entry {\code {complete-hostname (M-@)}}{122} -\entry {\code {complete-into-braces (M-{\tt \char 123})}}{122} -\entry {\code {complete-username (M-~)}}{122} -\entry {\code {complete-variable (M-$)}}{122} -\entry {\code {copy-backward-word ()}}{120} -\entry {\code {copy-forward-word ()}}{120} -\entry {\code {copy-region-as-kill ()}}{120} +\entry {\code {call-last-kbd-macro (C-x e)}}{121} +\entry {\code {capitalize-word (M-c)}}{118} +\entry {\code {character-search (C-])}}{122} +\entry {\code {character-search-backward (M-C-])}}{122} +\entry {\code {clear-screen (C-l)}}{115} +\entry {\code {complete (\key {TAB})}}{120} +\entry {\code {complete-command (M-!)}}{121} +\entry {\code {complete-filename (M-/)}}{120} +\entry {\code {complete-hostname (M-@)}}{121} +\entry {\code {complete-into-braces (M-{\tt \char 123})}}{121} +\entry {\code {complete-username (M-~)}}{121} +\entry {\code {complete-variable (M-$)}}{121} +\entry {\code {copy-backward-word ()}}{119} +\entry {\code {copy-forward-word ()}}{119} +\entry {\code {copy-region-as-kill ()}}{119} \initial {D} -\entry {\code {dabbrev-expand ()}}{122} -\entry {\code {delete-char (C-d)}}{118} -\entry {\code {delete-char-or-list ()}}{121} -\entry {\code {delete-horizontal-space ()}}{120} -\entry {\code {digit-argument (\kbd {M-0}, \kbd {M-1}, \dots {} \kbd {M--})}}{120} -\entry {\code {display-shell-version (C-x C-v)}}{124} -\entry {\code {do-uppercase-version (M-a, M-b, M-\var {x}, \dots {})}}{123} -\entry {\code {downcase-word (M-l)}}{119} -\entry {\code {dump-functions ()}}{124} -\entry {\code {dump-macros ()}}{124} -\entry {\code {dump-variables ()}}{124} -\entry {\code {dynamic-complete-history (M-\key {TAB})}}{122} +\entry {\code {dabbrev-expand ()}}{121} +\entry {\code {delete-char (C-d)}}{117} +\entry {\code {delete-char-or-list ()}}{120} +\entry {\code {delete-horizontal-space ()}}{119} +\entry {\code {digit-argument (\kbd {M-0}, \kbd {M-1}, \dots {} \kbd {M--})}}{119} +\entry {\code {display-shell-version (C-x C-v)}}{123} +\entry {\code {do-uppercase-version (M-a, M-b, M-\var {x}, \dots {})}}{122} +\entry {\code {downcase-word (M-l)}}{118} +\entry {\code {dump-functions ()}}{123} +\entry {\code {dump-macros ()}}{123} +\entry {\code {dump-variables ()}}{123} +\entry {\code {dynamic-complete-history (M-\key {TAB})}}{121} \initial {E} -\entry {\code {edit-and-execute-command (C-xC-e)}}{125} -\entry {\code {end-kbd-macro (C-x ))}}{122} -\entry {\code {end-of-history (M->)}}{117} -\entry {\code {end-of-line (C-e)}}{116} -\entry {\code {exchange-point-and-mark (C-x C-x)}}{123} +\entry {\code {edit-and-execute-command (C-xC-e)}}{124} +\entry {\code {end-kbd-macro (C-x ))}}{121} +\entry {\code {end-of-history (M->)}}{116} +\entry {\code {end-of-line (C-e)}}{115} +\entry {\code {exchange-point-and-mark (C-x C-x)}}{122} \initial {F} -\entry {\code {forward-backward-delete-char ()}}{118} -\entry {\code {forward-char (C-f)}}{116} -\entry {\code {forward-search-history (C-s)}}{117} -\entry {\code {forward-word (M-f)}}{116} +\entry {\code {forward-backward-delete-char ()}}{117} +\entry {\code {forward-char (C-f)}}{115} +\entry {\code {forward-search-history (C-s)}}{116} +\entry {\code {forward-word (M-f)}}{115} \initial {G} -\entry {\code {glob-complete-word (M-g)}}{124} -\entry {\code {glob-expand-word (C-x *)}}{124} -\entry {\code {glob-list-expansions (C-x g)}}{124} +\entry {\code {glob-complete-word (M-g)}}{123} +\entry {\code {glob-expand-word (C-x *)}}{123} +\entry {\code {glob-list-expansions (C-x g)}}{123} \initial {H} -\entry {\code {history-and-alias-expand-line ()}}{125} -\entry {\code {history-expand-line (M-^)}}{124} -\entry {\code {history-search-backward ()}}{117} -\entry {\code {history-search-forward ()}}{117} -\entry {\code {history-substr-search-backward ()}}{118} -\entry {\code {history-substr-search-forward ()}}{117} +\entry {\code {history-and-alias-expand-line ()}}{124} +\entry {\code {history-expand-line (M-^)}}{123} +\entry {\code {history-search-backward ()}}{116} +\entry {\code {history-search-forward ()}}{116} +\entry {\code {history-substr-search-backward ()}}{117} +\entry {\code {history-substr-search-forward ()}}{116} \initial {I} -\entry {\code {insert-comment (M-#)}}{124} -\entry {\code {insert-completions (M-*)}}{121} -\entry {\code {insert-last-argument (M-. or M-_)}}{125} +\entry {\code {insert-comment (M-#)}}{123} +\entry {\code {insert-completions (M-*)}}{120} +\entry {\code {insert-last-argument (M-. or M-_)}}{124} \initial {K} -\entry {\code {kill-line (C-k)}}{119} -\entry {\code {kill-region ()}}{120} -\entry {\code {kill-whole-line ()}}{119} -\entry {\code {kill-word (M-d)}}{119} +\entry {\code {kill-line (C-k)}}{118} +\entry {\code {kill-region ()}}{119} +\entry {\code {kill-whole-line ()}}{118} +\entry {\code {kill-word (M-d)}}{118} \initial {M} -\entry {\code {magic-space ()}}{125} -\entry {\code {menu-complete ()}}{121} -\entry {\code {menu-complete-backward ()}}{121} +\entry {\code {magic-space ()}}{124} +\entry {\code {menu-complete ()}}{120} +\entry {\code {menu-complete-backward ()}}{120} \initial {N} -\entry {\code {next-history (C-n)}}{117} -\entry {\code {non-incremental-forward-search-history (M-n)}}{117} -\entry {\code {non-incremental-reverse-search-history (M-p)}}{117} +\entry {\code {next-history (C-n)}}{116} +\entry {\code {non-incremental-forward-search-history (M-n)}}{116} +\entry {\code {non-incremental-reverse-search-history (M-p)}}{116} \initial {O} -\entry {\code {operate-and-get-next (C-o)}}{125} -\entry {\code {overwrite-mode ()}}{119} +\entry {\code {operate-and-get-next (C-o)}}{124} +\entry {\code {overwrite-mode ()}}{118} \initial {P} -\entry {\code {possible-command-completions (C-x !)}}{122} -\entry {\code {possible-completions (M-?)}}{121} -\entry {\code {possible-filename-completions (C-x /)}}{121} -\entry {\code {possible-hostname-completions (C-x @)}}{122} -\entry {\code {possible-username-completions (C-x ~)}}{122} -\entry {\code {possible-variable-completions (C-x $)}}{122} -\entry {\code {prefix-meta (\key {ESC})}}{123} -\entry {\code {previous-history (C-p)}}{117} -\entry {\code {print-last-kbd-macro ()}}{123} +\entry {\code {possible-command-completions (C-x !)}}{121} +\entry {\code {possible-completions (M-?)}}{120} +\entry {\code {possible-filename-completions (C-x /)}}{120} +\entry {\code {possible-hostname-completions (C-x @)}}{121} +\entry {\code {possible-username-completions (C-x ~)}}{121} +\entry {\code {possible-variable-completions (C-x $)}}{121} +\entry {\code {prefix-meta (\key {ESC})}}{122} +\entry {\code {previous-history (C-p)}}{116} +\entry {\code {print-last-kbd-macro ()}}{122} \initial {Q} -\entry {\code {quoted-insert (C-q or C-v)}}{118} +\entry {\code {quoted-insert (C-q or C-v)}}{117} \initial {R} -\entry {\code {re-read-init-file (C-x C-r)}}{123} -\entry {\code {redraw-current-line ()}}{116} -\entry {\code {reverse-search-history (C-r)}}{117} -\entry {\code {revert-line (M-r)}}{123} +\entry {\code {re-read-init-file (C-x C-r)}}{122} +\entry {\code {redraw-current-line ()}}{115} +\entry {\code {reverse-search-history (C-r)}}{116} +\entry {\code {revert-line (M-r)}}{122} \initial {S} -\entry {\code {self-insert (a, b, A, 1, !, \dots {})}}{118} -\entry {\code {set-mark (C-@)}}{123} -\entry {\code {shell-backward-kill-word ()}}{120} -\entry {\code {shell-backward-word ()}}{116} -\entry {\code {shell-expand-line (M-C-e)}}{124} -\entry {\code {shell-forward-word ()}}{116} -\entry {\code {shell-kill-word ()}}{120} -\entry {\code {skip-csi-sequence ()}}{123} -\entry {\code {start-kbd-macro (C-x ()}}{122} +\entry {\code {self-insert (a, b, A, 1, !, \dots {})}}{117} +\entry {\code {set-mark (C-@)}}{122} +\entry {\code {shell-backward-kill-word ()}}{119} +\entry {\code {shell-backward-word ()}}{115} +\entry {\code {shell-expand-line (M-C-e)}}{123} +\entry {\code {shell-forward-word ()}}{115} +\entry {\code {shell-kill-word ()}}{119} +\entry {\code {skip-csi-sequence ()}}{122} +\entry {\code {start-kbd-macro (C-x ()}}{121} \initial {T} -\entry {\code {tilde-expand (M-&)}}{123} -\entry {\code {transpose-chars (C-t)}}{119} -\entry {\code {transpose-words (M-t)}}{119} +\entry {\code {tilde-expand (M-&)}}{122} +\entry {\code {transpose-chars (C-t)}}{118} +\entry {\code {transpose-words (M-t)}}{118} \initial {U} -\entry {\code {undo (C-_ or C-x C-u)}}{123} -\entry {\code {universal-argument ()}}{120} -\entry {\code {unix-filename-rubout ()}}{120} -\entry {\code {unix-line-discard (C-u)}}{119} -\entry {\code {unix-word-rubout (C-w)}}{120} -\entry {\code {upcase-word (M-u)}}{119} +\entry {\code {undo (C-_ or C-x C-u)}}{122} +\entry {\code {universal-argument ()}}{119} +\entry {\code {unix-filename-rubout ()}}{119} +\entry {\code {unix-line-discard (C-u)}}{118} +\entry {\code {unix-word-rubout (C-w)}}{119} +\entry {\code {upcase-word (M-u)}}{118} \initial {Y} -\entry {\code {yank (C-y)}}{120} -\entry {\code {yank-last-arg (M-. or M-_)}}{118} -\entry {\code {yank-nth-arg (M-C-y)}}{118} -\entry {\code {yank-pop (M-y)}}{120} +\entry {\code {yank (C-y)}}{119} +\entry {\code {yank-last-arg (M-. or M-_)}}{117} +\entry {\code {yank-nth-arg (M-C-y)}}{117} +\entry {\code {yank-pop (M-y)}}{119} diff --git a/doc/bashref.html b/doc/bashref.html index 228094dfd..effb48723 100644 --- a/doc/bashref.html +++ b/doc/bashref.html @@ -1,6 +1,6 @@ - +

- - + +

Killing text means to delete the text from the line, but to save @@ -10231,7 +10240,7 @@ that when you yank it back, you get it all. The kill ring is not line specific; the text that you killed on a previously typed line is available to be yanked back later, when you are typing another line. - +

Here is the list of commands for killing text. @@ -10490,11 +10499,11 @@ A great deal of run-time behavior is changeable with the following variables.

- +

bell-style -
+
Controls what happens when Readline wants to ring the terminal bell. If set to `none', Readline never rings the bell. If set to `visible', Readline uses a visible bell if one is available. @@ -10503,14 +10512,14 @@ the terminal's bell.

bind-tty-special-chars -
+
If set to `on', Readline attempts to bind the control characters treated specially by the kernel's terminal driver to their Readline equivalents.

colored-stats -
+
If set to `on', Readline displays possible completions using different colors to indicate their file type. The color definitions are taken from the value of the LS_COLORS @@ -10519,14 +10528,14 @@ The default is `off'.

comment-begin -
+
The string to insert at the beginning of the line when the insert-comment command is executed. The default value is "#".

completion-display-width -
+
The number of screen columns used to display possible matches when performing completion. The value is ignored if it is less than 0 or greater than the terminal @@ -10536,21 +10545,21 @@ The default value is -1.

completion-ignore-case -
+
If set to `on', Readline performs filename matching and completion in a case-insensitive fashion. The default value is `off'.

completion-map-case -
+
If set to `on', and completion-ignore-case is enabled, Readline treats hyphens (`-') and underscores (`_') as equivalent when performing case-insensitive filename matching and completion.

completion-prefix-display-length -
+
The length in characters of the common prefix of a list of possible completions that is displayed without modification. When set to a value greater than zero, common prefixes longer than this value are @@ -10558,7 +10567,7 @@ replaced with an ellipsis when displaying possible completions.

completion-query-items -
+
The number of possible completions that determines when the user is asked whether the list of possibilities should be displayed. If the number of possible completions is greater than this value, @@ -10570,7 +10579,7 @@ The default limit is 100.

convert-meta -
+
If set to `on', Readline will convert characters with the eighth bit set to an ASCII key sequence by stripping the eighth bit and prefixing an ESC character, converting them to a @@ -10578,14 +10587,14 @@ meta-prefixed key sequence. The default value is `on'.

disable-completion -
+
If set to `On', Readline will inhibit word completion. Completion characters will be inserted into the line as if they had been mapped to self-insert. The default is `off'.

editing-mode -
+
The editing-mode variable controls which default set of key bindings is used. By default, Readline starts up in Emacs editing mode, where the keystrokes are most similar to Emacs. This variable can be @@ -10599,7 +10608,7 @@ keyboard. The default is `on'.

enable-keypad -
+
When set to `on', Readline will try to enable the application keypad when it is called. Some systems need this to enable the arrow keys. The default is `off'. @@ -10613,13 +10622,13 @@ The default is `on'.

expand-tilde -
+
If set to `on', tilde expansion is performed when Readline attempts word completion. The default is `off'.

history-preserve-point -
+
If set to `on', the history code attempts to place the point (the current cursor position) at the same location on each history line retrieved with previous-history @@ -10627,7 +10636,7 @@ or next-history. The default is `off'.

history-size -
+
Set the maximum number of history entries saved in the history list. If set to zero, any existing history entries are deleted and no new entries are saved. @@ -10637,7 +10646,7 @@ By default, the number of history entries is not limited.

horizontal-scroll-mode -
+
This variable can be set to either `on' or `off'. Setting it to `on' means that the text of the lines being edited will scroll horizontally on a single screen line when they are longer than the width @@ -10646,8 +10655,8 @@ this variable is set to `off'.

input-meta -
- +
+ If set to `on', Readline will enable eight-bit input (it will not clear the eighth bit in the characters it reads), regardless of what the terminal claims it can support. The @@ -10656,7 +10665,7 @@ synonym for this variable.

isearch-terminators -
+
The string of characters that should terminate an incremental search without subsequently executing the character as a command (see section 8.2.5 Searching for Commands in the History). If this variable has not been given a value, the characters ESC and @@ -10664,7 +10673,7 @@ If this variable has not been given a value, the characters ESC and

keymap -
+
Sets Readline's idea of the current keymap for key binding commands. Acceptable keymap names are emacs, @@ -10702,14 +10711,14 @@ appended. The default is `on'.

mark-modified-lines -
+
This variable, when set to `on', causes Readline to display an asterisk (`*') at the start of history lines which have been modified. This variable is `off' by default.

mark-symlinked-directories -
+
If set to `on', completed names which are symbolic links to directories have a slash appended (subject to the value of mark-directories). @@ -10717,7 +10726,7 @@ The default is `off'.

match-hidden-files -
+
This variable, when set to `on', causes Readline to match files whose names begin with a `.' (hidden files) when performing filename completion. @@ -10727,21 +10736,21 @@ This variable is `on' by default.

menu-complete-display-prefix -
+
If set to `on', menu completion displays the common prefix of the list of possible completions (which may be empty) before cycling through the list. The default is `off'.

output-meta -
+
If set to `on', Readline will display characters with the eighth bit set directly rather than as a meta-prefixed escape sequence. The default is `off'.

page-completions -
+
If set to `on', Readline uses an internal more-like pager to display a screenful of possible completions at a time. This variable is `on' by default. @@ -10754,7 +10763,7 @@ The default is `off'.

revert-all-at-newline -
+
If set to `on', Readline will undo all changes to history lines before returning when accept-line is executed. By default, history lines may be modified and retain individual undo lists across @@ -10762,7 +10771,7 @@ calls to readline. The default is `off'.

show-all-if-ambiguous -
+
This alters the default behavior of the completion functions. If set to `on', words which have more than one possible completion cause the @@ -10771,7 +10780,7 @@ The default value is `off'.

show-all-if-unmodified -
+
This alters the default behavior of the completion functions in a fashion similar to show-all-if-ambiguous. If set to `on', @@ -10783,7 +10792,7 @@ The default value is `off'.

show-mode-in-prompt -
+
If set to `on', add a character to the beginning of the prompt indicating the editing mode: emacs (`@'), vi command (`:'), or vi insertion (`+'). @@ -10791,7 +10800,7 @@ The default value is `off'.

skip-completed-text -
+
If set to `on', this alters the default completion behavior when inserting a single match into the line. It's only active when performing completion in the middle of a word. If enabled, readline @@ -10806,7 +10815,7 @@ The default value is `off'.

visible-stats -
+
If set to `on', a character denoting a file's type is appended to the filename when listing possible completions. The default is `off'. @@ -11230,68 +11239,68 @@ The text between the point and mark is referred to as the region.

8.4.1 Commands For Moving

- +
beginning-of-line (C-a) -
+
Move to the start of the current line.

- +

end-of-line (C-e) -
+
Move to the end of the line.

- +

forward-char (C-f) -
+
Move forward a character.

- +

backward-char (C-b) -
+
Move back a character.

- +

forward-word (M-f) -
+
Move forward to the end of the next word. Words are composed of letters and digits.

- +

backward-word (M-b) -
+
Move back to the start of the current or previous word. Words are composed of letters and digits.

- +

shell-forward-word () -
+
Move forward to the end of the next word. Words are delimited by non-quoted shell metacharacters.

- +

shell-backward-word () -
+
Move back to the start of the current or previous word. Words are delimited by non-quoted shell metacharacters.

- +

clear-screen (C-l) -
+
Clear the screen and redraw the current line, leaving the current line at the top of the screen.

- +

redraw-current-line () -
+
Refresh the current line. By default, this is unbound.

@@ -11317,9 +11326,9 @@ Refresh the current line. By default, this is unbound.

- +
accept-line (Newline or Return) -
+
Accept the line regardless of where the cursor is. If this line is non-empty, add it to the history list according to the setting of @@ -11328,64 +11337,64 @@ If this line is a modified history line, then restore the history line to its original state.

- +

previous-history (C-p) -
+
Move `back' through the history list, fetching the previous command.

- +

next-history (C-n) -
+
Move `forward' through the history list, fetching the next command.

- +

beginning-of-history (M-<) -
+
Move to the first line in the history.

- +

end-of-history (M->) -
+
Move to the end of the input history, i.e., the line currently being entered.

- +

reverse-search-history (C-r) -
+
Search backward starting at the current line and moving `up' through the history as necessary. This is an incremental search.

- +

forward-search-history (C-s) -
+
Search forward starting at the current line and moving `down' through the the history as necessary. This is an incremental search.

- +

non-incremental-reverse-search-history (M-p) -
+
Search backward starting at the current line and moving `up' through the history as necessary using a non-incremental search for a string supplied by the user.

- +

non-incremental-forward-search-history (M-n) -
+
Search forward starting at the current line and moving `down' through the the history as necessary using a non-incremental search for a string supplied by the user.

- +

history-search-forward () -
+
Search forward through the history for the string of characters between the start of the current line and the point. The search string must match at the beginning of a history line. @@ -11393,9 +11402,9 @@ This is a non-incremental search. By default, this command is unbound.

- +

history-search-backward () -
+
Search backward through the history for the string of characters between the start of the current line and the point. The search string must match at the beginning of a history line. @@ -11403,9 +11412,9 @@ This is a non-incremental search. By default, this command is unbound.

- +

history-substr-search-forward () -
+
Search forward through the history for the string of characters between the start of the current line and the point. The search string may match anywhere in a history line. @@ -11413,9 +11422,9 @@ This is a non-incremental search. By default, this command is unbound.

- +

history-substr-search-backward () -
+
Search backward through the history for the string of characters between the start of the current line and the point. The search string may match anywhere in a history line. @@ -11423,9 +11432,9 @@ This is a non-incremental search. By default, this command is unbound.

- +

yank-nth-arg (M-C-y) -
+
Insert the first argument to the previous command (usually the second word on the previous line) at point. With an argument n, @@ -11436,9 +11445,9 @@ Once the argument n is computed, the argument is extracted as if the `!n' history expansion had been specified.

- +

yank-last-arg (M-. or M-_) -
+
Insert last argument to the previous command (the last word of the previous history entry). With a numeric argument, behave exactly like yank-nth-arg. @@ -11474,46 +11483,46 @@ as if the `!$' history expansion had been specified.

- +
delete-char (C-d) -
+
Delete the character at point. If point is at the beginning of the line, there are no characters in the line, and the last character typed was not bound to delete-char, then return EOF.

- +

backward-delete-char (Rubout) -
+
Delete the character behind the cursor. A numeric argument means to kill the characters instead of deleting them.

- +

forward-backward-delete-char () -
+
Delete the character under the cursor, unless the cursor is at the end of the line, in which case the character behind the cursor is deleted. By default, this is not bound to a key.

- +

quoted-insert (C-q or C-v) -
+
Add the next character typed to the line verbatim. This is how to insert key sequences like C-q, for example.

- +

self-insert (a, b, A, 1, !, ...) -
+
Insert yourself.

- +

transpose-chars (C-t) -
+
Drag the character before the cursor forward over the character at the cursor, moving the cursor forward as well. If the insertion point @@ -11522,39 +11531,39 @@ transposes the last two characters of the line. Negative arguments have no effect.

- +

transpose-words (M-t) -
+
Drag the word before point past the word after point, moving point past that word as well. If the insertion point is at the end of the line, this transposes the last two words on the line.

- +

upcase-word (M-u) -
+
Uppercase the current (or following) word. With a negative argument, uppercase the previous word, but do not move the cursor.

- +

downcase-word (M-l) -
+
Lowercase the current (or following) word. With a negative argument, lowercase the previous word, but do not move the cursor.

- +

capitalize-word (M-c) -
+
Capitalize the current (or following) word. With a negative argument, capitalize the previous word, but do not move the cursor.

- +

overwrite-mode () -
+
Toggle overwrite mode. With an explicit positive numeric argument, switches to overwrite mode. With an explicit non-positive numeric argument, switches to insert mode. This command affects only @@ -11594,121 +11603,121 @@ By default, this command is unbound.
- +
kill-line (C-k) -
+
Kill the text from point to the end of the line.

- +

backward-kill-line (C-x Rubout) -
+
Kill backward to the beginning of the line.

- +

unix-line-discard (C-u) -
+
Kill backward from the cursor to the beginning of the current line.

- +

kill-whole-line () -
+
Kill all characters on the current line, no matter where point is. By default, this is unbound.

- +

kill-word (M-d) -
+
Kill from point to the end of the current word, or if between words, to the end of the next word. Word boundaries are the same as forward-word.

- +

backward-kill-word (M-DEL) -
+
Kill the word behind point. Word boundaries are the same as backward-word.

- +

shell-kill-word () -
+
Kill from point to the end of the current word, or if between words, to the end of the next word. Word boundaries are the same as shell-forward-word.

- +

shell-backward-kill-word () -
+
Kill the word behind point. Word boundaries are the same as shell-backward-word.

- +

unix-word-rubout (C-w) -
+
Kill the word behind point, using white space as a word boundary. The killed text is saved on the kill-ring.

- +

unix-filename-rubout () -
+
Kill the word behind point, using white space and the slash character as the word boundaries. The killed text is saved on the kill-ring.

- +

delete-horizontal-space () -
+
Delete all spaces and tabs around point. By default, this is unbound.

- +

kill-region () -
+
Kill the text in the current region. By default, this command is unbound.

- +

copy-region-as-kill () -
+
Copy the text in the region to the kill buffer, so it can be yanked right away. By default, this command is unbound.

- +

copy-backward-word () -
+
Copy the word before point to the kill buffer. The word boundaries are the same as backward-word. By default, this command is unbound.

- +

copy-forward-word () -
+
Copy the word following point to the kill buffer. The word boundaries are the same as forward-word. By default, this command is unbound.

- +

yank (C-y) -
+
Yank the top of the kill ring into the buffer at point.

- +

yank-pop (M-y) -
+
Rotate the kill-ring, and yank the new top. You can only do this if the prior command is yank or yank-pop.
@@ -11732,16 +11741,16 @@ the prior command is yank or yank-pop.
- +
digit-argument (M-0, M-1, ... M--) -
+
Add this digit to the argument already accumulating, or start a new argument. M-- starts a negative argument.

- +

universal-argument () -
+
This is another way to specify an argument. If this command is followed by one or more digits, optionally with a leading minus sign, those digits define the argument. @@ -11776,9 +11785,9 @@ By default, this is not bound to a key.

- +
complete (TAB) -
+
Attempt to perform completion on the text before point. The actual completion performed is application-specific. Bash attempts completion treating the text as a variable (if the @@ -11788,25 +11797,25 @@ command (including aliases and functions) in turn. If none of these produces a match, filename completion is attempted.

- +

possible-completions (M-?) -
+
List the possible completions of the text before point. When displaying completions, Readline sets the number of columns used for display to the value of completion-display-width, the value of the environment variable COLUMNS, or the screen width, in that order.

- +

insert-completions (M-*) -
+
Insert all completions of the text before point that would have been generated by possible-completions.

- +

menu-complete () -
+
Similar to complete, but replaces the word to be completed with a single match from the list of possible completions. Repeated execution of menu-complete steps through the list @@ -11821,17 +11830,17 @@ This command is intended to be bound to TAB, but is unbound by default.

- +

menu-complete-backward () -
+
Identical to menu-complete, but moves backward through the list of possible completions, as if menu-complete had been given a negative argument.

- +

delete-char-or-list () -
+
Deletes the character under the cursor if not at the beginning or end of the line (like delete-char). If at the end of the line, behaves identically to @@ -11839,64 +11848,64 @@ If at the end of the line, behaves identically to This command is unbound by default.

- +

complete-filename (M-/) -
+
Attempt filename completion on the text before point.

- +

possible-filename-completions (C-x /) -
+
List the possible completions of the text before point, treating it as a filename.

- +

complete-username (M-~) -
+
Attempt completion on the text before point, treating it as a username.

- +

possible-username-completions (C-x ~) -
+
List the possible completions of the text before point, treating it as a username.

- +

complete-variable (M-$) -
+
Attempt completion on the text before point, treating it as a shell variable.

- +

possible-variable-completions (C-x $) -
+
List the possible completions of the text before point, treating it as a shell variable.

- +

complete-hostname (M-@) -
+
Attempt completion on the text before point, treating it as a hostname.

- +

possible-hostname-completions (C-x @) -
+
List the possible completions of the text before point, treating it as a hostname.

- +

complete-command (M-!) -
+
Attempt completion on the text before point, treating it as a command name. Command completion attempts to match the text against aliases, reserved words, shell @@ -11904,32 +11913,32 @@ functions, shell builtins, and finally executable filenames, in that order.

- +

possible-command-completions (C-x !) -
+
List the possible completions of the text before point, treating it as a command name.

- +

dynamic-complete-history (M-TAB) -
+
Attempt completion on the text before point, comparing the text against lines from the history list for possible completion matches.

- +

dabbrev-expand () -
+
Attempt menu completion on the text before point, comparing the text against lines from the history list for possible completion matches.

- +

complete-into-braces (M-{) -
+
Perform filename completion and insert the list of possible completions enclosed within braces so the list is available to the shell (see section 3.5.1 Brace Expansion). @@ -11956,29 +11965,29 @@ enclosed within braces so the list is available to the shell
- +
start-kbd-macro (C-x () -
+
Begin saving the characters typed into the current keyboard macro.

- +

end-kbd-macro (C-x )) -
+
Stop saving the characters typed into the current keyboard macro and save the definition.

- +

call-last-kbd-macro (C-x e) -
+
Re-execute the last keyboard macro defined, by making the characters in the macro appear as if typed at the keyboard.

- +

print-last-kbd-macro () -
+
Print the last keboard macro defined in a format suitable for the inputrc file.

@@ -12004,87 +12013,87 @@ Print the last keboard macro defined in a format suitable for the

- +
re-read-init-file (C-x C-r) -
+
Read in the contents of the inputrc file, and incorporate any bindings or variable assignments found there.

- +

abort (C-g) -
+
Abort the current editing command and ring the terminal's bell (subject to the setting of bell-style).

- +

do-uppercase-version (M-a, M-b, M-x, ...) -
+
If the metafied character x is lowercase, run the command that is bound to the corresponding uppercase character.

- +

prefix-meta (ESC) -
+
Metafy the next character typed. This is for keyboards without a meta key. Typing `ESC f' is equivalent to typing M-f.

- +

undo (C-_ or C-x C-u) -
+
Incremental undo, separately remembered for each line.

- +

revert-line (M-r) -
+
Undo all changes made to this line. This is like executing the undo command enough times to get back to the beginning.

- +

tilde-expand (M-&) -
+
Perform tilde expansion on the current word.

- +

set-mark (C-@) -
+
Set the mark to the point. If a numeric argument is supplied, the mark is set to that position.

- +

exchange-point-and-mark (C-x C-x) -
+
Swap the point with the mark. The current cursor position is set to the saved position, and the old cursor position is saved as the mark.

- +

character-search (C-]) -
+
A character is read and point is moved to the next occurrence of that character. A negative count searches for previous occurrences.

- +

character-search-backward (M-C-]) -
+
A character is read and point is moved to the previous occurrence of that character. A negative count searches for subsequent occurrences.

- +

skip-csi-sequence () -
+
Read enough characters to consume a multi-key sequence such as those defined for keys like Home and End. Such sequences begin with a Control Sequence Indicator (CSI), usually ESC-[. If this sequence is @@ -12094,9 +12103,9 @@ stray characters into the editing buffer. This is unbound by default, but usually bound to ESC-[.

- +

insert-comment (M-#) -
+
Without a numeric argument, the value of the comment-begin variable is inserted at the beginning of the current line. If a numeric argument is supplied, this command acts as a toggle: if @@ -12111,115 +12120,115 @@ If a numeric argument causes the comment character to be removed, the line will be executed by the shell.

- +

dump-functions () -
+
Print all of the functions and their key bindings to the Readline output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.

- +

dump-variables () -
+
Print all of the settable variables and their values to the Readline output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.

- +

dump-macros () -
+
Print all of the Readline key sequences bound to macros and the strings they output. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.

- +

glob-complete-word (M-g) -
+
The word before point is treated as a pattern for pathname expansion, with an asterisk implicitly appended. This pattern is used to generate a list of matching file names for possible completions.

- +

glob-expand-word (C-x *) -
+
The word before point is treated as a pattern for pathname expansion, and the list of matching file names is inserted, replacing the word. If a numeric argument is supplied, a `*' is appended before pathname expansion.

- +

glob-list-expansions (C-x g) -
+
The list of expansions that would have been generated by glob-expand-word is displayed, and the line is redrawn. If a numeric argument is supplied, a `*' is appended before pathname expansion.

- +

display-shell-version (C-x C-v) -
+
Display version information about the current instance of Bash.

- +

shell-expand-line (M-C-e) -
+
Expand the line as the shell does. This performs alias and history expansion as well as all of the shell word expansions (see section 3.5 Shell Expansions).

- +

history-expand-line (M-^) -
+
Perform history expansion on the current line.

- +

magic-space () -
+
Perform history expansion on the current line and insert a space (see section 9.3 History Expansion).

- +

alias-expand-line () -
+
Perform alias expansion on the current line (see section 6.6 Aliases).

- +

history-and-alias-expand-line () -
+
Perform history and alias expansion on the current line.

- +

insert-last-argument (M-. or M-_) -
+
A synonym for yank-last-arg.

- +

operate-and-get-next (C-o) -
+
Accept the current line for execution and fetch the next line relative to the current line from the history for editing. Any argument is ignored.

- +

edit-and-execute-command (C-xC-e) -
+
Invoke an editor on the current command line, and execute the result as shell commands. Bash attempts to invoke @@ -12472,7 +12481,7 @@ be completed, and two to modify the completion as it is happening.
compgen -
+
 
compgen [option] [word]
 

@@ -12498,7 +12507,7 @@ matches were generated.

complete -
+
 
complete [-abcdefgjksuv] [-o comp-option] [-DE] [-A action] [-G globpat] [-W wordlist]
 [-F function] [-C command] [-X filterpat]
 [-P prefix] [-S suffix] name [name ...]
@@ -12745,7 +12754,7 @@ an error occurs adding a completion specification.
 

compopt -
+
 
compopt [-o option] [-DE] [+o option] [name]
 
Modify completion options for each name according to the options, or for the currently-executing completion if no names @@ -12912,7 +12921,7 @@ An older version of the bash_completion package is distributed with bash in the `examples/complete' subdirectory.

- +

@@ -13058,7 +13067,7 @@ history list and history file.

fc -
+
 
fc [-e ename] [-lnr] [first] [last]
 fc -s [pat=rep] [command]
 

@@ -13095,7 +13104,7 @@ and typing `r' re-executes the last command (see section +

- + - + - + - + - - - - + + + + - - - - - - - + + + + + + + - - - + + + - - - - - - + + + + + + - - + + - + - - - + + + - + - + - - - + + + - + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - +
 
history [n]
 history -c
 history -d offset
@@ -13270,7 +13279,7 @@ An event designator is a reference to a command line entry in the
 history list.
 Unless the reference is absolute, events are relative to the current
 position in the history list.
-
+
 

@@ -15539,105 +15548,105 @@ to permit their use in free software.
Index Entry Section

.
.4.1 Bourne Shell Builtins
.4.1 Bourne Shell Builtins

:
:4.1 Bourne Shell Builtins
:4.1 Bourne Shell Builtins

[
[4.1 Bourne Shell Builtins
[4.1 Bourne Shell Builtins

A
alias4.2 Bash Builtin Commands
alias4.2 Bash Builtin Commands

B
bg7.2 Job Control Builtins
bind4.2 Bash Builtin Commands
break4.1 Bourne Shell Builtins
builtin4.2 Bash Builtin Commands
bg7.2 Job Control Builtins
bind4.2 Bash Builtin Commands
break4.1 Bourne Shell Builtins
builtin4.2 Bash Builtin Commands

C
caller4.2 Bash Builtin Commands
cd4.1 Bourne Shell Builtins
command4.2 Bash Builtin Commands
compgen8.7 Programmable Completion Builtins
complete8.7 Programmable Completion Builtins
compopt8.7 Programmable Completion Builtins
continue4.1 Bourne Shell Builtins
caller4.2 Bash Builtin Commands
cd4.1 Bourne Shell Builtins
command4.2 Bash Builtin Commands
compgen8.7 Programmable Completion Builtins
complete8.7 Programmable Completion Builtins
compopt8.7 Programmable Completion Builtins
continue4.1 Bourne Shell Builtins

D
declare4.2 Bash Builtin Commands
dirs6.8.1 Directory Stack Builtins
disown7.2 Job Control Builtins
declare4.2 Bash Builtin Commands
dirs6.8.1 Directory Stack Builtins
disown7.2 Job Control Builtins

E
echo4.2 Bash Builtin Commands
enable4.2 Bash Builtin Commands
eval4.1 Bourne Shell Builtins
exec4.1 Bourne Shell Builtins
exit4.1 Bourne Shell Builtins
export4.1 Bourne Shell Builtins
echo4.2 Bash Builtin Commands
enable4.2 Bash Builtin Commands
eval4.1 Bourne Shell Builtins
exec4.1 Bourne Shell Builtins
exit4.1 Bourne Shell Builtins
export4.1 Bourne Shell Builtins

F
fc9.2 Bash History Builtins
fg7.2 Job Control Builtins
fc9.2 Bash History Builtins
fg7.2 Job Control Builtins

G
getopts4.1 Bourne Shell Builtins
getopts4.1 Bourne Shell Builtins

H
hash4.1 Bourne Shell Builtins
help4.2 Bash Builtin Commands
history9.2 Bash History Builtins
hash4.1 Bourne Shell Builtins
help4.2 Bash Builtin Commands
history9.2 Bash History Builtins

J
jobs7.2 Job Control Builtins
jobs7.2 Job Control Builtins

K
kill7.2 Job Control Builtins
kill7.2 Job Control Builtins

L
let4.2 Bash Builtin Commands
local4.2 Bash Builtin Commands
logout4.2 Bash Builtin Commands
let4.2 Bash Builtin Commands
local4.2 Bash Builtin Commands
logout4.2 Bash Builtin Commands

M
mapfile4.2 Bash Builtin Commands
mapfile4.2 Bash Builtin Commands

P
popd6.8.1 Directory Stack Builtins
printf4.2 Bash Builtin Commands
pushd6.8.1 Directory Stack Builtins
pwd4.1 Bourne Shell Builtins
popd6.8.1 Directory Stack Builtins
printf4.2 Bash Builtin Commands
pushd6.8.1 Directory Stack Builtins
pwd4.1 Bourne Shell Builtins

R
read4.2 Bash Builtin Commands
readarray4.2 Bash Builtin Commands
readonly4.1 Bourne Shell Builtins
return4.1 Bourne Shell Builtins
read4.2 Bash Builtin Commands
readarray4.2 Bash Builtin Commands
readonly4.1 Bourne Shell Builtins
return4.1 Bourne Shell Builtins

S
set4.3.1 The Set Builtin
shift4.1 Bourne Shell Builtins
shopt4.3.2 The Shopt Builtin
source4.2 Bash Builtin Commands
suspend7.2 Job Control Builtins
set4.3.1 The Set Builtin
shift4.1 Bourne Shell Builtins
shopt4.3.2 The Shopt Builtin
source4.2 Bash Builtin Commands
suspend7.2 Job Control Builtins

T
test4.1 Bourne Shell Builtins
times4.1 Bourne Shell Builtins
trap4.1 Bourne Shell Builtins
type4.2 Bash Builtin Commands
typeset4.2 Bash Builtin Commands
test4.1 Bourne Shell Builtins
times4.1 Bourne Shell Builtins
trap4.1 Bourne Shell Builtins
type4.2 Bash Builtin Commands
typeset4.2 Bash Builtin Commands

U
ulimit4.2 Bash Builtin Commands
umask4.1 Bourne Shell Builtins
unalias4.2 Bash Builtin Commands
unset4.1 Bourne Shell Builtins
ulimit4.2 Bash Builtin Commands
umask4.1 Bourne Shell Builtins
unalias4.2 Bash Builtin Commands
unset4.1 Bourne Shell Builtins

W
wait7.2 Job Control Builtins
wait7.2 Job Control Builtins

- - + + - - + + - - + + + + + + + + + + + - - + + - - + + - - + + - + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - + + + + + + - - + + - +
Jump to:   .   @@ -15891,308 +15900,317 @@ to permit their use in free software.
Index Entry Section

!
!3.4.2 Special Parameters
!3.4.2 Special Parameters
!3.4.2 Special Parameters
!3.4.2 Special Parameters

#
#3.4.2 Special Parameters
#3.4.2 Special Parameters
#3.4.2 Special Parameters
#3.4.2 Special Parameters

$
$3.4.2 Special Parameters
$3.4.2 Special Parameters
$3.4.2 Special Parameters
$3.4.2 Special Parameters
$!3.4.2 Special Parameters
$#3.4.2 Special Parameters
$$3.4.2 Special Parameters
$*3.4.2 Special Parameters
$-3.4.2 Special Parameters
$03.4.2 Special Parameters
$?3.4.2 Special Parameters
$@3.4.2 Special Parameters
$_3.4.2 Special Parameters

*
*3.4.2 Special Parameters
*3.4.2 Special Parameters

-
-3.4.2 Special Parameters
-3.4.2 Special Parameters
-3.4.2 Special Parameters
-3.4.2 Special Parameters

0
03.4.2 Special Parameters
03.4.2 Special Parameters
03.4.2 Special Parameters
03.4.2 Special Parameters

?
?3.4.2 Special Parameters
?3.4.2 Special Parameters
?3.4.2 Special Parameters
?3.4.2 Special Parameters

@
@3.4.2 Special Parameters
@3.4.2 Special Parameters
@3.4.2 Special Parameters

_
_3.4.2 Special Parameters
_3.4.2 Special Parameters
_3.4.2 Special Parameters
_3.4.2 Special Parameters

A
auto_resume7.3 Job Control Variables
auto_resume7.3 Job Control Variables
auto_resume7.3 Job Control Variables
auto_resume7.3 Job Control Variables

B
BASH5.2 Bash Variables
BASH5.2 Bash Variables
BASH_ALIASES5.2 Bash Variables
BASH_ALIASES5.2 Bash Variables
BASH_ARGC5.2 Bash Variables
BASH_ARGC5.2 Bash Variables
BASH_ARGV5.2 Bash Variables
BASH_ARGV5.2 Bash Variables
BASH_CMDS5.2 Bash Variables
BASH_CMDS5.2 Bash Variables
BASH_COMMAND5.2 Bash Variables
BASH_COMMAND5.2 Bash Variables
BASH_COMPAT5.2 Bash Variables
BASH_COMPAT5.2 Bash Variables
BASH_ENV5.2 Bash Variables
BASH_ENV5.2 Bash Variables
BASH_EXECUTION_STRING5.2 Bash Variables
BASH_EXECUTION_STRING5.2 Bash Variables
BASH_LINENO5.2 Bash Variables
BASH_LINENO5.2 Bash Variables
BASH_REMATCH5.2 Bash Variables
BASH_REMATCH5.2 Bash Variables
BASH_SOURCE5.2 Bash Variables
BASH_SOURCE5.2 Bash Variables
BASH_SUBSHELL5.2 Bash Variables
BASH_SUBSHELL5.2 Bash Variables
BASH_VERSINFO5.2 Bash Variables
BASH_VERSINFO5.2 Bash Variables
BASH_VERSION5.2 Bash Variables
BASH_VERSION5.2 Bash Variables
BASH_XTRACEFD5.2 Bash Variables
BASH_XTRACEFD5.2 Bash Variables
BASHOPTS5.2 Bash Variables
BASHOPTS5.2 Bash Variables
BASHPID5.2 Bash Variables
BASHPID5.2 Bash Variables
bell-style8.3.1 Readline Init File Syntax
bind-tty-special-chars8.3.1 Readline Init File Syntax
BASH5.2 Bash Variables
BASH5.2 Bash Variables
BASH_ALIASES5.2 Bash Variables
BASH_ALIASES5.2 Bash Variables
BASH_ARGC5.2 Bash Variables
BASH_ARGC5.2 Bash Variables
BASH_ARGV5.2 Bash Variables
BASH_ARGV5.2 Bash Variables
BASH_CMDS5.2 Bash Variables
BASH_CMDS5.2 Bash Variables
BASH_COMMAND5.2 Bash Variables
BASH_COMMAND5.2 Bash Variables
BASH_COMPAT5.2 Bash Variables
BASH_COMPAT5.2 Bash Variables
BASH_ENV5.2 Bash Variables
BASH_ENV5.2 Bash Variables
BASH_EXECUTION_STRING5.2 Bash Variables
BASH_EXECUTION_STRING5.2 Bash Variables
BASH_LINENO5.2 Bash Variables
BASH_LINENO5.2 Bash Variables
BASH_REMATCH5.2 Bash Variables
BASH_REMATCH5.2 Bash Variables
BASH_SOURCE5.2 Bash Variables
BASH_SOURCE5.2 Bash Variables
BASH_SUBSHELL5.2 Bash Variables
BASH_SUBSHELL5.2 Bash Variables
BASH_VERSINFO5.2 Bash Variables
BASH_VERSINFO5.2 Bash Variables
BASH_VERSION5.2 Bash Variables
BASH_VERSION5.2 Bash Variables
BASH_XTRACEFD5.2 Bash Variables
BASH_XTRACEFD5.2 Bash Variables
BASHOPTS5.2 Bash Variables
BASHOPTS5.2 Bash Variables
BASHPID5.2 Bash Variables
BASHPID5.2 Bash Variables
bell-style8.3.1 Readline Init File Syntax
bind-tty-special-chars8.3.1 Readline Init File Syntax

C
CDPATH5.1 Bourne Shell Variables
CDPATH5.1 Bourne Shell Variables
CHILD_MAX5.2 Bash Variables
CHILD_MAX5.2 Bash Variables
colored-stats8.3.1 Readline Init File Syntax
COLUMNS5.2 Bash Variables
COLUMNS5.2 Bash Variables
comment-begin8.3.1 Readline Init File Syntax
COMP_CWORD5.2 Bash Variables
COMP_CWORD5.2 Bash Variables
COMP_KEY5.2 Bash Variables
COMP_KEY5.2 Bash Variables
COMP_LINE5.2 Bash Variables
COMP_LINE5.2 Bash Variables
COMP_POINT5.2 Bash Variables
COMP_POINT5.2 Bash Variables
COMP_TYPE5.2 Bash Variables
COMP_TYPE5.2 Bash Variables
COMP_WORDBREAKS5.2 Bash Variables
COMP_WORDBREAKS5.2 Bash Variables
COMP_WORDS5.2 Bash Variables
COMP_WORDS5.2 Bash Variables
completion-display-width8.3.1 Readline Init File Syntax
completion-ignore-case8.3.1 Readline Init File Syntax
completion-map-case8.3.1 Readline Init File Syntax
completion-prefix-display-length8.3.1 Readline Init File Syntax
completion-query-items8.3.1 Readline Init File Syntax
COMPREPLY5.2 Bash Variables
COMPREPLY5.2 Bash Variables
convert-meta8.3.1 Readline Init File Syntax
COPROC5.2 Bash Variables
COPROC5.2 Bash Variables
CDPATH5.1 Bourne Shell Variables
CDPATH5.1 Bourne Shell Variables
CHILD_MAX5.2 Bash Variables
CHILD_MAX5.2 Bash Variables
colored-stats8.3.1 Readline Init File Syntax
COLUMNS5.2 Bash Variables
COLUMNS5.2 Bash Variables
comment-begin8.3.1 Readline Init File Syntax
COMP_CWORD5.2 Bash Variables
COMP_CWORD5.2 Bash Variables
COMP_KEY5.2 Bash Variables
COMP_KEY5.2 Bash Variables
COMP_LINE5.2 Bash Variables
COMP_LINE5.2 Bash Variables
COMP_POINT5.2 Bash Variables
COMP_POINT5.2 Bash Variables
COMP_TYPE5.2 Bash Variables
COMP_TYPE5.2 Bash Variables
COMP_WORDBREAKS5.2 Bash Variables
COMP_WORDBREAKS5.2 Bash Variables
COMP_WORDS5.2 Bash Variables
COMP_WORDS5.2 Bash Variables
completion-display-width8.3.1 Readline Init File Syntax
completion-ignore-case8.3.1 Readline Init File Syntax
completion-map-case8.3.1 Readline Init File Syntax
completion-prefix-display-length8.3.1 Readline Init File Syntax
completion-query-items8.3.1 Readline Init File Syntax
COMPREPLY5.2 Bash Variables
COMPREPLY5.2 Bash Variables
convert-meta8.3.1 Readline Init File Syntax
COPROC5.2 Bash Variables
COPROC5.2 Bash Variables

D
DIRSTACK5.2 Bash Variables
DIRSTACK5.2 Bash Variables
disable-completion8.3.1 Readline Init File Syntax
DIRSTACK5.2 Bash Variables
DIRSTACK5.2 Bash Variables
disable-completion8.3.1 Readline Init File Syntax

E
editing-mode8.3.1 Readline Init File Syntax
EMACS5.2 Bash Variables
EMACS5.2 Bash Variables
enable-keypad8.3.1 Readline Init File Syntax
ENV5.2 Bash Variables
ENV5.2 Bash Variables
EUID5.2 Bash Variables
EUID5.2 Bash Variables
expand-tilde8.3.1 Readline Init File Syntax
editing-mode8.3.1 Readline Init File Syntax
EMACS5.2 Bash Variables
EMACS5.2 Bash Variables
enable-keypad8.3.1 Readline Init File Syntax
ENV5.2 Bash Variables
ENV5.2 Bash Variables
EUID5.2 Bash Variables
EUID5.2 Bash Variables
expand-tilde8.3.1 Readline Init File Syntax

F
FCEDIT5.2 Bash Variables
FCEDIT5.2 Bash Variables
FIGNORE5.2 Bash Variables
FIGNORE5.2 Bash Variables
FUNCNAME5.2 Bash Variables
FUNCNAME5.2 Bash Variables
FUNCNEST5.2 Bash Variables
FUNCNEST5.2 Bash Variables
FCEDIT5.2 Bash Variables
FCEDIT5.2 Bash Variables
FIGNORE5.2 Bash Variables
FIGNORE5.2 Bash Variables
FUNCNAME5.2 Bash Variables
FUNCNAME5.2 Bash Variables
FUNCNEST5.2 Bash Variables
FUNCNEST5.2 Bash Variables

G
GLOBIGNORE5.2 Bash Variables
GLOBIGNORE5.2 Bash Variables
GROUPS5.2 Bash Variables
GROUPS5.2 Bash Variables
GLOBIGNORE5.2 Bash Variables
GLOBIGNORE5.2 Bash Variables
GROUPS5.2 Bash Variables
GROUPS5.2 Bash Variables

H
histchars5.2 Bash Variables
histchars5.2 Bash Variables
HISTCMD5.2 Bash Variables
HISTCMD5.2 Bash Variables
HISTCONTROL5.2 Bash Variables
HISTCONTROL5.2 Bash Variables
HISTFILE5.2 Bash Variables
HISTFILE5.2 Bash Variables
HISTFILESIZE5.2 Bash Variables
HISTFILESIZE5.2 Bash Variables
HISTIGNORE5.2 Bash Variables
HISTIGNORE5.2 Bash Variables
history-preserve-point8.3.1 Readline Init File Syntax
history-size8.3.1 Readline Init File Syntax
HISTSIZE5.2 Bash Variables
HISTSIZE5.2 Bash Variables
HISTTIMEFORMAT5.2 Bash Variables
HISTTIMEFORMAT5.2 Bash Variables
HOME5.1 Bourne Shell Variables
HOME5.1 Bourne Shell Variables
horizontal-scroll-mode8.3.1 Readline Init File Syntax
HOSTFILE5.2 Bash Variables
HOSTFILE5.2 Bash Variables
HOSTNAME5.2 Bash Variables
HOSTNAME5.2 Bash Variables
HOSTTYPE5.2 Bash Variables
HOSTTYPE5.2 Bash Variables
histchars5.2 Bash Variables
histchars5.2 Bash Variables
HISTCMD5.2 Bash Variables
HISTCMD5.2 Bash Variables
HISTCONTROL5.2 Bash Variables
HISTCONTROL5.2 Bash Variables
HISTFILE5.2 Bash Variables
HISTFILE5.2 Bash Variables
HISTFILESIZE5.2 Bash Variables
HISTFILESIZE5.2 Bash Variables
HISTIGNORE5.2 Bash Variables
HISTIGNORE5.2 Bash Variables
history-preserve-point8.3.1 Readline Init File Syntax
history-size8.3.1 Readline Init File Syntax
HISTSIZE5.2 Bash Variables
HISTSIZE5.2 Bash Variables
HISTTIMEFORMAT5.2 Bash Variables
HISTTIMEFORMAT5.2 Bash Variables
HOME5.1 Bourne Shell Variables
HOME5.1 Bourne Shell Variables
horizontal-scroll-mode8.3.1 Readline Init File Syntax
HOSTFILE5.2 Bash Variables
HOSTFILE5.2 Bash Variables
HOSTNAME5.2 Bash Variables
HOSTNAME5.2 Bash Variables
HOSTTYPE5.2 Bash Variables
HOSTTYPE5.2 Bash Variables

I
IFS5.1 Bourne Shell Variables
IFS5.1 Bourne Shell Variables
IGNOREEOF5.2 Bash Variables
IGNOREEOF5.2 Bash Variables
input-meta8.3.1 Readline Init File Syntax
INPUTRC5.2 Bash Variables
INPUTRC5.2 Bash Variables
isearch-terminators8.3.1 Readline Init File Syntax
IFS5.1 Bourne Shell Variables
IFS5.1 Bourne Shell Variables
IGNOREEOF5.2 Bash Variables
IGNOREEOF5.2 Bash Variables
input-meta8.3.1 Readline Init File Syntax
INPUTRC5.2 Bash Variables
INPUTRC5.2 Bash Variables
isearch-terminators8.3.1 Readline Init File Syntax

K
keymap8.3.1 Readline Init File Syntax
keymap8.3.1 Readline Init File Syntax

L
LANG5.2 Bash Variables
LANG5.2 Bash Variables
LC_ALL5.2 Bash Variables
LC_ALL5.2 Bash Variables
LC_COLLATE5.2 Bash Variables
LC_COLLATE5.2 Bash Variables
LC_CTYPE5.2 Bash Variables
LC_CTYPE5.2 Bash Variables
LANG5.2 Bash Variables
LANG5.2 Bash Variables
LC_ALL5.2 Bash Variables
LC_ALL5.2 Bash Variables
LC_COLLATE5.2 Bash Variables
LC_COLLATE5.2 Bash Variables
LC_CTYPE5.2 Bash Variables
LC_CTYPE5.2 Bash Variables
LC_MESSAGES3.1.2.5 Locale-Specific Translation
LC_MESSAGES5.2 Bash Variables
LC_MESSAGES5.2 Bash Variables
LC_NUMERIC5.2 Bash Variables
LC_NUMERIC5.2 Bash Variables
LINENO5.2 Bash Variables
LINENO5.2 Bash Variables
LINES5.2 Bash Variables
LINES5.2 Bash Variables
LC_MESSAGES5.2 Bash Variables
LC_MESSAGES5.2 Bash Variables
LC_NUMERIC5.2 Bash Variables
LC_NUMERIC5.2 Bash Variables
LINENO5.2 Bash Variables
LINENO5.2 Bash Variables
LINES5.2 Bash Variables
LINES5.2 Bash Variables

M
MACHTYPE5.2 Bash Variables
MACHTYPE5.2 Bash Variables
MAIL5.1 Bourne Shell Variables
MAIL5.1 Bourne Shell Variables
MAILCHECK5.2 Bash Variables
MAILCHECK5.2 Bash Variables
MAILPATH5.1 Bourne Shell Variables
MAILPATH5.1 Bourne Shell Variables
MAPFILE5.2 Bash Variables
MAPFILE5.2 Bash Variables
mark-modified-lines8.3.1 Readline Init File Syntax
mark-symlinked-directories8.3.1 Readline Init File Syntax
match-hidden-files8.3.1 Readline Init File Syntax
menu-complete-display-prefix8.3.1 Readline Init File Syntax
meta-flag8.3.1 Readline Init File Syntax
MACHTYPE5.2 Bash Variables
MACHTYPE5.2 Bash Variables
MAIL5.1 Bourne Shell Variables
MAIL5.1 Bourne Shell Variables
MAILCHECK5.2 Bash Variables
MAILCHECK5.2 Bash Variables
MAILPATH5.1 Bourne Shell Variables
MAILPATH5.1 Bourne Shell Variables
MAPFILE5.2 Bash Variables
MAPFILE5.2 Bash Variables
mark-modified-lines8.3.1 Readline Init File Syntax
mark-symlinked-directories8.3.1 Readline Init File Syntax
match-hidden-files8.3.1 Readline Init File Syntax
menu-complete-display-prefix8.3.1 Readline Init File Syntax
meta-flag8.3.1 Readline Init File Syntax

O
OLDPWD5.2 Bash Variables
OLDPWD5.2 Bash Variables
OPTARG5.1 Bourne Shell Variables
OPTARG5.1 Bourne Shell Variables
OPTERR5.2 Bash Variables
OPTERR5.2 Bash Variables
OPTIND5.1 Bourne Shell Variables
OPTIND5.1 Bourne Shell Variables
OSTYPE5.2 Bash Variables
OSTYPE5.2 Bash Variables
output-meta8.3.1 Readline Init File Syntax
OLDPWD5.2 Bash Variables
OLDPWD5.2 Bash Variables
OPTARG5.1 Bourne Shell Variables
OPTARG5.1 Bourne Shell Variables
OPTERR5.2 Bash Variables
OPTERR5.2 Bash Variables
OPTIND5.1 Bourne Shell Variables
OPTIND5.1 Bourne Shell Variables
OSTYPE5.2 Bash Variables
OSTYPE5.2 Bash Variables
output-meta8.3.1 Readline Init File Syntax

P
page-completions8.3.1 Readline Init File Syntax
PATH5.1 Bourne Shell Variables
PATH5.1 Bourne Shell Variables
PIPESTATUS5.2 Bash Variables
PIPESTATUS5.2 Bash Variables
POSIXLY_CORRECT5.2 Bash Variables
POSIXLY_CORRECT5.2 Bash Variables
PPID5.2 Bash Variables
PPID5.2 Bash Variables
PROMPT_COMMAND5.2 Bash Variables
PROMPT_COMMAND5.2 Bash Variables
PROMPT_DIRTRIM5.2 Bash Variables
PROMPT_DIRTRIM5.2 Bash Variables
PS15.1 Bourne Shell Variables
PS15.1 Bourne Shell Variables
PS25.1 Bourne Shell Variables
PS25.1 Bourne Shell Variables
PS35.2 Bash Variables
PS35.2 Bash Variables
PS45.2 Bash Variables
PS45.2 Bash Variables
PWD5.2 Bash Variables
PWD5.2 Bash Variables
page-completions8.3.1 Readline Init File Syntax
PATH5.1 Bourne Shell Variables
PATH5.1 Bourne Shell Variables
PIPESTATUS5.2 Bash Variables
PIPESTATUS5.2 Bash Variables
POSIXLY_CORRECT5.2 Bash Variables
POSIXLY_CORRECT5.2 Bash Variables
PPID5.2 Bash Variables
PPID5.2 Bash Variables
PROMPT_COMMAND5.2 Bash Variables
PROMPT_COMMAND5.2 Bash Variables
PROMPT_DIRTRIM5.2 Bash Variables
PROMPT_DIRTRIM5.2 Bash Variables
PS15.1 Bourne Shell Variables
PS15.1 Bourne Shell Variables
PS25.1 Bourne Shell Variables
PS25.1 Bourne Shell Variables
PS35.2 Bash Variables
PS35.2 Bash Variables
PS45.2 Bash Variables
PS45.2 Bash Variables
PWD5.2 Bash Variables
PWD5.2 Bash Variables

R
RANDOM5.2 Bash Variables
RANDOM5.2 Bash Variables
READLINE_LINE5.2 Bash Variables
READLINE_LINE5.2 Bash Variables
READLINE_POINT5.2 Bash Variables
READLINE_POINT5.2 Bash Variables
REPLY5.2 Bash Variables
REPLY5.2 Bash Variables
revert-all-at-newline8.3.1 Readline Init File Syntax
RANDOM5.2 Bash Variables
RANDOM5.2 Bash Variables
READLINE_LINE5.2 Bash Variables
READLINE_LINE5.2 Bash Variables
READLINE_POINT5.2 Bash Variables
READLINE_POINT5.2 Bash Variables
REPLY5.2 Bash Variables
REPLY5.2 Bash Variables
revert-all-at-newline8.3.1 Readline Init File Syntax

S
SECONDS5.2 Bash Variables
SECONDS5.2 Bash Variables
SHELL5.2 Bash Variables
SHELL5.2 Bash Variables
SHELLOPTS5.2 Bash Variables
SHELLOPTS5.2 Bash Variables
SHLVL5.2 Bash Variables
SHLVL5.2 Bash Variables
show-all-if-ambiguous8.3.1 Readline Init File Syntax
show-all-if-unmodified8.3.1 Readline Init File Syntax
show-mode-in-prompt8.3.1 Readline Init File Syntax
skip-completed-text8.3.1 Readline Init File Syntax
SECONDS5.2 Bash Variables
SECONDS5.2 Bash Variables
SHELL5.2 Bash Variables
SHELL5.2 Bash Variables
SHELLOPTS5.2 Bash Variables
SHELLOPTS5.2 Bash Variables
SHLVL5.2 Bash Variables
SHLVL5.2 Bash Variables
show-all-if-ambiguous8.3.1 Readline Init File Syntax
show-all-if-unmodified8.3.1 Readline Init File Syntax
show-mode-in-prompt8.3.1 Readline Init File Syntax
skip-completed-text8.3.1 Readline Init File Syntax

T
TEXTDOMAIN3.1.2.5 Locale-Specific Translation
TEXTDOMAINDIR3.1.2.5 Locale-Specific Translation
TIMEFORMAT5.2 Bash Variables
TIMEFORMAT5.2 Bash Variables
TMOUT5.2 Bash Variables
TMOUT5.2 Bash Variables
TMPDIR5.2 Bash Variables
TMPDIR5.2 Bash Variables
TIMEFORMAT5.2 Bash Variables
TIMEFORMAT5.2 Bash Variables
TMOUT5.2 Bash Variables
TMOUT5.2 Bash Variables
TMPDIR5.2 Bash Variables
TMPDIR5.2 Bash Variables

U
UID5.2 Bash Variables
UID5.2 Bash Variables
UID5.2 Bash Variables
UID5.2 Bash Variables

V
visible-stats8.3.1 Readline Init File Syntax
visible-stats8.3.1 Readline Init File Syntax

- - - - - - + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - + + + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - + + + + + + + +
Jump to:   !   @@ -16314,256 +16332,256 @@ to permit their use in free software.
Index Entry Section

A
abort (C-g)8.4.8 Some Miscellaneous Commands
abort (C-g)8.4.8 Some Miscellaneous Commands
accept-line (Newline or Return)8.4.2 Commands For Manipulating The History
accept-line (Newline or Return)8.4.2 Commands For Manipulating The History
alias-expand-line ()8.4.8 Some Miscellaneous Commands
alias-expand-line ()8.4.8 Some Miscellaneous Commands
abort (C-g)8.4.8 Some Miscellaneous Commands
abort (C-g)8.4.8 Some Miscellaneous Commands
accept-line (Newline or Return)8.4.2 Commands For Manipulating The History
accept-line (Newline or Return)8.4.2 Commands For Manipulating The History
alias-expand-line ()8.4.8 Some Miscellaneous Commands
alias-expand-line ()8.4.8 Some Miscellaneous Commands

B
backward-char (C-b)8.4.1 Commands For Moving
backward-char (C-b)8.4.1 Commands For Moving
backward-delete-char (Rubout)8.4.3 Commands For Changing Text
backward-delete-char (Rubout)8.4.3 Commands For Changing Text
backward-kill-line (C-x Rubout)8.4.4 Killing And Yanking
backward-kill-line (C-x Rubout)8.4.4 Killing And Yanking
backward-kill-word (M-DEL)8.4.4 Killing And Yanking
backward-kill-word (M-DEL)8.4.4 Killing And Yanking
backward-word (M-b)8.4.1 Commands For Moving
backward-word (M-b)8.4.1 Commands For Moving
beginning-of-history (M-&#60;)8.4.2 Commands For Manipulating The History
beginning-of-history (M-&#60;)8.4.2 Commands For Manipulating The History
beginning-of-line (C-a)8.4.1 Commands For Moving
beginning-of-line (C-a)8.4.1 Commands For Moving
backward-char (C-b)8.4.1 Commands For Moving
backward-char (C-b)8.4.1 Commands For Moving
backward-delete-char (Rubout)8.4.3 Commands For Changing Text
backward-delete-char (Rubout)8.4.3 Commands For Changing Text
backward-kill-line (C-x Rubout)8.4.4 Killing And Yanking
backward-kill-line (C-x Rubout)8.4.4 Killing And Yanking
backward-kill-word (M-DEL)8.4.4 Killing And Yanking
backward-kill-word (M-DEL)8.4.4 Killing And Yanking
backward-word (M-b)8.4.1 Commands For Moving
backward-word (M-b)8.4.1 Commands For Moving
beginning-of-history (M-&#60;)8.4.2 Commands For Manipulating The History
beginning-of-history (M-&#60;)8.4.2 Commands For Manipulating The History
beginning-of-line (C-a)8.4.1 Commands For Moving
beginning-of-line (C-a)8.4.1 Commands For Moving

C
call-last-kbd-macro (C-x e)8.4.7 Keyboard Macros
call-last-kbd-macro (C-x e)8.4.7 Keyboard Macros
capitalize-word (M-c)8.4.3 Commands For Changing Text
capitalize-word (M-c)8.4.3 Commands For Changing Text
character-search (C-])8.4.8 Some Miscellaneous Commands
character-search (C-])8.4.8 Some Miscellaneous Commands
character-search-backward (M-C-])8.4.8 Some Miscellaneous Commands
character-search-backward (M-C-])8.4.8 Some Miscellaneous Commands
clear-screen (C-l)8.4.1 Commands For Moving
clear-screen (C-l)8.4.1 Commands For Moving
complete (TAB)8.4.6 Letting Readline Type For You
complete (TAB)8.4.6 Letting Readline Type For You
complete-command (M-!)8.4.6 Letting Readline Type For You
complete-command (M-!)8.4.6 Letting Readline Type For You
complete-filename (M-/)8.4.6 Letting Readline Type For You
complete-filename (M-/)8.4.6 Letting Readline Type For You
complete-hostname (M-@)8.4.6 Letting Readline Type For You
complete-hostname (M-@)8.4.6 Letting Readline Type For You
complete-into-braces (M-{)8.4.6 Letting Readline Type For You
complete-into-braces (M-{)8.4.6 Letting Readline Type For You
complete-username (M-~)8.4.6 Letting Readline Type For You
complete-username (M-~)8.4.6 Letting Readline Type For You
complete-variable (M-$)8.4.6 Letting Readline Type For You
complete-variable (M-$)8.4.6 Letting Readline Type For You
copy-backward-word ()8.4.4 Killing And Yanking
copy-backward-word ()8.4.4 Killing And Yanking
copy-forward-word ()8.4.4 Killing And Yanking
copy-forward-word ()8.4.4 Killing And Yanking
copy-region-as-kill ()8.4.4 Killing And Yanking
copy-region-as-kill ()8.4.4 Killing And Yanking
call-last-kbd-macro (C-x e)8.4.7 Keyboard Macros
call-last-kbd-macro (C-x e)8.4.7 Keyboard Macros
capitalize-word (M-c)8.4.3 Commands For Changing Text
capitalize-word (M-c)8.4.3 Commands For Changing Text
character-search (C-])8.4.8 Some Miscellaneous Commands
character-search (C-])8.4.8 Some Miscellaneous Commands
character-search-backward (M-C-])8.4.8 Some Miscellaneous Commands
character-search-backward (M-C-])8.4.8 Some Miscellaneous Commands
clear-screen (C-l)8.4.1 Commands For Moving
clear-screen (C-l)8.4.1 Commands For Moving
complete (TAB)8.4.6 Letting Readline Type For You
complete (TAB)8.4.6 Letting Readline Type For You
complete-command (M-!)8.4.6 Letting Readline Type For You
complete-command (M-!)8.4.6 Letting Readline Type For You
complete-filename (M-/)8.4.6 Letting Readline Type For You
complete-filename (M-/)8.4.6 Letting Readline Type For You
complete-hostname (M-@)8.4.6 Letting Readline Type For You
complete-hostname (M-@)8.4.6 Letting Readline Type For You
complete-into-braces (M-{)8.4.6 Letting Readline Type For You
complete-into-braces (M-{)8.4.6 Letting Readline Type For You
complete-username (M-~)8.4.6 Letting Readline Type For You
complete-username (M-~)8.4.6 Letting Readline Type For You
complete-variable (M-$)8.4.6 Letting Readline Type For You
complete-variable (M-$)8.4.6 Letting Readline Type For You
copy-backward-word ()8.4.4 Killing And Yanking
copy-backward-word ()8.4.4 Killing And Yanking
copy-forward-word ()8.4.4 Killing And Yanking
copy-forward-word ()8.4.4 Killing And Yanking
copy-region-as-kill ()8.4.4 Killing And Yanking
copy-region-as-kill ()8.4.4 Killing And Yanking

D
dabbrev-expand ()8.4.6 Letting Readline Type For You
dabbrev-expand ()8.4.6 Letting Readline Type For You
delete-char (C-d)8.4.3 Commands For Changing Text
delete-char (C-d)8.4.3 Commands For Changing Text
delete-char-or-list ()8.4.6 Letting Readline Type For You
delete-char-or-list ()8.4.6 Letting Readline Type For You
delete-horizontal-space ()8.4.4 Killing And Yanking
delete-horizontal-space ()8.4.4 Killing And Yanking
digit-argument (M-0, M-1, <small>...</small> M--)8.4.5 Specifying Numeric Arguments
digit-argument (M-0, M-1, <small>...</small> M--)8.4.5 Specifying Numeric Arguments
display-shell-version (C-x C-v)8.4.8 Some Miscellaneous Commands
display-shell-version (C-x C-v)8.4.8 Some Miscellaneous Commands
do-uppercase-version (M-a, M-b, M-x, <small>...</small>)8.4.8 Some Miscellaneous Commands
do-uppercase-version (M-a, M-b, M-x, <small>...</small>)8.4.8 Some Miscellaneous Commands
downcase-word (M-l)8.4.3 Commands For Changing Text
downcase-word (M-l)8.4.3 Commands For Changing Text
dump-functions ()8.4.8 Some Miscellaneous Commands
dump-functions ()8.4.8 Some Miscellaneous Commands
dump-macros ()8.4.8 Some Miscellaneous Commands
dump-macros ()8.4.8 Some Miscellaneous Commands
dump-variables ()8.4.8 Some Miscellaneous Commands
dump-variables ()8.4.8 Some Miscellaneous Commands
dynamic-complete-history (M-TAB)8.4.6 Letting Readline Type For You
dynamic-complete-history (M-TAB)8.4.6 Letting Readline Type For You
dabbrev-expand ()8.4.6 Letting Readline Type For You
dabbrev-expand ()8.4.6 Letting Readline Type For You
delete-char (C-d)8.4.3 Commands For Changing Text
delete-char (C-d)8.4.3 Commands For Changing Text
delete-char-or-list ()8.4.6 Letting Readline Type For You
delete-char-or-list ()8.4.6 Letting Readline Type For You
delete-horizontal-space ()8.4.4 Killing And Yanking
delete-horizontal-space ()8.4.4 Killing And Yanking
digit-argument (M-0, M-1, <small>...</small> M--)8.4.5 Specifying Numeric Arguments
digit-argument (M-0, M-1, <small>...</small> M--)8.4.5 Specifying Numeric Arguments
display-shell-version (C-x C-v)8.4.8 Some Miscellaneous Commands
display-shell-version (C-x C-v)8.4.8 Some Miscellaneous Commands
do-uppercase-version (M-a, M-b, M-x, <small>...</small>)8.4.8 Some Miscellaneous Commands
do-uppercase-version (M-a, M-b, M-x, <small>...</small>)8.4.8 Some Miscellaneous Commands
downcase-word (M-l)8.4.3 Commands For Changing Text
downcase-word (M-l)8.4.3 Commands For Changing Text
dump-functions ()8.4.8 Some Miscellaneous Commands
dump-functions ()8.4.8 Some Miscellaneous Commands
dump-macros ()8.4.8 Some Miscellaneous Commands
dump-macros ()8.4.8 Some Miscellaneous Commands
dump-variables ()8.4.8 Some Miscellaneous Commands
dump-variables ()8.4.8 Some Miscellaneous Commands
dynamic-complete-history (M-TAB)8.4.6 Letting Readline Type For You
dynamic-complete-history (M-TAB)8.4.6 Letting Readline Type For You

E
edit-and-execute-command (C-xC-e)8.4.8 Some Miscellaneous Commands
edit-and-execute-command (C-xC-e)8.4.8 Some Miscellaneous Commands
end-kbd-macro (C-x ))8.4.7 Keyboard Macros
end-kbd-macro (C-x ))8.4.7 Keyboard Macros
end-of-history (M-&#62;)8.4.2 Commands For Manipulating The History
end-of-history (M-&#62;)8.4.2 Commands For Manipulating The History
end-of-line (C-e)8.4.1 Commands For Moving
end-of-line (C-e)8.4.1 Commands For Moving
exchange-point-and-mark (C-x C-x)8.4.8 Some Miscellaneous Commands
exchange-point-and-mark (C-x C-x)8.4.8 Some Miscellaneous Commands
edit-and-execute-command (C-xC-e)8.4.8 Some Miscellaneous Commands
edit-and-execute-command (C-xC-e)8.4.8 Some Miscellaneous Commands
end-kbd-macro (C-x ))8.4.7 Keyboard Macros
end-kbd-macro (C-x ))8.4.7 Keyboard Macros
end-of-history (M-&#62;)8.4.2 Commands For Manipulating The History
end-of-history (M-&#62;)8.4.2 Commands For Manipulating The History
end-of-line (C-e)8.4.1 Commands For Moving
end-of-line (C-e)8.4.1 Commands For Moving
exchange-point-and-mark (C-x C-x)8.4.8 Some Miscellaneous Commands
exchange-point-and-mark (C-x C-x)8.4.8 Some Miscellaneous Commands

F
forward-backward-delete-char ()8.4.3 Commands For Changing Text
forward-backward-delete-char ()8.4.3 Commands For Changing Text
forward-char (C-f)8.4.1 Commands For Moving
forward-char (C-f)8.4.1 Commands For Moving
forward-search-history (C-s)8.4.2 Commands For Manipulating The History
forward-search-history (C-s)8.4.2 Commands For Manipulating The History
forward-word (M-f)8.4.1 Commands For Moving
forward-word (M-f)8.4.1 Commands For Moving
forward-backward-delete-char ()8.4.3 Commands For Changing Text
forward-backward-delete-char ()8.4.3 Commands For Changing Text
forward-char (C-f)8.4.1 Commands For Moving
forward-char (C-f)8.4.1 Commands For Moving
forward-search-history (C-s)8.4.2 Commands For Manipulating The History
forward-search-history (C-s)8.4.2 Commands For Manipulating The History
forward-word (M-f)8.4.1 Commands For Moving
forward-word (M-f)8.4.1 Commands For Moving

G
glob-complete-word (M-g)8.4.8 Some Miscellaneous Commands
glob-complete-word (M-g)8.4.8 Some Miscellaneous Commands
glob-expand-word (C-x *)8.4.8 Some Miscellaneous Commands
glob-expand-word (C-x *)8.4.8 Some Miscellaneous Commands
glob-list-expansions (C-x g)8.4.8 Some Miscellaneous Commands
glob-list-expansions (C-x g)8.4.8 Some Miscellaneous Commands
glob-complete-word (M-g)8.4.8 Some Miscellaneous Commands
glob-complete-word (M-g)8.4.8 Some Miscellaneous Commands
glob-expand-word (C-x *)8.4.8 Some Miscellaneous Commands
glob-expand-word (C-x *)8.4.8 Some Miscellaneous Commands
glob-list-expansions (C-x g)8.4.8 Some Miscellaneous Commands
glob-list-expansions (C-x g)8.4.8 Some Miscellaneous Commands

H
history-and-alias-expand-line ()8.4.8 Some Miscellaneous Commands
history-and-alias-expand-line ()8.4.8 Some Miscellaneous Commands
history-expand-line (M-^)8.4.8 Some Miscellaneous Commands
history-expand-line (M-^)8.4.8 Some Miscellaneous Commands
history-search-backward ()8.4.2 Commands For Manipulating The History
history-search-backward ()8.4.2 Commands For Manipulating The History
history-search-forward ()8.4.2 Commands For Manipulating The History
history-search-forward ()8.4.2 Commands For Manipulating The History
history-substr-search-backward ()8.4.2 Commands For Manipulating The History
history-substr-search-backward ()8.4.2 Commands For Manipulating The History
history-substr-search-forward ()8.4.2 Commands For Manipulating The History
history-substr-search-forward ()8.4.2 Commands For Manipulating The History
history-and-alias-expand-line ()8.4.8 Some Miscellaneous Commands
history-and-alias-expand-line ()8.4.8 Some Miscellaneous Commands
history-expand-line (M-^)8.4.8 Some Miscellaneous Commands
history-expand-line (M-^)8.4.8 Some Miscellaneous Commands
history-search-backward ()8.4.2 Commands For Manipulating The History
history-search-backward ()8.4.2 Commands For Manipulating The History
history-search-forward ()8.4.2 Commands For Manipulating The History
history-search-forward ()8.4.2 Commands For Manipulating The History
history-substr-search-backward ()8.4.2 Commands For Manipulating The History
history-substr-search-backward ()8.4.2 Commands For Manipulating The History
history-substr-search-forward ()8.4.2 Commands For Manipulating The History
history-substr-search-forward ()8.4.2 Commands For Manipulating The History

I
insert-comment (M-#)8.4.8 Some Miscellaneous Commands
insert-comment (M-#)8.4.8 Some Miscellaneous Commands
insert-completions (M-*)8.4.6 Letting Readline Type For You
insert-completions (M-*)8.4.6 Letting Readline Type For You
insert-last-argument (M-. or M-_)8.4.8 Some Miscellaneous Commands
insert-last-argument (M-. or M-_)8.4.8 Some Miscellaneous Commands
insert-comment (M-#)8.4.8 Some Miscellaneous Commands
insert-comment (M-#)8.4.8 Some Miscellaneous Commands
insert-completions (M-*)8.4.6 Letting Readline Type For You
insert-completions (M-*)8.4.6 Letting Readline Type For You
insert-last-argument (M-. or M-_)8.4.8 Some Miscellaneous Commands
insert-last-argument (M-. or M-_)8.4.8 Some Miscellaneous Commands

K
kill-line (C-k)8.4.4 Killing And Yanking
kill-line (C-k)8.4.4 Killing And Yanking
kill-region ()8.4.4 Killing And Yanking
kill-region ()8.4.4 Killing And Yanking
kill-whole-line ()8.4.4 Killing And Yanking
kill-whole-line ()8.4.4 Killing And Yanking
kill-word (M-d)8.4.4 Killing And Yanking
kill-word (M-d)8.4.4 Killing And Yanking
kill-line (C-k)8.4.4 Killing And Yanking
kill-line (C-k)8.4.4 Killing And Yanking
kill-region ()8.4.4 Killing And Yanking
kill-region ()8.4.4 Killing And Yanking
kill-whole-line ()8.4.4 Killing And Yanking
kill-whole-line ()8.4.4 Killing And Yanking
kill-word (M-d)8.4.4 Killing And Yanking
kill-word (M-d)8.4.4 Killing And Yanking

M
magic-space ()8.4.8 Some Miscellaneous Commands
magic-space ()8.4.8 Some Miscellaneous Commands
menu-complete ()8.4.6 Letting Readline Type For You
menu-complete ()8.4.6 Letting Readline Type For You
menu-complete-backward ()8.4.6 Letting Readline Type For You
menu-complete-backward ()8.4.6 Letting Readline Type For You
magic-space ()8.4.8 Some Miscellaneous Commands
magic-space ()8.4.8 Some Miscellaneous Commands
menu-complete ()8.4.6 Letting Readline Type For You
menu-complete ()8.4.6 Letting Readline Type For You
menu-complete-backward ()8.4.6 Letting Readline Type For You
menu-complete-backward ()8.4.6 Letting Readline Type For You

N
next-history (C-n)8.4.2 Commands For Manipulating The History
next-history (C-n)8.4.2 Commands For Manipulating The History
non-incremental-forward-search-history (M-n)8.4.2 Commands For Manipulating The History
non-incremental-forward-search-history (M-n)8.4.2 Commands For Manipulating The History
non-incremental-reverse-search-history (M-p)8.4.2 Commands For Manipulating The History
non-incremental-reverse-search-history (M-p)8.4.2 Commands For Manipulating The History
next-history (C-n)8.4.2 Commands For Manipulating The History
next-history (C-n)8.4.2 Commands For Manipulating The History
non-incremental-forward-search-history (M-n)8.4.2 Commands For Manipulating The History
non-incremental-forward-search-history (M-n)8.4.2 Commands For Manipulating The History
non-incremental-reverse-search-history (M-p)8.4.2 Commands For Manipulating The History
non-incremental-reverse-search-history (M-p)8.4.2 Commands For Manipulating The History

O
operate-and-get-next (C-o)8.4.8 Some Miscellaneous Commands
operate-and-get-next (C-o)8.4.8 Some Miscellaneous Commands
overwrite-mode ()8.4.3 Commands For Changing Text
overwrite-mode ()8.4.3 Commands For Changing Text
operate-and-get-next (C-o)8.4.8 Some Miscellaneous Commands
operate-and-get-next (C-o)8.4.8 Some Miscellaneous Commands
overwrite-mode ()8.4.3 Commands For Changing Text
overwrite-mode ()8.4.3 Commands For Changing Text

P
possible-command-completions (C-x !)8.4.6 Letting Readline Type For You
possible-command-completions (C-x !)8.4.6 Letting Readline Type For You
possible-completions (M-?)8.4.6 Letting Readline Type For You
possible-completions (M-?)8.4.6 Letting Readline Type For You
possible-filename-completions (C-x /)8.4.6 Letting Readline Type For You
possible-filename-completions (C-x /)8.4.6 Letting Readline Type For You
possible-hostname-completions (C-x @)8.4.6 Letting Readline Type For You
possible-hostname-completions (C-x @)8.4.6 Letting Readline Type For You
possible-username-completions (C-x ~)8.4.6 Letting Readline Type For You
possible-username-completions (C-x ~)8.4.6 Letting Readline Type For You
possible-variable-completions (C-x $)8.4.6 Letting Readline Type For You
possible-variable-completions (C-x $)8.4.6 Letting Readline Type For You
prefix-meta (ESC)8.4.8 Some Miscellaneous Commands
prefix-meta (ESC)8.4.8 Some Miscellaneous Commands
previous-history (C-p)8.4.2 Commands For Manipulating The History
previous-history (C-p)8.4.2 Commands For Manipulating The History
print-last-kbd-macro ()8.4.7 Keyboard Macros
print-last-kbd-macro ()8.4.7 Keyboard Macros
possible-command-completions (C-x !)8.4.6 Letting Readline Type For You
possible-command-completions (C-x !)8.4.6 Letting Readline Type For You
possible-completions (M-?)8.4.6 Letting Readline Type For You
possible-completions (M-?)8.4.6 Letting Readline Type For You
possible-filename-completions (C-x /)8.4.6 Letting Readline Type For You
possible-filename-completions (C-x /)8.4.6 Letting Readline Type For You
possible-hostname-completions (C-x @)8.4.6 Letting Readline Type For You
possible-hostname-completions (C-x @)8.4.6 Letting Readline Type For You
possible-username-completions (C-x ~)8.4.6 Letting Readline Type For You
possible-username-completions (C-x ~)8.4.6 Letting Readline Type For You
possible-variable-completions (C-x $)8.4.6 Letting Readline Type For You
possible-variable-completions (C-x $)8.4.6 Letting Readline Type For You
prefix-meta (ESC)8.4.8 Some Miscellaneous Commands
prefix-meta (ESC)8.4.8 Some Miscellaneous Commands
previous-history (C-p)8.4.2 Commands For Manipulating The History
previous-history (C-p)8.4.2 Commands For Manipulating The History
print-last-kbd-macro ()8.4.7 Keyboard Macros
print-last-kbd-macro ()8.4.7 Keyboard Macros

Q
quoted-insert (C-q or C-v)8.4.3 Commands For Changing Text
quoted-insert (C-q or C-v)8.4.3 Commands For Changing Text
quoted-insert (C-q or C-v)8.4.3 Commands For Changing Text
quoted-insert (C-q or C-v)8.4.3 Commands For Changing Text

R
re-read-init-file (C-x C-r)8.4.8 Some Miscellaneous Commands
re-read-init-file (C-x C-r)8.4.8 Some Miscellaneous Commands
redraw-current-line ()8.4.1 Commands For Moving
redraw-current-line ()8.4.1 Commands For Moving
reverse-search-history (C-r)8.4.2 Commands For Manipulating The History
reverse-search-history (C-r)8.4.2 Commands For Manipulating The History
revert-line (M-r)8.4.8 Some Miscellaneous Commands
revert-line (M-r)8.4.8 Some Miscellaneous Commands
re-read-init-file (C-x C-r)8.4.8 Some Miscellaneous Commands
re-read-init-file (C-x C-r)8.4.8 Some Miscellaneous Commands
redraw-current-line ()8.4.1 Commands For Moving
redraw-current-line ()8.4.1 Commands For Moving
reverse-search-history (C-r)8.4.2 Commands For Manipulating The History
reverse-search-history (C-r)8.4.2 Commands For Manipulating The History
revert-line (M-r)8.4.8 Some Miscellaneous Commands
revert-line (M-r)8.4.8 Some Miscellaneous Commands

S
self-insert (a, b, A, 1, !, <small>...</small>)8.4.3 Commands For Changing Text
self-insert (a, b, A, 1, !, <small>...</small>)8.4.3 Commands For Changing Text
set-mark (C-@)8.4.8 Some Miscellaneous Commands
set-mark (C-@)8.4.8 Some Miscellaneous Commands
shell-backward-kill-word ()8.4.4 Killing And Yanking
shell-backward-kill-word ()8.4.4 Killing And Yanking
shell-backward-word ()8.4.1 Commands For Moving
shell-backward-word ()8.4.1 Commands For Moving
shell-expand-line (M-C-e)8.4.8 Some Miscellaneous Commands
shell-expand-line (M-C-e)8.4.8 Some Miscellaneous Commands
shell-forward-word ()8.4.1 Commands For Moving
shell-forward-word ()8.4.1 Commands For Moving
shell-kill-word ()8.4.4 Killing And Yanking
shell-kill-word ()8.4.4 Killing And Yanking
skip-csi-sequence ()8.4.8 Some Miscellaneous Commands
skip-csi-sequence ()8.4.8 Some Miscellaneous Commands
start-kbd-macro (C-x ()8.4.7 Keyboard Macros
start-kbd-macro (C-x ()8.4.7 Keyboard Macros
self-insert (a, b, A, 1, !, <small>...</small>)8.4.3 Commands For Changing Text
self-insert (a, b, A, 1, !, <small>...</small>)8.4.3 Commands For Changing Text
set-mark (C-@)8.4.8 Some Miscellaneous Commands
set-mark (C-@)8.4.8 Some Miscellaneous Commands
shell-backward-kill-word ()8.4.4 Killing And Yanking
shell-backward-kill-word ()8.4.4 Killing And Yanking
shell-backward-word ()8.4.1 Commands For Moving
shell-backward-word ()8.4.1 Commands For Moving
shell-expand-line (M-C-e)8.4.8 Some Miscellaneous Commands
shell-expand-line (M-C-e)8.4.8 Some Miscellaneous Commands
shell-forward-word ()8.4.1 Commands For Moving
shell-forward-word ()8.4.1 Commands For Moving
shell-kill-word ()8.4.4 Killing And Yanking
shell-kill-word ()8.4.4 Killing And Yanking
skip-csi-sequence ()8.4.8 Some Miscellaneous Commands
skip-csi-sequence ()8.4.8 Some Miscellaneous Commands
start-kbd-macro (C-x ()8.4.7 Keyboard Macros
start-kbd-macro (C-x ()8.4.7 Keyboard Macros

T
tilde-expand (M-&#38;)8.4.8 Some Miscellaneous Commands
tilde-expand (M-&#38;)8.4.8 Some Miscellaneous Commands
transpose-chars (C-t)8.4.3 Commands For Changing Text
transpose-chars (C-t)8.4.3 Commands For Changing Text
transpose-words (M-t)8.4.3 Commands For Changing Text
transpose-words (M-t)8.4.3 Commands For Changing Text
tilde-expand (M-&#38;)8.4.8 Some Miscellaneous Commands
tilde-expand (M-&#38;)8.4.8 Some Miscellaneous Commands
transpose-chars (C-t)8.4.3 Commands For Changing Text
transpose-chars (C-t)8.4.3 Commands For Changing Text
transpose-words (M-t)8.4.3 Commands For Changing Text
transpose-words (M-t)8.4.3 Commands For Changing Text

U
undo (C-_ or C-x C-u)8.4.8 Some Miscellaneous Commands
undo (C-_ or C-x C-u)8.4.8 Some Miscellaneous Commands
universal-argument ()8.4.5 Specifying Numeric Arguments
universal-argument ()8.4.5 Specifying Numeric Arguments
unix-filename-rubout ()8.4.4 Killing And Yanking
unix-filename-rubout ()8.4.4 Killing And Yanking
unix-line-discard (C-u)8.4.4 Killing And Yanking
unix-line-discard (C-u)8.4.4 Killing And Yanking
unix-word-rubout (C-w)8.4.4 Killing And Yanking
unix-word-rubout (C-w)8.4.4 Killing And Yanking
upcase-word (M-u)8.4.3 Commands For Changing Text
upcase-word (M-u)8.4.3 Commands For Changing Text
undo (C-_ or C-x C-u)8.4.8 Some Miscellaneous Commands
undo (C-_ or C-x C-u)8.4.8 Some Miscellaneous Commands
universal-argument ()8.4.5 Specifying Numeric Arguments
universal-argument ()8.4.5 Specifying Numeric Arguments
unix-filename-rubout ()8.4.4 Killing And Yanking
unix-filename-rubout ()8.4.4 Killing And Yanking
unix-line-discard (C-u)8.4.4 Killing And Yanking
unix-line-discard (C-u)8.4.4 Killing And Yanking
unix-word-rubout (C-w)8.4.4 Killing And Yanking
unix-word-rubout (C-w)8.4.4 Killing And Yanking
upcase-word (M-u)8.4.3 Commands For Changing Text
upcase-word (M-u)8.4.3 Commands For Changing Text

Y
yank (C-y)8.4.4 Killing And Yanking
yank (C-y)8.4.4 Killing And Yanking
yank-last-arg (M-. or M-_)8.4.2 Commands For Manipulating The History
yank-last-arg (M-. or M-_)8.4.2 Commands For Manipulating The History
yank-nth-arg (M-C-y)8.4.2 Commands For Manipulating The History
yank-nth-arg (M-C-y)8.4.2 Commands For Manipulating The History
yank-pop (M-y)8.4.4 Killing And Yanking
yank-pop (M-y)8.4.4 Killing And Yanking
yank (C-y)8.4.4 Killing And Yanking
yank (C-y)8.4.4 Killing And Yanking
yank-last-arg (M-. or M-_)8.4.2 Commands For Manipulating The History
yank-last-arg (M-. or M-_)8.4.2 Commands For Manipulating The History
yank-nth-arg (M-C-y)8.4.2 Commands For Manipulating The History
yank-nth-arg (M-C-y)8.4.2 Commands For Manipulating The History
yank-pop (M-y)8.4.4 Killing And Yanking
yank-pop (M-y)8.4.4 Killing And Yanking

- + - + @@ -16732,23 +16750,23 @@ to permit their use in free software. - + - + - + - + @@ -16758,12 +16776,12 @@ to permit their use in free software. - - + + - + @@ -16782,7 +16800,7 @@ to permit their use in free software. - + @@ -16798,7 +16816,7 @@ to permit their use in free software. - + @@ -16824,14 +16842,14 @@ to permit their use in free software. - + - +
Jump to:   A   @@ -16722,9 +16740,9 @@ to permit their use in free software.
expansion3.5 Shell Expansions
expansion, arithmetic3.5.5 Arithmetic Expansion
expansion, brace3.5.1 Brace Expansion
expansion, filename3.5.8 Filename Expansion
expansion, filename3.5.8 Filename Expansion
expansion, parameter3.5.3 Shell Parameter Expansion
expansion, pathname3.5.8 Filename Expansion
expansion, pathname3.5.8 Filename Expansion
expansion, tilde3.5.2 Tilde Expansion
expressions, arithmetic6.5 Shell Arithmetic
expressions, conditional6.4 Bash Conditional Expressions
F
field2. Definitions
filename2. Definitions
filename expansion3.5.8 Filename Expansion
filename expansion3.5.8 Filename Expansion
foreground7.1 Job Control Basics
functions, shell3.3 Shell Functions

H
history builtins9.2 Bash History Builtins
history events9.3.1 Event Designators
history events9.3.1 Event Designators
history expansion9.3 History Expansion
history list9.1 Bash History Facilities
History, how to use8.8 A Programmable Completion Example
History, how to use8.8 A Programmable Completion Example

I
identifier2. Definitions
initialization file, readline8.3 Readline Init File
installation10.1 Basic Installation
interaction, readline8.2 Readline Interaction
interactive shell6.1 Invoking Bash
interactive shell6.1 Invoking Bash
interactive shell6.3 Interactive Shells
internationalization3.1.2.5 Locale-Specific Translation

job control7.1 Job Control Basics

K
kill ring8.2.3 Readline Killing Commands
killing text8.2.3 Readline Killing Commands
kill ring8.2.3 Readline Killing Commands
killing text8.2.3 Readline Killing Commands

L
localization3.1.2.5 Locale-Specific Translation
login shell6.1 Invoking Bash
login shell6.1 Invoking Bash

M
matching, pattern3.5.8.1 Pattern Matching
parameters3.4 Shell Parameters
parameters, positional3.4.1 Positional Parameters
parameters, special3.4.2 Special Parameters
pathname expansion3.5.8 Filename Expansion
pathname expansion3.5.8 Filename Expansion
pattern matching3.5.8.1 Pattern Matching
pipeline3.2.2 Pipelines
POSIX2. Definitions
quoting, ANSI3.1.2.4 ANSI-C Quoting

R
Readline, how to use7.3 Job Control Variables
Readline, how to use7.3 Job Control Variables
redirection3.6 Redirections
reserved word2. Definitions
restricted shell6.10 The Restricted Shell

V
variable, shell3.4 Shell Parameters
variables, readline8.3.1 Readline Init File Syntax
variables, readline8.3.1 Readline Init File Syntax

W
word2. Definitions
word splitting3.5.7 Word Splitting

Y
yanking text8.2.3 Readline Killing Commands
yanking text8.2.3 Readline Killing Commands

Jump to:   A   @@ -17271,7 +17289,7 @@ to permit their use in free software. [ ? ]

About this document

-This document was generated by Chet Ramey on October, 22 2013 +This document was generated by Chet Ramey on December, 27 2013 using texi2html

@@ -17433,7 +17451,7 @@ the following structure:
This document was generated -by Chet Ramey on October, 22 2013 +by Chet Ramey on December, 27 2013 using texi2html diff --git a/doc/bashref.info b/doc/bashref.info index 7733bd366..8ea2bb69a 100644 --- a/doc/bashref.info +++ b/doc/bashref.info @@ -1350,64 +1350,66 @@ The shell treats several parameters specially. These parameters may only be referenced; assignment to them is not allowed. `*' - Expands to the positional parameters, starting from one. When the - expansion occurs within double quotes, it expands to a single word - with the value of each parameter separated by the first character - of the `IFS' special variable. That is, `"$*"' is equivalent to - `"$1C$2C..."', where C is the first character of the value of the - `IFS' variable. If `IFS' is unset, the parameters are separated - by spaces. If `IFS' is null, the parameters are joined without - intervening separators. + ($*) Expands to the positional parameters, starting from one. + When the expansion occurs within double quotes, it expands to a + single word with the value of each parameter separated by the + first character of the `IFS' special variable. That is, `"$*"' is + equivalent to `"$1C$2C..."', where C is the first character of the + value of the `IFS' variable. If `IFS' is unset, the parameters + are separated by spaces. If `IFS' is null, the parameters are + joined without intervening separators. `@' - Expands to the positional parameters, starting from one. When the - expansion occurs within double quotes, each parameter expands to a - separate word. That is, `"$@"' is equivalent to `"$1" "$2" ...'. - If the double-quoted expansion occurs within a word, the expansion - of the first parameter is joined with the beginning part of the - original word, and the expansion of the last parameter is joined - with the last part of the original word. When there are no - positional parameters, `"$@"' and `$@' expand to nothing (i.e., - they are removed). + ($@) Expands to the positional parameters, starting from one. + When the expansion occurs within double quotes, each parameter + expands to a separate word. That is, `"$@"' is equivalent to + `"$1" "$2" ...'. If the double-quoted expansion occurs within a + word, the expansion of the first parameter is joined with the + beginning part of the original word, and the expansion of the last + parameter is joined with the last part of the original word. When + there are no positional parameters, `"$@"' and `$@' expand to + nothing (i.e., they are removed). `#' - Expands to the number of positional parameters in decimal. + ($#) Expands to the number of positional parameters in decimal. `?' - Expands to the exit status of the most recently executed foreground - pipeline. + ($?) Expands to the exit status of the most recently executed + foreground pipeline. `-' - (A hyphen.) Expands to the current option flags as specified upon - invocation, by the `set' builtin command, or those set by the + ($-, a hyphen.) Expands to the current option flags as specified + upon invocation, by the `set' builtin command, or those set by the shell itself (such as the `-i' option). `$' - Expands to the process ID of the shell. In a `()' subshell, it - expands to the process ID of the invoking shell, not the subshell. + ($$) Expands to the process ID of the shell. In a `()' subshell, + it expands to the process ID of the invoking shell, not the + subshell. `!' - Expands to the process ID of the job most recently placed into the - background, whether executed as an asynchronous command or using - the `bg' builtin (*note Job Control Builtins::). + ($!) Expands to the process ID of the job most recently placed + into the background, whether executed as an asynchronous command + or using the `bg' builtin (*note Job Control Builtins::). `0' - Expands to the name of the shell or shell script. This is set at - shell initialization. If Bash is invoked with a file of commands - (*note Shell Scripts::), `$0' is set to the name of that file. If - Bash is started with the `-c' option (*note Invoking Bash::), then - `$0' is set to the first argument after the string to be executed, - if one is present. Otherwise, it is set to the filename used to - invoke Bash, as given by argument zero. + ($0) Expands to the name of the shell or shell script. This is + set at shell initialization. If Bash is invoked with a file of + commands (*note Shell Scripts::), `$0' is set to the name of that + file. If Bash is started with the `-c' option (*note Invoking + Bash::), then `$0' is set to the first argument after the string + to be executed, if one is present. Otherwise, it is set to the + filename used to invoke Bash, as given by argument zero. `_' - (An underscore.) At shell startup, set to the absolute pathname - used to invoke the shell or shell script being executed as passed - in the environment or argument list. Subsequently, expands to the - last argument to the previous command, after expansion. Also set - to the full pathname used to invoke each command executed and - placed in the environment exported to that command. When checking - mail, this parameter holds the name of the mail file. + ($_, an underscore.) At shell startup, set to the absolute + pathname used to invoke the shell or shell script being executed + as passed in the environment or argument list. Subsequently, + expands to the last argument to the previous command, after + expansion. Also set to the full pathname used to invoke each + command executed and placed in the environment exported to that + command. When checking mail, this parameter holds the name of the + mail file.  File: bashref.info, Node: Shell Expansions, Next: Redirections, Prev: Shell Parameters, Up: Basic Shell Features @@ -10680,15 +10682,24 @@ D.3 Parameter and Variable Index [index] * Menu: -* !: Special Parameters. (line 46) +* !: Special Parameters. (line 47) * #: Special Parameters. (line 30) * $: Special Parameters. (line 42) +* $!: Special Parameters. (line 48) +* $#: Special Parameters. (line 31) +* $$: Special Parameters. (line 43) +* $*: Special Parameters. (line 10) +* $-: Special Parameters. (line 38) +* $0: Special Parameters. (line 53) +* $?: Special Parameters. (line 34) +* $@: Special Parameters. (line 20) +* $_: Special Parameters. (line 62) * *: Special Parameters. (line 9) * -: Special Parameters. (line 37) -* 0: Special Parameters. (line 51) +* 0: Special Parameters. (line 52) * ?: Special Parameters. (line 33) * @: Special Parameters. (line 19) -* _: Special Parameters. (line 60) +* _: Special Parameters. (line 61) * auto_resume: Job Control Variables. (line 6) * BASH: Bash Variables. (line 13) @@ -11167,105 +11178,105 @@ Node: Shell Functions46875 Node: Shell Parameters51959 Node: Positional Parameters56088 Node: Special Parameters56988 -Node: Shell Expansions60047 -Node: Brace Expansion61990 -Node: Tilde Expansion64771 -Node: Shell Parameter Expansion67120 -Node: Command Substitution79414 -Node: Arithmetic Expansion80747 -Node: Process Substitution81679 -Node: Word Splitting82729 -Node: Filename Expansion84377 -Node: Pattern Matching86542 -Node: Quote Removal90242 -Node: Redirections90537 -Node: Executing Commands99701 -Node: Simple Command Expansion100371 -Node: Command Search and Execution102301 -Node: Command Execution Environment104638 -Node: Environment107624 -Node: Exit Status109283 -Node: Signals110905 -Node: Shell Scripts112873 -Node: Shell Builtin Commands115391 -Node: Bourne Shell Builtins117419 -Node: Bash Builtins137326 -Node: Modifying Shell Behavior164779 -Node: The Set Builtin165124 -Node: The Shopt Builtin175450 -Node: Special Builtins189871 -Node: Shell Variables190850 -Node: Bourne Shell Variables191290 -Node: Bash Variables193321 -Node: Bash Features220196 -Node: Invoking Bash221095 -Node: Bash Startup Files226873 -Node: Interactive Shells231902 -Node: What is an Interactive Shell?232312 -Node: Is this Shell Interactive?232961 -Node: Interactive Shell Behavior233776 -Node: Bash Conditional Expressions237064 -Node: Shell Arithmetic241066 -Node: Aliases243842 -Node: Arrays246398 -Node: The Directory Stack251379 -Node: Directory Stack Builtins252098 -Node: Controlling the Prompt255054 -Node: The Restricted Shell257826 -Node: Bash POSIX Mode259663 -Node: Job Control269050 -Node: Job Control Basics269510 -Node: Job Control Builtins274229 -Node: Job Control Variables278700 -Node: Command Line Editing279858 -Node: Introduction and Notation281530 -Node: Readline Interaction283152 -Node: Readline Bare Essentials284343 -Node: Readline Movement Commands286132 -Node: Readline Killing Commands287097 -Node: Readline Arguments289017 -Node: Searching290061 -Node: Readline Init File292247 -Node: Readline Init File Syntax293394 -Node: Conditional Init Constructs310231 -Node: Sample Init File312764 -Node: Bindable Readline Commands315882 -Node: Commands For Moving317089 -Node: Commands For History318233 -Node: Commands For Text322418 -Node: Commands For Killing325091 -Node: Numeric Arguments327548 -Node: Commands For Completion328687 -Node: Keyboard Macros332879 -Node: Miscellaneous Commands333567 -Node: Readline vi Mode339373 -Node: Programmable Completion340280 -Node: Programmable Completion Builtins347556 -Node: A Programmable Completion Example357302 -Node: Using History Interactively362552 -Node: Bash History Facilities363236 -Node: Bash History Builtins366235 -Node: History Interaction370163 -Node: Event Designators372868 -Node: Word Designators374090 -Node: Modifiers375729 -Node: Installing Bash377133 -Node: Basic Installation378270 -Node: Compilers and Options380962 -Node: Compiling For Multiple Architectures381703 -Node: Installation Names383367 -Node: Specifying the System Type384185 -Node: Sharing Defaults384901 -Node: Operation Controls385574 -Node: Optional Features386532 -Node: Reporting Bugs396596 -Node: Major Differences From The Bourne Shell397794 -Node: GNU Free Documentation License414653 -Node: Indexes439849 -Node: Builtin Index440303 -Node: Reserved Word Index447130 -Node: Variable Index449578 -Node: Function Index463101 -Node: Concept Index470329 +Node: Shell Expansions60099 +Node: Brace Expansion62042 +Node: Tilde Expansion64823 +Node: Shell Parameter Expansion67172 +Node: Command Substitution79466 +Node: Arithmetic Expansion80799 +Node: Process Substitution81731 +Node: Word Splitting82781 +Node: Filename Expansion84429 +Node: Pattern Matching86594 +Node: Quote Removal90294 +Node: Redirections90589 +Node: Executing Commands99753 +Node: Simple Command Expansion100423 +Node: Command Search and Execution102353 +Node: Command Execution Environment104690 +Node: Environment107676 +Node: Exit Status109335 +Node: Signals110957 +Node: Shell Scripts112925 +Node: Shell Builtin Commands115443 +Node: Bourne Shell Builtins117471 +Node: Bash Builtins137378 +Node: Modifying Shell Behavior164831 +Node: The Set Builtin165176 +Node: The Shopt Builtin175502 +Node: Special Builtins189923 +Node: Shell Variables190902 +Node: Bourne Shell Variables191342 +Node: Bash Variables193373 +Node: Bash Features220248 +Node: Invoking Bash221147 +Node: Bash Startup Files226925 +Node: Interactive Shells231954 +Node: What is an Interactive Shell?232364 +Node: Is this Shell Interactive?233013 +Node: Interactive Shell Behavior233828 +Node: Bash Conditional Expressions237116 +Node: Shell Arithmetic241118 +Node: Aliases243894 +Node: Arrays246450 +Node: The Directory Stack251431 +Node: Directory Stack Builtins252150 +Node: Controlling the Prompt255106 +Node: The Restricted Shell257878 +Node: Bash POSIX Mode259715 +Node: Job Control269102 +Node: Job Control Basics269562 +Node: Job Control Builtins274281 +Node: Job Control Variables278752 +Node: Command Line Editing279910 +Node: Introduction and Notation281582 +Node: Readline Interaction283204 +Node: Readline Bare Essentials284395 +Node: Readline Movement Commands286184 +Node: Readline Killing Commands287149 +Node: Readline Arguments289069 +Node: Searching290113 +Node: Readline Init File292299 +Node: Readline Init File Syntax293446 +Node: Conditional Init Constructs310283 +Node: Sample Init File312816 +Node: Bindable Readline Commands315934 +Node: Commands For Moving317141 +Node: Commands For History318285 +Node: Commands For Text322470 +Node: Commands For Killing325143 +Node: Numeric Arguments327600 +Node: Commands For Completion328739 +Node: Keyboard Macros332931 +Node: Miscellaneous Commands333619 +Node: Readline vi Mode339425 +Node: Programmable Completion340332 +Node: Programmable Completion Builtins347608 +Node: A Programmable Completion Example357354 +Node: Using History Interactively362604 +Node: Bash History Facilities363288 +Node: Bash History Builtins366287 +Node: History Interaction370215 +Node: Event Designators372920 +Node: Word Designators374142 +Node: Modifiers375781 +Node: Installing Bash377185 +Node: Basic Installation378322 +Node: Compilers and Options381014 +Node: Compiling For Multiple Architectures381755 +Node: Installation Names383419 +Node: Specifying the System Type384237 +Node: Sharing Defaults384953 +Node: Operation Controls385626 +Node: Optional Features386584 +Node: Reporting Bugs396648 +Node: Major Differences From The Bourne Shell397846 +Node: GNU Free Documentation License414705 +Node: Indexes439901 +Node: Builtin Index440355 +Node: Reserved Word Index447182 +Node: Variable Index449630 +Node: Function Index463810 +Node: Concept Index471038  End Tag Table diff --git a/doc/bashref.log b/doc/bashref.log index 0a7321e98..96f494311 100644 --- a/doc/bashref.log +++ b/doc/bashref.log @@ -1,7 +1,7 @@ -This is TeX, Version 3.1415926 (TeX Live 2011/Fink) (format=tex 2012.4.18) 22 OCT 2013 11:07 +This is TeX, Version 3.1415926 (TeX Live 2011/Fink) (format=tex 2012.4.18) 27 DEC 2013 14:46 **/usr/homes/chet/src/bash/src/doc/bashref.texi (/usr/homes/chet/src/bash/src/doc/bashref.texi (./texinfo.tex -Loading texinfo [version 2009-01-18.17]: +Loading texinfo [version 2013-09-11.11]: \bindingoffset=\dimen16 \normaloffset=\dimen17 \pagewidth=\dimen18 @@ -20,24 +20,25 @@ Loading texinfo [version 2009-01-18.17]: \mil=\dimen25 \exdentamount=\skip18 \inmarginspacing=\skip19 +\centerpenalty=\count26 pdf, -\tempnum=\count26 -\lnkcount=\count27 +\tempnum=\count27 +\lnkcount=\count28 \filename=\toks14 -\filenamelength=\count28 -\pgn=\count29 +\filenamelength=\count29 +\pgn=\count30 \toksA=\toks15 \toksB=\toks16 \toksC=\toks17 \toksD=\toks18 \boxA=\box19 -\countA=\count30 +\countA=\count31 \nopdfimagehelp=\toks19 fonts, \sffam=\fam8 \textleading=\dimen26 markup, -\fontdepth=\count31 +\fontdepth=\count32 glyphs, \errorbox=\box20 @@ -53,38 +54,38 @@ page headings, \itemindent=\dimen28 \itemmargin=\dimen29 \itemmax=\dimen30 -\itemno=\count32 +\itemno=\count33 \multitableparskip=\skip22 \multitableparindent=\skip23 \multitablecolspace=\dimen31 \multitablelinespace=\skip24 -\colcount=\count33 +\colcount=\count34 \everytab=\toks24 conditionals, -\doignorecount=\count34 +\doignorecount=\count35 indexing, \whatsitskip=\skip25 -\whatsitpenalty=\count35 +\whatsitpenalty=\count36 \secondaryindent=\skip26 \partialpage=\box21 \doublecolumnhsize=\dimen32 sectioning, -\unnumberedno=\count36 -\chapno=\count37 -\secno=\count38 -\subsecno=\count39 -\subsubsecno=\count40 -\appendixno=\count41 -\absseclevel=\count42 -\secbase=\count43 +\unnumberedno=\count37 +\chapno=\count38 +\secno=\count39 +\subsecno=\count40 +\subsubsecno=\count41 +\appendixno=\count42 +\absseclevel=\count43 +\secbase=\count44 \chapheadingskip=\skip27 \secheadingskip=\skip28 \subsecheadingskip=\skip29 toc, \tocfile=\write0 \contentsrightmargin=\skip30 -\savepageno=\count44 -\lastnegativepageno=\count45 +\savepageno=\count45 +\lastnegativepageno=\count46 \tocindent=\dimen33 environments, \lispnarrowing=\skip31 @@ -99,25 +100,30 @@ page headings, \rskip=\skip37 \nonfillparindent=\dimen37 \tabw=\dimen38 +\verbbox=\box22 defuns, \defbodyindent=\skip38 \defargsindent=\skip39 \deflastargmargin=\skip40 -\defunpenalty=\count46 -\parencount=\count47 -\brackcount=\count48 +\defunpenalty=\count47 +\parencount=\count48 +\brackcount=\count49 macros, \macscribble=\write1 -\paramno=\count49 +\paramno=\count50 \macname=\toks25 cross references, \auxfile=\write2 -\savesfregister=\count50 +\savesfregister=\count51 +\toprefbox=\box23 +\printedrefnamebox=\box24 +\infofilenamebox=\box25 +\printedmanualbox=\box26 insertions, -\footnoteno=\count51 -\SAVEfootins=\box22 -\SAVEmargin=\box23 +\footnoteno=\count52 +\SAVEfootins=\box27 +\SAVEmargin=\box28 (/sw/share/texmf-dist/tex/generic/epsf/epsf.tex This is `epsf.tex' v2.7.4 <14 February 2011> @@ -134,9 +140,9 @@ This is `epsf.tex' v2.7.4 <14 February 2011> \noepsfhelp=\toks26 localization, \nolanghelp=\toks27 -\countUTFx=\count52 -\countUTFy=\count53 -\countUTFz=\count54 +\countUTFx=\count53 +\countUTFy=\count54 +\countUTFz=\count55 formatting, \defaultparindent=\dimen47 and turning on texinfo input format.) @@ -149,6 +155,8 @@ This is `epsf.tex' v2.7.4 <14 February 2011> @tpindfile=@write6 @kyindfile=@write7 @pgindfile=@write8 +texinfo.tex: doing @include of version.texi + (./version.texi) @btindfile=@write9 @rwindfile=@write10 @@ -178,9 +186,9 @@ This is `epsf.tex' v2.7.4 <14 February 2011> Chapter 2 [1] [2] [3] Chapter 3 [4] [5] [6] [7] [8] [9] [10] -Overfull \hbox (43.33539pt too wide) in paragraph at lines 866--866 +Overfull \hbox (38.26587pt too wide) in paragraph at lines 866--866 []@texttt case @textttsl word @texttt in [ [(] @textttsl pat-tern @texttt [| @ -textttsl pat-tern@texttt ][]) @textttsl command-list @texttt ;;][] esac[] +textttsl pattern@texttt ][]) @textttsl command-list @texttt ;;][] esac[] @hbox(7.60416+2.43333)x433.62 .@glue(@leftskip) 86.72375 @@ -231,23 +239,10 @@ arallel -k traceroute[] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] Chapter 4 [39] [40] [41] [42] [43] -[44] [45] [46] [47] -Underfull \hbox (badness 5231) in paragraph at lines 3770--3783 - @texttt emacs-meta[]@textrm , @texttt emacs-ctlx[]@textrm , @texttt vi[]@textr -m , @texttt vi-move[]@textrm , @texttt vi-command[]@textrm , and - -@hbox(7.60416+2.12917)x433.62, glue set 3.7426 -.@glue(@leftskip) 115.63242 -.@texttt e -.@texttt m -.@texttt a -.@texttt c -.etc. - -[48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] -[63] [64] [65] [66] [67] Chapter 5 [68] [69] [70] [71] [72] [73] [74] [75] -[76] [77] [78] Chapter 6 [79] -Overfull \hbox (51.96864pt too wide) in paragraph at lines 5987--5987 +[44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] +[59] [60] [61] [62] [63] [64] [65] [66] [67] Chapter 5 [68] [69] [70] [71] +[72] [73] [74] [75] [76] [77] [78] Chapter 6 [79] +Overfull \hbox (49.43388pt too wide) in paragraph at lines 5996--5996 []@texttt bash [long-opt] [-ir] [-abefhkmnptuvxdBCDHP] [-o @textttsl op-tion@t exttt ] [-O @textttsl shopt_option@texttt ] [@textttsl ar- @@ -260,7 +255,7 @@ exttt ] [-O @textttsl shopt_option@texttt ] [@textttsl ar- .etc. -Overfull \hbox (76.23077pt too wide) in paragraph at lines 5988--5988 +Overfull \hbox (72.42863pt too wide) in paragraph at lines 5997--5997 []@texttt bash [long-opt] [-abefhkmnptuvxdBCDHP] [-o @textttsl op-tion@texttt ] [-O @textttsl shopt_option@texttt ] -c @textttsl string @texttt [@textttsl ar - @@ -274,7 +269,7 @@ Overfull \hbox (76.23077pt too wide) in paragraph at lines 5988--5988 .etc. -Overfull \hbox (34.72258pt too wide) in paragraph at lines 5989--5989 +Overfull \hbox (32.18782pt too wide) in paragraph at lines 5998--5998 []@texttt bash [long-opt] -s [-abefhkmnptuvxdBCDHP] [-o @textttsl op-tion@text tt ] [-O @textttsl shopt_option@texttt ] [@textttsl ar- @@ -286,48 +281,39 @@ tt ] [-O @textttsl shopt_option@texttt ] [@textttsl ar- .@texttt s .etc. -[80] [81] -Underfull \hbox (badness 2245) in paragraph at lines 6161--6163 -[]@textrm When a lo-gin shell ex-its, Bash reads and ex-e-cutes com-mands from -the file +[80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] +[95] Chapter 7 [96] [97] [98] [99] +texinfo.tex: doing @include of rluser.texi -@hbox(7.60416+2.12917)x433.62, glue set 2.82155 -.@hbox(0.0+0.0)x15.0 -.@textrm W -.@textrm h -.@textrm e -.@textrm n -.etc. -[82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [96] -Underfull \hbox (badness 2521) in paragraph at lines 7379--7382 -@textrm `@texttt --enable-strict-posix-default[]@textrm '[] to @texttt configur -e[] @textrm when build-ing (see Sec-tion 10.8 +(/usr/homes/chet/src/bash/src/lib/readline/doc/rluser.texi Chapter 8 [100] +[101] [102] [103] [104] [105] [106] [107] [108] [109] +Underfull \hbox (badness 7540) in paragraph at lines 734--740 + []@textrm In the above ex-am-ple, @textttsl C-u[] @textrm is bound to the func +-tion -@hbox(8.2125+2.73749)x433.62, glue set 2.9335 -.@textrm ` -.@texttt - -.@texttt - -.@texttt e -.@texttt n +@hbox(7.60416+2.12917)x433.62, glue set 4.22592 +.@glue(@leftskip) 115.63242 +.@hbox(0.0+0.0)x0.0 +.@textrm I +.@textrm n +.@glue 3.65 plus 1.825 minus 1.21666 .etc. -Chapter 7 [97] [98] [99] [100] -(/usr/homes/chet/src/bash/src/lib/readline/doc/rluser.texi Chapter 8 [101] -[102] [103] [104] [105] [106] [107] -Underfull \hbox (badness 5231) in paragraph at lines 565--581 - @texttt emacs-meta[]@textrm , @texttt emacs-ctlx[]@textrm , @texttt vi[]@textr -m , @texttt vi-move[]@textrm , @texttt vi-command[]@textrm , and -@hbox(7.60416+2.12917)x433.62, glue set 3.7426 +Underfull \hbox (badness 10000) in paragraph at lines 734--740 + @texttt universal-argument[]@textrm , @textttsl M-DEL[] @textrm is bound to th +e func-tion + +@hbox(7.60416+2.43333)x433.62, glue set 5.18782 .@glue(@leftskip) 115.63242 -.@texttt e -.@texttt m -.@texttt a -.@texttt c +.@texttt u +.@texttt n +.@texttt i +.@texttt v .etc. -[108] [109] [110] [111] [112] [113] +[110] [111] [112] Overfull \hbox (26.43913pt too wide) in paragraph at lines 929--929 []@texttt Meta-Control-h: backward-kill-word Text after the function name is i gnored[] @@ -340,33 +326,8 @@ gnored[] .@texttt t .etc. -[114] [115] [116] [117] [118] [119] [120] [121] [122] [123] [124] [125] -[126] [127] -Overfull \hbox (12.05716pt too wide) in paragraph at lines 1877--1877 - []@texttt complete [-abcdefgjksuv] [-o @textttsl comp-option@texttt ] [-DE] [- -A @textttsl ac-tion@texttt ] [- - -@hbox(7.60416+2.43333)x433.62 -.@glue(@leftskip) 86.72375 -.@hbox(0.0+0.0)x0.0 -.@texttt c -.@texttt o -.@texttt m -.etc. - -[128] -Underfull \hbox (badness 2753) in paragraph at lines 1991--1994 - @texttt hostname[]@textrm Hostnames, as taken from the file spec-i-fied by - -@hbox(7.60416+2.12917)x433.62, glue set 3.02202 -.@glue(@leftskip) 173.44862 -.@penalty 10000 -.@kern -57.81621 -.@texttt h -.@texttt o -.etc. - -[129] [130] [131] +[113] [114] [115] [116] [117] [118] [119] [120] [121] [122] [123] [124] +[125] [126] [127] [128] [129] [130] Overfull \hbox (26.43913pt too wide) in paragraph at lines 2142--2142 [] @texttt # Tilde expansion, with side effect of expanding tilde to full p athname[] @@ -379,31 +340,49 @@ athname[] .@penalty 10000 .etc. -[132]) (/usr/homes/chet/src/bash/src/lib/readline/doc/hsuser.texi Chapter 9 -[133] [134] [135] [136] [137]) Chapter 10 [138] [139] [140] [141] -Underfull \hbox (badness 2772) in paragraph at lines 7987--7991 - []@textrm Enable sup-port for large files (@texttt http://www.sas.com/standard -s/large_ - -@hbox(8.2125+2.73749)x433.62, glue set 3.02754 -.@glue(@leftskip) 57.81621 -.@hbox(0.0+0.0)x0.0 -.@textrm E -.@textrm n -.@textrm a -.etc. - -[142] [143] [144] Appendix A [145] Appendix B [146] [147] [148] [149] [150] -[151] Appendix C [152] (./fdl.texi [153] [154] [155] [156] [157] [158] [159]) -Appendix D [160] (./bashref.bts) [161] (./bashref.rws) (./bashref.vrs [162] -[163]) (./bashref.fns [164] [165]) (./bashref.cps [166]) [167] ) +[131]) +texinfo.tex: doing @include of hsuser.texi + + (/usr/homes/chet/src/bash/src/lib/readline/doc/hsuser.texi Chapter 9 +[132] [133] [134] [135] [136]) Chapter 10 [137] [138] [139] [140] [141] +[142] [143] Appendix A [144] Appendix B [145] [146] [147] [148] [149] [150] +Appendix C [151] +texinfo.tex: doing @include of fdl.texi + + (./fdl.texi [152] [153] [154] [155] [156] [157] [158]) +Appendix D [159] (./bashref.bts) [160] (./bashref.rws) (./bashref.vrs [161] +[162]) (./bashref.fns [163] [164]) (./bashref.cps [165]) +Overfull \vbox (10.81442pt too high) has occurred while \output is active +\vbox(643.2+0.0)x433.62 +.\glue(\topskip) 0.0 +.\hbox(652.26442+1.75)x433.62, glue set 18.01016fil +..\vbox(652.26442+1.75)x207.80492, glue set 0.00302 +...\glue(\topskip) 26.12001 +...\hbox(9.87999+0.0)x207.80492, glue set 197.6216fil [] +...\penalty 10000 +...\glue 3.46501 plus 1.05006 +...\glue 0.0 plus 1.0 +...etc. +..\glue 0.0 plus 1.0fil +..\vbox(652.26442+1.75)x207.80492, glue set 0.0716 +...\glue(\splittopskip) 29.75 +...\hbox(6.25+1.75)x207.80492, glue set 96.39734fill [] +...\glue 0.0 plus 1.0 +...\glue(\parskip) 0.0 +...\glue(\baselineskip) 2.5 +...etc. +.\penalty 10000 +.\glue 0.0 plus 1.0fill + + +[166] ) Here is how much of TeX's memory you used: - 2085 strings out of 497974 - 28645 string characters out of 3220833 - 66405 words of memory out of 3000000 - 2901 multiletter control sequences out of 15000+200000 - 32127 words of font info for 112 fonts, out of 3000000 for 9000 + 2225 strings out of 497974 + 30407 string characters out of 3220833 + 68774 words of memory out of 3000000 + 3040 multiletter control sequences out of 15000+200000 + 32896 words of font info for 113 fonts, out of 3000000 for 9000 51 hyphenation exceptions out of 8191 - 16i,6n,14p,319b,705s stack positions out of 5000i,500n,10000p,200000b,50000s + 16i,6n,14p,319b,749s stack positions out of 5000i,500n,10000p,200000b,50000s -Output written on bashref.dvi (173 pages, 719856 bytes). +Output written on bashref.dvi (172 pages, 720864 bytes). diff --git a/doc/bashref.ps b/doc/bashref.ps index 1f12f778d..27fe886df 100644 --- a/doc/bashref.ps +++ b/doc/bashref.ps @@ -1,18 +1,18 @@ %!PS-Adobe-2.0 %%Creator: dvips(k) 5.991 Copyright 2011 Radical Eye Software %%Title: bashref.dvi -%%CreationDate: Tue Oct 22 11:07:57 2013 -%%Pages: 173 +%%CreationDate: Fri Dec 27 14:46:25 2013 +%%Pages: 172 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%DocumentFonts: CMBX12 CMR10 CMTT10 CMSL10 CMSY10 CMMI12 CMMI10 CMCSC10 -%%+ CMTI10 CMSLTT10 CMTT12 CMTT9 CMMI9 CMR9 +%%+ CMTI10 CMSLTT10 SFRM1095 CMTT12 CMTT9 CMMI9 CMR9 %%DocumentPaperSizes: Letter %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips -D 600 -t letter -o bashref.ps bashref.dvi %DVIPSParameters: dpi=600 -%DVIPSSource: TeX output 2013.10.22:1107 +%DVIPSSource: TeX output 2013.12.27:1446 %%BeginProcSet: tex.pro 0 0 %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S @@ -60,6 +60,299 @@ B/g{0 M}B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{ 0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end +%%EndProcSet +%%BeginProcSet: cm-super-t1.enc 0 0 +% This file is generated from `T1uni.map' and `glyphlist.txt', `gl-other.txt' +% +% LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ; +% LIGKERN quoteleft quoteleft =: quotedblleft ; +% LIGKERN quoteright quoteright =: quotedblright ; +% LIGKERN comma comma =: quotedblbase ; less less =: guillemotleft ; +% LIGKERN greater greater =: guillemotright ; +% LIGKERN f f =: ff ; f i =: fi ; f l =: fl ; ff i =: ffi ; ff l =: ffl ; +% +% LIGKERN space {} * ; * {} space ; zero {} * ; * {} zero ; +% LIGKERN one {} * ; * {} one ; two {} * ; * {} two ; +% LIGKERN three {} * ; * {} three ; four {} * ; * {} four ; +% LIGKERN five {} * ; * {} five ; six {} * ; * {} six ; +% LIGKERN seven {} * ; * {} seven ; eight {} * ; * {} eight ; +% LIGKERN nine {} * ; * {} nine ; +% +/T1Encoding [ +% 0x00 +/grave +/acute +/circumflex +/tilde +/dieresis +/hungarumlaut +/ring +/caron +/breve +/macron +/dotaccent +/cedilla +/ogonek +/quotesinglbase +/guilsinglleft +/guilsinglright +% 0x10 +/quotedblleft +/quotedblright +/quotedblbase +/guillemotleft +/guillemotright +/endash +/emdash +/afii61664 +/perthousandzero % PERTHOUSAND ZERO +/dotlessi +/dotlessj +/ff +/fi +/fl +/ffi +/ffl +% 0x20 +/uni2423 +/exclam +/quotedbl +/numbersign +/dollar +/percent +/ampersand +/quoteright +/parenleft +/parenright +/asterisk +/plus +/comma +/hyphen +/period +/slash +% 0x30 +/zero +/one +/two +/three +/four +/five +/six +/seven +/eight +/nine +/colon +/semicolon +/less +/equal +/greater +/question +% 0x40 +/at +/A +/B +/C +/D +/E +/F +/G +/H +/I +/J +/K +/L +/M +/N +/O +% 0x50 +/P +/Q +/R +/S +/T +/U +/V +/W +/X +/Y +/Z +/bracketleft +/backslash +/bracketright +/asciicircum +/underscore +% 0x60 +/quoteleft +/a +/b +/c +/d +/e +/f +/g +/h +/i +/j +/k +/l +/m +/n +/o +% 0x70 +/p +/q +/r +/s +/t +/u +/v +/w +/x +/y +/z +/braceleft +/bar +/braceright +/asciitilde +/hyphen.alt % HANGING HYPHEN +% 0x80 +/Abreve +/Aogonek +/Cacute +/Ccaron +/Dcaron +/Ecaron +/Eogonek +/Gbreve +/Lacute +/Lcaron +/Lslash +/Nacute +/Ncaron +/Eng +/Ohungarumlaut +/Racute +% 0x90 +/Rcaron +/Sacute +/Scaron +/Scedilla +/Tcaron +/Tcommaaccent +/Uhungarumlaut +/Uring +/Ydieresis +/Zacute +/Zcaron +/Zdotaccent +/IJ +/Idotaccent +/dcroat +/section +% 0xA0 +/abreve +/aogonek +/cacute +/ccaron +/dcaron +/ecaron +/eogonek +/gbreve +/lacute +/lcaron +/lslash +/nacute +/ncaron +/eng +/ohungarumlaut +/racute +% 0xB0 +/rcaron +/sacute +/scaron +/scedilla +/tcaron +/tcommaaccent +/uhungarumlaut +/uring +/ydieresis +/zacute +/zcaron +/zdotaccent +/ij +/exclamdown +/questiondown +/sterling +% 0xC0 +/Agrave +/Aacute +/Acircumflex +/Atilde +/Adieresis +/Aring +/AE +/Ccedilla +/Egrave +/Eacute +/Ecircumflex +/Edieresis +/Igrave +/Iacute +/Icircumflex +/Idieresis +% 0xD0 +/Eth +/Ntilde +/Ograve +/Oacute +/Ocircumflex +/Otilde +/Odieresis +/OE +/Oslash +/Ugrave +/Uacute +/Ucircumflex +/Udieresis +/Yacute +/Thorn +/SS % Germandbls +% 0xE0 +/agrave +/aacute +/acircumflex +/atilde +/adieresis +/aring +/ae +/ccedilla +/egrave +/eacute +/ecircumflex +/edieresis +/igrave +/iacute +/icircumflex +/idieresis +% 0xF0 +/eth +/ntilde +/ograve +/oacute +/ocircumflex +/otilde +/odieresis +/oe +/oslash +/ugrave +/uacute +/ucircumflex +/udieresis +/yacute +/thorn +/germandbls % or /germandbls.alt +] def + %%EndProcSet %%BeginProcSet: texps.pro 0 0 %! @@ -121,8 +414,7 @@ dup 108 /l put dup 110 /n put dup 111 /o put dup 115 /s put -dup 123 /braceleft put -dup 125 /braceright put +dup 124 /bar put readonly def currentdict end currentfile eexec @@ -161,54 +453,46 @@ A28D40FCD6D9B321855BDA608E23BD365208DAB23983C0D8A7C9DDC28ED62216 12A20A3068D843B5FA016B8C6B9BBD36356BF85A128F96F0CE861FB9C998BB21 E8624E3DE453C686D41DA7B72ABD919C5BE2F24440D11962C77742A8C0115A72 9E974E71247FCD58318A4347813D4D5A73CF882A7513E2EFE05CE8C7195BDDC7 -DF250B59AD14D02D2991E2D0CF2D0022EF52D78781711697FB784B832DB7FD5D -A70B5A3A2F51985422B685644B23FB4BD39E743817606055EA9E919202151B7C -3374BD7F327FAA9E033893D3B05E305FB06C4098FBC0E96C9746CEECB1A71DFF -174DE4BFC20805F23170D4E9CC591CB605E243C953608656053E47D42692A516 -54CDD59EC3DBEFD075E63B234272548CBDF06E539A62441AAFC6F19FF9EF4C9E -59B4E5B46EE95B68678F1CA9507342AE1BB5B64C4F0C0DA6110ECB0DFA7120BC -EEAADE70224CA0AA0DE936474CD031B5333FEC81039B73F62F9AEB9EFC2ABFCD -91BC8221B86E5FA9E077300E2240FFD8ED945485EDC31E1628908EE3CC15356F -AE422BAEF4CF53716A5DA300B0EA0864C09EFA4B80355337349FD222079081BA -2F3D4C652BA1BB7ADB825A7DA1F7FE91B22E974AD9DB1777CA2B9568D52FF869 -7109343257EF3197B571790146662A4228A807D5C03EEF3649498C8A74A1A57E -D808D1557B8F6CA4E8EF4AB0D35AF5F1292EB70577C5FBB8C36F63BB1F3B2CD0 -FEDAEF4BC620290B59C745B367ECDF5CE962EBF66A22B2D80F275F1EA4C0E20B -76259BFC054BB4BF0A9A7869ADCBB18B21067CE4548982D43DF7C20B5F1573F4 -9A82B4746FC28220FBD402EF6F64C182472E732CB71C4382637DF498B5181B09 -331ACD2628B0D7320F180FF56E10E4C00A54C92D98578BCD5050EB477F8B5587 -5D19A43AEEF01B1898D9B33DB4001364DE863BB463095F4A880A288594E9C29B -92C038B2AC0519AA4E0E2796EB9D8BCF2344207F57C1AE7EE6538DF1F13DCA70 -9D04886CAB82BB020C7425B9206BC84DDB28735A0E0FAD39E2DABE78DC83C438 -E6DAFA3BC97F19F250300A0629C4F7D7DD2D3A44BC64AB9E5CC4E6CB42D78AB7 -2FD0EAC23458847740997AEF151BF758E50D06839BF6A6E46824044574A18F21 -D595F2C9E958FAD04B6F31375D24E1BDEEE484E46D4128E44D62711212867ED1 -12C3E7FE9FE9AE0BA73D7F39B4A4F4918D22384B30BD70AAE305F27905C64082 -6603F819836432CF488668C1102817334B8A6DA8715EB2486656BA048BDB7388 -6962CC2FDD4E659F92C2E651DE36654F986AA54EA16ECBAD44E18323AFD392EC -949B628C2154A2F84831A0369C2EF715EC943E11DF179DF507FBCA729A367BAF -D9CD115F5CCE44A2745F62F0715C8654EC1502BAA0CAD3CD9A4B1FA3025BFD8F -C4DE0F32E82B8E2EB3D2594C9FF5FAFB60ADAA1EE1E83C181FDB49F677082E29 -0D3798E85DEF6B535E46D455E94B0FA07D55C774BAC2BA6EF6B11DF3019DD48C -3C52E1F3B0891094F7C92D83695EDE6C08FA10FE826C08429407824C45B4266F -E51889E5C7CD98DB6F32C5C96D4C87A220A6DA621F7971DD723C68B847679AFF -509F5882E39A1BEB248790DC8B1CCC48951B1A40747A7F63E602D5E45F2BB16B -72F5D48DE4D1DEF6B7EA7EA9CE63170925D5957D64E13ECF00966DE010490B47 -C85B7A98AC16F4291ACB7D81D1ACEA572FEDC8337C7DC9B734C2EFA2EA52E590 -6969682039B6B991719245C94586F52C4DD92BF33457DF69B42BAEA4F1222D4F -EB972C57A0BAA11AEE39E4F94D9F4F098416F1497F0DD231B1DE520F12F24BD6 -47C7B3FB15E963D52C8137BC1243D5731F76559333DFFFF2F34F47FA31EC28D0 -C78C54A599A97EB7C5F07F26A266024CA314BD198D06E30B775BA30AEAAFE10A -10D52067EEBA50EB67F01426426CCD079A6C016C86EE5FCF229946EC02F9BD52 -98C1C40D7C4797ADE8ED7FB1CDCF39A1AD5C0DE46B543C3738C305B57C152FE9 -2575ADE0A3CCE1BFDE234E5DAA477BE479D76BD69FAC6CEAD570C97802A34A55 -35CA2D6C2006C4D422EAE12F72C39FF0562FC497D0B9AD301047CF1D42543295 -A16A8C06B1DCFCB0CA5FB7A29541BFE828E2D1B6B0034C2F0D48346AD98BCB42 -B3CC9E57F5CC0EA63D5FFAE3ED4DD44605E27E5913388F9661CF4A7B6C2BC76A -A4D944B170DC4BFD0411A8DF2D36D514E12F77231D5AB3DE6112BFB5C6309F92 -31C0A932846E7C2BAF2306640B9E54C583F6486317BB4E6308C232E26FD86698 -636F814E6D55C8E1C52B184F5EE6518A86F11B6CB55EE663DD8D71F5FDBBFA71 -394638EE1450E851205AB4CBF9ADDF +DF250B59AD14D02D2991E2D0CF2D0022EF52D78780A34D2A5EBDB458198535BE +8B67CE5E1C9152A21FBB14C4E72828182A77418DF5E3439ED90AC7529AF0E761 +A8FF0676364C61692CCAD317817EDCC17260FF7E2BD3FBD5B6BB078C8D5E78E2 +E2344C0FC14382F41601EE374DBBB0C2465AED57BC4ADF0622B22B2B9DEE8A65 +41F49237821D3C04AC267AE38B4847CA255747D41718122F35239FD328634281 +701854F90CF39734734FD82C4A893B68CA3DD5F353A5416BC710F8B627AB30E2 +CBE1887C4F4A8892FEE7FEC1FC2FD27005C3B416E3146D5C0F157710504DD523 +DD7196888D0DAD10D8BA80034973346DA10C42C39F13C7A1CC3A206874DAC8F4 +FF91066FE31954D26803547C6D73CF884ABA4E9919F94C61BE31389F338670CD +EDD348C3147161C8A013BD73075E9D5453BB63F0D1C1FAF2D3508999293EFE73 +1938DEAAF8E9912B570CFA85337C0097B65F0BD87BC2985088EBC9C82C603762 +36C212F08216BCF7409C3C0C45EA3B3A70F355C88B00991913B8B37B394A51B0 +F31480B8864B519B46A664D84DA0DFAA5EF761088C8D753BB68DEDAB413082EF +A3D13D88404B22353D13CADE3FE1A4C4C84B22D6E01883DB55B1070FF8DF4AED +629BB76EDE1DCE72DD5E67DC7A65A823BD897435159D2A19EF6C1B8140DF6FA3 +B134DF24C97EBE566E371DAE070410144971C9591FC918AF87D5282DDB0B5646 +4FEDE6C79EB2442F59D3C9078750AD6BC35A5ECADC438496B1AD5DAC09445A54 +7DED15E0B678EB9310B3576A4962D846B405B019F7D9601A0435B34CEDB468F2 +249228EFB45311A50211148FBDCA8141406B7AF8A7F1712E15149114134BFB10 +D10CF434EC53D2E1482B3CAA38A50F3712C0FB9AA1452F468595BAA7C16BEB59 +B2F3C6771FECA7C8B2608C37FBB7142D61F31E86F5B712FE3B7DFB52153C6CC9 +95AC0DC8764DB20787FC4366FB90441976CECD1FF9D4ECB82FBED648C292401D +DC2B6A71FAFF6D22C8FAEF0928C7280E8B0DB146EC742F8A479138642430AC85 +F6933F11D5171C0BDCA8DD5155489C4E9066882EDC00B078108B4A3C605C165F +184C4198F9FCBBD65FDF7B7AFED6768C847E3C5E9788402902976DBCD5FB3CE3 +3D592281A1B5A17F0E648ED88529D43D525DF5FD966F9707C264A5AA7F703546 +F103259FC2F77CD379FF00A34BE6385EAA9DA5A06C7801F000EC795747997CC9 +C31D4EDA25CD2037DBD53DA48F51FBB2A757971D33F0C3EBF1F6B051F6D995F0 +082CA7139AA8C990D10197A25C613C199A634B63C5E8B8EBB91272F510D13162 +47A2ABB34D5741CD9E45022A81934C3CC7A8042BBF28A3E9BA7718E08AC91E35 +9C1864328AB297AFBF2DD62A13EE850B12DA21E621AECFD642FD70A42520E854 +9BC128C75DAB4B316F3FC8A944E6102B2F6700FAE355319F079027274E610266 +83C4F35A4FE9689BE48536E93D0C6C5F6011707F95E5DAE8DA8256B7CC81F688 +4184B8E96CBCF86E99E515AF5F90B209228DB44EC8618D12F602591F010A2669 +2BA8E81C1E18161D532D0C61DC696860227170A05406A52A6D89BF19FC952FF8 +D47D8E6333C1828A7E7E3B8BB1C7A85C35AA50AC0CC070E540D8F0BF951C6F87 +4B8A4E41D65350806F04B06F3F98E881649F3895D83A27B5A4F2D4DBC8EC483E +5E43E196A6448A82B881F7EFF91D6C99C287E3439C5E6ACA6A53070CD1FA6384 +068F78E11E6F596E080C84EB0CD85422B46339CC8B5598D0D699C506ED02884E +3C9B9EE27357AB5D42096F 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -2305,6 +2589,7 @@ dup 13 /fl put dup 14 /ffi put dup 33 /exclam put dup 34 /quotedblright put +dup 35 /numbersign put dup 36 /dollar put dup 37 /percent put dup 38 /ampersand put @@ -2330,6 +2615,7 @@ dup 58 /colon put dup 59 /semicolon put dup 61 /equal put dup 63 /question put +dup 64 /at put dup 65 /A put dup 66 /B put dup 67 /C put @@ -2693,477 +2979,493 @@ F316A68985E3A0338D8CF730881326E2B76D75BD2566D7387C0DD8C5724592D5 2A7BC536F373C0EBAB41C780E56F5BD1CA645DCED5090CF32D4F0E5A780651A0 477CB27558B2D0E2AE3D0A02565EE38D5F437D01308A6BEF55E80422F5B5B56F 6DD11ED717B034083F9BB1536D76E321255A137E618B398875B5BB8F5AF02B6E -B4DFFB173C424B2619F448F7CC3A206BBE5A6246CC152C59C909C600F63AE940 -60ACB023DEE119BF9575D15049B5DF6441715F68B7082B9444408864120F5EAC -9AA03C7C0DC1FFE2C4F80F12B93F6735B9F0BFB8FD5009D8ECE097B08A198D7F -0DD0D8F3F32E23EEBE92D456E6C19F095F70FB5A0A4EC5A0A28E2A1B48E97728 -18BB643C3174C5B882454561D9FB758B35D8D1AEB3C6323693353496BBBB7A21 -5DEDEBA1AEAC77D8189B2F2E67A9534E197055EDA86604E54A0692BDCD66B790 -068C176C2DC9F8C808E941210A9701E7036C6090536CC8E57D7930DAAB3810F8 -CA78AC8BA0583A692B3707D8EFF67852F1D10C2316CE94B0A86565F33AA21D95 -F10EB3AC20610AD3E994906B46C6341AEFFC14D68FA18DCD7F47031862B77761 -33AA4697C83E422B68E3088C75454BEED7F2B2683DEA162D64A2C13A6FB9AEA4 -805376FC30C38D71FEAB0270ADBCBAD2783F4EB5CBFE07B3C8092CFB44CAC100 -596981C49C201729363F55CB5BD83002BD6C48EB90BD0025D0DE37FA60BD65E2 -0471A4D7603AB24B35F54D8CBFB69C66F8B7479DC373EAF98E179445C3C75D83 -A4E3F5FAD36BDF55E1277757AEDF5C5E653CD8D20E88A4E2A35C3DD1B28EF3A6 -AE0BAF0B4EE0183528D3D4D477A37B1F1C8FA2ADC6AD45436B44E7DB3CDA336C -21984BD90389BB4DDC946C5BB90DD36F3F2B717EE91AAE5DEDFCC61346445AAA -20C69B691AE897BF37C4CD53E7EBBD2A688329980006FB57DDC23A76CC50319B -664277FA194B7B3E6B367A64DA7EBE5C2F49BB2654E9F9E2F90DDAD323134ACD -7E791DD8D54952927ABDF05859F1E7A261142BC8E3FEE76D68DE3D934A6CDEA9 -EE0EE9B475A5E0A8EDD62B373557B19FB378E20CAFF7E6D7B8971397651754F2 -0C1AA7352058FFFEDF2678D577786B0A1A8D0808B3E8730B61181173E1D303F1 -F7E76AD64859FF5174978587BD32367BE92A0BF88EAC6C6CD1F4C961C2042C3D -2F30FB270135154DB5AA09BF613BB9E481B003006E230362A670175F08FC95A0 -9A04E761D19EBB5B5E35B178FA281E1F9D542012BE66BD263D5E0D33F5D9AA55 -65AA4E7455DC8DAA3B1282847D24867F1E2FFC0BD6FEB64EB3E24456C8D7BF03 -2E63825C24B8D6EB7CCE2D711A218FC3388321F35029B10C914A76A86A2979DF -065AAE38A3F880BA047D4D1DC7FF83B27D5E0364CE9BF40618E9AF2079365F3D -F3C3D03B6140A53DE5FDB0D85D448ED3EC184EBA2B807FB3013B3C1CA1A586FD -ACDB00F8DB768ADA36F90005EAAE1A89E8E40DB045F2C1095F8958D9193CAB72 -ECFFB9AF10717656BA3B2E3D09B0E7911768AA2B661A2C87D66FBE26CA23F6FF -EDEDBA40CD167F1442F4560EC101A605EF5A76972190424F0950923396C7E375 -D3B55F06B378166B6A2472B83F8E77810BA74FC39102DCA7DF768449EEDC53DF -25FF749A0212C8E77E78B7C6E53F306FC870F71F07F7202CE18ED5A1D68B8B61 -E653DA69E05E6B2C0731B3D298AC63257B63B773CB51D9C9651C5D7DD655F503 -AEBC24932ABE55B9B2FAED40FF745685F0F7DAB850521F1F28934F151CE0E760 -3C95C6FC654D51E5F280BE0301EEABDC20A53CCD02D6EBB7C743DAE40684B157 -8E69DE455563628C63938D6E77E76FC488E905753D58A74E6059F3834EE88B5B -E11BD205B63E7F44AED092763076166B8AE25CD12A3F2294B94C19724F97ADD8 -2E8FEAF5841F52D654A5E366454C625413D5D14069BDB1C02D34F8C1E04669FA -50BAF7DF9FEDB9745D3C220886B78DE4B272C043F37D8A9B97C584B63FEDAF5B -EA8FDE3A373DAE7C2C029C892C4501E140EF3ED7A1710ABD761BE6E39CB18F55 -21529A69844CD87C3E55284348E9297B5969A37FACE43C4E10870B61801CCEA4 -A236288DB3F6537F7E6EDB5A39B0BDDFB74523F3B78026A98C6C7F7647AE4005 -51F0B7333CF9DBEFAD223CF07D577F09D9E40E4DA34A7A91A6827D628FBEC964 -7BD672722BE1647A4A51ED1E53536958A13DF69165C10471CC39B939813DA837 -26506BD312569097CE4C542330127D8316574BC6B13F234B514B13B151F49F38 -5FCC1511A11B3E488E31E7EB29ED38D4D9A04D1606263ADCE796364A0E1EE611 -73145BA0ED50B329ED72DF373701AB8F83DDC0BE85D296C396C94471E617993F -34C7F27E96963A3EFEDDE4E89BDBA7C606BC6FE2AB63CE2C8C52724C004924CD -B284DBEE7559427559FC1A5C5EE739B150E03FAA4573E4FA0D16090679BEB417 -78621339D334002D01BBEFA8D4D8E02425105261E9B093CBB0337301155CC554 -7B4AFDBA72FF0D111D26AA6C89AE3D8BF0ED28CBA683301DE49049527C0F8618 -A1B48D9906D88475DF2F3A9657BEFCE34FAD0A4801B959221A49C6C7425F20E8 -889401BA118221E6196957A790C159360437D7852A27E752C05C01180F80F2E4 -5FB6D1A0B2B781546585A448E7D528769B554936849DB7AF7CDEB393B86CFE30 -0C4430F7859146D7A5E371F0C443AC6B5A6876245643A2E147806EF7E65470DC -5BA1574A7849C14F51951453FB88BCA11C8B6D5B3BDA0DFE79B68B9C3AF7CAA6 -DB4412E0AE6D40004418B10DC55DCBEF8411D6A2B4238EA63B9C4B7B7210757E -4B1148742AD2ECDD1F39E47826EB95E38F304BF507AEE75EA8F814C537FA1494 -FBF1E1177B98262B9C7B3E06028936A2BA5741F135FD20B32BC987CDAC91C6F2 -A528DE9C430ABE7B8A3DFE96B2C4B7453BD94595DDF7F726810143A8BD7F121D -4E2745AA2A2CBAF48576476D8346D0637BD329FCD2D15D164A78B4A845421D98 -2E9B65C14E8810A2E4ECF05966B2DAFD9FFC2E23A27E74AD8A8F41964B206CF5 -46CAA9F0CB4F9302113C4B84EABE1C34EA1DA560286FB89D069E933AAA6CCC8F -8AFC1A6D5CD46B2D3FC079C42A3CD448B724F859C71755DE746791E6D2663C62 -C801F5A3851EE07EC782DCB89CA9284302F1B238962F02A970221E248BA87485 -3352872C96DF0AE2A25125880852F9BC3FF3EC521E5377907E1A4823F6F71D8F -4A00F6B64393895826FA8A795A22FF0ACDD7B434BC0B6B8CF644F277B5AFC638 -CD6110E69851E986261C4FEC776D9FF446F974F01DA8B66C29AE35FDD26287CC -AFFEC304EF0F4B4D0207A48822373DB031BA5B0207A27C202B8E6A9225569269 -FF224E7A5C7952A2C9CA7C574877654F5A885AEB53157CD9E1F86FB8CE6BDEE6 -3B4B18BD0DF048CACAEB8B1653521B1CAC70674C8E0E0F52D1D20FDABF255735 -AE84F2460B88FAB55BDEBB0E92319BA90A6860DC939EAAF454D3A1E7CBB60ED9 -F94363F069F6A7209BC408E29C2769BCC287A634BCB8DA80836DCDFDDD265D6A -BFA28CA76A1ADE69A8EAF62540903706ABE09BC0E91DD87EB38D1482BF79862F -85E4131AD1B172EE0F47B627EA39F14BF808E2E7399E7A59886A48B57F06BF74 -2A81D5A429F8D96153B68EC82AFE4E3046B20CE5B56A6197196EB1BF5063E415 -F75969C72918F0FDBD0B6301A3582DF9089151515B021904659D1BE4B43B29D8 -A485C48F803C9F74186C527DCFC6322A48E4DA39A29A7DA79EC395AE61FF11BC -9860E8036B67A06CE3ACAC15BD6F5E0BEA287EEE4F16EB3C905AD31BEB76E434 -028449F1FF147AF28F382929EC5AAC6F0528D4A5600895EF0852908D4BB6986A -34BE0B0F5BFA99443441E4396ADF11820A37FD7EB079601CA692CB3C950447BA -46AEC7F4BF6EA0787F9522A015D41C58DC0A9ED32103892D3071110EA6189FCC -940C1F39290BBF3253CB42E015108018D91CA8EF5D52BAEF026FD1D20C395B55 -E0C6A8C0E199E9678594AEBADB4C7CA15CD16B1D97B9E9414077E4B9D7D37482 -A2153944B22860F6E736F0E3B88AE3B66C7FBAD2545E2867F7728A4E317360AA -51EBA228CD7BD89C5CF33F50F00382E2F38A75837487AD9D5058423A5B0D4FC6 -C40ACF7D697AA00F8C0DE7B99855022B457C2268E5316F7F496326F3C86E7EE2 -83FFC6DC42BEB91978670559466F2918BA13C5E7BCD36D589100C292D0FC124B -567BC886C60C646A20A0DA1E59620BC57F2CC3C7042C08FB6D992C2CEBAA45FC -B81B5D09D8FF740CB6DD5E908D6821B32E0EDEF8660AAAFA262844D5213914D2 -828D12AB9EEEF9EA65078B05975B4625D5505518C08CE8C150F5CF933B17C7EC -879D9839BD08BC38F84A0AC362C260CD0B56A504351AD2DEFDE3EF044F9312F5 -B9973552C834A293EE64C2BBA4D47B2A95DA434BECBF22D26624CEA215B6F364 -1902EB2150210540FF8B9678AA483FB1C3F103DD6DD86B0E3016A4DD00EB7B5A -BA836EF9E9F26307F4648603AF92FD8B9EEA19125091C3F33F50D9EFA965B7AA -E6D8F5EEA76A1874DB12C874162074F615A0C141647EBBD184AF5D53418BA286 -AA3A10106EF65F09511B26EA124725C81583B79351B96322257EA15583C600C6 -0E8307CAE7853FA002CADB2A90CDF98C8FEEA629A25037E718017B87B806145F -F20E0057F9CD60F0133CB01BDC8E502D2C4B9100DBEDF93F955A35B70900EAD5 -C045B891E0CFA1F75031BA2B346D0CF632BD629A9C5D3258C1D7E0C9D1D1593A -110BDEF6FB4B638AFC2F78DA1B4CB524A2B3502A4D62E7B13A3D55A68B00199F -5687A3D259126CEAFADF2499D0133959B0BA9629D95668D7AF12D82A906236A4 -837635EE78F931B00EC1BEFCEBD8B97D468A0D38B449841947B4A772BBD5FD5F -7B1B657B2520AAA600A439E395584E339DCBFD6D0256006F7C9D39904B55416D -507548A98EACF534C4587595D6A9E276699BBF2BF016D4CEF438CA37052FDAF3 -DA3D2D3441E31A623D3CB143119FF95A1F04BA7D3A9B5E561C492658B3F5444A -7DE7BDF42A7E211A6F624BAFFE91D61EE884FD84F06124ED9677A15B6131FF49 -205BF0B9F7CBA8D2A6BAF952F5022EBC8AC56567FBE269472A08FEA231219970 -B7A9D9842EAB692AEBDC37C749562680FB7953D8359D8307558B8624E048BDCF -C45CCE9134E120F8EA1A4186E57821CD91DFDA1512200D0F1ED8844A13554EFA -077E848618A426A480B82B4556079C11393F07F355AB53494B965A3B304DFE8B -020CFCB4782C58065F0ABA591F4B807003ECFD955C73E38F37CFCE482B2A5A30 -D32D608A142EB964B6B66C3B6F0FDCF83BB5E36E45E43EB045A7BDAF0C75953F -D382040EA2B54AD9AF2F7E9B582B19318D7987DDEA32280EAF70407FC80F3459 -F92A5F4627E229EF4ABAE598BD9C3324B07276B9E945CE4B74163B9DE723933F -6BED2E0BE0B8E95ABDE2C4FD331CEB50944C8EA073AB32C0B7BCA5AD33455872 -08A32D4C25F67FFE0ABC8DA05DAF65F6886BDDA191B493BA7A1211CC98C7FCDC -25F0A251CE379F378F73F9C3FED8DE5AEB3D4C8E2CCA39687138DFF0D1E26E96 -E9D3A4F6FBF5CB961911C0018F762BAF53CEFB2AF145C55E7AF367790D2BACB6 -411D6F5DCE3F27C4C490A9852ECF4C6A2659407FFD1FA16B5C8EA47A5BB00E34 -4BFA4446A6925E5D5752245AEDC5D4E5B2BF51908ACA64418DE64E3C1DD1A052 -BAD0CD6A1176091CF1A595BA13CF260ECE6375BA1A5ED68C0F21BF01A7EABC4C -189E2FBA359BC17FFBE565628CD01662CD4EAEF2AE0836A742381B59E4770907 -0252C2B21CA6471173CCA084F38E1A10B5D38E4D609BF30BCA7FA4223A4B44CD -8564002503E8C1FE7596CF9F3F6ED4497223A1AA2844ACD08BF7E7804BBF232A -FC2B030F1126608707757B37F2BF295B3EEB61ACA417C12C877600DF9E412EC4 -22313D45B0A92903DBC36F336B9CDEADD122024E4E9EC1719A05AF161314CF59 -550518D598C1F432F6F619D68C47250AE9631837EEB52180E307237DBC0FCA5C -D6445C5EA4284C0834AC268955B7084BA7D1384E8D4FBEFCAB3A1C8735FF57DF -CC8FFE2BBF52AB9AC097C1AF30C46548BF5CD32D71502CBDEB3982F85793C229 -F72039A25336266E5BBEB3005FE48F771ED9AA3161E88121B62F8D03976FFE66 -4D40E1DB342A9DC540225796DB48828FC2FF676382AF3D3E70E75DE05D7AFD43 -DDD0A21B5F28209FBE9C0D1713595D17EC31F94D3AE98131E25663BEEEDD8D77 -ACE63ADA18690128517D2A9C1EF0EFD2F8BC2C68F4DB891B4B5BE0A0A647FC5C -7248EC6256375DB235F48FE85AB575EB69EE092289102409A26E924F816408E9 -6A148480E3E0A426607D185993F36CCFB81468D01F25343F91969EB0C65C73AA -2407EE10DD59CFF0DF9BE2FB4069D03CC036E4EFC709B039F529F6159A3FAADC -95FA4993E57EC1DEEFC39131156A75BDC06A2659DCDC0A9FE78C4F6DF5ECFC77 -8D555E10336C4B9A873CE4F58A9607EAF7AD34C45A8C788864C39B9750E4CD30 -5BB52329B609780125FA6960DDB2CC21E368571785C1E61D4BA2CF57E996312D -8785290A893183DB2B8590E4C65F25E6B67CF08DF9713FE785DE8956BF9F6E95 -C8D0BE11BB23DB038BEF4FFD7A5C3C41F88A72A64E3C0358228DDFAE06E428B5 -2ABF80AE2D3C194A4C31DA6F294E7B988AA655D3105C5E0A01CA3D2F073F1C09 -903CAB398F3E78BBEAEE9AA555B5867D1A577BE0B7CE7B92A9C2E418C156DD6D -1C286A527A8345B852E6E364FD6DDAF9A350446AE32D8C195FB34D177BB12278 -03B0A4C993C2CC198476C3EB7E910FAA8441062670E619F06F543B4F0DBD92E8 -DDD0F9EAED33CC1717996FF3C961F1A31BC34351FE75CB3AE344D97D164C9C47 -EBC30F73E3782842FCCD01C64627602BD39C36EB76DE02AE3D71472C78112819 -A7B109DEE09357627A3AFC0D48BD43D322E9B8BF2C05EAAB45D3495B86A1E639 -5E43817B1ADCFD85BE0AE455EF4EFEF75A6C52CB8210AF749222124594646BB4 -5C6E89246CD90B89D60C2E141CD5093AAD78C31F724EB7C14F69AC451C68C700 -A520FEF0ACFFD8B4B2092A3D6534E2495D58B8AB3D76199A62EFDC2F12C39606 -EF7B0F73FB37BACDD3A3813220B4CBC66978AB207DF7164F05DEB3F9F7916F21 -647A6482D143482480CC14C7676CD04094C740EF0CCFC2AEA3B4E4DBE57DE61B -B67188036B013E93EB47CB55BC96C4DFFD6D671602E53C7807D04597708FC7C9 -F56819B28BD7E2731F3A0C71F08CEED40C354946F5CA237467DCA92069CFD851 -7BA1C0E398C721E597D47024670F64EF00BCC74036C9FF94BA8DDA00E2B5F152 -8F6D8FD9C58CE4B32D1F9E17490B76FB107AE92E4BE09378E00ADE4C7E737D4B -9B26672994CAFFA7B04EFDA7332AC5FDD175E996B4DF867A5A5B95CD40AEAF51 -5B91313A4ED9D4EE86EC9B5CAA594AB82F85D89B42AF50AACED0CA3046292E9A -D8EA95CFD0F67259D21E1C6D9E3CA990C2B159205F34F270EDD783277FA33993 -5F8EB1163FEC6C2A627218BED8BA4C38120E46BF161E75B623811C1B2E1FE99A -CF93CDF69995D628C6965CC12D5216C1A829CCC390DBB87D6FC5DCD0CBD188C7 -DFFFF86E17D5AA1162084DF13F51D139A3932B8107091A507E613F8FF9AAFC8E -EC4FB236994E73D8277EE91FAB4DE51D88E0CBEBA66BF190372DC182C643228A -9B6E7E0B61904496EF1646D7BE9BD12A49D78364706F4A2C494EE8B768230113 -80E61EC3F9A33A2BE64F7F82FBEC5A4537C4A10D7D4A902F7208572B6ED7E8EF -0A70D05D876B5D1163AC5E8E179BD0015DCC0614DEA8185FE58C207B5B559291 -A44B5D6B43208F3BBCB61185498F9C2DD395A1E27180704BECFBDB2D2E7F3350 -3E41D557D930D0BB781057C9322F2A23AD4D362D316EA4E46FF98336C761E9B8 -C638AA52F5DE03FDC7FBA76FA91DFA604B811B60227CDAB0AFD7EBA04C7F5500 -E71F6B96E79EB210BFDB3C4E17F8DE361C46A55BAE38F520504B4049F4D3C0F7 -0552AC71AE9ECD8C35F49EFE8F446088AA12607F77A0A132B78E7CF4776532AF -1B2218EA9138E76106341AD429D8609D77EB18796AF95E857EE12AE941DFD293 -2318DDB0112E3FC3916C38491E14D620033DCD1D2F568A06C120EB7694390AEE -21F3CA365EE38DCC3D67790684697DC838DFEE3BF615B7CC620928366B8A2ACD -CA3DA7A679F863BE6DA27245224DBD069AF51D28E7FC3925724903704F362772 -67A2D8C3B1E4C0F343BD5EAB5C821E9DD828A465A80A7DF48F5F1153DC56228A -15F81915064028C561A7D9DC00504A12B5212A658A992388250771ED09B25619 -08473133667466EDE64986FF166FC705DF06F970716602DDB38AE398AB0EA5D3 -FE88D039FD3CEBEE13D999870890EFE9521E30A4C78C154B9F59D2C0DB526950 -F4C803889FF887377848979FD5A5C135E541EECB1D296B053CFF2BA6BA2CB48E -137B678F06B1091389ED9E69CBE13A653E37A14A09B754B1430C265F503622EE -F87B1C22C747C6622ABBD1C3C75A8A0D980651BFCA3712291C119DE5FCE60E02 -CCC0463AAB39B8EE681FF905B4FB35D7501F95D0A87B2587FA0E16ED8B773586 -CA262BEACA20E1D3F33E07B38C9609C780472B665D577A1F868D629D84B3C8B1 -CAA7861633380407324D4FB9F3047CC3E8642B4CD1A035E3C0A10B0F43FC24C4 -92273CBAA7144D6530A256B2DE5D15AD3341E28A6561C1DA1BA572EF8AC0DC84 -274111F1CDF068595A77DD907A8381204026EBEB0C230EB3C563FD62DC5DF9B5 -4B7FB4A788BE81CCF9B912A186AD5DD1B402A5E4668DA0A28AE3C3EDE128B4BE -80DFC9DF0C000D812D932F80C2822B1640C8E3F46CEC9255FB2991EE1D3FC7C9 -F42669091B433190A5773AB2DE3B6A808EF33CE857D93D8B5DE09E2B864C1BBA -0AF8E9411252D76FF921CB6E705539D2B773F752269BD3158A25999552415708 -BFDE7B4FAB16E3E511C90EB134511BD8B13FFA2C3D92AC07962A201EFA8A9BD0 -EB9B25A7512478C70BB4985620C8C92DA55060E18C70C03C5B54A1E48B39FFA2 -C06EF56825E934988061EC893E6163D4D4663D51835DC13F98C27C5E5A186AE8 -5C63668210386C7F90B5B227A1BA65988D5E7B74B2F18CA8B30C08F1148A8A5C -7FA3F8C1047602BD4706725689C367B5024AAAB48E604AF5A54877571913672F -7266C5ABAE9E1F15581D195A8BF6913E875AD4C58999B19367801BA52193025A -B0AFFB630245F26A283A94170F1598CBDEE99DC2A1C07507BAABD4FA60039A7E -8CB91728F69F2046680A8AF6679F902F71563A0657FD94BD029DA971BD4EE571 -7BBCF3C1527987CAF4C3CACCD502BC7653632532E139F0BD2BEE36E8D37E314B -372B2F3752D3343581CCD5DEBFAE11A09BF4334F73D1FC50EEC98A00DC81E160 -E7DB6EC3916038DCB96700A607ACDDD929323DFD961CD5057F4472AB3BD98108 -6BA0C2708152EF29C77DE49615E1CD52153DC95D130758238977CCCAC94D3A16 -EF90CBACEA3BA3C4E3BB9AF83854AFEA1301F8EDEB4C448354F30F1CC469FB14 -2C85A552465AFFACE55115AA7AF3A7D7FA9F2B3186B9D0E2655F73F5FEDF7F80 -50A83D40D050E358F6904BD8FE102F19D707DB078A843AF32DF381E341FD3D4F -3B75F547CB126F70EE4C36D8B8787F0ABCB2A190B0490F22FD304041B0E4DF8B -35A64217EE77C40802292F7A4A0A92D249D789532F02A33B8CBF938381801FFB -051D924F5A52A5C539C57C13683B1D335197F069F5D5D7A43CAB5FC1B6BCB27A -FF820CB8FFAFE4425A11A3D1484B296CBD7BFD68596DAD18BFF8631B872C89E4 -E82BC21D71961677146744ECDBFFDA389AC3C1B4CEF371D02C3069788997B959 -7F56FC475657CEE7E1526829FC8EC8FEC33F5DD316A19F8F91E425A51606F987 -99495DBB3AA2EA3116BDDF6464ECE47EC9792F7A2CC58ED980DA3583C9EAF207 -FBA9912578E18A9461A42A0A7E192F83429F653E1C54CBDA83EFCE597259BD10 -EC8C15406E64E3FD1E62734462F66A1A8AA59F03C7E8D671BB2F71EF7CC9A235 -D0ACEEC8EA98B35DB4025AAF6627811B437A8E52F10AEA99FFB30C4A780450F3 -D6352D7DFDD0DC031675813F476BA4522EE91BE71BC655F2C390B56D36652058 -A203457679CFC54F75B515ECC64955A9B6F0818D835E33E8E3EC65040FF4DF88 -DB5DCC5D848557D88188161686F4195F26035B5C7E0B172A20EFABC8CBDD2E4C -11A03C4FC4D73D7D5008D67F4118F3364D1144AC4042812FF53AE2421C9794C5 -4A8C2E21B1D674C1B842AE430854AA1EF951521BC95DB6A7811A6385AC19A61A -86DFDEEBA2C8F9ABB91F6699F97A1DB7F943B49991650301C3FFBD7670E013F2 -54094C629A6819655A4C00B2A35E62D68DFDE02F682FA0341B1CA83C3CE9AC1A -C10D170B957C239F911CE1126A92F84E7C79F37F9EAB542457D8CF1C90674ECC -4F1CEAA8897E73746B4845C1AD7E7ABBEBD755AD1CEB3BF2E39B2C87A2CF45D5 -167D24FD7656A9AE53C0EB5B5F5493B9CB809DAF833CC6EF29F47AF82EF1759B -36D0C527CB5B6BA3C80DF3D409A8BBAA6E837A14D959888467C7163C6296D920 -40629C57255C4C2F93380C1C4D894E9960D980FB07D85AF29956FB705195963E -8C3B456CBE21B099EE0415EEA67C7F437CE777F1C94579890DE6639E39CADD67 -06D76B937312612E41B38016F3F4CE03D1E73064DDC7C6C9E970892A55DB007D -30BC2C5CDA0580E2DF13A4EE79A298B5BE53F30100CFAFC23E578B8ADDBE3515 -485728E382359D114C1015DE055A6BA02462C8224D8D0DED58A54E06153E42A2 -EF0977CE9129C70776A6908A6E8B7E58A4358778DBAFD944277A92D12E6E27FA -E6DAC6958F8507475AA3DA3883C5A6F3FA83324E37079E6B44A52313B3991940 -7CCD7FAFB690B86AA40A237347955E567F2370FB63CADB84FF1B9AC99FDC2355 -30A3B2C74B3F28F8F28FF30B9EC8112800AAD2419A982C3FD4480C45D91A3095 -B55FAB80ABCEFA4E1DEE7F7934D3D987BB9F2C842E8B54BF8C53615EAB170102 -4102F969A27A85B2D9059DD56B737E7A5FD13318C174ABBD72A4001093FE66C6 -4654BCD1C94C3EB35D3FE7ECE712DC781C2269530E395DA15402516F8689777B -D80A5607EB8F1710896230C61F227B96B30D90F34F95F945578C6F57EBAB5754 -AF5B56938118D79E98C816C901CB7E489689E5C3D6DFE80234237EA96BF17F19 -E3595E614C3675EE55262BF288064A9599E7AB5E22718A5B3EC97BB7ADFC352C -E3028FE22E3FCABB7717D4643AE4E291FDD07DB0015EAD90938D970ADF56660B -07B35F3D5CA96200DD491826249E7244C30FEED75325D0DEA44D42584E3979FA -BBCBA15A68B2BDB658D748D5A54FFC69E2F4777E2BC8FFD9B8222EE4AD0C7634 -E1E514FDE2A91445EF7A57F1DD74B041002A5679A0900617D776B704B82AF17D -4A4F1F9D8C655EB6E7DF245AD4A21CA0709D78CC50D3BD8605BBA89B8326C87D -08CEFFFAE3F4747E65D6166C2B77A8FF6CFF312D4997538390FF97E1F1324CB2 -D62575DDF37DAC2A5941B252AC6C53A1E4AFF31A478BDF1FA36E55DB8AF6EBBB -4CDEE70E5CB4DD2A91E9B85F5E9A1FB125E91ACC965A0A1981646396D63B510C -AB27EC3730CE29CB8B44A07696C026EF713B16A1976F981E9431D115B2FB9049 -C71DE7DBF37C93D92938518614C2F4E9027A5825812A8F8D89B44324A7072992 -9B2B3F9C5CACBA7E93C207BD6598349EBFD88ECE219BA69805109FF4A4F180DA -725B221623F04D88C18540334A0F94160878089735A78DF3A9841157EC183725 -5ECCF645CC2CE98A372AE54EF603EBD99F7F8B4AD7885D2A139E0D777A098696 -58BBBFD322CC5C4BBB41A76B4939BEAD8E0FF9FF056FFE301D5CA626D5057988 -EFBD86845BF377C99A5B8C4F305448AE05E657DCC59C69AB96E73BDD82DDCD20 -75D6BF26FB34A4E304D164ED532FBB642D418F4031D77140EEC9D2EEA628E67F -2A41A546105858D93779E8EAEAFC3C5E30B564993A65A6681A7B8F08F9A81F95 -3F1BEF143AEF54D16B69763E8699343C2DBA3B7B18F24516CC27DF4E6CFBFC51 -3D0ABFEA8661D21A8C6901AE8FAAE1C69DE48F797A4EF9E74E5D3AB4DDAB9A13 -6DA9597CAFDA19735E373C0CCB9AC00CBA8612ECE2FADB52402B5551C918ED17 -D6EE1A3271CC1BA38820A8B2277FC9082742F001FD3EB7580C12E4896F0E1FFB -2662B7838342B9C59D6871CDF40DDF37C5CF9E9DABB50EDFBA071108A505DF75 -B7F80350BF7FC5952AADED7CDBE037763C946C41229697B99F8410EEF31561B6 -AAFA8ADFA46C1A323AF857116054C3C610A7C68DD9207CA1EEC49C65D61B45A3 -BFF5A1D9D8E550D21014C230E6FE8CCB8827D4C1E9275C24EA409B9DA6982A45 -87479ACBFF83EAB2407525CC9F7171F444350724F42BD668110559BE4A0FE069 -11CF8BE111D312377F9E7A299278F2BEF5D756E0716C47DB80230FAA44E80D19 -E33FCA90BAF261127367BFA5FCB439EF490B0BADDD6FEF9B7C662CFA4568C524 -04FED1E8E476C8F4D453B5CA08CB4C93F5C845E2D55D10C4AAE4F5341C57911C -2B3AC4E44F8236F55938C35BF2209D0B0620D59E0D0959EEAE2336DCAF39E75B -6D908FD1CD7AFE1351DD3608B00D30CC5C349ED51EC5844028A2E997FFDE6DD4 -140CB0BCFA6EF678E063B8E43F2FF63D0E5C0A2B6B102EBAD19F1E7465791063 -0A87230C289B36BA2AB6C45BFC4ECADF46D2D2A9AD636A3E1C441757B5435EAD -0039B4BDD2FE49C8B274A9BC20C8C9279F66640B4CFC79B594262D8484C4DC15 -10B9C4CB8EDD33E4E4B2CA82E1EFE51F8F6474769204F442977DBF7FA93662B5 -7FB88B0FE3D01B0418C30E8CDB3A345586A77889F32C7D3B32D6CFD99D33FFBC -87A496B3ADCCB0CFFBD6F0F8503BB431AC53CFBC9CD74CA839534B0904146B6F -DA37C37E38BFD3018754C12F23CCAD2E8B9D785D0D991B6CCE7573D1A3CD11DE -5C13279763F7C01CFC080ACC80DCD121BDDE7D753F9E7EA5B081A880A3ABF6D0 -2A9E99436DF4E0D1BF51DB50836885D2BDF679547C03D32CC24EC7AE525AFA60 -2F01519855F2710166ABB6524780517CBE6CA03613BCEC4F815A3F26A325A919 -E88298FAB2029FE4809801B9F34BA5DE4913FC8AD53C2C69DB0823D341EDF7A8 -0BDD5820C5320F83136F120C62E533616962B0AC1113F7C5FEA153E53DF8DD93 -6B1275A9EB69A1AAF094FB239EB39B0FCA7DEB28FDEA4F28DEEB8D036DCED361 -A73FF212ACF355846A1ADECEBCC3130259B23D01F51EAF1D98B7C5EF0E72000C -0885CCB2229D7196EE55648E64212CB18BEF3292F638BDD0B05EF3787CC8A6E6 -B34FDDBF722CA2A4892DB03C1FEA5AFBC2BF9DE80533FCB41291E2B6B160827A -326D5A32CF971BAC82760AD86C8AC025DC943E5BD2B02B012996A58A2D7371FB -AA61478DF11B081A869AB6EB67694FDF49A60613ABD7C12AC62F19D3B7CB7F94 -9D8C61817B29DC2AE96F6A8715BAECAD56FFFFCF5D03905FDAFF3F8B9B319CB3 -25252AB3EBEB0C85C6817243E775859099B8B9CDA71851E35525DE464F6BC259 -459F6B4DDBDEBC31A1EEE64AFDA5B0D90B8E55872EE65CC571A513FD0CAE86FC -5D690AD99B291F6D4FFFEDB3BAF7214F50CE37511566D7CA2766AA5704382270 -A41379495A953F247BF4C7A4DBBA37691ED9C7E2BF2462802C3522DD6364E59C -90327ED2D7C89322361465B73A022FE3D27F35746F6E88C9B8A4F0311EE686D2 -F31D307C5F5A8F1E4723CCD8FC47E39D9FB4CD4BDC300084E2348D00E71A516D -1C65DE9428E18A31BD9F71D99552BE2C55747D7A6E499B985101FD19CF584ED1 -B30DDB63008915336EC5375503C6B126575A1251B503473E4A0D4CDF23014DC7 -BD807BD934C74EF0CADA54A1E1D0705F3C1D8AFAAD5F4CFEF35DABD67B80BDD7 -5DF273B7B6BC19E131B1BB05DB694D121199416E9DBCA7A7DEB13E64FEC3BE53 -491DA79BFE22B4D76200C73935A4D588E0F48F1C991759E2451D04E2C30942D2 -B710FAA2C7E16471ED375D1369F606C591096086AA37E9BAD2B4DE2344199EAB -1A9435041E4BEB8CE0FC53E78864E55EEE1A6E6CCE4E92B1C67D13D6D0FB1F93 -F628153EB9857ECEBF77415AE693593C57F3D4E76C56CA055799E6495E406A51 -073AA03085E104709B4DF3066ABCB45E7C3784480596E2853A512A772C576DE7 -1DB7056028D6874DA38CB6B4D00688D168D80F5E89D572921BEDCCE7FA4FC142 -1226F1F900872E91EAC1DC4427DF7F99C50BCF92B81638B2023927F92FC3A715 -A409298085299BC4BFD6EA8A97EE7F1E67DF740C08DE389FBD4AC1817C14F0F2 -919E73D99B5CF6209764D239955795B8B5F0761C092483FF96FD61E6530372D9 -222A0405937493CFE22D52B4526A45AFF7C3AB57153F802542E4AEE9E68A6FBE -5149B20449EE4F4AA47FBC0CCA17A489B48CEFB85094854B5F4EEEF84C7E5E60 -D92CF9C46D5095B8AC73C8D97C8B0507B3573756379A457CDE744B7385EFCC21 -68CFAE2165378F8EC2516E71DD89A62B0075937BA1B4F84A0F010DF2E5E964A2 -6903EA13D2D17B7B35D19150AD66F8623DCB96D043C0277C80989E59CAF6ECFA -D8BBF338EFAC34668D15B301110F7406ED65DB43B41DD438083F54897AB7B98F -838D2279C49A48C6301E9C8B616D1426BABF1DD99598B233AD30A13B5BEB8DE4 -EF136163FCC5C3BBAE35FAB402C3036C54F46EC8F5266C02A96D885660EB7FFC -E6A85A28F59F4473E1A3FB6B81664ECC7A35A73AC79D5089D5074C2D3A66026A -307D9C73187D29CB652C4800C6413B4EA752A275ADCB432021620C4DFA082707 -352ADC437DF089DCB79C7AEB371D864DC0D16287A71CDA2A958E56D37B080002 -B532E5DCF010D3B1A26B855FD25359A10F84AD3644E5D600DBB78630FE4E39B6 -4868130A1FFD534B9A4D2BDED8B0795463DF705EEF22171BA3DC6DDD0B07153D -2AAD6271E9EF6D80690E3CC1D958BC8BD09769805E7DCEDD1CC0A16CB4D824C7 -5D1EF88F46A08E53D67BC1D27204A185705972E9D9D23462A72CF60D2EBDC5CB -33BB54AB90AD5ED13C4138E2E89AE8CB5BC9528D90780C1E235305DE7713ABB7 -A3EE834577C8A81F05BFCB0D4DC15FEE6F353E891E7C1BD7E605F40ECA4DDE1D -A9DF8403483DD999FC11B68652830AC0BB8BF1346D056D52548D9F8180E01949 -3C4C5848CD5E5BEF564114D5429BACFD8035B80E19AD07D1460850618F18820F -CEE2992EC77BC22EDCC6B5B78C8F37E3E722CB691F66F1E71F004B6CB3F8558E -EE5E17E13A12FE5D59DAD2752A626A29B4AE021F9B6DB4B184EE9CA3F2BF7DA4 -0887D528AE93D547C4E7D8B1A3617F5A5DD8E067B29E88BCC5B646BE478835AD -E40538658779B671AF3A2E2BBEED302F6D5F42CDB3E0669406B48E1D46C1BB79 -502981331DEF8E4B51AFEE0FF9491FF082375562F5292104691887219C209484 -7CB6DC824CF415CA3C9D96EDB34A01904F6880AA12BCF1E1F56DE7A10DD12D69 -83FA9D950A425175F69324D1352AC3CCB76B09BDFB2950E4462CC99820C53B1A -CA33985BD0999C02DE84D9A348D25F9E361E57BA4CECDE862F7448DBA8213700 -F2C44015C4FE822F6CDFADB0B82D04F47AD18467195B3CDCB0959D60C00CEACF -8A1D1950EDD1767B818A3F57B0FA17C0101A2DBC0500929A29FC28C50800F47A -38043CCDB3F949C0D0C082929692858D08CFFD6E20652465A3CDE5E24D50DF4E -C7212B2E9AEE131B0EDD0F2E09457867F196EC7BACFB68EC476FB91AFC3CB309 -FA19C4E79430F9C343FB4DF5F8E6BDCD8DB0A2BE0A753E2265FFCC3B08D345FE -6AA038EF222E300A4707CA6F8F21DF2A9913E44C675712D5FBD6581A7718B67B -A83C19EB4044E9E131C764C7B364BC095EDE2D9DCA582C7C710D7AFD70B845A6 -E5A8605D5D86CC06E8023188501B08CB9AAED731F6EECB38A3A1D7586E26AD39 -283120121054740C3F25FE464DC2D5D00D4ABBBE26CDAC7B510588810D20E2C4 -8F0F3DA2919532DFDBFEE036D750ED0289FF00D7E6C0AA09F052C4874309EADA -EDCCA510BC3EFDD894EE7BC7E9F3539C6CCCAA3EA1D3DD6F305427B561C7552B -A02C193E21D95E0B928CA4861278156D2B03DD5F61BFDA4C57F3F9FE2CF39304 -2BEB3ADCB2A0B07210FA8D4477DC4508D446D9B2056B87702A517D083E2686C3 -279406D4E723558E527A9BAB3201E3A6408DE34A608C004C34EFC6136EE01E7A -7C52C5B48ED86BDC246979CC28A7D442C04530C9174EA9C125F0EF822C4D4A05 -A571C01B056D55AD5797D426D0813D8803E9E46630978B7712996C7F7E96CBE2 -A160E6F628CC27607B1BB5C5A76D61D0D0F8E93869B4479D63FE65CBC9F32F82 -E01C7DA4DFFA643305DF43544CEF4339F2248DEB0E1DD00728BAB0AE5251D05B -3B856A5E333A462E91480F9ED5E6431F56043779BD85A94C0FBC674CEAE4BDAC -006ADA1B24A3DA3FFFEE2DB573C43B3908707EA1F0F7DEF59E06C397F18FC328 -799423BC3508FAA5AABDC230039CDE2995B5B850228BD5EC32F5C5248F921C95 -0104E1FC2D1E59CE35F55884B6B60518AEC8FD81DA3878363C28C9FAF96019FB -2822AE4DD80318F8701DD49CD5CCB07A8740E8496251D1D6D30496F2C568EAC4 -0AC3DB6CA871F289B824E82D42A8E95AF072A304D9896F570395F5A21DBE11C8 -F483783912992D5336734B95FDE53DA67AE91CB9D9AF29BB8A52CD54A39D2070 -B996AB101C8EBFE4A04D66F407F1A5A8D0330E3954114E41D71BC8D2FE85D805 -D12A4AD9700F64A0A42E308E0F41E943ED427830E6D1ECE5A2A4F4027FCA6BF7 -F2979E60AFF9F4E6F1CFFA81451D2B508431505096D29C1002F10CD0A2434691 -D643F9C54926F866DE4EA2932E9345272734001A60330B2313D73643589309C9 -FAFA0643A869033E1B79E532C439E6FECA577EFFC89A78CDB672ED7EDCA17101 -7EDC42CF01F2B0D483690566A2836A0B96A1E9F25732284D53DCC9E54136D164 -6EB7F0A246319431B33C510118B5E93BF96AA2EA91F8EA047254F9E67CE8F7DA -7C5088149954EA430DE2BB41F40000C36913C521E6B9861D645981292CBF2558 -D14335C07BD02725418EFCE21927D10148F5ADA862A21938185F1DEE52D550ED -120DE6644FB7E51C5AC063E3848E43117B522D95AD7BDEA29729A9E85709CFAD -05A2A69CFA1544447D4B3F4A859C0FF96DC0DEFE78044A0FC85EE91D371D3204 -7937A2B9CAFC97219848E1A102A18682DCEF3D6FBA50C83D3D1F5CA6A06F1D05 -D965DD0BF0942C261D738A72D94D4ABE288E5AD81451B62456C01F1B568448A7 -533E20C38646A7B53119DF45A2E82AC51A5DDDE588DF23CDFFCD1E7DF01E6C80 -0E1DBD537D48269346A9FABEFB387845ABE11F5B951A3C9539DE4778946185F8 -86F3978D2A0FAB1CB1172BE2DE1CC2908872B03FEA2E71B6D0CCB8462E4FE5BE -2954CEFEB2A7522CBCF7973B9BB5416CD051B289984D0CD60C8A8BC59F245349 -8365315EE000B8A7F1460B15130648E7BDEEB73C983A1F9000E8735589CBA965 -1B3B3216DC4594A6C99156DC64CBBC906E9D9B8A46802CF9589546A00717F4FE -4DAEF735A0F6266FE8200B4B862FECE518B5A300BD9FFD01FD71272E3736B78D -91842B53C27AFC216C014AD8F211D924E9D41427EEC27E24B5C7B947BFAA66C4 -1CD785D1012ED2A787A3612CA3111694728D85756D003E2C18B69B58901785A6 -FECCC6DD966336AFD8D6F2A524E46567AA13A00F27C2CC69208500C8BFE21716 -27188E8D93F36DF766A29811120BA00E413269E47F057C5EDF7B750785409CF2 -9F4ED976F82CA0411DD44F11B849626D12D320DA6F95B68504FEE499B64C0A4D -14076179B9EA36B7EDCA5BD6442974C7B197F78B859E4F9F09095869AF7B44F0 -DF16566A0DF4142A2714C5F02B5A431D5B2ADAD0E0A5CCB7F425A19B15AB0CCB -8A93C64739655E59E16A1D97B3E5B6056428048B4B01DC0C8CCAC8BFACFCF045 -140241AEDBEC878FAF85D7DDC3C99642A0F330B484E00927129B6AA97121639C -6190F0EBD3BA37CEE372DD77A9F1FCBA93F45FA21E9AD8ACD837C780946AC54D -A68E986BCEB6BD70E4DA8CA42F90994C3DECE3B35875C37C806B0CADF2C76EAD -F594DFA26AB52008852E67C0BEE6AE5DA64859234BA355355DFC78065A83CB86 -194698E1CF8E13882A60A0D4B0D08D20BD80E310032843E5B441EF80BC4FEE11 -0ECC4B99F51116B65ED83F928881B0D1E0530FFAF622E99AA45D974FA7874CF4 -AF5FA16311486F0EE103BE0D70D28A76A9E4E1930F12CB9B0E43171EFFAFC4F5 -140F958EE7459E49456D3ABA60DC34AD716461A1468D9DD58D10DD5E5F915A9F -90E4F73CEADDC166B3645B0039B2CF24E8DFCA2D4A9261C7B13406E12BED3959 -6AE277F9FA06D8C70E1EFA74906D15845B3FE13EAD56F26E7EA97E2041E5D05E -283215EB8E5BAFAB596D43DCE4E7C9BA1BB5A4708CCFD769194390F104B1F209 -A1916A440E9500A4089566F29BEE23F9F93C0F3259A4B66141822394EAC11858 -A735368ADCABCB4896111445E253C49E3682641EE3470EBBA8FC08C55B8D540B -7D8A9FCC205FE1ABD98934CD76E0F2E3C041EA680BA7869547A1F337B3AF2E7D -1F293A6604B53760053B88DCAE2EE141946CEAE5D3B38554FBF17A6DA9B3FA0D -CC9AF77867AFB98FBDDDEC71DA2B392C9685D98AE10162A0C5F74EB774CF8485 -DE1ECA689996FDA1F4BEBC93914BBA88C68CA9BC146A8FE198B73C77F2393B8C -4B0718CC95051FAF56755A2EEB1D361151C1B861C8B5259713A8BE80159AAD1A -80D342F1D9B1378C15DE0E3CECAB0003B8F35454BD40FD3BC629CD89AE4C3F47 -F03F084775A6908AC1E086F17B2803FF5CA178A43F21D0848CCBA17011CB1F23 -3969BE5517762825775A8092E3ACBE1DBE58804F67F689EF82D9351E2A2E70AE -2E5B14041857F69C59CCB86C7A8C72DC54EF4485D6CB6D69B959D652BB5B7C32 -96F25817B29055302404CBDBB20C054B733C78D01A181D85F074FF168F837491 -C30F9857F4978A316771B26874946249144E9B897E097C7D54301F00E49FE807 -DE4AE0D39F5CF337DB4CF6A0B486D430864B8559CCEF874B2275D8C507C37F5B -213BBEDA0A601D422537CAB32015D5B53188E27B30259B9CA3BBBE4D77EE56BF -7AA6C092C5ACF3D3EE5564BD91E07D49C8B7C6E5A91B5E7AFD2CA6169CA23C55 -8FD406A70A7DADB1E8AF288AAB6C82790E797068552C8943D90EB9D40F5348CF -29A6BF5C19487311B3C7AD762C7A834EBB3E40A0CABC55DA1BB28E1B6E22C9CB -F8D2F1BBC00AA263894111A5C617D38A053903CBED807628BE9299848D5ADFB0 -630010AC64B48E362C9D69CD26BBD2FA5A9D6179C365195DA1815C9C8EA4E8AE -72FFD695DB419F1CEA4FBC04086F686F71A19B51AB9782C05C8572DE63B06B86 -0CB8697C2050D629CDB2BBD50F53462EEA873D9BBD8453FEB75E791433E59446 -1685A92DA218EB49A2EFC7B7E44285FB960B52D13529FFB245224CAEAD531915 -74B583979FDEFBF9166F4D2B570F14E752244A892BB0EA06597A0A737728683C -821EB7E4755AD7A59DB6983B8F721F7B1FE79316B3EB18ECCEE73D4883E69FE1 -48A58C9C2CFFE6545AA0186C1F75DD99AB87147B5FB7DED13A9E856585B1C221 -CDEB59AE15C737105FED64CF32F360C7685947703D5C727FB71AB789B4DC39B8 -F48DDD537D200589010DC21172878332B92096B9B9008028D52DC32D533D4570 -0BC551851ACAA9DEA8EE1FBD1281D2597C48386EF526D4AA194F6399C50E52A2 -447C82F5E9A963B8002126382ADE1D89143D7A210B8161D55180DC7257345554 -C951A4DDD81A586F2529EC7A34BC12434DD673B9BD775ECE74389BDF79CE3D50 -54FB70012B5C961497D01A8584E18AC73BAB2E3E958E765B5C0270D9DC6D80C7 -1E879E993825200221A13A818565248E0A6C7C192419E77DED057B081EBE725A -A696E39B2B87B75A7DC6B5F0E83F343AB190F45782054A7F2EE822AC2704A641 -563EE2A5E8E04D13BA7FAD2EB13CF5361EAAA6973051FAA8A5DE4BFE9116EBE2 -3BBD30D0A39872E8A1D34A9AE37273D91E4453C098815A6178376C5CADEEAAC3 -7A492DF7823FA2198871ABD0E2FF87F55E475D51899E915EBD0A2451815154F1 -4A6C024D214F67762BD9DD483FA26B6BC81ADF3AF215939019313B8547D3A8E8 -69BEAA3B27D317A2446AB607CE40E067273E8456EA4B07FB2BB07FDAD36B463D -F9398066AC18D59835B8585622414331EBC3925F6CF4421614D9ABD92E5FD3B9 -ACEEE36DFBA857EC8902D109B78BD6832EA9B3AFE43229EECBA30AEE9A9EED9A -46F4898797A8DAE70923FBEE4F9D936B4AB30515CEA4346AE6F351F7C48897C9 -2234FC06DD4C9F57585B7355B817006ADC0482D5FEC8DD665192FEE0C3B7B126 -F08C6FD3881ADF43EC2642B202D59A9A98FF082753EBF391C690CCD5A0409F27 -10DEE1EBA0635A057011325266A9AB924E33F17538234E2BA96D98DBF049871C -EE77458D506F6A354767EEA33D2412B16F0A3412D53FBB3AB420C1E6460AD70E -6B85912FA9A4FC1A729119EC9609D038E8948E8846F118C9A12C8A03CD691680 -49D5C12C9AA4AA35E48E658C8B3262F4C56849DD84CF8744FB5734A39375533E -390BE9CB7CDE8E04A212EAB8E58F9FCFE2C2D547F1B7964016971AC30BA2B8BC -89E8898809DBEEC910F912D1EF195819931647021AD7DCD57B17D8850FAB41D7 -9E8F1142B4D067EE0B8C0D7C90476CE63076C832DC2972CDB3B9C22DE6AF8C59 -306FF6DD83A005AE5236B1BD42CD0E32FC44B156C47B0713B94D0E8D8D04C7D1 -C4E6CB68EFE67526B017A81A399C4A0A87F6CA0139D0BC414671B90B29C51601 -8CF69066AECB360D7A1513D56E5A673559EDF06B66E17256C0E5CD09F2386E7D -937619EB018A4070F222959D217F89746478AB1568F60900367FC0BA3EA68919 -956D6990CB0114119F5015FFB3E788BFA9791AC03A2A954F8B026128BD2250EE -7E47CE5236EB13B7F144927251B207B502AB7C0B7AD2530997F4B6CD0D10765E -046CDA527F32B123BD3FF3B57FB5DD25D5FECB7D4030EDAA610B2975E7D1D539 -908E0A44A3CC6C5A35F5DC94A78158B1640C2BBB2590D2971728303E59FA956B -7028C5025DD0666A66DCFA45959743504598092EAF64F346CAD55B0BEF469C42 -98340240AEF816317A05F5822FC52376CDDA0FD6A5D3ECDDDCF04AAB183BFDAC -36774666B0E5E44B4EEDAB9B29B3CDB31A4FCE80F650018E17814E29BF6B5F08 -9332233436138D385E622EE570AEA29E4ADF8720CA0496DD517AF5F42E8C8A9B -E2663BA6BED875914553E7830D1C176CB77224ACAF50CB81AB31B775B49358CD -958A3A65618E26A660AFC91E79F3D670A6E3EBC0423A6B4C140F9A6247401C8E -0F80E40B57 +B4DFFB173C424B24BCAF3C9271A54166A65927519C9770B0DC44CE276ED0C20C +8EF41AC3AEBEB0996DEE664E8F872023710D0BA81DD3A3EBF79BC24717BA1280 +9E9CEE362F5BBADAF6D8200835311B1063FAE4D6EC8325A694EC516AFD24FF99 +EEE758AC14E76FA1573462BCAA75D246AC363C412185D20CDF1539011C35D1C9 +B3B3717F6A37DE522943CF9B3D8CF284B4C0068A1ABD9B58FDFC20CFDC45BCA3 +DD054AF00C18CD7EAF8DFFD45C28A82C7B417AB7188BDB49A5871320B2EFE0B0 +25CE25F3BEFB53856689A44D365C55218190B407B7BF9855ADCBEC5C0094CA63 +11E014EAFA0D1BB324D3B1D94DA4A7AAE9D29C71E2D5F122F1C79726731FD066 +6545816A5E05DE1F8DEF865DDAE0D80E9AD0120A0C81384AFA5BCAED3F8FF80B +B9F8C8A7517A3863034C312BE64AEABAD77A5269253883D460DCB2F0A3B28700 +255BB96397D1D613A14C3368C9F27F3E42B887108793F4B12E2233E5A3620BC4 +F886F124503FE64421C1A40C37B25127094476713D39EB73004CB56E877935BF +BA0C7B095414A1FD59CA11573B86EA32E297BA38B907938B3A25992F0563022D +CF54FD863B8792EFB58A27DC2CA6C4DF48B9388F5676CD462C1AC745488F6BA4 +2B923427A7D29935417E010099FEB69B16BE5A2AF7B4883BBA80815A09693AD3 +2B78D3A939FF18798043F7C88A76BDD527B554BEBAEF922FDC9B381D72C7CD3C +49698A1444FC33E276D3B9263CAFA375F1E64C8B39C89D4A65FC42A7183E41F4 +1C3F0CF7EBBE5260F862EBBA059765497817B8597DECFCDDDA5C1D15AFD3C3D1 +6F1A8E43709540948B1E3B41E32AC13B469222867483B0E765FB427300AE9BB5 +4CED17DE5C45EC8391687036EF43D57835CFE689B99FA0B860E3FAA6471417AB +BD505F23013DBD726BB5645F3006BDAFFD5ED0CAA7428EAFB448E0A30F8B7858 +311E3FC16FAF9FAC5E86998E4954AC4C9E32FBE6E9DF280B457BE80DDA2959A4 +0A874282A7F9AE5236843298C26D5D4160A4554ADBD3EF0254C4F2D108D49DAD +E1D1B996D5147560D574FC238DD005D18CB32A6CD73C265F05E0AEA17C73E3F7 +2FAA00290D1A6361CF67EEAA68800D9212BB5B8F0259FC8D133A21E6BD375FF0 +4BB0FB1E78F065E51298E97164C1FF241336428932D1AB97E1D0ADEE93BA8903 +A8124A3169AE0B905465D7E8DF132D903C9B4C64074147F2BDB1F722BC261E10 +D366C246E8D664CB57A92883CD7174218655BA68D9919D0C8678DC4E7A7E66B5 +DD7DA4E011769991DA9D93311A06A623B680DDCA32B287104A1D7BBD05AA061E +019BE06684F9BF987FA635B9764DCEC3A3286340A7D50355663D5556103267CF +8CD9DDB4DAF109C47176A1E9443F3E2703788B85B6FDC8951783D08F02DF72AB +DB5F8739B2B9B38CC813796F48FCC21B0CFEBC8F074E464989AE5EDDEE5CC3EA +69C281CC4CC295360FC11F67AF3746CE3598A215FA109709A4B193BFEA270261 +8ACB9B7081A9D60CC49AB3F25B0B6F922672E58708BD707AF7DF35E32E7CB939 +CC25BE8392B3DF687FB67F25342671FA831264230CA39D189AB6267095B7CBE5 +09DDBFD5512A8831DFDCF53CDA45E3F0C097C0C4DA1F12589F7AB3D83178E9FB +2E9B5236ABD35A872EB9A37ED9545C6ADAF8FF2000E67AA8C8A8E61C9829F29C +5555FA19BF6949AE81487EBA68E8ACB6244ED2EE8CD537155B68BD1305FCE20D +710147B9AB3CCF6BBC0F2C3D8D77D783ADFA68B208829F05522211E28432729E +AE8A8C09C04174BAEF8D560D62733BBAF506D2EBA030AA77F18A38EA8E98B38B +C03B5A3C33A7B36EBFD1D55D503FC06F19056EEF9D1D01CE279D2BF23B04E880 +D6873E16AAA583ABBEF1EA8E5D6C3D038738573081E264C01DFBEEEF02B8844B +19BB8D27BAD7354AD310ED720DE2D4240F3106275AEF6F7ED61735D799306DB6 +4A3BECE20525769A0D99EB90D957297D5913CC48A98EEE84FEE5D02B30651CA3 +B7573DE50F1B9D8D50E5746394DA8C5BA5D71CF1647F80BC9337F00EC31476E3 +1019B41BD01DE7FD55886402565F688D1E09810DD8AF982032B048548D87AEBF +B20C6B938C6D8F96C2D7B42A1E69DBFE6AC28D166804E03AC698B180A48503D0 +0549D2DD2EBA5C601841A711DBE9D7019E5DE56CF78457F412E42CEEC248DC5A +C0F349903F745E40897D0331124749D0F9F9C71B704E4CB0898AC7120A880215 +236800020AC60B1E5682656534F3332C2DB06A7510AEA061D9206B4C033A80F8 +77DC8EAF7D32A7B791FA3930647CB1A29228DE62A9733C6AE072144BEFF15651 +791C8F99508DA1E3F8B451985DC68251044FEF9F91C7578A2F3956D97D544D3D +0E6A3F7719F9561B47D76612D833BDB64780728A6456E8CF273BB708FFFEF743 +CF069E55B1A871718E02778CA80A5D21597D597246C260AD390E5F4A285A5CCD +E55AE1C37589EE307C6D2E1DEFC605C9BC33511968CC8AA7E61F5390951087AC +F4376C5BC48DCB22D8F0CA6CABF25383616DADD012FAD655FF4198245209E305 +274D18A98D760203C8AB09F7204A967D07B75E7650BE0A0595742F821F74193D +CA0AF1A4875F50D1F3F2786C5532EA3913B3589215386E78157D6F38C4860698 +7DC51E51908A7AA304DF1233ABAE2B3C9B03F2496B320DCA5B7DE98FFBFD6FF6 +EFD2FFECDCEA32D0A7F799382366C6325B89C94B37CED9A1A1BC88602AC5D9BD +1BEDB8D5CD2D38FD1FA33703C41F979BC24F1609B3B35295CF756551F9F2D770 +ADC3D23C5B7C6A777CB33A06791EE8481BF577A94016A061D8AF8882466F7499 +E66E7E93F104E599C79CB6F76D42608B9BC1171A9AFAAD93E846008330DC3C0B +6E8BC7623E8693C1E7E8B5B8BC426B1EF8EE705D2E806486775BAC15660BDB75 +66BD708939D23762BFB8628A863C4F9978F83733049F63709066CD4203476CF4 +575DB5CA5B5F01D8E4DF345D78C2A938B5EEEE618507B2AC9EB9C4BC9B64CFBD +AECF052FA5D93B306C075AA8A645E5B93D1005C252F0DAB540243C7E3C3EE52C +0886A5D89A30DAAB4ED8F38ECE11217F0198347E62BDA7A1BEB6D46482BE3726 +33CFBB23A78756BA63741693D764467273078167DA48362985CCEA2889133C7F +A5B0BA827E92333BB02221F6757E4ACB8C2198BD7A976A29387CFB9B7F51C65C +2E151D1D1F73470B14587A6F11AAD77465975961CB77306E7793EDAC65EA7AD5 +E562F2673FBE78794C9D38659647EF5189F6ADD9B4250085A59F84C0448EE47A +A073B712B6B1CE984DDE3125960C16AC77098424004666BA6116A042551B48E7 +507FA464B21209D31C506D1DAFB628FC2AB30279E6148F3A2DFDD183FD770551 +0CD3FE854FD619E7D2B62A8888C300838E41744BA759EA4E4F19AD5CD249E8DF +74E81BFBFBEE42B2F67370B748B1B3FD5C6201866D8CFFF8D9ED127F43F4009A +CB5D9651587B54ACB8C6D410128362A74EB358437D0CEBB9E0FEA7FFC27A5509 +E799762B27F30B5FAA4ED3B492752B04702E48B1D0C55155157FD7B4E578A560 +5C0343A472546826E9B9B80E91867D2D4C3EEC02133BC338954AC6B58499AA9D +24CC3CBD2023E962D147618C08BBDDCDF36E91EC2D51D6DEB97A1477D8156707 +9C1B858385FBA45CF0FE74563A5D5A51ACCC3EFE991429A8CE57131AD56F352C +E95401BEE11B310C96E9C3CFACACA00114625BA7B4400FFBC5947574317E8699 +90BD8678107AAFFE1516A59027E9907359B61C6B8A97B4F99A338BEFDA2C25DC +D6413A0CAC46051E76BF732CFFCCD0FF1408DD26C76DFFB54F7745C79F3A7ED3 +1D9F8BED7C6977067E6C8E46EFEC63AE0D3953175A6E51DA38EFA2DEF475DD93 +1C34376F5C6C6218DF78EB84773361B9339FA58A88E96C646F291CEEF398D281 +E0DEB2EE21C3EDE0996427EDA0CA0A44247B1A0E03BD9366E75F763C9B1D2BD8 +00D2066BEF933DC6AB3586EEBD04E6D750A22978ABE902200200B468135B690F +B840BEAD5EF80E068F6F87442D93848684A127EA79F4A8A24DE737A373ECCA3B +B405847430C138E51DC18C367702E868CBAAEF6890FEE68A75C5781F32B96D86 +BF5A0C99F04DF2B7FE968B6566BD816C96D7EE35A863C0D4635047FF09F68302 +EF62B9293BBB8BADCFA64C6CD9024C4F739C8C730BD62F2B613C6E1923F04BD5 +62C556E3927411C2655045B9744C9DCB7F1DA9C1B5C70A145E9A35DACF1B68A8 +B5DAE1C62DF9220483F1DC721D559B87D7CD802AB539AF1BF3E434EBCB796A8E +378B1139CB3DD3134DE8F40C716BA87185D3E406E3C941D336A1436D891803E3 +D2C8E627204A343811FA82FD1A232FFD6915501C1B158E890C534CB94FCD9ABA +F64EAF649056C1198F0F58F56D3E1C91C167D4D9B4481D48A12CE297D5DCD0BB +8BE16BF18DE1D58F7D2587B70FF5734EF8391DC5F709BC39E729713CDCFC2EC4 +5E7AA863CBEE1CE8185E657E7FA6565EBD6868F478554E96FA808A708B48E463 +AACC817DF43EB9A5233606A402F3A83FCE99F73B8DD819A4D014FB435BA7F23D +F2AC40C473A34FEAF0A5DE457AB5A18A6CEEE95A55FF604AB5225C5C1DB6C6C7 +0C7647F075E5FD3CBA9F3B316887B4A01F1C2FE09719B4BD09A84C5A3DCB82BF +F5EE9FD0133F987FCF77098E0CB919CA7FB8468059FD35088B97705F180D5A19 +CDEFA29A02C5D3EC4893985A2478B0BE83B18FABD32654040A2F2A9BF7BB4F7B +5781D2A6B5E416BA14BDBB481B3D619B0C885CB392111E32B2AD6C8BA13E9F93 +49CC4B5A35B1F93B68A5ACCA4823DE44BA8979181E50A3804E43D6245488A15A +BD51999A729A20B9DE927F728E59312ABCF89176C35BDED4BEBEC14636B19989 +CB8BF2927C1BDF5460BBB09BA81FB83020BE4D4B69179C8E3B838D6763946166 +B328ED82B448CAB5EC2331CE7601EE8B39B334BCE11038B0EBD8437E5463C640 +73C5FACEA06A219AE83515674CEF03AA2F5FEACF656ADBAB944CBB237813CDC5 +06C303EA518CC59486410D65F5E5395DE84D0EBF8EA37633BECF5A08851B4758 +1BAE6460B2B67D29A8F88FBE52A26DE7A6E6D859CA00BF437837DC123C459B9E +43FB6DA6B79DC16C60F9035EE3B10E2CCEA9F7ED4FE29667E0559A3A34F6B550 +E4184ED8E953247B104DE7D912C5BF66F3259214FF091096DAD710C9F4EF531B +B4C6B3BFBB4715F3654587A5EAC63C917E100F37862B03EC240E762F2DF72CCC +9CBF233ED204EB966F6A34519C0A169EA6130D18CB8E53EE96B7A63C828CFB28 +45CDBBF7FD775137119B7C7BB2A665074691199B387ECF452A3DC5F859D4248F +3A02D4D65167A9E6C92E0A16D293ACE234C049D98E961D14D070DF2A7F55C232 +B2CBF0378ED83686DF80E05DD417153A3FB34A7B2F0DEFA69A34E19CBFF56D1F +14EB4CEFE99DE9CABC5F0FDDEDED79A50F29151294E2576CE97CA00F734702C7 +B94243299D8080957B7102AB370D5448226870CBB5DEA5A295D3D5C8F7D1B5C9 +44E6F16F703E4CD3F74B37AD19BB53635CC4801A317C953F2A131F82DBF39694 +FE552FC18B94EEFC490A579F263DCF470D2AF1336C166F0FC69D84800CB1765D +85937598431461E7B5DB95839BFA81D51ADE49E4242E2DEA4560DF41D27C7733 +2D1F036614FA1AB505537197F419E6722D4EBAF5DB087FCFF838E782D239BE68 +43AB130B26003747C36CFFE7A96CF8522F3F369E1E6443C923C4EF6616241DC2 +5366259FA9FB2559B5B797ECFA474D491E96F2CF07DFCB0765A1A7B0FA8EB181 +0A82708A93C8C8C2EC711CEB46D4A4D51ED42E6D023932F6C29F7E4D9735A5D5 +269481F9A92673E88970CD15DD2F532A2D96C48150C10854F3A98B200612EED5 +C2074848780E53C5E086AB78EBD0444A064C5377945680900997D1739E93EABB +520519269E2516C7757FFACF312E6725805BB2261552C760CB68A7BCDDA0438E +0BD4E6DD87C204039396684FDFC4398421E1D94B110F2831AC0DA589822357AD +A78CEF72FAB2EFCC848DE7C5486AC56D56DBD0BCB39D608F40E0981572B9FB0E +51F11778CDE7A9DCE029ACD63D61C22135CA5AC9DA490C29FF12165AE20F3127 +9D57AF7441F31659BDA2872A720100F3F63D9CBEB596FCC23FE1BDC7DAB26FD8 +00182A4EB8C9ED92B3BB9971AD01063CA67ABE06F51F66232545EA42AC145113 +1BB165ED65DCC3A1C0E288FED14706BD7FA08D3D4F143B8B3BA68BEABE09225D +2D0524B51E2D7ECDFAC0F8D66C7D96D885D0D87B7657F6134B3E7D0493E4BA5A +6DD7591027A957EF7E04AD08B10D93205A5F268E65B30242AD7D07C2EF59238F +F5B6FB46BAFB04D0E354072DD934FC5C63A4FD47541A4BA4B68E531E4614BEF5 +15AC43BEB87A1204B9BC873E9E79BAE958F4622077B7F7C2EBC0FFB7F7B6EA39 +C9D47152C26BC4A41188B367569A22762B8800E715416B7B396BB3B5ABC11A19 +C427DA9CC6EFAB2450C54030DC95A775422AF14156388FC0DB8901D3D13CB248 +B774DC8E8E36C7FEB216ECD93288F0520FDA6FCAC443C62347D680CFE38039F4 +1D15F56B06632BB1E91AA8E098EF73D8A054AF1A8E327BC6E7D37EF19166633D +1714371B2E916869E420A69BFC9AF4CCD3F1DA4569D3542AA43722748E5079E6 +EBDAD7306314586BB17C9C7FF0825D865AF14F0FB03EA08F5E2D22A97B9702A4 +8A169602A94B3F08ED7A0CF6B9288E35FD989F2D0020411EE777702C408920E2 +7A7F37E36734BA4937FEC3B14FB1FCC92BE0944C9D893929A63DEA8030DFD9BF +86C40A4E5421C663BEE7F2C29248B4839E441AD9D04F051AA0991A6D6EC47280 +10CEF96A41D329CB263A566A2D0C993FB918C6356C1249BC14BBE3B39596F7FE +DF719A7A9175B271E37F0C3B46B6F1A53ED40E6C3EA4313A7C90B65997EBD308 +E2F08EA3B7038E0694294BE05E9583BC74306255DE19846A692C0D0D64506C30 +F1E7B83EE2090F0B0C9A1DE01474DF9DC7D618193149E95DB2F6BD8C0DDE48C9 +625313BC0C265A6A4BF5FC9598EF8E16477DD19068CD1AB4C52777E9CBD2EF5F +99E28F5A2CE31E2924C196492A8E3319B1024C84CBD4FC175BE286F1F0829E3C +7628AA9FFFB1810C93336E3749A818E46206A3E415139064C9C7D004D0CEC1F1 +FAB611B672C0EB951AB9CEFE67BEB2817BE9248F887836DB614BD26A59CCA79F +04CA82700DDD8D792E89EA14D0B90FB3F8D6648090A39C99894C8CB638EADAEB +D9BC62555D36EBED36A39AD7601BCE938D26C84EB1A6302CA1111B0C362C7718 +3791067E2B506460D1BE71A13D02451036C4FAD7B917CC9CB347E8FC30EDE59E +8BF9874561A4B0E4235BBA799471EFBAAA64DC644958D1695526A86D56DAA3B6 +8AFA3A1AA7B66C840DDA7860072BF4C937B37FDA41922388FF8B4E3C305335BB +ED114714115CFE1385261C6EF0EC27CE200A0B2434BE519CF064FD5860CB7395 +C934A9D7B06DAA01F039DCF3318F393E22AA8CCEA80F58094F5129B06A5856C6 +9DB2EEB9B377135ACDD04876012CFCE0CAEFA831CDDE6B3ABF574573EB6D72D6 +F03D294CE59A42D5348781C90D1F0D8BDCF770E6989A939E3FD42A68D34E6B0E +A0AE88E2B52577B1BAA36EEA23071FCFB8FC4C41A8FCB9F8871F265D78B274B2 +D0D8F92D55011A124E037B5254162E7956465E96DC76D0CD96643AF172BD33A9 +DD48C30161EF717BA3AE6C7231F05DC4E330964C01F6BE6EE652AEE0AA41086A +B2FB3DEE6697965BF24EFDEB87D49BB4D617A10480CC29C978C953A0B826E470 +BC73AB39F4A8A94306CAC840DE844C60F650537E695C6323991AB9038DB838DC +0264EDB30E27E3F38B9073C8F7FAEEEF4B8285FDFEFF1C7CB16E43C712D78345 +813848FC335ACBA0768BCA0A9D57E99026CF04808F002FD842AF9DDD4E72BC61 +4997B2B39E28E971F60F8D96B66D8EB5911B8856287E3CC2D24D662312C238F3 +777745B73A30CF91BCAF4C6205808A2286285462580052DE31EC1EDB0BBDE46E +5DBA461A815EEDCA60F8D64F7A2A84613DEB4C4745EBD6C04DAE969BF4681B5A +F95ABFAFD2E9FB49A8504348551E67EB6EED4F87362FF9A5CC9BF06478E815E9 +EB946FBAC21430CF51569E331E0060BABFC7B21535D987B480FE1264A3738EB9 +F67197E54D9C2B032A06AAACD80FEEE298763DF5CFD00E2814F58A69A8643AB3 +3902057079A36C46D8ABE38C48ECCC6F7491D4D4A581A452C48CFC961DD8E85A +5929131DD9543262E81C96631C7FD7B94C724102DE9C365AD97D6ABAF44AEFEC +BFFCB5DB96D395117A665FD30A70E8090C3883FCF7ABE76954BFC07E4467E5D6 +262D9C949ADA532E94F9676D15DE90911D34BA384081A789D304584C688025BA +4F6EABB4ABBD427CD00FF823773B11F283241BAA9B9719808D7FC5E77FCFFFA4 +F95DAA339D4843AD99133A1DE37103F386B4092343814923FCC22A87D8A91F98 +3E72139EA419D61789C36D99A207600C188477278887467F15D6A6635BC18D38 +53FC280A6AF75015E003E2C80F312FC1D967203234583FF829FF13890D62FDAD +69DBF4D1AA69AB22A11A64662AFA11952042294C55F890EC1805936402B7C229 +F0A33C29453754544D92CB1E338AB7F3337BAFDC535CC93DCA0A049368B91FB7 +07670DEC8F84592CA1B4B8CF94E0D6A64A0DF9C0C239382D283AB166206B1893 +510E6320866A16450FBC2B0F82A38E460689EB07AD663A0785971D53E42EDD4A +4BA81BAECF10B93B346B20FBAA70E4D15AFEFBE7CCA040D982A92E7853D055E2 +065A09DEBCFA1B2ECAE26C38F8DBD378E976FF597397C27828EE0E6791B8641A +95CEAAEE1849027B06DA878994B70F94C835444F6B69A2DFBD6E4FECA5160C53 +7F12F395CBB410A6C92DFF74F8CDDAF64EFCF4F8ED9B832AD75E48B3F01DBFA8 +86D7ABCC22CA3C13603580C64B639948E2B74654FC8AF03B4F56BC8302645BB3 +B682950933DF6086F8641FEA62CC01F451312D22F4CC5804EDCDF981F6DEE997 +BB777110A8E8ACADFAF6428096108F535472D856AF4165C255A1B43342202F3B +A72C931CD8A966D1898B78B12B14DBC0D3663983A9E2153CBC23184A4FDA6A0F +779AF83DB6FA36FF6258473B17FB452EA4AB02F0D34C0B8C8E1FBBB35B680D94 +0201AB0D0F0637DDE7031FDD239BCD083FF5A28AC9AAB7271D9179A8AE589B26 +A897659AA8E9CA50ADCECF5D5F4D21C7142D4A85678466CBF033D883ADF819FD +CD27E3A6046F3EAEF987DD9171440DE702ECFD3AA51C12AEAB971FB8E3128291 +592A3619A00A4DDE933F960CF460C31AB712D12AE4A37357E42CAA235672926B +00FF510B7686F013ED7841FD01805D2496293CC262F80E730D2FB94EF320314B +2E9BFC65A17A0BCC2233F53ACCC3ADFFAE00F19277AFABBBE4D2E377BE54EC2D +82038A9D3A35D7B13744E468A1AB3D0231D394EBEFF06BC1D52F18430F7F77E8 +DB47FE2A958D86452CB7FB6FAB65198AC7507BAC92FF4F46B97A265BB80E99EE +B2211B9989BBF73B1753B4BD6730271DB7679FAF4D3B223839094C1C980C15D3 +2C9E74DC9DCE7CE0D48B1E2A8E2E3DEBE2DCF6FF7B8407FA88F59A8D572E818F +0C6AEF5B4A99F83398F97B162429D82A62E2377361853F630E7D0A7D728DFEC6 +EE39A9DAD89967BF1579C57AB99CD78DE820C407CAE52C2D7E65C97A594FCE3D +378AC8FF6F8867E8953FBE91D2D8131AF97821F28D6EAA5A9F025DF790FA0967 +2C0A1339E953EEE5FC75F76FEEEE780F332A1C0C08DD80EEF52F1CB7E02DFE52 +86F148A998753B27CB823FA9B4907B37007A5FDB8395AB3FEE7CCD947D1F6CFE +E81CD88BC9690E2F89F7CB130C9A2834F938B3D562A42CEFDC45A38E6BF62ADA +1517974E61F6D35267795C7A9E945856824329B14E70EB350C997756A8FC0A8F +7CBABC48C4AAF0A5D6A8F58AC190AC3F980C00D93FEFF1539D417AF2DFBE1021 +2882782C625D2BD323B9E0D53F1494F8CEF84ABEE30CA90C251887075A697386 +89F38001C3B2FDA9991D9A5EDA186C37DFBD0A77D47E24204981DC0A45B3AC66 +DD14D43A8A9826A0BBD96FE2279638F5AF12F010474075C381BE0243E3217199 +ABF00214D7D13F66411A6AB4FDBFDDF295163DEF72E788302F63FA8225F08ECE +1F32D71BDBCC1ECBBC067187C9713C686E3EDF304BD3C58981C76B6943E66F34 +2BE57CB3145FE9A286F570074DC259CDAB2A415DCFDCAF46FA3E195FD43C38F5 +A612D653E3F178E16D9FCCB637CAC9AFEA648AF52B945B9BFE37F241DF9DDD61 +5425B37F903B079F337E8E15B70CCDB8920F15AF89538608A573E7C9008BE814 +FFAD305F0B94C7AE5F3DB35D34C04C1A250E89C252759581AD933896B468547F +BF0AFC136FEC40C7436120A944979C9DB4D492A52B0FD658E8083E0EACBC60DE +67DCC01E3F87F04754223A34732D211B43248A5A5BDB19992CAF481A564DC9DE +B16CABD3BBF40BB4F84D67015773F7261FB175806DBA97597A0A8AF8920596A1 +3C77C728F23CDA310161CC8573ADE490419AE08CEB622DB6883CF0B75D43F0B8 +B37715EB9AFD9CBA33DEC10BD2D78E541499738D77A6450B93B795EBAD5F44C7 +311134D264B1881069ED3422281C15D1822DE565FF7768B80B58096D5B03D168 +0158B52A52B7B5B94609793DB02F8EA785A2E0A039FE4F8CBA3CD0C2A934F2D0 +A2F862F75093FFB2743748EAE9947B5D9F56CA0D67ABCC01E4432BE67E22DE05 +39664D8D7E9D732A897F03DF889A0D3C09E60C4F3A3996AED7293B8743353739 +DE1D41C5FEDC2BBF6662BFC35660CF8EA4F2C0DA06AE90AE91A9E0A8BC94D43A +B79F3778BB68BB937032EE09062E1C4611EF8E86CB7007F2AA7DD3E46A31AC00 +8CC36771023DE9E9BB5483C051FFEF412A14A65F30DF95C91990408BBB8A1E6E +FE801BA15666D3C270F045A8178BE9E424998653471706D0D86D49967771961C +3F62F1B6F36652DE97526AD89E748221893C9B6E5915C1504FF46B6CD09D85F5 +57F881284D70C35BEA64731C99C0D865E2E9C9FFBD50806164157CE198DF009F +B560FA76FD75CF742308B01F8ABF13E7F9DF82298FE454C1F709387B6F23C306 +61FD8651CA2F51C5F28786D6766B4339928115601BB265F6895712C39D4EB75E +1E1EBE9BD2E808299CAD5092397B7AFC8B386E992AF8A47FB618101925514570 +2CF7F3D9418ECDF120DE0D9B14BA35A19312BB4C87C9A1862E7AC946AAF7E0DB +9126282D6813095178325D6F7510550788D387CC3F7936E5BDFC55543FC2AD73 +0A47BF75CB6B625FE8F087C3E53330DA3EDA69BEB3601FE3223BF111C6235FC6 +8ACA71E69693779A68F93DB849000C3915225B007E9F1A64211A66634F67247D +CB39A389107705AD40B0EE4D1E1AFB6B6F6E7F1D59D12847F748BAA026367172 +61FB9E0FF8EAD4609047340623E92C4954683F777B761B09A1B6E06E13977B66 +B7D5B557C9E0682A0E4EB4B04EC5191E68ED14DB179A9E167389023CEBD2F046 +05B7B10F352B91FBC1D499BC63A8B63A782692732DD2C49C0532E0D98BF9B5B9 +F1EDF5A5E00EA42DF50F9FF5700FA06DE26B5EFDBD15375BFB87068ABFD6101E +4DCFB11A4F6CE0A126B1AF08A0DD21B487FCE447DB919FB215BF614D5027E67C +CBDD8B631B0755EF9B2F6E261D4EE7D892285D1579F3027F9B04BCB1DB28A8E3 +BB0E83592AB3BF25CB92A3BA038A91C5854402DD5C47E1F535750D1090DEE1BB +A5AB0785C67806FE7A4D1C7DA3A8D40E5F8EECD2DB7F5221ECC3AAE50BC607A5 +6B91C718E2092102B2958EEE11B3FAA96868D425513142D1C374886E63A705EE +6D996AE31AC5F89456AD296DD490CA6E63BA98B78E4E9FC2AB540F27D47BAA6D +C8BA9D2F10FB380F3C37575FDCAFC69F42E83301FCFA1DC31DEE29087614B306 +F158970D92374D7435EF08EFB3B32BECBC3C6C9FBD42951801B86C715A7FB306 +65B90CFF9FDE5AA20F20BC8DA696E5FE7214E98F39D2EE60185F926027A6CD5B +960579744D143C1A7BC8BDF10C70003858B2A6EE72F854CD35ECCEC8E92BD664 +F9734FEBD981C41DAA2A42AE83697E3B030C9E2C6C3969293D324A7D68274044 +487004C3F6FAC5B64BA149DF711EDF2F17881864AEDE3E1E4C3147BB3DDB4ED0 +2F79305B402E76F974CD56CB04A4B562DFF36B40DBED2F35D38DBCA5CE8DDD12 +70C28A19C891D126927DAAECF16B2DF41802882956716BDBB442E9F062DAF65F +6E3808CF58F9A4912209644195F04B4A5B209314017E96A700903AF6F4A8E8EA +6CE36F67EA9139F816CC75A806C3585BBFD882F14028770670FEA22F34358E0D +CD9626705BEDEB3A0965697647220C1962FCE67D0D3E2B9FC5DA3C3861F84209 +C56B90CC792B95076CD73D35974433DF6567FCE72A24162B434208A79117055E +53BE3CDCA527E33638F940BED805EE57A3526186F80ADC5B6ACAEE25E2081A63 +3E6D985A8A6256F923B971E34BDA04D21EA99D34095AB201BF44B62258B19ECC +45149754F896F64FBBBA939E41A11082C307165C5EA32F7C8CDEB80851B5219B +7A680F7A8D02C9BAB72FE3B941E324F554E34F5DD5E4936250A82DB846F5966B +779F29A9A4E53BCEA49CB4C6CC7D0034515E9F7B357B6AFC0FCC6FCDA1A34B5B +103062647367EB77762F6B47773264536E40536C5DB2985C3048969F9D6C698A +EEB959112EC964BDB8DC3C6F307477C2615BB536C03E9C9B346A7916D1C69C0E +116DD955FEE0B8F6A0B476DDF245B7C901473A96C2C53DFB5BF4833F984F4D42 +C06B6751BFA6D96E9493139AEE7BE7839B8CB2290735C80542C40D266283CF68 +4DE60FABB54F29A930357CD2AAA60F5E85D1E674610F2E7C280401061AD47B55 +5A1EA0B0196423DD4DC994CD41094818332B99FC9218B2D628E86983DBC5B842 +AEDB7362D479C940452A947973C8BCCD46588808F0F9FFC55EF2D75C1C075BF7 +FE6C21DF51E5F6B00D807B033ACD1C7C6A8B3CCB7332E5ADC93433422095C0C3 +8CBDC619DC8EAC0382428C88443B16ED0DF49CD042D38082CDA4DFB035CE50C3 +9271344F46D3765ACA3E1B2942215F559EF1E308DBC2AF0659DC980F5DCEC6DA +B33D596CB3F26EDD5A11D6647DB7AC5AC4FD41B62BC353356CD12DA5FC6EC2ED +86DB312ED5C8323E1C766A0108ECE43C11D2BA0A63F1BE2B0A9D40EB995647C1 +82D5C9FC55169F50121ECA94D1953CFBF9F38B1FE0C7DD8B786902A841F24A23 +B8762B929FB5AF021414A5321C7288BCA19A240EE15D106043DA19354C4EE1B2 +434A967968C29B9125BE84A907D22B0BC2A2CD09AED00F3CC3C5C7C9AE7C906A +7050756D4E67E11F2F2C14DE59A92C013849CAD0A1B6CD32C0CEAD2A4B20AD3E +ACF8CE2AA125F1EE154B79690659E1B90563E3884B47699AE1F7A71579C3C4CD +B66E6FA9BF98769452C5A2BD8B54112351F05BB77D3D3E3EE9250953BBA94EC9 +C0DAF20B0606C3CFCE4815A876F9CAB8A9A2E5662F7764050A0F5A7852B9AE4B +5799C95B8718D481452AB4262A843E01CCE943DBB8377B7052FB397600962A01 +25E5FA112149DF197FD9C8F16BE5819096B87CB3555969026B8A5F4FCDBF3171 +BB1D5F36E7CF89D94457F4CFFFECFD8BB3E009655D799C4F262FBEF937E5107A +511677585FE4D4560C34F03183E6293EC2BDECF5DB400CD1A29BA1678083CBDF +EAFE8D078B72B42BC1CEF9FB5FAB5B2EAA044F5E98D99D9B907A3FE4E1BD4E0A +2B845C58D7D0119C323AAC85463968D97A651A087DF3B6866EE0D09BA5583D8A +8DB9837B487DF5FA27624BE3C7F17E6C734D294A1D200D971EAECF983A0A2378 +BC2FF6B206A5121EC01229C14E0C22CFE7371AE1007ED8F556B54347ED545D05 +EB488D7DBD5F668F45986703122FFF97A19523731B7D3CDFF8FE45ECCF2B91A2 +0907AB03E8698E0E3F6D846A4417B9F66703DEC16AB8DE158431D3424BF6462A +70085CD88F8BD3DF2023F0738FA6E3F36E752DBE7590F6BBFE1BA8092CB69B54 +BA30D871F6200BB9CEAAD3D6A5AD721FD4A48D002BDFD8E339483D6E32ABE379 +914BE6B673F6FF3CC20BB2A971184433A714E802CBAFE2C85DD5F0E29B5F9459 +16AFA7D594B373139006786FB5B8594D50C91217D49ECE8E684C292946D79658 +A9BC010ACED5F757796BB9C32F98409ECA6511351E340C2C9E3CE2AC1007A52E +95E6DA9F56E11D4B0586F88A149FA8A2BE78DD25F89BF504A99140A7453E4C3B +EC9F94B300E4F6AB24C4528E029DBC0C61E116BDA8F0AE3108E3269A76927509 +95B41AAF17DB3759D04E9F0E7CA4863A9A771A49293B1EE6CB38E33A125342D0 +6C63AB27F308D08F60F4DEB8C0A335B115D25683F8AFF549598A3B1E88BBCBFB +7C418723054B346E748DB987ADF0EB40FD0B8FAAFE5871EDDF9D68821C8C9643 +7A3EF4FD3BDE591022C83EECE829BE8189C6D819708103BB96A29CD107F416FE +3230C3E7E358722AFD9469FFF2C7FD9DEC35BE527B99BAFF00C799B99080BE0E +C88272197BFDEE472E29D1A197083F1BF10324E834C9D76190223E095487AB37 +50BB4FC92179754DD1138F9A55269137543FDE3173BB57BF3E5A2C42F5C58536 +BF4FE748D9033B0E319E3061A7044883A795BFF107E9C12F2449197FD29A2BD4 +C5B7DBC42C28596D43CA57E4184250213D3EE5D447A0D8023E2BDCA6B095DAB2 +3094B07797FA4AD49A4BC874F462D46F9DB4A21773BA0181B3482CF9235D9C78 +B967B280FF82EF3938F51211D5822F527127A5B4D7D643A443581EC8599C62A9 +A91D57B358D8787A39DFC4AD363869F6002E1EE878EC3573521ABBA11B6FAA80 +2F73E889DE675B42463A8488C72AF383482D6509F49786ADA521F76D93C4A91B +7A5B23417305F5F89FB34261C2FF16B3BF983B19DBAB9BB6B1A2EBA3C2AF80C7 +450248EFADA22E1F8D18CBEE599C8D210498432C47CA067449143710A73DA7C1 +38C859665D0D88FF0E4ACB573E954655B5DD4B8C7DBE9B8A3B2C4526872CEB80 +45CB40C3D53F89ACEF33BF54BA05439AB4137D9F6A5F7CC983CC0344216AEE0E +2BCED1790BF4506A8908E1D7AC441366E9938551A962C6AF4BF5E2E6B706CB0D +8572EC4AC8CA0714A5EF6D4861932F42509F217477AC1547A3F96CCD15787A6B +B7DFFA17B0F44E83A08486E779A1E36B7748B17F2D09FE6D7717E1CD3E306004 +F69F2EE47DD0A9FEDA1D43558C8217FC810C109B8E55446B6F151D44C08FC996 +63530C24C7F0B8A59AE9FB7ECD212902BD8E4115A6F6411266A57CA3F7532E2F +C631F18FAAEE1F1B7224B598AC585A4279155501B1BE29E06893A8C56DE80D66 +4D5586C74C54B88D1B61602D44CAC618E21F447A3A17123F9032AE7B7854C08E +E63B5335540A7F4B36DCD11A47FC8E672E8EDBD9BE813702927FA8B0E0715943 +E1AD81AFDA2350A8D9C05295A208EAB36592672ED05E16C4D9392B3CDC1EAC2C +526F600BACC7C2F6E0AD1283259B1388E83880DF85DC9790DCED3EE2CB06245C +3FA795567CF8F6E63059D974D5E2DA8B5262CBEAE15984ED2D6FBE0C5580CD20 +05640AC7C4D28C5692D3F814A1A90A7BA2633A68A7A9752AE74761AD428B19DB +79133438C8E0CACA1624A5780A14DF07A74003E6EF75F75662EF6E817223BACB +0B0B47C05B22016F6EC2E518EA8AF4DA0BDC4B02EBBA5D746CCD8F698E5F25CC +47184CA13E1670BC214C44C27A70CE6DFBFA31B6C82B015C1A4F64F2C767960D +E2E40BC61F84B19C6F874381488053602966F43AE5058C0FAD7FCD563D01DC11 +09C7252BD1FC94D7975F72047395F685A7FABA083130F64B8DEA9029F14C6AC6 +874B97B05248E3D6A435711263526F395BA49D30A21D4AE548141E399FBAB5B1 +6EE081015FE3C5663CCC484B8B4183EFB92E69EFFDD7F01F518569E03A72C4FB +6772A0644FA922FC56B0B99B1F35832A11D929CAEC8280793D062109E3BC57B9 +43E01331FCA8548A573FEB914F916BE1D06D2561296972C28F6AB92BD7C739FB +B1D5251FC46E2ACA742585DA6C13ABF373F66B51B45B44DB1471220A3C5AC33D +B1CBEA5B541B8C1AAEE38ED30735CB1C12D02DF0F6770979AE08BA566887CFF7 +54C4AF9ACC382793D4BF251D09A088691EDF51E72BD9BF9F2455A8380D40723B +1D90B78C210ED9972BA6BEAD25A7B240219C012E3757353802DA6183C365F51D +D94C2C57373A44EC5C422D3959C140BD87F1271405B33BB9747A78E5460A96DE +2C1E98D4B4FD3A15E10989FAFBBA5C57644D6206CDB81493667B3E4FD684F3F5 +8FAEC6F36B47625DAC46AF37D9A04536EB5D64B84D17FA194BA862BADF76E107 +548B078BD5DEAFEC764E789E6CC8E78039801CC4716FFF5E7857B0FA3BC31CA7 +E1AB37C519A9EFC58DD1D3926226A3AB147EEDF10D63CBCDAF2DE66E4356711D +EFB9601764562A81D21D943A01AAA3D814DA167531C164BDE763F6E3D619FE40 +4705A2A03672929945500B4D11F01ECB2B09CED1927029D49A9ABC19B23463EB +0FAB85297CE11F97C1D560C5CFD27691E39FAAA95B468A502988BA484664EF88 +2630187E829EAFC67146942DAFE5DD566A72FD6BF32B33F27B383ABF99F9E438 +C30F7CF8513F209A6B4E76F16BEA603005E8F71C817BA98D25B415B930988A1D +4EFC4CC7BA7801869D53863261CCAF234BBC398FFC8D7F736F231E77DC9C0EA3 +1AA359D0A1962649825F59DBBA3B5975D70B2D6FBEE024FEBB2908E47858568D +4BF000D59D21F549FBC46726878B0123BC5F2450F60B092AB46065DDC9BB7D41 +8E3CDB9982369E2CED9B88B58D47A94A108324E6BC009395CB656230FD9C5EC3 +8631D1F70F5B29CBABA91706687A4EC238AADFD7BC3B43166134AC044E72007B +8BB28A578560F256B2C9F818D948CD3CB57E351BA8F34834C164F3AF6F544B64 +0DA5FF8D23E70669BE37DDD66EDD81132EE4AC92607D6309C5CDFC6D800FA012 +BEDEF9E53F5F3DE3B0955FF6D7F6AFAF7C5026F2B989F8103E4FD2E39176E5C7 +A50333B89EC266B1C39E2534EA4AB75B62B90962065D26D8958DE43A879FB0A6 +316D86559080C6048BF798AAB878E578673FF67A92741F60CADD40265C658184 +A42E9B85997CC8BB4696F50CB08AA5F0F1A658041F6C32A0859B99E9B41A0141 +E9EC90FDA5A358995A7FE0F8E7D5B74F1CEE7C6EE8272B35BD242B5219AC103B +CDD20FB4F83F7BC30E2D0DC150B036CEB93C92908D53C6FD6D2D5BE1A1EB1596 +CD9374A4F388507EB1624048C79366F13C1319E410B9EEF4F33C5BC5BA7392CE +852B8F2F649AF0781AD969BA91CE623BAAE3A45626D4A6D98F210C30C60DFB30 +72C19559C54ECD9FBE406551B0B3C8B1833A8834E1BFECD87A20D90B25F4859A +3A7A21054BD82BD20A3E2112F447ADAD7BDE83EE87ED04683DAB283627AEC13E +450DA15C25855BC4ADA345C1D92CB5880AD4466DDA84568FF703A824A8EE8E29 +F0E221661D6BCF20BF046F80C044A860A2925E96063CCE02D044DAA35923E5FF +6DAEFA7845ECDA7EB4D3145F0436EB4850AB3A65120C32BD2AFAFF65518A7529 +AF8B2E8F5DB78B7F789ED6144D3EE5588A64DC1709E64C69B3907A8B4872AAC2 +896172C0119889060CFC265751C8A781208282157BA8F925BFDFE72E4AE0BB4C +D472F838F9FD40E229A3B36F18D96C99FE8D88CA44BD2702C5723D7BD75CA5E7 +E606909DC6EF9550DC7866C54E6F08F6993E6AC0E78CA0FDB60DB16AFE9149D9 +CE9E29E6461C1FDCAC59B0CA7814F7CB663BD335998F2B946407D92791AB32CA +BC3FAF02A19178205981B654FBC761D3316337936BB9C02F4435E9FF33A93228 +CDCB3DBD347E15779CEB58473E78A5AF2F234F2FF350FF5F2589FD2A3F38EA2A +0411507AE1ED51B550AD45D561344D3A6470C9449E25522F261E9F861A87F272 +250144D4A7FF42EFE2F53F262B4D50A9296958A5FCCAB2A72192C87AA4D7163E +F5C23005FB2BFDDBB7696A39A987822C4D71A1BCFFF58FCE32435CE6580DC9FF +F02B40A04772837D1C090B31D98E73E79D6E63D973AF32C762643D50575E99B2 +D2944583F89A5C23DB7BC78F34E2A23079DFE9CE9E9AD70C5EA9AC910B721861 +9CD2CF56C2E9F92311D2F4319C4E55411BCE3D593188E4324A653B730C2435DA +3D2839B68C3919AF4DFE343C1F1BE951985F50F264253552CC514B6962EA363D +CA92F7AFF2A2F64B14194F69137D3EE3E4854B0BE9E9D9400EF10A9F1B40A01F +0AB88A7542A3F40A29B012ACD52C644EBE181CD24FBAA9A2687A182BDC142695 +6013E51C2A8E561A067760B4696EC55E2DF1D6A04CEE65E74A11F712BCB2F8A6 +9994358EC86660EC04F7DA6C7A133CAB415B034B567F36DC71EDD3DEF8F0802D +437DC1488532EDEC290E147FC9279F4821F0EA2F5BA6E2A43B64CAF0B1942F33 +215C18ED620C928F1EA7D0452613927FE3A78377C01542FBA8A397D0C6D6D26B +AEE8F0A3C15AE5CC927CA38E4C0CD2AB9C71B6780E5EE878523177130C291C70 +75D865FD73B3A875F450331C332ED0205F74355A07C528AA047568789CE16005 +A3CDB32578707DFABCA888B476BDB2FBC69425F9157AE29C0E807B4D996DA7E0 +75C8F714F2EF2803C456E2EE318F6111C286CC7305D2C1E270643BAD7587DC7D +4030E32069D4CB84C8F07D0DF1E492E4F4C9AC6C71ADC174925CECA25FE6878C +4C2BD2D4E3A3CFF16E0FCD8C308B759C2A4FEEDF484BEB0F5BB9B7895DC641D2 +922631FD2E23257128523B31B369AEC4D3A63E3AB3DBE2F649BA1C2E4BB4F8FA +7CC579D3C6FBF2B045EAEC3E5522802DF1E107179B98CDB9F0A9D400CC5DC89C +561A93455644ECF841E34C28FD690062504AEF2D5E09E9E84230E93B56B741D1 +1AC88BDB4E77B90D49DAFF1333758F9E72CC153F4F1823407E9EA929067E180B +989D5B459D867D3B242CECABDA3439BA08BE3F96155B62E3323FFD874DB7897B +CC139739546D83739C5C1665F6CCD89F74CB7C07138891E23DACABD4B67AD04A +1DA2D547378B8E77D1D6CF3A89295BC499F383FEE55EA8359544EF60ACF1F750 +1C607FFAA1AA10A361DDDE23B2858E77C71F0FD2D47ECDE5E77CEE1DA878A8B1 +40211679D7691011B81246ACFF2B487F106FEFF52E79B7B7B05442D846FA7381 +98E1EE04940FD3446A516B47C815943870C9CA9C1B1BDA2894AD89DEA6E1B96E +60C94BE49C89A0FC4B009AEAA8B9E658798B79AB404EB06515D23D0C83465473 +4833AFB6B56761858EDBC5E125891D58DE477CD512943AEFCFCCA741D39CFA02 +E0CBD9045ED5FAF2580C39A1102196A85E1CBC67A1C56A7CDFA12BE2AD351D9F +37D4783CD6A8B0EA717B5FE28D7B39000712E37E622A821D040AC927726402E3 +63345131FE928E3147B83D619DA8F212E144B19EDA829C7F6CBDE636F76ABEB7 +82658AE7276C2F8BEFD02188598DC592E05666984DA2BC8C9F3549E96DF45D44 +9FC713AF972127020E99F95AF3904EAA898F4B67D19BA296AA36FBC14C4DC5AB +C88DCCE567002214C7518098D015FA37AF02BEA5D9F5845FE3FF9037C15EBC79 +4CDCB7D79129ACBFD2573A884EDEAF3939E2D3D6967F1A0117A0DC6C8597FD47 +01813A0B01D60D7709BC55D5DDFCB08F53B441D7EEC6544FF96638CF1ED431EC +794A0E716F63233C0D80E8B4123F30E632AD427857EF57A6CF6A106F5382EF74 +F9088615AF05E3362609E86DC9CB58CD2F709F8196FB61FB4F82F9B1F0792B09 +D6AD2F194A9353F60EDE331B84B7704F0C797415FAC6F5DBD56D39B44A45D1DE +B6A2319784AF1B2A9573DB75B573926AFC074627FAA9E8B4BF773A802896CC96 +65B535DDA172851A2F052934E7D7D593D3E2644444F7C635179D00536099420E +CC56526A9FBCA1B2DDFC48D479DD9A928197AE138735926D72737FE8EF7D1B21 +6425B94AF20B5EE8BC00FD87705DB8DF11ADF16715177FE917C2AAE6DC1CE5EC +EBFA2BBC044398B8F85DF05D50BA8A53E97F44D6CCE9690F901A50B844416408 +91F0DA30C55BC25008122D9A08EE92A8C84F6CEACF40591E4320A114E2B62F15 +92971E5DD0613D6D323245F1DE0C5397802E88C79D9C8C7719F4A13902828BDB +34D6E8D8B68BEEF5A4AB6A4DFCD93AF6ACE8C60A16A593474CB17982F611D6B1 +3294A28699B8E8E73C27C68910AB90B2CC147944323A5F339A5844B674AD75EE +7BA8094D3BFA4FBE6D1EFBBF7603607E38B920BF9CE43E418452E4D61A6D28C1 +F91CC04699210332A1555931106ECB43AC1FE2D08882F0E9180E5924C0335693 +AA13697E9F7F1091D71360D373661CBAA631992B3B2627DA5340DC655F712572 +FD675340127A1CBEFE3656AB4009BCD1BAE64048275146C32E79F031EEC428A2 +0B786601B1B44D5BF9E464CAF224E5636B0D2D83EF07E81A545EE9A5F9A531D2 +064EC94A90714E13760440450A6ACF3DD244C32A9ED0A65C546BA46C27FD7801 +C94F5C0735A1E9E6934D30AD680799FB3A761896C9E1F1BC0422CEEDDE021770 +1837B9A79B0F8775340CE0C2A18E260F6C471E98A3C6E4AC73A148CAB6EFAB3C +E50F14240785645FEE335349C9B8D59B99FD884EA4A1C878A5AB6934511DA544 +7D009675FD5B62F999ED528C3B70D337A7D93D4D14522D1270B5C345B5ADE5ED +518AB80590221630B0E66A85B1DC67A6CDC6B3694F8EE53BF90223FD68ACF7D9 +A4106D543E16EA756EC3CF9C96FAD7E45A8966B8BBBD5B1E5E9509F2DDA57EC1 +AB2B457D495F9C8452376C11C649FE4015844D876967666AF9824AE5E3ED033C +D3DE8808897B223FB36CC42BF7867775B8B97610CAD61760B48C7F3F2DE23908 +035EA9A89551B4AC734DEFF55D121AA9D365BFE4C621AC78344A11360E042213 +EE8F7EB0EEC8BEC6C9294D22467B5D6DB1A0B0E03F371E1AE162C5DD46DD127F +F8F75142EA07F5F5E3B4848E9F4B884F0257D4FCBA87797839A716CAAF03EE52 +FF4479EB9FA912146C609AD0784C7EBC41CD480FB7B3CBA7D5BB91BEBA43B5BC +AA5E4A9CEDB68B34B4EF7A15AE58EEBD677D7D2ACB6570A569F79AA9F8C08334 +2575F0AD37AD980DECA14BD61D6D0F38DA4C8F5E4350778BE866AB63AA8260F0 +3D9105FD3738B1C5417EBC9BE27027718016DAB611E3D06529A5F9C2C0A05371 +3A7B87144805AE4E317F26B518FAC096F5A9BAA8EA45D77BE19CDD1E352FC955 +1ADDD93B080C6E95DE94CE3CC6AE60E797B09EB9FF1EA0B5C60822953F8612A5 +93923E7D7FA07A86AD52B23D3D0B88630B88D6E8C62D009DEF41CC7D95EAC8EB +B26AC8E3DCF0929016378EC4841E1C4F951059105BB7F4D9D827ABA155102A09 +0242EDC57D050CBB9A0B6C5302B1534EC041093CF0C05C0E30F0B3513F3F5356 +75E913640AE066B795197E009D880CF19ED6C92FBE4D9CD3C96C88A59F2097E3 +D9F0F923CF7537FC69D5C714DA5E53CBEF307D8BA7FEB8CAF2DC63B9B07D4556 +CF751C7AA7CB1268BEE3591838C5DA625BDD22B4748A2118B7073C7AC7A885A1 +4996A7900CE4F42B19383E12F0BFBF0862E3A539F952038E1149B57D3B92DD18 +FC33B2AEFF202D53D5212300869B57A104AD5640DDE1A5E3F1240482EA9CC7DD +A63BE8B6DB82A2FBB5DFD31E72A6CED413ABA65C6DD3674A76E547A4CC9C1C5A +504992A649C7F2AC469A9BCA5E9C84333AA74C686A863A05FB73110E466A34C1 +3E3AE5E21B912282BEDAE14864E420B05F9E2EE8B1C523B362A4237929BF2D06 +A0D398D91ADCFD021113D4489736B4D8E703D77F2BB92973874EE461E76ECFE3 +D114EEB3F611531FF20CE6310C338C6C426F2CDE535C69E3F14CBFE16F48C7E7 +7420777D9A175710174DD5E23B2BA6FFEC521907939AD66488857BE8021B385B +D6E1162BFD8BB36174E0D5C238BFD778BA5817BF31B2624429080A5B93AC98E3 +B6C5E9C792F9B1CBA7BBDF63277A28B6891DDCD36D0CF656C4F510C77AA08991 +0545717C76D2289D77C79DB34F2FF22E29AFB3F5E9B6313A2F582E4DDD2373CE +6064843D24FBC35B1A08AAD4A9B408541301166DBE585317FF2A8E15C25DA94F +5A5B9D11F5F0B1A658648C529717151A96623F590FD41908A5CA20CDC0D75D84 +6DBFD25E5D4739177AF9 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -3546,6 +3848,268 @@ B8C0C194C26F5E122DF5E4153316C971460C3B3B336C1B72 cleartomark {restore}if %%EndFont +%%BeginFont: SFRM1095 +%!FontType1-1.0: SFRM1095 0.3 +%%CreationDate: Wed Sep 12 2001 +% Copyright (c) 2001 Vladimir Volovich . +% See the file COPYING (GNU General Public License) for license conditions. +% Converted from METAFONT EC/TC and LH fonts: +% ecrm1095, tcrm1095, larm1095, lbrm1095, lcrm1095, rxrm1095. +11 dict begin +/FontInfo 6 dict dup begin +/version (0.3) def +/FullName (Computer Modern Roman) def +/FamilyName (Computer Modern) def +/ItalicAngle 0 def +/isFixedPitch false def +/Weight (Medium) def +end readonly def +/FontName /SFRM1095 def +/Encoding StandardEncoding def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/FontBBox{-188 -320 1445 942}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052BD0CE60552BD63101D7CDBEEF5B11 +69C468645FE4ED1AF2541AA0770C1DCF81623DE0ECDF49F2B522618F650CE6CB +CC8C21885DD61AF8A523AA677EAEDDFA51A1F9B1885EEE0456196D634E04EF89 +F17499DAD982502ACC349B9EEAAE4A71A73D1147318C60A8BAC10510DE90D8D3 +F46E47295D27129A5AFE0C65E22BAD10D06885A2EE623FF8E1D90287A083E00C +EF25195F68A2A98170E48759F33528B839DFD4B92DF0482493852D12053A7904 +BF6E144B9488970F220C299E80886366662C1276120E72472BF84082B9EEC729 +F7007ECDC5A850C88810EA679DABE81714004E65D938DA9ABDF29C949A52EF02 +EDA8451563235D51286E9133FFC7A27067DF0332ED614AC2D4FAB88EC84E6CB9 +FAB41C933E84B88097BA8742BC30A81416D1CAA3545F08E2554B28362B99B79E +FC42281922B94604AABAF5F7A9B8E2D9A4358F38F2382EF9544B859D098DF243 +034CC475CEDEBF0EDD0A60C907127BB32F7D85A62A44E90B4056D9B4B2FF3A49 +786032C6B25794E2C0003C7852C6B0688351FBFC43300FB0B72880BB7B58BB61 +3D1064E7D4DDB128A9B38EF7510B7E5F82BDE39489E2D1DF08816781B13836E4 +89390F84577F31776FE43A5F94F817A4AA4A698AA4AE84B178FCB65F1B5A5CE1 +334417595F6E40849041565BAA497F6E4B8F4305D849128C9A26A98B909EABE9 +8F2659189ED27C588ADC7C744712B4D9AD0C5DD25D1233E979DE7F53C5F1C47C +E9DF254086E5EC70EBC6B7E080060BA72F15E6BB75C75011B15B7ABB6BF761DD +428FF1BD688938C75BEABA7DEE2AF49364D2E198FDC7F8FA2313BBE598ED3703 +7ECAAA4670BE3A85C693ACA829A5936778BCDCDB38A5981D4CAC8994E2B2F086 +26D8793AC1393D49A8F2FE391F0EF8899F63CFA5A77BC739C867C6CFB9A226B4 +620AED34573F068052604331B7E8E1F0C3BC0BD7DF733F056DB8C3F57E3035BB +EC82DF5B511453A952D429AC721A4F94D5C9BA5B83545948643D0596F4C6C9C5 +796BEC7B26EB9D729F337E0FDFA91E5955585C330D0C4F193FAC870A28CE054C +8942BDA170717B7AE9927C936DF0076507F55CA2979BADD3EFACC0A599933EB6 +F148BB7C3D61066CCC93A5856D253D759F30E37534743210743F0D53F58D0B45 +463F053E19A16E5A1B111915D1E664802F8C6C3ACA0F1BFCF3E209D1FD6C79D1 +5D867E142AD6E69933768274F4E2AB57CC518AD5A1C120887EEDDDF18C291BE7 +B3DB17E8FDB124B11B6142DC60F560DDD668D700614732F3FBAC4637B9F41361 +54CD2D8757A9D9BEDD1EC72FDAAED3CE4A1144F1E919FDB952BA7CA1E3D31C3E +9E434E2E44E7A83AE3480EBE89E0881584045E4AA5814897382EEE5FB5C9410C +2DC7A2136551DE2AA713487A77B911A7E7AEE41F0BEA1FDAC1950473B1394479 +513741DE60091BFB9751C780D99F2DADD5AD8283DC9CD1C81B902C9F3C9C3EB9 +55608E09D6DD423540BCF72394A24F81135C9D9063C0F4441BFE0120E03558D3 +4A16744457EC281AB2A60432C97DEDD16B2F1FF4C1A90D72D46C9F9BE984C6E3 +E239F98B59A938C2A6490889B437CFC21D923572530E41B7567A9C7E2464DB2B +18FAF3EB7CBFE7BED6E77219C0366A7D54D469CE3FF62E75FCA2ED6A46F3E5C4 +489992EE1A42C19DA52F0CB2B1A6956BB3F1767B97FDF225685FF7C9E9243497 +144D31ECF634CABABB79E323CFD483BD7A7B0C2679A9C3DFF0D44F09F084CF3E +886CBC91C5386A266730CE2AF3863534E2450583F6ABB520C27C4EFEA01EBC8A +F019D25B7BDB40CD6712D7DF2DEBF0BC70A92D3B64D1FDF723DBF3D4AE939E96 +D93646BAAE0BC57BB244AAF47ADE59A5228F057192D917E2BBBF588335E09095 +1CD4AA406C1D10C8EE6812DA676A8FD166461064BE4150CB95C41FC055FF8FA1 +89A4BAACB0B978A58EDDDB0CBEBF6566D47CC0AFC93110751B59EA33AB5D6EAB +0DB9A65CB16A053495F06B0D49A70BA8A7826EB571B8428AFE5EBB99AB9B56C6 +F69DCC77C25BBBB53FF25C5DB5CB8E742E3C0BFC25098B4CAEF12D299C886881 +0D4EB71D637BC0CD4D63BD6B4F5FEF9B083D95C34FB9E7BC9FCCAC0B9C7D8AB1 +1816B17AFBFE1DA146662723887E435E17AD2E2315AD800EBEE700B3C12B50EF +4A48C2839AB4BB367E908F59BB5AB88635C3E1B89948BE9F32EFEDC2E439CC79 +BD9754280477F7C982850438092D309C213D70F8D476728119E8FA03762C22B8 +89AC2A2A7C0BEBB0C91CAA95BCCDF91AA918766C82A978B7313870327F89107E +11A44FF02F597C8D4B085F6D7A098233ADADA521CDF34A78081F8965DCA615FB +55DB12C1E3459E49C273ABD2663B13447365C9C1C52E192282E96049FD58506F +FBC9507DDD77014C29275D1352CD5FC765853E858A5781F2DA41360D32FB5A54 +D04E088FD99F8C01DF740E587AACB0E431E03E170CBDA9FF1FCDE8D9FF5E43A5 +73166AF5990B238122AB322F709FEF2F0E2FA7C04FBB62C5383997BC9CFAC8EE +3FAD26E788DB37ECB388CD80A7D861AA9E9199E7BD065BD7A4D21A0D56DA9323 +2AFAE158CBB662283EA7310D32FB5A54D04E088FD99F8C01DF7535A5156B8344 +F1CCDE84A46AB2CC7F0CFD113074A1C4D90758EE58F61589051A0150121A7BAB +A636171E6814A1398DCB9F13FE9B11ED5A5F2EEAC14E0C831B2540D10BC0EDAE +833A83965A33180B0AEA361848DF8FE8E50DF6856F1D10C8EE6BB5198CFB7607 +B6B044160CBE8D4CFF067DF3579918B19B9128C2A83512FC0567CF47B38961BD +CC60FB8C6330A30AFEA9B276DA89313D6A83343298F34461B13C382575BE392E +F94E3EA3004D6D37C025DA3F1846E41606DD510D2C7D0BE9DD194E46BE7CAAF7 +A60D496CE85D2393457C50B2D586E010C7C4C7272F496F0CED0084EA956455F6 +2EE57D13B6485B968190360A3E30210D2664BF91C73AD1A811651CAC09A9DC0E +3A328E1DCA16082699B41A3D533703E58E366E871C982F262478E41DA3483028 +6BDBF03E444C6F0F4DA2CE9AB049F324F887732D21C4BF9C5365C603C9971CFA +7E45249203329FB9B4054B163C166E1322DED12CAAE39E289C126301D25076D0 +2FD409FABA5247D7A25945AD5881E18C2DAEC09606228CF925557DDFA155400F +8D446CFB8AD19704B6C544CFCE47ACCB854A74DEB5C646318679DD738987F800 +96844722729076811B5054DA998F9AEBE37DE5068418F41A007E645599C0BC21 +8363573C695B3F68111CE4A6199C8BD40D61E46A153C3C25D0C7DC125415D125 +D0C6130BB6B603ED78153E0CFE7384F7481FD4EDA141C27898B3636398EFBBC1 +9E81060816655B2F7052016A4C72A6A1CDB83BCCB2EB475A9BE17EB08A5ADA04 +CA8AACF6FE68BBDE580243B111BE76EC06E70CB7751A8B206143D0134BF52670 +BB3F44DD8AA7D26283A483CB46286EE0A9BB4FDB0337342BBF362C236C30A120 +D85812760265E3B283F48C05E78F47CF5C678F54658A30EBD7AAD5840F3C7B9E +21D8CA390CFD164792FF2040E07FA087FDA110A93430C7FAD65C951AEEF79D91 +FC25EC950E250511BB22156C2886A249CD442575934D385554B2B4534AC28C31 +43A657DC937CFAF3F6C87EF4F2826BB02C41DB634D91B70BCCC4F83F4C32796F +C5664490597DA5F2CAC7C0013B18373EF51520DFE081F95E0C1693D02E39AA2B +E356FD312C233285B2A8C8C337504C1EA7E9E1F6BD250B5874842F68C92DA11D +F74E6068495709EDCC6E4BB3A96AA3A4C89411FF06B66DA03FCBB052CF5DE837 +4834FDB84E2248DBC10CD7454636E97E399A7AC5A16A2191D763AFC09588F5EE +57E80130CBDAF18FE2F530BDBD2CFC21D684AF84A8CA37BF2258C80CA61485BB +27EFEBB52E5FDDA77E57AC8EEB3811BE2BC948A926FBBBAE974D9CE89333C945 +A9DFE37E5F34BA68EE97019BDBDAC7482826B8F71EC51A777B64C52B1C37326D +1172F83F6E4DF93B37E66CDD6344810758B10B2EA8C68918DBDBC72F8821F1E1 +96AB78288A2E00C2E03FA05640009DD0EB0D0D318C6A726DE5D8F2B1B035C658 +D09053A4B27B18F18BE4396C900A730908D832F3E8A21C36E32F2D603D0263C0 +8EADB43290CC59C43AD57D357057B13C9ABE55F11DAAA8D78574C430939CEF9E +FB36B462DA71CFB6E86C72ACAA04D5FE4732AC386F52D4AC92C47F9B11FC32E5 +B188AF2890EE3786AE2772D2FBC5D75A7FC59B0519F32D930B71AAEC8B88F1F5 +DCBACC2CBB9951DCC8F21A26F197A309C26ABBC4C25E3FF22B2A511A96F0BFF1 +2BD9AA37DA5DDDF261EAB0E48C62DE0885B8D074A7642D59C8E216B5F0A8B327 +1794E0BA5B672E41832562DE119AC5DA1AFB74AA66885ADB605AF60B44C1D904 +EF85F00E1F143A19DAC00F751E77EE62D394ACD26B463F7C7EBE4EFD40DD93F8 +81C2956C4250F5F28207671D7AFB3AC09FDD0126533384CF1B2004F31E053135 +44EDCAD0114140E52B7E153C354CF3F2BF37A15E2D19A2ED688710B6F9F83C5B +BA14795934112F7963FFD217F016DE82353B915549CECBDF7BDFC6FA4F7B74BE +E202170C9F25C7448970684BC555C8390E34A5098F55E0B003B841CAE775D48C +1603730AF8C091C0622640AC5A0B46757165B44F0AE1EC1072DA26A8EE0DA335 +A6BC8AF994F5508921F3D9E4E09B375A58ACBB9E6B0448903E19A5CF2A51F619 +81D2A539A4556B9C25722D4DFAAB480586C90874DCDFC2D70716B18572557BE9 +E9CAB7F5A3959D5419DD9FEC22D015EBB5D4BB5CABE110D76E8A76D6EF3513DB +5C23D3AE05BEFA77BF6B4ED5C413E8DB87B5ABD1B2FA9B3BF37A81C784ABC42B +1FEFDE6DF012974241B33B67AA67FA38798336F7354F0984D612DBB455D0662B +C8F15F12DA07E391480C1A150213ABBBB0F2927D223D5752B69C930053655C34 +FC487DD271A8AF594F457F6A083C4150686FBCBD60832E4E7D0D4987CAE5484B +CA81A230A21F9C49DFBEB24C94C93ADC954B9B3B3EC484C502BD0DFD605F6D5E +13158237535FA2EADA044ADCC1E1AD42918C8C67320F6621369C250D5335FC05 +AFEA1B294EA5D2A6F335FADB80CB26FCE9EBC0A4EBF72DD47806EBA23C3BCD77 +7F175E2041EA03E2F0B2BD2B81E9A6DD43BA3486375883C30B8606D917C678B6 +6E567A92A0E0DE89BEE5E5AC45C9202D46EED5E045302B71EABAC5FD997A9A7D +8F522B2CA316B7FDF16CE4981DBC25E4E2FCE3981324B16A18236476FE242584 +AE70C683199B7647325D295528EB7CB15A7E3940FE2D248945015E9DEEB9EB26 +7012041740F5A2A6C7DB7B2358EBC0358E9385E734D208957ADFC7DEF83F5E5F +4EDE55E2F078E994312214EEAF63F8D0B481C3D523E712901AD838AF2D840055 +E57D34F8FDD4C842D64D3D94B1CA46CEADF497A2FC75A45AC59F8696DE49672E +E33773AEB31A204F01793262E820E813949115DB90A7C798BDDEA0D5D1E699ED +753593F2B6373BD24D4647CF35A448037ED5E72DF3175DD6744ABAA0E2E0864A +2F4EFF3B07B035520A598CDF1AA97D7DC3057414513DDDDE40C2A9DEFB23631C +B2291ECEEF4D18652CEA451BB1559C0743FE3205BFB6711F1026A613D244BB07 +DB3830F07F32EA637775BCC1B2CEF0C6B0D119AF6CCA17DB1B03AB1E9281C568 +33502239B067013D261BBF33358AAB8803C451B2F570EC34BBA052170AB42F95 +F9386DA11A2C7BB9C05E8C9FDC96111549EAC90DFD8DC906C03F0281C40EC1BF +EB6B15455CF32FCE5C7DF6F55C91132223FD13FBD62A787EB15CF3E4E6E59AB7 +A529DA186B178CC6E8A4D876794527F3AD72FA86B7C2BAE14D3E5A41D8F90754 +AA28185D92C9ECBBDE4EE53E2BBDF05AB4C9700C1367B3D81FFC1AA34A79CEC1 +1CA7D422CB58C8E21870F680E48EB1B2D5A30D974A7E9B24DE13958976C76225 +45415635E32FF316DC4A69B3CD5EFC6EF5F845C8E24C92166C9076691817FA6E +AA5D1F1CE12235DEA3902F3C355CBDA5CC344376A5394AAA7C2CB50BCF32DB50 +4B6D9BED63F0A8928C0C06829558B714FD54F355501EEBE29882185A6CA1703F +6AE65F03CB07406324CCDF00093EBC76627A11A84B5EDB688D20DF49616D8D3F +7491719761E7627CF8FDCFC0DD2265160BEB33ADBE3AD01E7464370E3E0F9D45 +51FC9A87C678EAE5B16A564333DB11687FCB4D1D82C75A2F551FB4F940E0C71D +74CFDDA0974D787BE959B2B87FE13DC290C53819DBDC2081CCD16F34F0A61AF4 +3CF53914B713820BF8F2243C0679345EFD56307165AEDF16E3BC771EFBFF595E +C6B1DB8B028342D5DA1E8CF3FF4269126B48BDDE9BEEF7896CBA70EC77063CFB +0EB3C6FF697509736BCACAA7F03C4C326875396F0499B198DAF7842384C36C2F +36B17A65A1D9FB77649DD78499592C817679F344E0B88D80B8D78EEF9EC6A9FF +41F4D635520B2269035CEDDCB3B5518D63DEBAD4F365A70533AE119F11323AB2 +EF07047536DA6370C07B2215C3A82BFDB44DA593C6B3A33BACC38A105BEA2109 +06DC63737E3EB362A122FE90CE8EF37B9C73FA6933BF27C39EBDE137F15AC495 +7F58F6549759FFD86C2BD3A09490AB47B60E204B16910AFB0C18E4F2361AA033 +9BE5EF972F4B52F18548E3CB947F083768C7254FC019CBD8C4DE7E01DFA456A1 +065EF834C7B146FD395ADBB9FB72B8EABF58EE9E2B2276C87FB83CEAD49BBA55 +7DA56ECA50BE1AE4819EA3C72DBE30F363D43C75287945B0DE47D1FF0283C494 +EA65527E8708279B3B2437BF1CA2456E260020E4FC0A85BA18562CDB8261FDBE +0B928EF40F0DD40E215B8BBD40BB5B5DCF2FD9AB4D5AF64F82EC77BFF8C37BE3 +74BB9B2E44C819E84CE2C634D55A9EEB4F6DA28025C3831B601AD254108178F3 +3EC068E78ED8C72AFC5C3BE0BFE17F31A23B55E7158FFC40381F36DFEB6612EF +33A54D2004D92F0A44B3468DBAC0ED5E34F70561F5E77DA369754685B7F6B04F +233454A59AFDF45F28383B05B6120717744B58D2A96BA706CC9317B5E7FD0848 +56665EB38E31C7F8C87B0C65041A5D2E349CB4264523AABF9C10CA95CDD3BE1D +9923C1A11D046FFC2E82A09E36ED0146978DC383AC6D70EABB20327360CF7EE1 +DC4DE736760F5CF3B47F7BA082DCBF881ED8DEBC1A4580C287418295CFEBFB01 +51B09DFC98C8A8C9C5F9AAA6971CA95D96A23166E5931F7E464B288F4E357112 +4111BB33FB7F0E042448478D3ED7AAEA57D1B0B4E237F919152F8D9E86229BFC +B8D59BF9FB9E0062A3ED67A367669D0F2F8EFEB2219E5FFE7400A9DC725ADA62 +706D4D1860BC04D4432F49D7F4271376678D381B148D72DAD9012173FF3779A1 +7C4D92B28D3117888C864440902499FF0F9BEAB0C83FBD788E26B0BA47484188 +FC01B0349E045421E7D912E1BD329A536F61169344F16D65F6B90DB87E22F72D +8E6F486F8D21E6DAE282C35A2723464F560CAD8B31A931CCA7A2FDB9530769FC +BE0A5F66F1D4DBC0EAF834D078CFAFA415F43DC87AC62A1D8913334016B3FF37 +20902A7E5644848A57346228A13D7B1C757DFA9B5FC4E9E1DCB2C2AA2FD37386 +87E6B350662256D158D8C7DCD2F7AB1E02D6C5C8E3ECB1C6055A6C0B807B8FF7 +997E562EDBEDF7646B64165A55DED91178BF13FD30ADC1A6B6D621B1A7AEE1F4 +2E30D49CF3BD0656F584CECE76A17151913D7ADB223727B47EB3D7F491385112 +D36848973526DDAD7C1C1C0FB672EC627172D10DD33ADF2445483470F28AF65F +29CB086189B3FFA31E0CDA710B6DE2B0EE515A46A3FCFC354AF01AF5C5D0B301 +C8FDEADC6DB9D492554777965E2751A715F8FFB6E0248AC51928DD65CA4F6574 +BB1E01B3ED95D736691EBEA8ADFCD8265F128A67C372720840A206056F66A7A4 +10E1722E4C1BDEA8C980250F9E034C29FE0F7D2F5DAACAE3173C865CA9C4C240 +49B6D4D0CD90B75D3BC68B8C84605923075A9A2D5D6F7008365E52796975CCA5 +02770D168EAF28C337D45762A08817666907C68142CFAB9D75C4F6D6A73FB4C0 +748F038F140CB009A24A80270037C9B5E514E04AEAD7CA8468C4D22E1059F2D2 +EA0E7CA2979C7066F1629B49FDB893DBECF6620FF9C48132297E81F717820A90 +BDB45E16CA1D0D9C152B12D50AF4E1B2519FBB2B779218C5E42E31FDF82448E3 +5AFC5F90AA018902EFFC4D5A14D4326911F7055F9B7AC5B592E2E2D3A198E2C7 +F476CB49DBA0FFB2CAAF494DAD087639203084CEA25DED422E0F8A30634FF1DF +EE5C61FEEC33D547A17961534B3535AA673AE15F560DDFF08EA7AC126882B57F +A1AE8A5313E6D21F67FB6D16AD32690FCE021616D0DB89C51001090A4A7FB515 +139B751F6137DFEA833004F4689474DE3A8FF64D98EF09D25802C3B35DD2DED9 +FB5300E4F50E5CC70FAD3A21917D15D5DAAFE30DC1CCF79A359B81AA3F21359D +297B9795636C03E483A80D47A4826930854329FAC093193AEE3A19BA91063421 +988EA0ACD987862A716C42F071140254B72AC91B91911CD6A9D275FD7F6636B7 +4B1B0A47FD39120411E1D5442E711A6C1EB0741C67B0A44C1A2F98C9FF245A9D +5AE4A04B529CC5FDBABB1C6E8C1590B3CE658EB77B58F4D04803DC351C5645D0 +4DB49D76906E068C3FB553AE91FDFF5F22F734DC4BF8E9D019B06D3A1BB7CDCE +9101E9D2276CCACFB36B9EC74AD213BCE896FAC45D08EBE43E676816DDA135EA +8B78003042DA8581975D4C14CBDECE0B027AE87DF28611F387E64B951812C848 +B661FCC0DF91B39DEF14976D7D00609DE2DB8195C186E376F4029CBACE3AF24D +AABB788FB1AC87D58BF341F95EC2DBD14BFF27D3DAD9A06569FD4EEE40C516AC +D809E761BFCA049DCD6F8E43E60A0BFE64BCB922D1989CC14EAC1987147A5559 +4F1CA14635DF029AC387BE36036BAEA8AE7DD09D090EBE271FE59FD806894A72 +61C714D6D08322726CAAF168C08CE31F26CDF6613C06CC50DBD59B70DA211B44 +1BFA22AD62D56AD098FFB998E25FABBD89A2C17EB7A3AE81F79C05AA4677D744 +7F412484C16CFB322FABEACF98AF9F152E3217D0F2593D6863E7872C5B6F82BB +FDFD09B13FA639680E972DC7B086D7DAAB076CF346814556119BDFBDC3A16374 +E7B92CE50B3BEE8B7C26856BDD3C2ED98337C2B877ED5EE4878C50F06A64F750 +E9C8CA83B7FE6C91E10FA717CCEC0D2F8E21CB5A2367B5C90A81897B6973FAD7 +D4D95F6BEDE4E1EBE6D852A937D5D814AA6BA62324C08AC12FC09C5037588F7B +1B043BC503D725EC657F47DE02CBA939ECD8418F4B7C705EDA3E9AF1E623A989 +074165DB0DDD59B7ECF513C714B7D0A1013E4E3F2B071F6A6DB89B7BBC2774B8 +87ADA7C572B0AA702156B715159829BA38A9EC28E1CF3494B0CEC876A97B4617 +2CC9162F204C36850CA9188B0B97300CDB1AB4F57B55D39BC539BFA5047B032F +02A88CDF11D098FD30F6A6B82B98AB9D288570FE18E4E6A707179D96287D438F +2D5D3C2305C5FAF075E0979EAB1DB645AD9DC87A621219C260FF67C2DB8D541F +8BE9E20ACDCF64C4C721AEF5B2B65761D0310CEF36B1A3E57092DEFB978A43F8 +B553169F523517518CA0618E31F9A5940EDA42D8B9D851AD1E77BC1C0C8EED23 +F469B0568B5A556A5FD5A20F5F4E00FA6F030ECC5E711865F1549E409792F7DA +D1FFD1BE1E6DD22619163B98EB0425319E738254ADA0AE57FE29E121B0D8F172 +DD717E0B59842BE9F6B37FEC3F1BBECE15664851EDA3DA3A1848191C38F2CF60 +7A262D4440322C26150C605AADAD4EC3EF0CA22D6A2F63BE63C9C08EA643B68B +9C88ED95D2F2F0868CC40278DC2752A1E61C793FB87EE69A6D348F98A0174B09 +5AE09E214EDA066174A6823347B831ADF2619281E43A71D549FE194D5AD4ED5B +1DE112CA90BB9D92C57FC3D89F1A57F7CEF2ACE8E944B8B725557F567D9DFC72 +3D28B0E11DA3F81633C042B5FD05513542A2B431B3744E2E9581ED828F5F8A8A +C600F526EA874274FEB94E64F0AD787F47C98899DAA4552E447D4B97B3774334 +8DF26A38D7CD36EA79B64CB31DB0302BFD0DD2280E10FFDEF59E2D1F6452FB09 +E2A7015523BC1A46AC2F816135FD4EC198D30E95203ECD2623E83FFC1436FF74 +068CFF87C1ABDE2D31AD1FEEE6031D889A25B9F2C05036F16BBDC143705545D8 +4D14A2467639644AFF1D239BB08AA769BB5476DD4FE9974DC01E85C02F82958C +12C3AAE071BF1E57C358F72290F15A2655C1C79DB5E5264133AD0139F9F9B540 +972A3FD82BF0377FDB8711A746B9F4C6016172C30CB33CEC0B327DA0DE2668BB +CD41 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont %%BeginFont: CMBX12 %!PS-AdobeFont-1.0: CMBX12 003.002 %%Title: CMBX12 @@ -3586,7 +4150,6 @@ dup 12 /fi put dup 33 /exclam put dup 35 /numbersign put dup 36 /dollar put -dup 39 /quoteright put dup 42 /asterisk put dup 44 /comma put dup 45 /hyphen put @@ -3631,7 +4194,6 @@ dup 88 /X put dup 89 /Y put dup 91 /bracketleft put dup 93 /bracketright put -dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put @@ -3834,443 +4396,436 @@ C2B4E8C1821FA67A655B5042C15E4DE1FB3652B55078DB123573C4E986B19DB0 C7564499BC1319121CE0D93218210C68080AFF33420E3CB3A48BF9EB66BC07C8 A79D8CD8E78C200FF7CFA3DAED0B9E87E6141C88B436D8FCBA50AC195FCBB9BC 9512B95FE3A37FFAAB39850FCEBD4D50A243EA416E73F53B4B00F3B6EAE0CA06 -0693AFFF8191C1AD2A5129C8A8DDDD492F8EC8B7B93CCD6D4F240785E515C128 -D7AC38F14C1FF204DB89A8805F8D737644DED6E8EC6A58365DFAC56200AA22A9 -8F20DE1C232DE4E818CB9D2D3330ADFD72C1B5146849142B447900FDB1DA01E5 -C1BD63FB69472D782C659F7862671FEDEEAED3617266DBD34AC593EF6F483D5D -AE56A502F9E66041D58C14FD6E83DEDA7DBA041726D78EFCF51152DE72B51F2B -B65060004FC8F67755EBA2F10A2D3E496FA3BC3B664ED03F496AC074B7425C21 -18FE971025F8553EDFEFBDA53A475B36DBAB73D08985749FD3B0F0C32108EF87 -BE0C8DA94598691F774407E4D36D336BC9883D0FBB46C8D8F786780BC5EACB9A -0875E368521C0D91FEFF40A3E10837B4D590E004A9E766ED62BB3DD2E2AF78CC -29F6C250577DF1B0AD91FFC3E1EA731CF4249F91143B7224DC344849D03139B1 -D53B4AD7FF13D2A79C2C38E0D09590B499936C87E9D0D71B2B06D74B7A1D388B -5A56C9FF8C4D4EC2F469549C5E2F62303BFFAC463C9C30FF7F2B77E7671C5CDF -EE067A2E64F5A763104D3EA3320E15C45999E0A4D002EE072875ADAC6F228DFE -893664E7C2CCD757F6DFB1ACAA9F5922492B573B6536B34F3B931B8C1C761E00 -BDEF6A0D88FB24D30FF643DE610795E1730133715D14FDCA813C62188C66D7D1 -2CE172CFC1203106790E648D9A19213A88589F54603BE7A45DD5AFD1BECB8C59 -A9F476D3D6856884E41B17FB36AA81CB3DE0F664F06B5C8BC3FD00F170165DF4 -889A551DAF6B144FCB5EC9D9A64C261A7BFFB3FF437B2C44E06EC1D1D83451AB -97BBD3AD1A2D1032BD4E945842F0C8A23866E08FF7DEC3675C07595EC2307447 -3CE67B718147E3D776CDFF0685A731C4F0BCA79545E43068CFCC09A82A5DCC8C -606574A06D7DF8359C48409FE7BE5CDE96693BF7C2E3D4639862BEC53B7F923E -2836D719FF300DB7BEDB63B8149568A399DF4275649C7AB9BCD283495FFC6780 -3CC50EC4E1151DA66D84C9F307610E4F730DAF2F2DF8F8E439972ED85601FDB6 -2782E8BD391CC137B1D312EC502600FC4AEBEB3E438FFAA650E3F1F6C25588D5 -36450EFEFE7F3E6CC4CD5FFAE2F3CEDD1559688B4DCCAE69CD2A847B1CC974F7 -6C568DF48D75D0D11864E5ADE1D20B7E4585C4321128B78F7BE81CC38F950CA1 -162F144299376A02E01B4E04080EDF9711500FB1A1CBE15332A077D520F2DB73 -5B47B5E59B33994208A8B682B0C3A48A8D1E9CA8676EDE942E6130A33DDD190A -BCB3204E45FBD8481CC715AF34A75DE6BA280CFE20A0EE7E1A01F06D7C77CE6B -895327E48DCC3268E195050B3E81E4410A4A62FA96E8C92A9190B64464B7D104 -2AFB0E928C533C47F423C6E41B2B6CA3F0F6BD56955DC422CCA330A232066BF7 -1C09643DC9D0A688023BF4933D7BE3266539A2A7E1E51F96A583D8E7CAD7C192 -36CC8514A6B341DBFA654CD1E3866BAAED9024B8D4C9AFC0805138DD44D68D62 -27D0CCC6D97413117CEEF0499C9E1D820D93A614D5A158FFEF907AF77FB23E1B -9881AB2CE9037AAB8558683DDE74FD02593BD0A59E1D9F11ED12B34C0E15836A -6F063CB303679A49D028C52CE197F69A620E4054441ADCCE4C1B2D4ACD25F8BC -B8D20F29E18C74F789750764CB16C741D4239CDAAA659F69B3219AB6A537BD2B -C0EC072CD7070960633C7EA0214098B92C469ED2E6E2D0467F292A7576279E04 -9ADD778FE4D73CB746DDDFD809DD4C2A40653FD3B7643C87DD94CA2BB16003D1 -5ADCF434E15BD8F9506F64F68F17EDF5F24C719A8B84B3CDCEF3ED3F8E25C75B -2D9D56BC22C5FF4C2A6FC16A1DF3228E32F2B62FA250CCA81C4513E8968B1C2D -242415A38B1BE1BD30904A5DCFFFFF3577501AE02EA02DA6CE507732008080C7 -8C427E4C252CF2D7CFC476A734654458B182E44DE3DD178761B278E4662A2D7D -7D287DE451DE57F219B3B872C7C07948C25FEDD32A3813D1C8C47AEA450E0DC6 -3A179A44C384AD922AD1E8DA4DF9AEE5FB1C3E7D88248702670687F7E9CFB36F -A8F6A6F66B7FCAA56F52E47B7DD596A86CDE4F302ED174F13FDBCF81EF5DD164 -91C9F2E77B1FE04F904A98F7BC72CF4DF640D57B1E20460301D0B62575692453 -27038F9EFD54BF477CECCC8DA952826C7858E8DDC9AB99D68D39F7EF3FFAAFE6 -EDCA0C5AD947C49D081B86A9E8D599E4AA1F29F9A5E12729EA9C8B30D168C8DC -770959A26A93B77BFE36E7B97F37B0F1DA44A560B0A8DD2815D792F53349D73B -B0436F5C2C1E9DCE30516D78945CF14AD2E006C6F5143C4A290EAC550F0A356B -E6C348DEA586569912BF890CF73E5E2E3B6F31244CCAE55EA1169676A9AFA1B3 -D28FEB69F21D1FB36276552FF8F5119A7D7DDE2BB0F050F9AD7730713674E97C -072B31C82D87E636C2819271DF0192C54CA34AEFEC6E3D7F59044869C7C27475 -90CA1490EFFD86A04781A5197DEBBE90BA3E4D9650E9ED3DA8B3D61371141BF4 -AE162139FE195FAB276299FC72496CA55F56323E47C00623021CE7EBB72F5BF0 -9CFCF5AB81B6873996D75DAF2BE4FDAE42A6C289E03D1D64CD8376433E9D2582 -7CB2CCCF4A6D1FAE25EEEEB25C568AEDFE24C3A6A57B1D6556C832DF6CCEED62 -9E913D086F01E175A76A0CF1DBB354826553B27C8433BA50FD295B8B7CB93B13 -91E0E8F33CB9D72DBEE55542C62E32E2EA89BBC3605B91AC2A7BBCADD0AC2F00 -2C623690C4915364E7BC42C98C1EE89DFA5DB1E9A335BE485F96D92A848E9F10 -89BBAF93A8E72D348FFA253BD462B72B758BDB662F4E15812A4C483B640BAD7A -8CD2629F86FD17FF5747F0CE48858AB5CB6C58EF16229D5C89D5E90517CCF7FB -B57BE70961108A92685EF820D772BCCE4080F4A4DAB3F3764D74004F20049CB2 -17C72F41938E9013DA041A36FC5D81ABC8C471ED2E99A1A1D6BC6E81E7576F4E -E17E9A7972C98F04DECC1E06852A0BD94A47915FA2568956B452F41062D65FBE -27E5F48DB02DED360369D8DDA6BB5D84467F95CD27D3042905A06644A9271C6B -6069539FB9E381CF5CF253186228D4F534D3BA1B51994762630F09BFC03B3C3E -26FB2B18E271BB7E446A1C6F1AE51E589BD103B43617B6098829DD7E5797CF19 -8E3B0F301B2962F17E6C9847F9DF9A3C6ACE96AED712A4A1BFECC614C008E495 -3DD983BBEFB2AC681B61AE3D35108D69FE45A058CA246CD4C278AC6ADAF97AF1 -E71673F9CD8792155124F3E0886811B8FFBB9521AAB27436783643CD3445599E -4E05811C063E64A0319693AD31194A72AA14DE7887AACE76B5B79639FFA6B2BA -3EE708EF87537D04522C2508E457478DF29A5FA639906F6712869F8A7F2FB909 -A6F86722E5C2A53932B8494F88B4AA346E5319667AC6B70F3C41E6275BAB9A8A -F7197FFC71B8E00DAF27B784F6958DF7346D49A1CFC43BC041B3834E6377D3D0 -F4A5CA68EEA2769626A006C47B869D2B92C4137265C07BE5C6D9E8CB8A489609 -52482A139C5D1C72D5BB08345799F1D13A232623C9834901B95FCABD7677E198 -13D8AA82574FF22B68C1E47D22A8F6ED06E3C372A108DB2BD20A3E2112F447C9 -C948E0E053BD36116F0C79989B27D82D5117BF48412C2305124AD94CBDDDA5DE -8BC10CA15DEB62E0E8799B16C8C7E3194681D462D591847BC15A4A2CFF981950 -3C97C031DEE6104907479B3B4C8CB3037376D6D00786E54F63D19E02AB3A6331 -3EECF0FBA366A61A7B68DD53D24E331A9590206D9E23B64C1645A3A7A5792D40 -70000B430C1E25C85F05DBDD502D0293BA3AE9AC0EDD494087DB5CBD3E0B2C48 -3BF4FD5E8D95CD6A1E707574AB3BACA6AFBD8DAE27ACA904FDB334A9573CF3D9 -1ED5F66F4B96E8FA8551BA6509B3E52DD718CBE7C190DE5EDE513D685D4BFE0C -85E18A5699FB9B359E7ADF5F65B28ABF8D4BB095B9A2549409CF607CB2B9BE56 -CD37BC0B909F493DBE1BB95ECA87BA37154CF67405F6E25C28A183545F26AEF7 -96D75AC79E4694D4F67A22EDEDA7B8A24E0D6BDD2DF4BD5E2BA3602308503AEA -28115B77E3025710FE88C441BBB0F09D8F6808F59B13B4EFF54C4625875B7292 -A8C7E43407D31C15471DD41AEA02C0D39F73C7142858342720F40D18CE901B24 -CA0A530B7E9A488BCA947CE70040FDCB3EADDBE2A8039927613927249287216D -2E5B1CB2BB6E6A917A9C5DB5186B6AC77383B360C349DD1797A070FA5022E18D -EC6099E2C76FC6C14518AA866E37D6A05F6B164DB5289973A4AB9FFE11FD48F6 -531E5D841B0F43D110BFE88D06D9774D944B8F07B3DDE66FD9AFEC8405889FC1 -B0D18BE78E554227EF73BD53E20353221E75D035CD1642E497932F736AF7CBB6 -71C094AA316C1488008B3A459B56E466C2C6B9E7A05B9E0BC438605D7CD8D883 -28C6D87F000E0ACA3D7484848584D55D60377BF3D6C02485B08B6D0F8998DA5B -EB9AFF49D304731CFE336B17C268DF694B5FC6B99D03CCA8C7915C78E6BE01C7 -324F5E4CEF5CC6F279E846666D2EBB052FBDD15F0849EC9E35D3F32A58AF87EF -7C6FCC7CE42C2F4E1654278AA7893FB455FD727EF6EA9A7B37F7F9BDA17906A8 -C6BD0588D0AB6932531980DEFD016725AA5C65F0CF127B1B965B3E1E6C5FFB86 -D8B5639369EFDF32CD7E547AB383F9AAFE30935CD4635671450F538ABBC457F3 -2390D28E8208A66CC46F04AC44BF3DB7CBD94638119E5B68AAD689A51B454240 -A85EDAA394DDCC4B0984104CF71ED8432BEF69CD862893BC4BB9451D145ACB59 -6DEFFB3551F8D067760EAB1505D443685B10B4A956ED200770E1E1D4ECE6743E -8C26B70C9DA49836C35F469F9C7D8D84BAF741B671CE6F0E5A3EB017FEE30E4D -B5524CAEBF2BAD987F4B290901D18F2F161BA5B3618371A6C868C959B2BD579A -22650599481CE05481F6BE5D44D88F8BF0930352194D4750F33D78CE18E25E23 -FF68409C8490F178872BFB6EB3E3DB658CE5CBC41841BD57806BC959A06192C0 -D722C50E5BC87A595BD38404E5454CF9063FC6C757576EA0E47949F7C160C9FF -8E89C687E711204BA3855B7056616E31EAA6414205853F7EEB9171C0D57BF449 -6EB9A52AE09088C5AD3BCAFDC49B4C922625599E97A88CB1FD6C5D3EE390D872 -EF6F0852A19BEFDFE8699DAE598CBA83ED71BDF8ACDB7DCE67A2F512B8A2F891 -80E5962373CC39A50AC13A99E765FD6F5C7BF7ECAA4AB8A0A2837E4EEA7F6781 -FEAB66191F472F0552782C1CE5D058F8AC80E242E443E084E7BFB0E3063A391B -D4F256883DD600AFD75210D6AB126857D2794B4B20A303571E8FBA672BF78617 -F598256A9A74C06E420CF03AB9F93BC569F6B53736A32D712692396E3D05B7CB -D604C5E77F1D996AD7E5FD58831FB56CF74904D2C502AB61888D497A67871043 -E67680FFA11CA19668280E8318969BC0D79C9D4BA43BE7B2523B22938E33247F -23B0C9A7D3B14DCADC575DFEB95EB33B95E9801A236E82A8AA7EED0A2C9DC58C -DAA4A7A40A1967713983AC17055B310E4720B34DA6D4097264CB4A6E65DA5F72 -1DF86D980BEDE79B702DDC3E600E966210F711E747B22C9C9BDA17F6EC4E9C24 -7982AEB524484C9A2D33E4DD8D7CEAA4CBDE41445FA9968C78343A6D85627359 -94BD1CEEA272964682FE4783A590D8BF311925F76FF21D6C4F181E254D46FDB9 -586F664560D3474A39BE0044ECD5E069B97CC19EC81118B6845EC92D167A0117 -84E5213875025198BD7065B0160239A20735A2D993684ADAFE681C096B28DE5F -6915B01D680C091A7A2F6B6EACB8B1930385DAB37E7B10E10030D8C1037827BA -99215103EFB40DF5748762823D7A006A10FC7E3247A9C80C5AF60387DD6E78A6 -288FEFFFCC7FE7E0E164B7E83D10292CCC22DA046600E9D64624D7825D9317B2 -E53FF8D6A23177DCE71242540D4A3B2D522A402E464B78B856EB040D0AAC5E5C -5253777D4FBDCB87B70DC83E7C6D03D9374A19B5A234BB225CCC905DE3DFBB96 -48A8A0CBBF6381026897C53837A79B3BD921FFF51FCC20F6FDB005BF4F9B707A -D0F4D97311EBF32F746AF9641AC06F8A858209EC9294AB9EDFF667FF9341F3E0 -E70B6BF2A7326DB1D78527D30C040C8F8FD582183A937021BAAFAFB493829E49 -A381C62843B4E058EAD501971684555C8D0266CF5271A919238CED1B967D7FEC -BF62D634F01960DA58503433F0264EA735D9BB9B5236A0E2AC257B0B9F87D424 -17C8E51AD1D0F180CBCCE2D25FB2DB840F13E95B589E2ACE8D28DEE5FBF906D3 -A91357986244140CC4C01D0FC5BB7D74D01E28C1C230927194257DD387AAB4B2 -F4AD3443F07E9AC489FBA01A4B71EA0AE60D578FF7E5D6DFFC11F704A5B24ED0 -8415507E53F4ABA42EDF5A75E74976115F48D42DC59FDB47B7E5C3C84D07C221 -9B3D804A3B987B85B88AD29C86B3AA6DE4137F8B0E403FE0E0483A873071EBD0 -A9951B3DE925AC92E57939FE4CE0BE11DA975A8DF214E53CDDCBA5E9E8911EBB -B11CA565493EC47B74B2EB88396CCA83433CEBFE8683A72ADC56EE3F0434B948 -86D8C9D149DF468FB602C3C61210B20F904C2016F7E9224536468B34E00A9C7C -0EC3FC06075E5D8472761E935F83A5E0D35D7BC8748ECCA928A9F10AAD8B4BAC -AE006BA206462352C6E1C3EC96D7FFF2425A73976E3954BFD43018F97C58F013 -1199DAD9E97021E026955E8E1C6CFDCC641007032631113BD07996623EB31685 -4963BDCF8C324D7A5FDC85E54B4CBCAE58D82F08B6ABF76AD6D3A85917118099 -E0FEE836292EB04F89259B12F92881A9E2664609BAC293E43FD0554E0D0C1959 -C53120573628D96FDDDFC7164CC014BD753C8318D20550A14C8D7B0DAFA9E24E -94DAFDD818407AB99EEF38F1AA32323404FB6EE025C4C1DA4E6441BFDA568A2C -96FA853B52F0A0F42BB5047D9AEB4221EFF4D016C17C52ADFF34495DC648770B -F929820673FD4AFA144B077D0E6FDD5FBE3CED5E873474244988A065B66745E6 -ADD5AE225FA11766E0FC6650F0643DB7788A9FB8DEE0DC9E1636046B5DD23AF1 -3B9A9C0FC4A956DFAD610EC24ADA15E5D8A27FC0F2B6B3CA37962EACBCFF5488 -6F89E9AA065F71EFB0F8F445B777F10CAD08EBE6CF3AEEDA0A9C434BC4D66C6D -FBF410B1522C7F40E6F44B5F4CD5C4E3A391C7947C9E2CE6B79EE0A640FD9826 -484EA383A96339A15AFA274700425559A2A185CB0FB31CEA643513D898FF681B -85BF1910887B4EBE8BC4B8B0C1E298FADCD5C79E19F1607DBD8DDC10C2147533 -425093D1CF3858DEA8C29F3B551AA10E86F5CA78C24D9DC2FEAF0CEF9A6B52CE -A4031CE32323765A01755D375CC665FFC65D6327A7147417B8DB659D76C3D1F4 -A6084EE40D9A0BA85A7CF164AF3DCFF32AADFC1D7F4962484B0CB57431B5DC14 -0F907A5F582D325023B65EDA9AD1C5FEE939D24196218BAE0B2FC16830282E19 -2BE9B8B64DA766E087DE77010BDA7D31EDE219C0E252A5E2724FE786C3BE4AB8 -E48EFC6047C2B133ADBE43E82B57F0640FF5DAAADC39A30FC98D3CB62020BFAD -05545B25851322FBEFB027B1FA4C4CAB2BB4B52E001724460CC0C359F9737A31 -1C9253EAFC50DF77B6F3C9C251ED271AE30CC51CC479BE5DE2D6290F8DB508D1 -E92E80DE84FA2BD7B21D3504502F9F64B63388D5120C8851AAEE7FE878482D57 -461E0CA6D2E694948CFDDBCCA5C1451C0E5DDBDCBF5DAADE4101561A983BEDCF -6BF9E92F8941C5890CB026850C1588AD1938185F1DEE52D54D5BE98BA4C62782 -FA273E9FBE8B6B15B99C0C9824C4A4F82A24DB38BCDD2F09288D68D6A6588BAE -D66378287202D4B40CEB5C230765C6A3F5BF0979801937F7C85766A0AB8B4F08 -3CEDE7401BD3F4C041C5A5F23B755F68C67EAD6A8401F96AE9D0D4CC5164F59D -EAF9044AE89B1864AD6792A34BF3F791E06549FABCBE386A158F5A2BB5B808D1 -E0DE5172FE5E8AC13195D474E67818FDC9E7257DF85702616C0AE0E4E60590A4 -A75DF1ACF5F07C298BD3A676A15FF2A64742568A9CCFF589ED8CC2121633B0B2 -9067BAC92D6F69D94904F00A413F524B9DFD59F05711B396BABA68178A3E8D01 -7368F3D3C8A694B5B30B67DDEDEDC62F92C0D53C04516AAD0B51EBE3AF5BF2CA -11C4DEDBD1E9FE0E65E11B73863967A4FF7FCC6C805A5AB76F3B8C0D7687EE34 -8E0573514D99E5E5FD2FE200E99AFA016421485BC2835BE20121EA9426BDFE04 -DC57E62AC2FFED33C6A6D75A6A5CDFD69BFA0185D2F45E0A5BBC3EDE2C6ACB80 -4C9536DE1D4297B5D18C965EB2E513AAADAC9F56BA5D7456C9C557E21201FE55 -60DAB1D95F9AF5D7D123A50706761F6F4E0FA550CE6C67FC6DB317D037A508B8 -23648D896B485F3B1D0C21299E99AC2D54A279A959270024BCCF547455750888 -CFE3F656AFCA7817A2A86115C807D7AD8455772D62C8975D09663901691A5EF7 -CBC370191EB4945FE3BCFAD6F6E5094ED6C544F720406E7E30892656BCA1F589 -B7BFB3402A10CD20671DF4824222E405FA06F72DA04A475C869F2907B7497C4E -1C0879145DC7E0AC8413B23CA86BCE45C225748465F03D4628708ACC998C1BB5 -ED5962F199A94FDB5768A8DDDAC5BC5DBCED6A7849D9097E6602EDC167812A98 -BADB3063B34C7A1D8202EC31DBF15477C73283958F3A0C5E947D84BA220A54CC -7E3600EA6C15D9ACA14F1C4CAE13FB4A126C67801AC73AD4958A3CBBA7030C01 -2DBC955150F4247A6F82D061D8D3D7A77F3645BC597B16D0C08AAB3AAA12BBFB -CADA03B79492676550934B0A5F491D407EF0D3DFDD12327A35BE575B12763352 -4E5C3171406350CB2E77F72C1BF871F1E65954A19A5BD59757942DB2C1014E12 -FB86F381FB40978404A2E05896093B000800C0FF8436C84F3AA47E80322E9E46 -89300072A5EC1FF1FBB85A9CC559A58F0219D7D7A40F9F93B0A0F62B31299F7F -6C1EF2CDA9DBAB5F82E14EB2E4C286A8B15DEFC4CBB85926CF5EE3A7655B9CA4 -744FBB0EB5EC121722886F942DCCDBA5432CFA52BF760352A9DC228E6EEEB359 -E32A03072BDE96D8504EE3A1E74E2623CC0E8F930CE82A6A17ED091B4E9F3966 -F9082F6010B20E22E9016B0659EAE874B03E0521BD0B22810B2F447B8868AF10 -F4352DA9A3CBDAA1D36350E172B774720BA0C018801309AED630564CEF742E80 -F8475A0CC1DDC16FD131C7F3021D70F47B5AD9060625B29E4FB610C3BEAB90A2 -290016C6D048114093613F9BEA595DF4BDAA2B8ADCB510A72F0E92CEC708A79F -093BD179C6478BA462B62A31BF9E8D0991ACDCC144FDFFD440C62168707C6E69 -1A4D410BD213D45532ED4E3AF0359A49AD90DFA148C8AAAE58935EF481769D1D -2773E93E4333DFF0672105E768D0870A027C129212CF9D780024C75F237CFB5E -C765E6AC6279BB5FC9D436F7F328F85D6925F825A96F601259AEC22BF5EF10BE -D524C90F3D5B3C74396CECEE20FA22F4D5AAE8ED4624DD1678A05DC8B21C0FF3 -9BACDB7CF12A45D7D2FA8A13EDE7FBA91DC7DC770E56C7CB864D43CF01543F45 -F586BFB542B22944AB25D731CB4C56BA9ADFF295F50A18717CB682E547ED8FA2 -3D533B5B371F089189572755F5A01AAAE6D3FEAA723195ECC0C069FCEBC750FF -AD34DCB8DA37C92BE80252D8B8A506C1B5ABF3C47E75A8E58A672E398718076C -FDB2F75F6723A762FD3DA0D1BBE6ED287FB5B0C6CF877C6DA06759B0718045EC -6080920A2030ED955A71DA3BB874EE58B69AD9919F7885FDB4CAB1DC001DD665 -F01A562B146E56E0A0270D634D9E3CAA9A11B19163A99D286095A6AD809F25CB -64913FB20266BAD050EF759CDEFFEFAC30A8FD0D4A3E9CB280F6AD012CB348B4 -09AA0CD23750C2C9F7AD23D5DDD514DA96D63ABC3F2E073B64561BA02B8DFD46 -6CB1A691B18370A6ED126233DBC4DCA6C81B455543BD707EF9D6B960765E3ED3 -A8912C207B1F4B76B22CECF203FE5756F8E613316776687A1B2C9AE9BDBFDF7A -8A6AE77368F6E1C1591D07307ADBFD680165B2016C180D063F9A0612B5D1A914 -6D44D00620F06CBFADFF7FEE004AD00DDA1BB5C299BE9A6016B87D7324077A72 -5D176F4D024FE46308F0A45FE917E2E387635A8A1AD20041745E7DCD7E2F7314 -EF96142758CD4486AC3CD516917B7A6D53050650FE39D0EB0BB07493A4C1773A -7AAA2FFB92EF05411F7989071E752ABA3806D8C89FF04CE537DAEC5D156B619C -F01278070941EA7B4DDB11367BB5658FB8DA26B02BB41644FC3204F286987256 -83013544C5ABA11A0C0D6CC2BF268B4A606C321BF1A16C2D125EDB73F00F9E29 -8B3BB482BB62DCC0127B7D3B1F978FB1D172DA3EF0453243B0E67EF48AD4DB84 -BDB1BDB9CD752B76B601BFBA81C8F868BF2F7EF4FAF1C9CB5F410F5031CA8A72 -53B5654189EC484C69624D013B0873F4DE118088581BD133DA02CAACB6634959 -6FA9B9D491BCA7AD51003523945170B2E64CF903DA6F10E8A85DE4E9E2478B9D -E473A5E9CB0AAC3754A3972C52A3833DA7EB7ED200C9F02AA109D20419534B31 -9C929D78239285C590029052BEE1CA289893CB3DC1F49DC0101316188C1DB0C7 -1BBFC04FAE0BB6829E67E8E1DBCDD71AB69E4B9A16BD8A76B696B5CA6772133C -00F32E0CFC02553AEB9AB020822602693C0712256A1A1A77BDBA2C4D27819034 -5770C08C182BC28BB50F177A14CA722EDEEA74CA7AB052E05B1743EFDDC0412B -E5B114D19A9BB159D65452AF62A986E2EC6C02AAAAFC22C7CB8322A597E967B3 -4F9F25791BBF622D81FC25F7ACA0C21B882E857520EC45408020F8B7CC84B383 -2E7E8252C4A2E605D3279854F4B234473F86E859B59885219182B165B4BE71F1 -62B8FE89EE84D0C67E5608FF13D1DF4A1C7E4932463EB52AB14B0F791CC5E9F5 -E7566B48AF01177AE5A97F43E1D9CAEBB84D15F40618BC14CBE056225060A42D -9BCB36A6E4AB567E41FE6D99245BDF931E9AA819CABC224E8B94D9F24DA95973 -3702A9D78B00AB41E5E2EBE2765AE1A2233A08EA6B795DC6DDBF0E5BCC0BC0F0 -EEF78760C3BB3B66936D74BA33BFE63F72DC5B14BBB0F899EBBE4F8614FADA4E -26A12088CA3A7B0E6EFD496CA7B5395A59E27594EACD67A74339C39F2E7D3524 -B0B4907AE836B1A62831EA329DFD8FB498FB960E23C7735165D75C50D499C4D9 -F1460B2E3078A257827BE42E99F1BF3DB9696906E36BECBC21CA9403118BBC25 -E1E41431E92BD7F40D3EA271BFB74D25909155C60AD3A7C5AFF5DB16AB60C907 -7FF407EE593FB3ED2D7C82791934893A0A382C943995C10941A4F57818B0FA37 -94F1D12BC888B668ABD18640DA55CE3AE0C07B11C545B02C79938CD01CE6685E -A1D82862F6973E1AA906E0EBEA21BC5784716F79CD807A0AB4375DB46CBC22FF -03CEF91E01F794B548A817C626B0B7F5A510700931FDAF466136460A8ABD7E35 -58D5113BDE7030BA6FABD3CEFC98C07E4E56214170B6B58C2B92D410EB7A049F -A0027095A87C13F84F9D1B789628ECC22611535A23787B3118BC413AA46FF8BC -2378CF05B2886237F22409C4FD5FC3BC8FC0D247FAFD3F73DD37F62A92EBC32E -CD6C3F9D09CDCB3B455DD9905962A808B2ACBF86EFC1B77BD668B6562266607F -F84C42D7C3BB8224E20618D4FC975CFBC61230B85865CCC59C7F7A7A46DDD97D -A4D76FAA3F4EEAA36FD20430C153A633AF5ECEE95CAE75D3C4A0AE7AA2E91DAE -6FAE64A1585B6906E0F51D8FB108F425882A033464895E879631D70694D4080E -EF0AC2337DE4DB985D1A66A9716387EE1605F1848A2E2C71F09159C13CD2D9E7 -56C43A3DA0BFEFB8ED79E897F297B11920DBC344941749293958C56278E16754 -A45F267B2421183F7499C8983A6C5A8075EE9B820C2410E29BD160F6C00078D5 -C57D0198325AAF84EA41FD60BE2CF64566DC31B50420669DB80F9EB84D9FA360 -045509F2726CA70F8F8A18BF2F02AF5D4B2E27180FFC326909F3596E5C5271AD -22BA29D31D37175E3A8983E560AE31E3210B0A87B6B8432152F396825A2ECDDB -969544A94C3EAEB537EA22F8D02BC113133C561CD552946C398E4C37B12A33CA -803AB7A78F848B11BEC667E28E72963011287E34A58A963CB4E73054BB88032A -65265C86BDA8E879CCE3D48BDDBDBC7098DE7756EBF98F2363DAD31A4DA2A12D -A81C0CC381A6FB4CF4B46CD904DD543689B6AAC6720AF3A851AF9AA4E7C0F166 -8A3864F51DD2F5670C45023B5D330757A71C90E22BCB8651EC73A7FAA2721A8B -92D26022B2C0297F04E90EB871D7AB7BD236CD1FCD25D48FCA2F8073CBB233ED -EB6244F2C7E4EB68590795EC2F8E5D8D02FD827460718EAE728E773D9F3EDF14 -7EE7BE7ED28BBF203568F778F70888E6805044EA720F47A7B4E963C62F4F465C -76EEB76BC36D165A70DA25A9AB083F9446D8BC197E400706016A12EF34CEA55F -9D63D9620F6FC71CEED862683B2F01F9E0CD353CE5D95A6B4E07469433717DA0 -F179C3A6B4DA0A7A9CFD05BFB6C7814A9B66D4376DA678D4A391DE59690C0215 -19DD54B38A7B7F046EDC03A7092C6B9913FDC1C3E23C785F6A755DC9476E9125 -DB971B22C4D4CCF0C23A93ED8798A3D5260A5C206B5CF4F4A9471FCB6C925A65 -1A610E5F6CE6A8ABFA5497E76BB5B2FD852627C64A12FA088045039C37946EE7 -494CFBE9613A15827FDDD365DB6E0CB24B528DE8BFE5D804FDC47A9BEAA07421 -8E48EB0119A67946992405F2F7834B19EB802A7FFD94612C9E66F56F9455DF6F -06D1108DEBC8EC112D608EC57D3F7023781A70A34E826C349B934665E6B3A77F -3D610B3E9876392A43F5CFF2FD3CB5B9C1BBA338C764512418B9B0738B55990B -0F633141C2E4E79D4F3AAE449AED503D376EA16343F55419D48E812F7E4F1F52 -519F4B923C1382E5084D0B185D1249EC6206D1648A35B17F8EF45A3328BFC6DD -2D8EC3994EFAC71D8C5413543A3CDD3656EEC958799AC24DF9C3DCD59409D215 -39786030FADBCE8B9D90AE1B9A9B9674F50384052998E9A5258C382E3A4F29D6 -A1A251890CF5BFD1C7438525CB38C600AB59D6E2C27203A25238F741C61E954A -B25A33D747CA6C00CBF5AED2D8FFF33DFEDC3CD717FCCE69865252EFD6B17ED1 -344533B87F933F3AEBD58364047CAF7DBF95DDEE6133D009D10D6E402AAC8494 -3DA2C3BD728272EC1CFF3397A20B217141DEDEEEC34F178AEE64D457FFCBE41C -AEFD8FD08A3B1E9F7CEFB2D60717407BC472ABAED13B8FC42A702A14C4042E0D -FEA2E3343169845E02356B6286BCC4772275B033D105B4FDE6651D7B2CDA05D6 -62F7C17BCB390205A0EE730A146DE3FBDED3C1ED9A01CACF9341582BA552F758 -4E38CC004A94AF909859E4E40B81067E3622034248D1477267D19350E5E56243 -E31E69A878D41845DF38B9B9429F58E13EBA1215D2AAC277A801667300140156 -0F1AE36E437E4AFD755518688DB56F51A998749B5F50FE5A5265D659B164766B -CE9AD79E5BC01C8DDA3562E988648CEDC78F95BEE4CC95F5E387F1D41B1EE495 -8C477265138359138022BE90D007E03261524F741FC1D53C224CFB4EB090BBA2 -AB1E1F22B39BB4F3088CEC582DF10F267CCBE6B2C0FA16453965BF9A04DC454F -548F744F5C2E7328CA2A005561DFC19F2ABE6141C96A74F99820DE87B06F6135 -F16BF169C41F1E1496E10B4AC47B7A045C8D4FA164C5FD8FE86821785372D177 -427D628FF391F13125C2C714274E595B4EE6CBD53278E0DC5E6E0073BB2211D6 -671240041CD12443B683098F666EBE4C61D648F8B6AD2BC361136AC9FA7B1868 -CF3F5A24C6A5AA1FB2CDD2E3F7A0F2D50C235ABAA9E6F4E1A7084AE328CEEE01 -B698AB0DE731A8E7CB1F9AD9B2BEA94F79A5C2DE587C394A8F5CBB5ED7B20653 -02F978EB0A5F6BAF1683EED4CD35036DC43BCF4F124DD07DCE3D76C75C95D758 -5634E03C6C367549CF51ACA9DF68966B38EC2B19ACDD381B1D66BAD5FE899A85 -594081D43574F92D2FA71B96F59E69018B02FAC6511BA8F0F8C727FF023D3803 -474EC2023D0F9DAEAFF4BF17483CDCD2C48FBE9FAD0F48789846911C6779A481 -FFBD8074568DD1B1084365F88695B9956639F38BDDBDC3103EF19C3FC0053F18 -EB179042215E7B09FF4773D5C56AA8CE4B46860DFFC7BEDAB48C001FB9F20749 -6BE32B9C4A83E6838F32475034C09D7351F08E97760494B4C39B9BBE31859E8C -77FB4E70BFE87E14C5D471DA9D3F5D4134615B1620EDC80A5494191237801B14 -0F866977D48B5C8AB9E71EA6161CE4DCBE65FE7078137568EB63164A0141CD3E -7432852F0CBF1B4A2A9D3FFC03E9D310BC2DA4AD6C8A957254B76F1A32C3DE5F -C9F297C301297304284F9D5E0B1C42AE850660D86A3A808845F6FD3DA6A7EB68 -54B571F078B7A63AE4A3695F9CB247D4DDF7921A48573D0977F17AE74DDF4214 -6EF545E53B5D9E04FD92F0B0F816CC85F9C9A987E2812B8CA402BBA64B259AA9 -A66C05382D696C42432B591B54E94128513E39F1758F4215CDED5C7F5DC100AB -16C35A213C7F1C83E429BD0143178516D5A77E3CFD0400CDBCA7CAF1854C2CFE -495A2D12E7BAD84D7D5088AC5B8E9D830A7D6129DFF9B1B6D82064C122B613CE -4BAEE07A2A119AA496625517002C82391B38DD6E2B494E9381FD69FD90516D26 -512589EA62F1EDE7329705BA58C67A882D8788D481A5CFE3F56DDC27094E1DEA -F65EBCEF92D4A24002D8BEBB38B258D2B483DDB994D7AFEC0A79160B27A887D3 -50FD6DDE0AAFE2CDC07E95FA975656AF0C1771AB7204CCD49C97A142C3303317 -A7915465EB8E52E3158120D9E62E7CB5F0C73D6DE8CB8348CB132DFDCF45FF08 -2D5DC1FBE95C988C90DB8497C3737D1E4680AFD5CA2CC98139583F6A07836DD6 -382B84D038C33124CFBDF80DC1CBD1BFF5BEC8F82F027F4F41E19A0B222B4DF7 -2DB96842A001074E5703AE78792BE8CF1759F3AD4785D68D884460EAD63886C8 -CBB32CE7417DC6482B7694874140728E9211FE130ED7AD5C1FFE481E76A7BEC8 -6D8F82C0A13B89EDDC15D719BBC481ADF1AA24A4052018799BC08D26B62B21F8 -3F4D37CBE73AAF9112895317E4E3D39865F683997ACED55E866729066D351C4D -6306D05333785D2C737FFB560BA4146B13D03F01B1EA45059B8891624EBF7F66 -BE574A7712C9E9CCF3CDCA645F07D74E194D3209E7F4ED938BB378E5FDEC9FE7 -05398DBD8EE62434A4E57266D554395F8749A1A12AC33D0E70B8F93F56A41630 -D5F0C387207D16B5FB04AE79578959416D53736319008C76BF6BC13EFDF0DF0B -D088706A73843497EFD4DA15059814F5AA43EBEE5D0646A28654E1695F8958AE -F13209ED4EFF6F14F51DF927BB713774E61CF74E638D6442FD59F6BCFB7062D0 -5986C27671428E45ACDDB6C1A06E8C90F4CDFFBE60A7115351356C5B4772ED0A -8427F065D3E86BBD9DF604190F15325632FB03D1369DF2442C3F60E80CAAC7F7 -76ED39BDC600791D956694419242018831F607239610CFA7EDD2669BCC66DBD0 -7968732B94C613230264C67D42D18B4F1F33608DC9CCB3D3E22620FADEEDCBA3 -49E6898235E7E6C0FE05910834C2A9C48E181F73EC7B016DB43FEDB7C81DC72B -E73F7F6C07518D9C5CE6ED62D94CDDDB6B49EE05860480625E63E1B212F60BE2 -8D9D5A371BD0D3DA1F23BB59674510D0D1252F70330F964345F63683615CB959 -6AF85AB38B389E75A402B41AC02397DB6563E5789F07B1A1D6834C796A9884E7 -4A23CF00041C4A307CBED62CC5B56187A237007DB3C9A4E84E4BBD097B776EAF -854B977DB99888F2AA7ACA75291FDF4D36DFEFB4E3D8395CD7E15FA4F2F0D949 -498352685B5B744D667CFAE48D2F865C67354A8BD4D808D72B07C0771E95E000 -3D648274AB79350D70A4D046AA5DC76686C82719F3688667B57C1912F6CC6066 -88FA20D211F3BCD27653626F3C3FADFC10DE826CC1812F61020E3E85C284FAA5 -142369B6D225D322A075DE50BE48C3686CF72E9839B0105815196E197D9FD183 -B3BCD30D53C8D8B8A5002E56B7B5B768CEF6DAC28ABDDBA13B2415E4C3619F39 -A841B058700CD22F4F058EE7DA3681D16C129BB3D4B876E702C0FB1DBC053E33 -564183AEDAC340519E7983D2C074C12448AE5C9D50C2FB1F6353EBDDC099C567 -B2902DB6B7C05D5529A7B7B8F89AB0B83B7BF1D8A9139D6F191100FF23C86373 -F9E06C0CD0AED60A2CADB1BECAC35C0E37F938394E3C83DB71023EF8301965CD -327D4C9A236703C05F7496DDAAA01B0745D5368FF6137F1C51F5AE0579715E0F -56AFD7BAF3887D05769E6C0E5E5B962354D939802E7CB3129B2A1B9F86EADE5B -216A148911C4BE95FD0F5BA036748FFE9F810116BACAF70E9B571E061165F49B -74E068D5329E920B325D42552FED5126EC257A964130E56C9503A7EACC531482 -B532E015CA121D94941865163689D05AB0AE79687F4C6A4D213728433FF95965 -69CD7244212530C7A163305709371CB3821CF527A83DD1594D51332E8942ADBB -8B22D55C9F63B59B66F944A4264CB480236C83FBAACF3E77484362CF09DD12B5 -E55A29C4A1CE24D9145DF8682818B1C5DB1F3D70A99664FD7F33A275E322FD10 -59D4CEFABAB45387B2CDC780EB726F45FD16DAE62132D4319CA9078436B45189 -D9BF390C72215E3D1A9B57D0BEBF0FB25838159286AF53F4A0FF1BB61653B4B5 -CF8251590DFCC8BFFC6D79746F475DC891530E75F3B3999C8278A829D80770B2 -77D55F5C0C060BA1C3A8B20D299BF1DD89EB5C92A526B388C153DAC5C109BFEC -FF54697ED1AEA20335E9D5C2352287212817068B0B2404E5E6BE6909BA17189D -58B1E3AB0CA4AF9629DCFA97E5F279CEE27629FB59CF681A2440713EB50276EF -FE30CDB9F23A1ED2C6DE399D1A86C21DB7ABE963745A5CFBB8832511CD1580C3 -D4434A14A16C862CEA36005A4104D40EFCCF25F9DE081B9709B3B101604BC0AC -AAD9AD8C88298D4B8CFE6C8FBBDF876BE5AF40F73F7C7BAED2774547F030AAE5 -E84C09B6D8231066F7B1E8E306E3803852CE65B67F611076BB8DB49A5AB12FB2 -9B2BAD84E95B8D9074C8E7CCD4C2FD95B8EA6A3511CCC529A6DABFC12F4F4892 -597A7D6D1348A3855E3ED2404DA0A105D137F3BA9F2BDA1DE79018969EAC833E -7035C6FF4046077874DB2D158888E051BFFC2EB60EB35DC494FDB1E5A4F825BD -4B695F05A1BDF37AFAFED3AE93B40B242C5532869CF7A75CEFB11F0B22140D71 -5568AC13715DDF6F7034D0501F92290FC246DA690EA1E403CD33099A76D7069F -040E63A630A7EE329167A44965F6FC50EA11A7590CDAD389A0BB807C96236441 -D599B6C264069276F20CEF00A35C43C238B0080D59CBC6779491734701544DF6 -D2D68850784A887E362B3564E1F777361E9E40D80A9EE7248EB692401F485D62 -BA41DDF265E185A35B6A36808A6495F7314BE12B4C07860A86AA784D8C46779B -61A43D0307283298AA7312C6D45939C9425CB48DCAB45BBB8224F78B3BB58B1A -13B7C333AC9BA3EC1F4614C4BBD08093FECBBDFB7A88BB37EA47551D87E0BDBD -80652ECCF25174F6D07D849B45EB1AB793D68FF878A470F393F2CC61D0A5C60A -D3F78CDF9A6B7CE32A5ECEF01C7C9CE19FB8CCBC908E9240D752DED90D2F3B3D -6C542EB12D5ABB5470ECA1C0EF709CFA6D1361FD237B0A4F39FA9C32221F7198 -6C40B4A6BEE3B6989CFD72702E263411B7ACF3541CDA7A2B5A9E03D83E2596E0 -C20470481A590A6C8078D60E5343D8692B404B60663A2368416516FCEE2F7E49 -50E80359B85C250A343B88387F32EF38D6C2DB2B3F3BF16B3A848CF5AC13F992 -8E24B3EDA7C7BAEC90FE62B118A170AC576C451A143257215666A3F3FD2A2F3E -AA0EE89068F3074423D07C14FA407DB6259CE9677D4607127B49E486130913E6 -90F71078F052BF0F1D08768693BDD7F34EFED92FCEF87FBFC9F4BDADD8118ED9 -F13DAD900F57A2391895F8F93562848005A0FE8D9F7C90F959D80614B5C56169 -C5AC0EDB28B9019D9695E0A4FA21538C014D0CE7A2F0A98FE71133F4F09213F7 -858AB9FB2C26698BDFC8009A30CEA60F8C640251ABC3451A3F2D873027288C91 -D493BBE6D66E8ED0405708C11B5C0A74B4764303E8818AC807CA1A3170A68336 -1DC31D6E08284C49EEDB866A0AB7EDFEE1F09B2B85B67F2A35B0F13C36488B22 -08A68D1726F6CBE076BA95EE4D286E4DF8B5DC70C67B894694AF20FB5C1A45D8 -E5BE1F026B17022D2684820F2BF0084F23D4F48DE1264281550FF7376ADF1CBD -423F1F8D80EC764C6FE3BBBCCFD97EBEFC4FF8C09D1B7BD07DB426BA3F09FBEF -2F3F3E3C8323953868625B0E5FC562ECC736D6DFB5C2AE5B2AA8EFA304DD5A0E -DAD0FFD27FC061A6A5BF0D3305216799F438AD1BFD5A0B971D21F6C0052607BF -0244F5E90CB800FFDAE0582D2B8F49C5E8DCDCB7607B094545157E42171DD390 -087DC5FC53A5A1D4A42BF444A796B76693E499C550729123BEE8A0CD5C1E4F85 -FE01AE5671E324A15B384AA5015358C4F22E0E54722B12C8E070FEEA8FCA1CF4 -5333EC677B24AB1F4049C2F7D8A629DFF3479FB7C024E2E6333D06E7A27DDC6F -476CFD6B7BC429783D9759C5D49EBBCE336023835673FF54C920806C58AE6D8D -4C9414DFD0733F9DE8209A4E8E17191FD3E9C059959458A0498BBA6DF9E338AD -AD9038A6BD01B3429C9487A2F2ABC7124CB390338396702DA0671FE52416505E -E84D8792E101F35FC124E95B0FCE7C21E7F93CD9D5970CD526ED575570A1846D -D257AF9E8AA4C46A9EBAEABE45F872144185BD2F8B3365533B7618950F3C8AF5 -5B8824421D3ECE207F62A006ECCBFD233B4D40A97C58C48193A663A309477E0F -88536891252680A07CA46706F9504F263D6D9AA1A207A0E2867C88632D833052 -0E8D1105F75CFAE57A32601D97EF8B95965B490F303950EF8E8D07ADE6756DCC -CC8F246FDBBCDF16322301435235984E762EDF9FDD17B0A69A6A09125DEF7107 -BA0E6569B40B61174A161D420BD200639FE9627B4D4D910F264690B0B2B50A78 -A60863D47AB4B245DCEB5992396C11DE333AEAFCDFB7DE5695F4A06E800C6414 -43EE404F68E6655190B9484EAB0FFE8A2B6CBADCA45A947AFFC66D5510184A40 -2A0CDD5E00B2E91D338E33F3C732E674F52A996C1970D05437E051981120AAB5 -1898395502D6A47076DF3EA7E9871AB0F24167E2A6D602C832BAB91A62486C99 -8178A5C102066585374632FDD192991E310877CAA8DFB4579CC515BED8023300 -AC1547A49DFA38CEF13A21A0FB373CA97810A4362B1827265E4F8FFD8CA96382 -D1604610DDB80598FCD5BDD78E0EF43F1801ECBFB1C6605A4C16DED8A81B2C87 -C6C544B8E538A41E490633E3C7F469B6E46480255ABB9B58969A9E3F3DF31BCC -08B5FB55484CA43C8678C67D8C4B471351E59C1F18C81344FE527C59AAE7B342 -1AAF33C3EB428B9674C352131778FFDFCF2E7B1B830AAA153F952CA65BD64387 -3659AB4B7983D36503140115D81DF0C1372BF518597A8A32E62FF986C32433D5 -7BA33BC468C9AF03C47E6614E137EDA88014D8298E0202BE747D31FEC89E240D -6921685A5955C7EB87CDAF6AF80FFBB4AFBBA869D5DD9DA5FD8831A5AF75E1A1 -CF521601C5B480445D91AAA779EFB79A3D2A204B2668E60A6EA6AF2ABE5E0082 -747F8433F61E9A88675BD8BABBC02AEF296B52FC4BB0ECE30A8B4B5D72982C5B -70EF4305D2FE7C0C6B16E52F7A2EE235725B0E81BDADBA4C8943EB2CAC86D4BD -425CC9F3965D0C8666AB59AC55FC90BB9191DDFF43BB6E76 +0693AFFEF215D00BFCAD02E45496D7C8F5E99EB9096FC4300D038C1AFD31EC4C +5ACA6B72C1BE7204E37A4CBBCB1EC26AB87F2FF82DE20601025169A5FBD2D060 +62B5B2DBC288C79C33B596832AA18D730AD572C6EDFABCBD36DEA87C0F323C3D +6E537AD3B43C6F3A905597570A8C6B0B4A5E08C08EAFF9731E745F2BA8ED0C0E +1ADF7821CFCD4E38F3F4C243CAD31D9F8FC68B9043740852B4CCBDD37BF728E5 +648215961FA82A0C847ADCC5187331D0863A4573BE520C02CAE14AED4F06B3F1 +FB4A318AB54CD86DEC824707B29F858FD726A167F2333855C0575EAF4EBEA0B6 +754B1775F967140641FC06F82B191244186FF347A351FBD8FA62E8C978B21F6A +E124929876488AFA97FAD262BE3D172E2F03F564F1325C9F1E050C83C12E0CE3 +C7F58270B5C40B46B3F592FB41FFB7F59EBD69B2F489441E398FEF7F84C85055 +531D95FD21629B0E509C2FCEE995D025BAD5D3F28CDBA5CD414405ACBD936C3F +AA4CB2620D7426002161F983AE95E542EB8553AFF7E57B82E05FDD5FC433E1DB +BBCFFB1ED92299DB0291CAB10A84529B7FE279C62628A24A2FC36B01976E13A9 +C528A198B8EC8654AD69CCB5C209964A2B25D6DA9BA0FFB366D19D8C69701D7E +8ECBEA88569601C80ACCC2D5487DDBDC27DC463A53A8E59F9EC17D0ECB7D2188 +B6CEC6BBCEE631DBB9959A9855B997481B5D88B8BA29995053CF42C5518A3E8C +AD21553A0F6BC3483624B013D3537F7C85D7C558A9C772554CFC1C3FE7A70633 +318A99533A1AD864430BEAB8A5D4290194F13FC1EEB80C2005998C0126EA9C07 +9DF7B66876309A37685C8555A6CE41C0EE4BF759159FB90FD85AB248BDAA0417 +4245331D416A4ECD2C10905CDCD95169CBBCEAA3E45A70778A746B11D7974C6C +616C217475E1632707B465B622DC2BE08B366A43F3B1F55E1384532F37F5CBC1 +8B2840EB834739DC02C8A477A0E0B5B1DE8F7944DDFFE6B4BA18D9DFFC2A9A7A +78E3BC3A0CBA942C110DD323775ACBAB430724E21575298C6D19663A9F4DFAE8 +AB299158B24294CACB53584FA5931C45205AF58AC7D6075890B8377997E18CC0 +C65436BB7790279B58D2E3C7BCF91EE077B0EEFFB07A403D702B9DA567AC51CE +FE7054FCC281CC34CD04E539FB17299816486830EBBB9DB3AA76247D50FAE981 +65CF044E39923C4E2173A9FE6E38A21CA36F70FB9FA6D2E2246B402D4BB5F150 +48434F9B4F2C2FC1E7C19C30374AC31C2EA87732DA14B6E925DD0F34E48941DE +796C44890144DD9691AE6F0381F174714B9E17A44CED61B9FFE40DA5986D29A6 +587781B9D3AC5CB19BC448E3CE9661EDA021755BC8DF86B3F766B0FFCC6504ED +82B4B8B53B62B399406D1658A37579EE7CAD4ED2554EA16F53122BDB72C89E96 +390332C0EDAE62DC139A6091E640D555E6D7C5AD81CEA20CB8B1272ADA2105FF +FD816EA361C24DCF0BB660E2228DAD143C5E0C101D34F9E1FD23466F672DBBA2 +586DC5BEDEBB112CC621B8778580EEF6B8EFF9BD99F335F43523E09E2062AD1F +DCEA3169348EB141776FA49800CF1173899E5D331768C864E998CE2078C1868B +5F3D166C13AD2C17639BE80856AFBD3B2C8EB89FD41E998A0AEB832AD421FB40 +1AE013CBB43D3D13647A2E27C41470ECC344534289FFF79162D7322C3EF5AD08 +345ECB050186836AA02A47D934D3FEF1BCBA503B9214949974A9C206055BE582 +42632173653D9A62EF76D442ECF4DEBE87030B9C366C7280BE342FF8D0A2DCC8 +A5C6993F0338A71D54F3AAB1CDFFB6AE9ACA6DB5E29024CD357054EC0A149893 +31AF86ABF24E2F7492E461DC9E399E815264D4A06F6DA4364432A12A8492A88F +DC7C433D4D884FF56DC2FC982F8FA87D69D59C4281C8B9529B3D41B854B00032 +8258AFF0063BB4DE1F824D6A526F7F196F21A01E503DB7FB20614F6AD61C84AF +13C23624346FF7A14EE8C073F7FDC888D43F917B353E56BD9C6E69D82ADCDBA6 +AC5EC3523627CF71FD5302B0BEA306EAA6FDBFB2168252D4C4D345775F5AB141 +9233B18ED9373D56FA74DA7A39CB7A90FC6DF98AC03BECD64FCDC2A85041C4B3 +48E999BCE6425C6A0B26574D99AFB5F61B500F600C0E9D5835B0296420FB81DE +14310596E2C64313849B8CE782437D712F8987B3033FD2FEF0A7AA0E26D33D28 +AC6E45A65F03530ACD022F2496B9F500FB274669061791AD5862D1AC84ED0012 +FCBBEC5BDE13D2907F1593011E0F92E558DA86BCE9C464C3037E3B63A3A67B54 +A3CA185B9E87AF9D76D67D100C59BBA1B530CF0E191D013D0DE94B0F9C50ED21 +D7930F0EE3A56EBAC215B0E1C9F85BE211E9164C990E7D4B1072DF49AA02D927 +53A129CD1144A6E4F8C1D23CB2D6FC87A2240B16C9E54BA04E33201A8BEE54C2 +F8798C93FA35EB287004DF64FA5C6AC4F7274F312F6264E94F2215A39CB8F6C3 +563AF9DE8F41D67AE31B326AB9C6607FCB47652F642118977AF4BE0A5E48ED98 +68F717085F0602B309777AD2E4044E1FCAF55EDF8327AE7FBB78AA15A4AF7C51 +5D521D1C6155DF31E7C7CDEC35B5AB7956F7FD06A8FC259A4845C5BA0A293028 +BF5FEC5984BB3702AAD0096C832BB1812A49FDB0D8B4ED1A02D24E82FFD80696 +79B1D2EDEA6D1F10CBF1649320FC04CDA340CB047A276DC388BCA1E39FD11980 +B0676294E4B690D371E3B8DE6F2A6C65861A161BAFBF18900D50D8F5B802D241 +F119E63504AACF61722EC2A9199A7F3C4DB29593C4C3321C1AADB9CF077B7BDB +17E5C1842B9D58DCF916C7DD7B848CDAED357E874D9788C648775A9725973A8B +046CE0FC513437C9436D5278915F74956D7C9B33DFFFEFEEA13176D5E9C7EED8 +E9350EEE1451FFB840E5B8B23A0B065CC861A91ACC2268D2CEDE02799D369AD5 +B9BF63A092F045D25B39FE41758D342B87EFB59F6EFF26F009A5D5411424E027 +EEC7FB8DCB92B707FD2DC7A41FE17E6722BE107873749FBC39B1B02E0E926FC9 +9ABF2343B114AE78DC9987FF435B351002570D9D5A831B96A6FDECAD60B523CB +7BCC09642E31877EF538B6DA969BC71A152139CFF5C656197B0051485A3E621C +B1E9357CD5D9D067C2B0F6E1DE201534EBA84182840CBCA07564BE64BDB09A88 +5C7B39B6FC6E32A2B4F5F22A250609FD5AB034E79FB9B8CDFCF306D878975696 +79D0403D07D02D94C7836B542AA0A163406A81B4B2286A7A3342787C56A13AA5 +B9376622404830BC533CAFC715EFB19518B239ACB7E94637829E3BC6EE7B455F +16DAD8DC390637F1781CA7A11A3FDD7BD3FC9F66656E90596401B633612BEC56 +F5C727D7BD9A3C6303F409C302EFF0280DC344D432C96548A7165F3463D9EB42 +F0BBA79E2AD7C748571732FB1437454179A5F62A790FA31B49492AD4D3A30EE8 +CC221C9F501A58E97E028A15B2598D0CDDB2BBD43D80C69B69637B0CBF24A2F2 +E5841B0FAF27D855A4C22D8FD6F07821B3DD76DBCBC76CB0647E862497F022A0 +367CD77D2BDC6DC109BA966540D94F15F55BAD3C0C2D3114748540E6BE9CF5F1 +31591307B1FA1BC1608635A76845967C4AB1F3190F07C5CC085EB16291C6B8C5 +0046511F7B428757B62FA04C038DF7F2AB09173ECE9BB93293A8BA18B25087CF +20600A85099BF39E6D4E2ED40350BCC6743036D7E5AD9AC8C81C53AD3C5F9D94 +2EACAF71E3256BB90BD1D956BFEE1F7655EEE5728A90BD5C90CEF59FA7CE811A +A708FBD232A38267A6D8A3166CC04E073414B729A70BA253BEA7BC97D77B40FF +4FB239DDB790DF1CC9658004202391FC6E394875C577C1FDC0CFA3E305E5C003 +36D0DC031675AA408BF3FAB297485F413002A79249F6D5DA9825879F2467933C +91B127E329E8E6A02993E92B9DDB3BB4F93E4DB927449A29DE84474086C994E5 +4D15E4A486197F4394920F810396C9F906E8FC0AFFB54B032F3D047156B49030 +3119CC2D5504B057D86D957BA326E961501846829EEA8B847F1FFE4DB8C547D6 +396A1516CF68E589861B56C3F5B6377E22195E3FA866ECE9AA8373A84BFA3554 +553446468572F84A6C7D35059DA21546EA5D0A60A747CC0C2E6E29F1DD7ADD2C +6F756959A5DB3CA09F4134FEF64C2DE432AEBAD846EF2E84920FB3D085BAF23A +7E91F3C016F560EFA44FC34D79B0FAAE2658626F830A59DD723A391329B0134F +F6DC21AAB7FD9CBBA5BC1C625AA6C2BC7D9C12894874A24EC5A90111EEE65E02 +3892B8B22BCF79D983CC56FBF48B7D8DBB0EA0471461A14541F2830160E96B29 +6545EBB30DD19646AB2898FBE1D5962735A99046BED138D650620A35F39FDC72 +42EC7A5CCFE733DA53A6E23373FB2B49D52EC20277393128BE44EBCBB4D7C37D +E924B1F166A0C7ED01E33994FBD2004928082EF54BE02A8357C218637CBC59B3 +476265DFEA687DEFBD0E4BE9264F25F7EE02347A164E9A36B62D5E1EDCEE907F +392A1F2969F52446DA4CCEE43FA9E9BF4310B7A764B90B6FE1350D60F6F21D0D +185DCAC079FF7A45C2A60E65561514CF4928B8523C8368BB4E368AC2F7203A1C +49150748497BBA696E9DFB2FD0617EADFEC5706B4FBAB17E13CCBC9CC1FD283F +F99734D174E503AC25247D76FC76B1AD3A78DAA8AD3A0CE6A3ED326C96043B17 +BAADF2985D521A26ED378841F41FAE21C29339143F904EDC5CA27CA82B0BBC8C +647D31968E47A57322926336F7D5F69CF8CE237FA1E69108E29123A80E65C769 +90156286FE39B33353E85F540649DF392A458ECED452A6973C6D994CD728522A +FE47E7C1617B4F3233150E265FBDF30DBD9DE574D7B938BE61CCA3D275C5D76B +89B3CEFCCD927F9781320882BD26627CA7BFB69B3B76ABD9533F085254F21637 +FBAAE05DB5A50BAA63395D70821126327011E2DFD713323378F55A24DFCB2C2E +129BA5CFAB9315ED4DCE755F1A79013FE4D490F955609FBFB7DB8EC0AC6EBEF5 +DB76FC9DF8F4957F275621DEEDE9125C5B3FBD32174F4FE78C2563C0E00209CB +393B3ACEB8DE30AA20DD26B6894E316872689D5954CF95FD0E5D292F29DF1ED4 +0B0746E862F7F4D9916D82E82CFF6BFC8E2277A2E43F57D152D54C56123EC368 +B9BE0CC8BEA71A1AB5CF35C2CF7AA39AA539B56781DEAF53E245415454B530A3 +08B5C59950A279AE37A48C95EA86FF8339ABF4720AA68FD68B078B246373AF6F +E409295C5E1B6E7B733B1C1FADD4863FCE5E373B3E8439FBBF3AA45F30FBC656 +15BFFE5748E6C3B5FA9F3FAEE38263E5A5504D88A31CFA5B00E253062B681D0D +7CEFAD5B0FF85B58BD4A0509CA4B342DE63D25B935F9AB6DE5A30463DC59EFA0 +DABFCAD726EE8342A3FD62997C3A7ABC8AEBCF22DE843BB456E3987904A421DF +76D9D3337F9396D94A6A9496A4B5011C97F6D7262927238A579B29B08CEF0E72 +09C760D2B8D26D32CD36409C8866DCE819E59989530A3BCF2E374D7D0DABF73C +D365C0EB1EB94F356F72CA27BBFBB45FE5FCD2DE0B79D4E17398593B4515FF21 +618FAEBF277D59E5C5B72D6A1F6739AF3E223BA4CCB15D619C322E36AB334DFE +50F72B9217965D2DF82C4274E98CDC2753F48D1901765709ACD6E270E3F78956 +1528FD58DFDDD0D859F9DCA28306B67014263719016BC9298C4EFDBB7F4CCEC4 +E56C2D9B407F0AEA035DEDC80B4EB576AD60C5368295F6D249E74F686B8D0281 +32B91C1BD7DB446408EDAA43DA867703C9956056C700347557BF693335289143 +F70FBBBEE55DDC1571435DBE799B45B689FEDFADB3C756D67FC290A71AE1BD0F +44D918CAA1B3622247E4798F4A6D6F89F6A36B467322CA2D3B9BD3483DF80A0F +7E09D321708BAF010640A28F916E44396C0140FB96E6121FCE625F81566B06B2 +8F9516262397C4C0DD8FD22D072C28D257AE2132B7658EDC786857B9057E3759 +A27EE1E770BC0745D9BF5F0F9A2C2F457BCD31036EFAF67219B9C79981A68074 +D3EB41251AA58ADB9392B56DBF091AD17A51A291ED8FFFAB28BA0627D4A0E90B +B489573EDB53E6F150348285460928A848DB92143FCCC84F525D51F2A36D4274 +F9A543E5FA4CF3EA68A49FDC679F5961212FAEAD82BEBD924A926E9DC6BB450A +09E969D4C2DFC5723473B70C023613DA4CEA344B7233CEB3D00C6F0945EE11D7 +E0F701E2C8427FCBB0D57C4ED46424E4CFAB43A4E5AA36D1A38D3B045DD1DF64 +8B9BC4A96333CD95206F436486180F113767AE8ABBFC3D400C80ED653D7BC095 +CCE6DD2ECC53106F65E7736335AB2685D6A51A94061C4CDF3DFF06E6D879A91C +949D2C2CA8666151836E124F686FAEF0FB42859A172E2D0F8D081E1A73A5F6C6 +E61C586B43B28EB7D08ECD915CDBB1CE735C0FC08A850176DF9704DB9BF71AC6 +29D21D3374BEAE9D51C81DEB509918A6637E0E00794B05540EDA577F379B09B4 +19E10C6629A33E029ADB3A4934F05454745C6A17CC6F1359FABFB5AB53B2F910 +B5F397291E6A463A5AC971965FDA9FC053EAA894E1FE04A24F47EB19FFE67A3B +2A5DFE539C57004C2B1AC8C0A59764F91CC6E9FAD6158427F82B9E1C77F715ED +B7EC1202D698A6913D3EBCD6CEFD098076A6827DCBED5812B5F969AE9D4BA95A +F12C40519E33EF065C9C69496C2042267E20ADC4BF0C8DCCF5FFF524E5ECDF22 +B31A066015FD4A5E8DCF4C484A11E39A53C813C87CCBC147912B9EA28C535602 +B7C5D5882F4FB764EE060C3D363D5563865F67CC8EC87165A37D00DB05287364 +84EFE9A54C36D8EF6F4B86A79D79903B77469F48288261F83970F7B56CC0E6AC +60B1F2AD9BDFEE0372C4E5DA1EC2DED6D8FC0230D2875A58D127D2599954ECF6 +962CFEE9C966FD747F60F3A9E02D219BD3031B041669CED09F9DECB766806A69 +19EAD473044DD90156E552925DE0844F7B8913F83CEED2B03E27DBD811B6497F +CEFF454F02330D3F0DBB6F742FD650D8FC64BB8ECD63421002E486CCE5AD262C +E26BCA5323B70AAD8699467A1A720F87F86BA0E289E463F772CDB7894E6D7808 +BEAFE9E0A69CA4A4BCA8DF61C7260BA3658C8678CA2A3CEEDAB05599E1BEDBDE +B213CC753C946A22BD0A545590F53642F89299BACFC5F1936F9EE63388670F8D +7AFF3E514BC93BC357F1A037D0DF7A511AF561366C1BD53C203606F06ACC61A7 +9565308A39A1EAE5E9809EE7D948795EAA763B05B6027D2F597607DB8EB5B545 +EA8F935A00086D86EF34DD686E7FA152FF18766F9F680070A0FD20995B09753B +3EE773684F79D01C7F40DC742FAB74716753DE9848C0AE8E96203692C2137D2F +6889EB67827ED0FA63709951A68D9C426D3598EB0CF3F8B8AADE80C2EE0FC92F +96005CEF73FAD0BD11F23B003E7094C72C702727C315BBACA116E29F61C37B32 +D39A19D53DEAE15279C9A2FB1DF92E989B4EE2974D78738B0E39C57E44131EB7 +42F7C271EEA410273698F4C02FA17EF7A33C216FE37849737D62A9A339595F5A +1A330346B6500F33C4C37A9E1CD824B3D34947BC5FD36DBDA232559005C2B14F +C4D9B2CA6467E4BF0E835D9A29053127EC8F19B0935DC4AF2F3997C59B1BE5AD +6B4E8F50B75A501F60715783CD39DDA3616165AAF4F904680E2C01B66AE2EEDD +6DC49B5D4378F381A086E3DBDB8E6790FE69AAA2385E653928DDF995656AEC06 +61E73AE147CA437524B559D6EE05D68C1F8ECE741DD6E99C1C3F8946F9B9A002 +C534775EEA9D77A594326AA4B50C234C965BD32EC7F7E9CE813E24EA47C452D2 +E8A6F2A20B0ECFCA3209011E3328B5E458056782BB79EF56485D7E6F796E50B5 +B0E5375F09C46590A9912913F9C702E294633F5AEF12AE2AE0E279794ABE5F23 +25F777B4DAD76416CBA671CF7C295E1B539FA057681F86E6882BFCFAAE205BC5 +7C0A6D0DA33A4EDE00EB08BB3B863664BCE2E70BE0AECC9E9F7B9CD9C921324D +C88D67922DEB40A3DDC0096CE0261C3366BF374717D6761942460D115C9C3F31 +053A1D5105D6D1F8938222720E8FECCD989F95A33290CF0B48A41FE6AA8A135A +F52E439552DF6334711E9E47603D471F6F6E13C1B16BBDFF6BE2BF2EDAAB15A4 +CDE92BE381E945F8C9D3454D4B5789D1C70851934961FC16682021BB8711F61C +0A5C1E236D891EC50BC4B2BA6D8A2C6983057A10F36E52AB407E852822EE91CA +5F54DB15A878DCB322ADE1142636D912678D42A68C07719CE59360BC08ACE64D +31196B5CBA3C03F62930F8E23FCAFE7CB64E8451CAE1F29C093CC4249699654E +B64649C3AB8ECA5ECDF9B2206AE64953F20ADE3D43EDAEA9A4D041A05C5FF7D6 +C02A8BB1FB32280BFDC1794647F11C7CF83FB1E9D7C3283AB3DB8A2B8E50FA58 +59AF00AE5134AE93BB3689A9446E55D42DAF400AA41C5532BB9490C00720D309 +E279614BABCCD807F0649982B356228F2B5A7FCA0CAB90969C23B71DD27A9796 +D096B860743AF9F9734233180983C4218D5234AD1E28BB2489DE60D8CBD23D2D +A2990C3A2310091FA37B80BD6C5B963DC989042D254953EB7AE64D1C965F1ADE +3EEC885838F428458EEE082EED5DA4F267792F890BC757447327BFE0A7BD11A8 +CA512B4A118E191E4F0E9AF7CF3B2184D49A3CC5751E59CFADC9A955DAC0C0EB +2C6F9CD152E90D780EF52B1D7DE430C66CE9DD188EFEB2EB3249B6B59467AF14 +6809310C1157E226FD7C94BCF528F741F745E3940C1F1B9CEB731DE7C5BEE08E +83A157EDD5380C618336CED69A064B2B8091B5F76CF63536F17CF81AFB04A225 +DA54D3EE177EBA1B804B7949BC4B8758C584D67C821633B563D72BD9F834017A +26E32DFC18BBDB6FD96DE9BE41254E676EA376EEBA85C15AB5AB88B773978F79 +BD31844F188F4D372B1810F9DD89961A2EDB3E129C80121FD1035E619F36081E +CC276BDE9146156681A7482B0CD3A7E963BCCE935C3E69F77035C2320736930D +C935A27D293348A28937BFD30395075BE40F1C5474CBC7D65BEE830271FBCCD9 +DFAAB5567DC25D131547E4ECBE55B03EFED0E44277559DB19FAA37C164B85DE9 +432D7364145D7E5DC443E920AACB0CF6931719E08EE784B25D848AA9CFBE5539 +761F88B94C9886394A7C1D9B0AAEB8612E11FC84CD3EDC25E8485BA5690086D3 +E39C038A53184DF677721C03276C629D414067B4AB0F6E5B1AE6FBC292FF71B0 +BCAA67C86E452CED1749AC2AA1D02CBC7B5BB9C564EE1FB3B45B2DCF9E1F9B2C +D5DF634277817342C527618AC1B86BF15D4E248CE50D5EA773A118EA6A37D658 +57954885B158B4A434CAC9457756BAC356EFBA3B00E9268CBADB61DD1AF33CDF +A1DCA6B8D96757925E509DD7B0D33BE0C21045CDE0DEA92FD943B1D0E2811F62 +3F061B367DE01BDFABDF2EF3FCF0491819D25619AABADEC9965FBFAD1D58A802 +F8F253F46AB4756ADFC1B3DD64326FBE340A71021DCADEFC44743C99A9CC8575 +3B0C7F25CA9FEA918F82AA648FEC525EBB75B1AA47216050C74088FA42091BAF +3D95286800E400535A83D504A353CC016A269D13E4C74E79FDCEDC4B56905217 +9018D85ACE1B989D55731515706CF39AFF2ABBFA8489F42447E7560C3294FF60 +F58785664096508D35EB80F81A39493426F3C1C070D946C77362C925897E5D05 +21EE4B210B79B3431300CCE5EA39355FEA878857CB789D16B957E39F995CF488 +892FF7FD7CFF4AE95B5B32583AD35710EFCF4C5CAE1F96AE7BA8DEC42CD57C31 +BCD3318F0F7117FCEC41E4BFE543CCFC69D57C0149EFE6075EBC81592E534564 +C7480C20EFFCB57D3F7EFBD3952F5599A8AC376CD2BBD4EBB12B44D9D9863569 +560D2D59520DBB6A2613D3174BC810C89514E0828323A9164D20832D2C75153B +BF388B98239B4AC9751AD57C2A25C5631EE7BCE893995F10306766D483FD867B +C29386B3BFAB3C5F9A07E56C8D6D45336265078428FFEF66E957602C0A4040FC +291B8648491AF5CAEDC6D40758E436432C0BF40A93F96CF1B4E9492DE1D142C7 +47C422EAFB4AD732A345B3BFC2C615A10B59F29FD8C58B6A0CBAFE329D9178C1 +744D14FAE70E94754EC67E41B837C14AC865630F8C9CD1E9BB8E97EC953BACC5 +0B4B5B4F04C75635E2830876E2AE7D0EB0B2CFBADF5B6E41231960F37553C42F +5F5E83B41AD4A75C8296C3ED321333ACADA874EA607FC84615E06EDDBB31B456 +8593F57DBC39EB41A1C0DD4539B7933829AC1B116B8661DFE674EBE05B068D1D +C4209B86051F6B585D66AFE23A5501DEFF3EA0C229F218D861FAAE80403606ED +1310B5F1EEBA5B1B83A6A959ACDBFE22D46BE01B07B8B7FB5B0CDF1E66E2FD90 +118A192A9B1E97B5D1D9165A948744A1B960DA72AF308E496E9D5FB2EECA8119 +808ADF470941702DB7235CE46FD7CF378A3CAA8D6970B15578A12F894297E27B +7E203AF7F93D6D2B194523B2D51064A3272582712ED56A12987BE676E20BCF79 +D9A507162F330F648A4236A1283DFA6C602F87A4C1A1AF205DC57128FF70BEF2 +50039CACA401D3A9002EDAA9DC6F72CEA7B30E032AD42EAE66789C13680682DD +C3CE5D10483745E6B12E963683CD1C5B2F86884A0E59F2D04AF9DED9E822DB1F +E5F14CD13AD39ECC1E8745B05B879834A8BBAF4578686557958B2257D0B34356 +D89D751E2BBA14F3755273479DC653ED01F6052639DDA9F6CBD9A4A319357F91 +B2D2BF5292B32BE971F2EAB21C651CA38FB9BF1B7C3F3BB46536F63F61BE88B9 +F8E20A197C1B94FF572D53B4BA8EBC6898AEE82464570EEEAC49D2ED9C653877 +773B3ED7E9C597952A6379F83F4177C133A6E770435FA67EC39AF6F9BDBC5849 +A1D27E68F5540EF421A081BE87F4C3C0178A3BA6BE166BB18B669E2FBE8AD2F2 +80A1979B7356E82388B51A98243BB9D6C29B2653E104B916E6B1A90F96885ABC +5A48B448448946E274150F1AD1816CE4D56D59CF148AF178947E52FA1EBFC874 +0931E0315C5037F24F139CC9E039A184EBB036ECA2033A70D9D14DEC4EEA2B9F +A0F132F6E63CBAEB544683469D3A5866F65E13CDD80623E5499584CCE7DE8AED +A85B1F7F53567BF58497ECE9A32E7B1EFBD9FDC256D724CBB7EBFDE3924EF67B +E944CB5396696625CE74F971CA520204D8D9EDE5A440CAE121A208DD3BBB0AAC +EF332B272870F26C605DD0974DA9BA728BB155303F5C5751B9B7B1FBE515EF05 +D481B9FCD96E6F3DFBFAFE846828ACB2AE66C90C6689E66790F1D142B3D4331F +59896FA02F4588D2C4A1666D6B3E6330059159C133B5F80C1FEA6983B3A7D65E +ECB180A121C6117D53C1DAEA9E4FAD13B0B3804208F11F175593673477427338 +FE402CC01CD6D8B46908E190BF08A477D7C65B58241EA83F584490FE1D18CC18 +18503402228FF42B65ED61368C7CC198CA98A3E269EDCF1742F59528EB81FB5B +017D5F3158B2224EEC7A2C21CD2A701D834F602760229B9CF2FFC290405D7D21 +394F7CFD9D7B5413DC52B36E2AA18BC769B4DA6912B2452CDE7CF15746864CE1 +A45E9E9268822265D1380A3CA82F651F9F8584F3C75D366C6BB96A732E23E0A2 +E1E1F0E4FA87B119E547047F4341638B7D9386C0F8F2810E03A461512EDD9C61 +2EA6E18D0BB04A3CEBB75498A4D826043CA86CB57FE14A00A4FA5517850E1511 +6D7E0664F97CA7C495D01D02908BAAE8160B0B0325E73B3C85A34838979B1F42 +70EB7B0FBAA076DCCE4D1ADDDCD332F42E4FD943515FFCDF34735034F13B5803 +42F0605590B3A8A23C0D6308A621EE8837C79290F3341ED3958355F0B4927AF6 +85BCA5A62FAD45E72442F541EC9A89A9937ACD7904C9D3066E059CA6E20CCFC5 +7983FAFC88F6844C274A8F42D34F052CF6C4930E6871A4F76B573CDC48B10DD2 +5980DF5663CDD00B7701C7DC0D72A535713E6CF18EF5BE8F7D315F7393890BC2 +5A641672A904E7CB8B407E0766E104E5C4DC3DD88F6A8EB255423F0F0E73247F +C4AAA97C03F2FE4AD4D10EFF0721308C6EE85F53E0EAD35F0F64567C84D5D202 +872A60C87EEBB3B6E85AC3D20E9DB260F37BD182AB50DA996406BE0B0F579EFA +7D81AB4B77CE39120C3573941386275027D72288CC873817D6E94C7BC657EAD4 +D76DA726352C2BC7B20E357DD64B3443BC80D978B2630A2AFB2293801662BE9D +D8DF886C0A4567F351400785B66D70412EDE4B53696F345F7E62738762121BD5 +0121BF06267D8534D9D02261944143F7470A2D7D70B6C30B55A9A103406D8CCC +5813E8C3CE294AFAA420C35935BEC915ECF17C495D79A9CB8DDB75E8A1C6A525 +1B1B420AE8E0159DF7AF26D635C93953ADA11C2228E0443907EB72B805644363 +65EF866ABAFD03CFDC540D3B00CC0AF1AC1BAD7D6B16E99216B3F20A4F09C559 +055D34CC6E88532735409162A53B077C37B06CA194AFE26656F180118B1A48AD +737B56AAA87A494E9B2F34D3ACBFC61C0C9620A76C0A0AA8CDB2B2B0E28D4739 +7432829128E83DEA68D6D4DBCA1648897882C8EF4C2FC6895FBBB6A230563CB7 +AC766E4C7BCEFEB342F9A5FDE6B6846FB50DBB5EEF8C6AB4F839618106250CB8 +C0EDAF9BCEEF07FC68D3E13135DDCF20EC52D6A25E533FB9E29F84CFDE8A78D0 +B5C63AFDBA8B1C4F74FF7127C7B49241B69EB9B7B126F5C575ADFFA29B27B4E1 +716BE3FA246B6500F278919D571C81EE27AC3CF8696871796A560761D477BF2E +71690CBEF553D4AF7AF6CBA53635C89A0BA6844C308478A476A42B13DCD01DD7 +73C4B2D0DFF0C0E1FE6B36B7F091307DDE52E330DC8BFEADFAA60B9193CFD6D8 +C3C1172922D6E46FC2CDE41CD0FCD1B88D485E0FE87B9458B9247C82060D33C9 +B19A7DAE9AD65579A99EFCAD02BE6390860FFC7C4E3F96235327397361B0BE9D +7B2F2EE5D47731E86DB99ACFE39AC140AEA0EB6FED70362FAE64391914233E8B +19E23092C71ED360FBF6E445E34D8972352E5D34E11B00F027B068E431C2E8EA +68A511EDCD103577D38CD594BC86789644F3DBAF2FA1FE1E4073C29BF4E39E62 +0020FD146794CB5B6090E5BF13B02355A7689A824B564B95845E51C03048B476 +32CFFB922E878699CE93E25394EB242BD21D77CA71D28EA7B6939A37DE1DD8D6 +C1BFA07F113631DFEF0CD8ADF418EDDF1D1BC0718F554CA3351AC97DF5F6C40A +B4073F62C3E604F76770D9563F149B50DE4819D8C03077FA1E2DE8AFC505EF4B +591B5A8D761B3018D5C5DD3D26329C3AEB150A34AAF84E5E1D0590BA2A17BF5B +E36A4193D13FD446339D3C9A1D4C336846C1CA17337F014BC0F52747878BDFBE +4DC8D2B871BAA9DA59718E9FABDE91AF2467BF2A322C5D9FDCD4D90AEAF2DF56 +A4446FD1C71E9FEFDDDB6940C33EFF3D60177C9681A94EFB154B1AE000292D6D +3B6B9CDDC1982FBEFF024B195AB1066645F80DD1418A70F8CA518A219EE35AE4 +D046C9560B162713FF31F2A5619E834957CB1CE9B561215711FE48927A370F53 +06FF00FA14506E42912FCE82DF59B8E1697014E9708A2EEFD0ADA95ABC545596 +FF2DA33F77D87E10B990872423FED32E3B5623166DD0A579664A46CFD8F95E20 +E35B03760E964331ED2F7FA937F9BB078F71F31ACDE4EB5050C9F8EFF4223FE2 +5E9670292E319C371791B51C7CB90681D8302BAFB9A1DA864C0C87F694ED93CD +D46A5BAFCC9579A5019A9249CF72771FD412E735D8199A48E04103CF78468E5A +AA222D2F1C9280EF55DFA685959400282E286BB56538807F5C87B193224A889C +680E05F93BB9210653613BCE43CB292AA4BEAC36C5591B5026EDE95BA780BCD4 +62422499D61B7F2A888712264BCC0B4B8B4DD28036F4950FC9DBC7FC525F5B89 +3924EFA75F7F50423B506A5F8D46E8BD5D0C5147F2AD7C9BCF57A93F8B188D6E +0BC266CDF09C0B78D7DD79B659B4F9336B98D2CFE2A0DD15CB79D87FA528EE52 +7C5CF1E83FD5403E42DA8E753051CF34C72CF5901CFA96E2F4021EF63622CA73 +F416404FEDD730D7DD28075299514670AB74CDF77609B432E3A8ABF6CDF34BE8 +82C866F9EEA56C7D36758D27E7DA6D26A37041D7DC19A8D6FE1CDCDE1A2FE3DE +51D29AC8CE19F6885A6A8906C9F3D54224028FCBD2D34C225D7165ACE46B797C +3C8B6840895554D460F6C7CB4A4AC0B0B1A8CE7016E2CFDF56072C7CC6E0913E +E924D4CF20226948F2BB641023E9C77824CC393163794A7C34E9925AF03F9E5F +E0AE47FBBF6086BEE6ABFBB0702788A63F8C5174ABDDAE23C0FB989D53EB4AE3 +9699A447724DFE258636E6DCA1B6D7A2D434C0415967C672B1F843856F87BBB9 +666328FC7FBCD4F6D120565BBE9F15203DBDA16D0B9F44E4DC1E1FB4BE45BA00 +63891961DB1EA0E711B6A13AF3BDCE301BDD9CA172E2CAF4F5BB67A1E28BA76E +8F574B86B036D79F24CDDC1FED51604C497C55479B16319471606F74CA153356 +09060F16951F28921F61C65097DC59A8A3BEB9E47C036FEB2ADB906C4339D227 +28463D527C20044AA1251DE1563CD4C897A62693E4F1FB78888C7159A8EAD8D1 +B06779571B340F6A131E1D4911BED7BC25D6DAE32928119C9C76664E53413BFE +62711326E3A3EF13E1B62F8E84E5744807BEF8F5C7035CCC2D693585ADC56A78 +D4FE6B027F4ACB9E098B0E6418045226B5F6F2349BD0450CD1A567C7E8ABC433 +8C4C850D60FC770C33910356567198F239CEC1D061A5C0D31980C379C93768F0 +728E92AD4DFE86E9F23EF4B7435939734EC22F02B029C1D4330DB135E3B8B092 +D2616EB4AB01BB854A5281F9F2CD67F6FBA75C3E5E7F70999DDE833979C7B3B4 +BF16433EFF4E9B234A85EFAA4BAEC9C47CA9C7BEAAA6D87458CCF2E12A38CDE5 +4D4CB4F60F851689C0DED75CC8701881BE66ECE19CA9791E9959215631B19C75 +5A35F948833D1228FF297D7800FEBD3F7A2B5F039D9CC39092101603F0CE8B76 +F1EF3FB06907054ED6A67D1C9E34769D36B19A12320B1C16B30DF6CF1B17CEDF +834FD6902344BA4145D7120C94882C75E30F02D96D8D7313BAB167A8A1CD4E70 +D022F26AC307F1FF2D098C1E6D89B9228B960054248374A313AD567C902B6814 +263B20792737EA1B42A228795AEFE63EC95BD7F06EE15AC1D0355D57AAE276B5 +FF364A28929E7621BC14719A265064CF6625976210806979280850CE81F1D1B0 +363B275C7A6D6BD8D56A5DF05A4CA41184BEE1D18496C3BB96DC3386FDB41E06 +F8409B79B1971B6FD73977C36A8C0A7742E7429E389CD6EF5FE87CBC16549B93 +5D31B5DE762D3BA5DDB12664314E094CD3D1E3B854B223038B3AB373C41EFA8C +3BF4D37160927CFF10954D279B2C5AD85E6E6DD56BABB683FC01D824C546E2E7 +A7FF73A1CC6330E05D3465A34440FF5581CF574F9F335CBB0F836628117819D9 +A8E4A579141A7E47EA1001A63FCA77DA6E55219BD89C64A75BE45FACB2F2E48C +A7375404E79BC059AE2839C0FFBCC8F945678D95055046696F3F2B6D8B2D7539 +BBF07A064EFA2B75EBF04A6D780A6A496A6F25593220D413AE1E37D0A08A8713 +19D6A2500B3C6467FEE0940586E4B2C524F7C8C92924EEF47EC0ABC373DC1F43 +D3AE4879D6D4495DFEDCA0EAA8134F41D5329EAA414956F1398615D779F13AF6 +338D3255646B5BA8D9C75D24A5FA1F9B0B91EFD97236F9EA50286D83C6F1EE43 +B040FD84E62469D9CA5A946A9567D2706D33CB19BCCBFB19A9CE3CCBEFC058FD +CFE63199D28E2841B458BA5E2CC0330094594FD4BAAA432B62E6F03C114E9D89 +7929597C7A8B16EE964614972FD47CD357E32D9E7581D407EB5FA16CB0D06517 +A3C9C88B756AF52975D8F419E5FFCF778499597748EA8EB85234BCAEB1AE8D2B +BB70E887569E9FC08D981B3C76E5CEF81B0B32953B92AA61DE5EFAA5310C2F20 +5E2ABE8D48AE0230986FDBA94C8D0006C0DCA86B3CD91B979B5D68277FFB26A6 +046D331FEADDD50592D143CE3628AD080B314ABC5EFA22B58B65B629E173AEE0 +55890CEC63AE5C4ACA0594F055ED0F8400A367212541A3E6164B00AE6070499F +1538603A87CBF4606E305005EE95335C411F2B396231F1B3756CE8B6EC95595F +8C66A933F2EB729A381FD502B02470741F5F7D2909C6881697772023480FE87A +E06E7FF3C7B165B53DE3531A35AC1C8C3EEAE32F44471249DA431B381F3042C1 +3D2E9750A33CB1416738B014EEFE93664B6856ABDD56FA5757EDD96949DC870A +FDA5561452DA2B61C0126916D5B8DC5D776B6495920F8A56F9754A74A47F171A +3697C75E6DE088AC7B7D7B3E8823DBBE4B66FBC2ECD8B907B428C0A5ADD93930 +45B92D9EEF1F64D9B364B4CDAF486C96B38304CAB171686B3F07019B87120B19 +64ADBC525F2261601C7BC5B17E0A1ABD4066EE6705697AE8C0992807CA3C8489 +70A76918BBBDFC662726E201C3EFF3A4626CDA05745446493CDFDC5D6C812DD5 +8CB7D705649C363FC0B111F3A6C7C0F233F79BBAEE2793C1A55561CA16B85B93 +69F84D39B401F72A8E4FE159DA89A217CA0B413F44B7592F16EBD523353E45D9 +F6DD625A39848DC224CB982A6B9F535D4A27E0BC3B2BF8EF45657E1EFBD0EBB8 +9BFBCD6E0FF339913592F43F0841F7FF864C296DD12580F0803FEDB1DA850D00 +9A8B3868F409581D04D73D356561D2E2E8020B5F62872C45381AE760D00DE6AC +C62396DAE0585B6F0ECF75A1012A63A4D54073E2D80D3CC5743B3BD03D2B1D52 +933CD3E003F28333A88AB2F091D16424C4C9EE3BCCB901E40349C6E33858B246 +BC8788B03E7B983374A37E8618B8377E0556FC76C6C87B6B8F4763D21E00F892 +4B37190E27C266CF556A12338EE1335BC5890E9D86D1B248FB67A10C358D2DB9 +AB3FCD5288973C84880DE54D5512CE587A61933AFAB1669A0D2BDBBA85E0F8C5 +2C6D6E58871999D177C9B30AAB9CEC401EFC7BC457B8A00196D228CA0E12C709 +228419492684F9CFA0B7F764D2675B672E83A7E0F39AFC997B56C6E70A447795 +ACE4D67B2832C0689189CB6A9FDE481CD3A2CAB2BFE336B929AB0954251583C1 +72402167F089E58610DF14536C155092B6998BE9CD99736E122FD3A3FBCE1953 +EBA1ABE66038DFE8C440C98B77CF80E9CB60E3144C0D80AC23DBF8537D690162 +576A2120C201D3F2E4C38D466F7A9FF33C7A8DD9E39AB1E2DD0C044897655FC7 +6B996EEFB09D6E0536C59320F8971BB5E500970356A296220233B11E19BAB3A8 +03F82CE41B3751753C320025C53F1E6304EE6D9727FB9E61AE7D125D4F656F90 +35F8AB032DD3FDB56B3F99F7828E95DF01C1F094DECCDD3AC4CE2FECF037B4A8 +6DF94FD6738E8D487A4C76A82C223ECE7A50519E6C9CF02CB92EBE0FA1BF6BDF +8CC79E6197F8E5EDC387660068C235010232B0ABEA843D722E265DA77D67FDAF +2C0277C9BF9914C322A06EB63CF8D33CBC17C7C619A16D2A0553A2DE83192009 +E9228B7A1D17837E5F99772D0A684E50896859C1DD87B51D090AD6FC0D661F14 +9EA1EDCD97EB9200E4DDC04356EC05453DA0DB84C558C55C3B7CD0C8DE5F511F +733E0AD84D1FD19474D58338D2FC530F11FB36FC72D529B4992606CE8D623850 +20B07D3B2AC91C7538A52BBE3DF079B0AB4DCC1EA2D51E3CB6321D2F92769893 +3A7D0AAAFD015AB189C1BDC9F8AF96185865E66F633A6BD74DD553B1D1B0FB66 +89CAAE8C7D0DD7A7EDC1F49E143B5AC0851330E64239DB148910C96834F9570A +65736B1E973E0DC7B65531B9A36DC5725058C466CAA1A4EF667FC9AA5A3707C8 +4D5543F8933E3DD5E0B1B8C242CA7E8892BBF6CCD481AAA99B96522FA77C1227 +A7534D02E08FCE557A93BE74E8084CFDC916566C47CDE46989517FCCA718AF98 +7FF243F5D75FAFA39D49DD87150D8F62F91A869F12F53790D0F5818DC6842E51 +26D98AD2B3A25B04D7E19D4198B02E57444DCC86D3C62FE9E0D7129DAD344D1B +F4C1EC4C8B096311109F5EB48A5EC3F4931EA134388F2B46B99F58410BACB788 +F4470FB91C8118C2A0212D5F8A4024B3B6DCB37BD1D216056B1E8763A0669EE9 +76835BB2234E86EFE2D6E4D7D882BFCFFCF29D4C553195A130C956CBA0B0ECFD +699D14A277369E5A7A5F4C482681A23FC8C7523E4BA4BA8383994007125A06B7 +C21068BB8946DC829473503EC92C873E63B9CB8631D76365C619F110AD5EBB28 +1D690D791B69BF643559E753FEE9A611815846A2F45699BA4F1768F162ABE615 +AD05C737E64E3E0E5E2A92A030D29051F74C8D6B2BC5308820EFA5FE40279C41 +1D21332BDFEA24AF7143192D6146D9AF64BF827FB2A23F7FC66D0656A986D477 +D98F41AFDB453C3C762E1D729DB377A01E9D22EFFE6E5F39ECF66FBAE371392D +D04C813F16764D194F60629538745909675CC6B087275FEC0C6DA3970135F43B +54B3DEAACE34F3F5DE1813D6E445D15E230277B91F47DA19539DD198A9349340 +5888F8D44F26AC106E9D7D7BDD133DD32CDD56736126A4CF401252BDA1C2240A +AD1653664A317A99B117BE4840A7F8A03A329846A0B927ABD28ACBAFBAACC426 +6E78328BFC11F47BE45195B5692A4EDE6FFB01FE2AB1B2678C39EEA39C74C576 +BE5D26667013087FECF4D6E397B54EFD44FEFFCA1ED10D1CEB2093C8FF01718F +6E420C769B60BC91D4A28EAA6DF03C61869E96146CA42FEF5EC2ECAC9C2B3DE2 +E43F86CEDFB029B5455503B63766C4EF624D9A04508DDBB5C38C0DE662AB1FD3 +31EF92E1C39C8B1DF11D00A4A0908A3F6000A3A7FCF6F73C5738AB3271A5B75E +CE01D536CAE4D86FEA334727961F1AF27A454947C737B44A3F528520B60B6200 +E81554075F94FD00C4A0852F44068CD096BCA5D6D3703BB886B8B5EC9B9E3B0C +D5CEB91337B3B3A9E5173C2ACD3A3E3AB4A1B9BFAE1054640DFABD1F6B0C22BF +363CB43B26262AF3BF8DE092B180FDC6C9BF4ACDED6C3BD0F7BA3D3684EACD5B +235E557FF4CF03FB3335E7EAD0846C5753C68E510670D6DAE77E0BA5101E5C89 +A68847444E4B6CBD8A1ED036AABD5C76D7902F1CC3AAB4B7F65AF3097F9BBFCC +3D79313CDF148613C31E5DD7B1DD974EF7EA50EA012F77DC1067323AA92553C5 +DDD670D1C5CA695290DF0579EA6335F7E34EE8EEBB219B75706106A0F2554F5A +7D26D6E4A642CD3CE3580C69784E95235F5356C99909494ADF969A3DB253DE9D +EA60768AE4AEDA02B9AEC2033D7784083105148ABD3CFBC816EB988B01F652C5 +A8C74C5FDDBFA5A13FFAEC90C77D932A9C41578D7DC49B11AD98DF75E7B7304E +30BC2E8E0281B6D2FD57D00DB836384BEFBA8F517F6DDD7F9E030019F27F237D +E5DBD0DB7D3A0A8DD34842FCF33770454A12DF553220F15F8916F064CDFBF9EB +67FC0BF6BEA776851431277A23D6228F6D4A51857B72E165FAEDA87B1631CE28 +E6B0827F64FDB35CF48AEE923C80B53AFB84169EF6F1574A5643BB76B7331024 +55A7F52F64A41052134BC5AD2DC092B21B033C1C4024B03B360799368594AECD +C42D45591F9875D46D5EE20EE703F1AD1C205E45D9845AD224C7D3F0EBB66F78 +ED96C162CD2CE58B5C18BB5D7938E06A860F7211B8B38FE9B849F58F8E809489 +7C6579EFB9632A0911E28DBFA491BB655A7C2AA6A833CBE87E740D3D2C 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -6897,64 +7452,65 @@ cleartomark {restore}if %%EndFont TeXDict begin 40258431 52099146 1000 600 600 (bashref.dvi) -@start /Fa 130[62 1[62 123[{}2 119.552 /CMTT12 rf /Fb -133[34 41 41 55 41 43 30 30 30 41 43 38 43 64 21 41 23 -21 43 38 23 34 43 34 43 38 8[58 4[43 57 1[52 60 58 70 -3[28 58 3[59 1[54 58 7[38 38 38 38 38 38 38 38 38 38 -3[21 31[43 12[{}50 74.7198 /CMR9 rf /Fc 197[21 58[{}1 -74.7198 /CMMI9 rf /Fd 134[39 39 2[39 39 39 39 2[39 39 -39 39 2[39 39 2[39 3[39 19[39 27[39 39 2[39 45[{}18 74.7198 -/CMSLTT10 rf /Fe 129[39 39 1[39 39 39 39 39 39 39 39 +@start /Fa 131[62 124[{}1 119.552 /CMTT12 rf /Fb 133[34 +41 41 55 41 43 30 30 30 41 43 38 43 64 21 41 23 21 43 +38 23 34 43 34 43 38 8[58 4[43 57 1[52 60 58 70 3[28 +58 3[59 1[54 58 7[38 38 38 38 38 38 38 38 38 38 3[21 +31[43 12[{}50 74.7198 /CMR9 rf /Fc 197[21 58[{}1 74.7198 +/CMMI9 rf /Fd 134[39 39 2[39 39 39 39 2[39 39 39 39 2[39 +39 2[39 3[39 19[39 27[39 39 2[39 45[{}18 74.7198 /CMSLTT10 +rf /Fe 129[39 39 1[39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 -39 39 39 39 39 1[39 39 39 39 39 39 39 39 39 39 1[39 39 -39 39 39 39 1[39 39 39 39 39 39 39 39 39 39 39 39 1[39 -39 39 5[39 39 39 39 39 39 39 39 39 1[39 39 39 39 39 1[39 -39 1[39 33[{}81 74.7198 /CMTT9 rf /Ff 167[62 3[60 46 -2[57 1[62 76 52 1[43 1[62 65 54 1[63 60 67[{}13 83.022 -/CMR10 rf /Fg 135[67 2[67 1[50 2[61 69 5[33 1[70 2[68 -52[60 47[{}9 109.174 /CMCSC10 rf /Fh 140[56 3[56 56 1[56 -2[56 56 56 57[56 45[{}8 109.091 /CMTT12 rf /Fi 134[48 -48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 -48 48 48 48 48 48 1[48 2[48 3[48 3[48 1[48 1[48 1[48 -48 48 1[48 48 48 1[48 48 48 48 1[48 6[48 6[48 48 48 48 -2[48 5[48 39[{}49 90.9091 /CMSLTT10 rf /Fj 134[65 65 -89 65 68 48 48 50 65 68 61 68 102 34 65 1[34 68 61 37 -56 68 55 68 60 34 6[93 1[127 1[94 85 68 92 92 84 92 96 +39 1[39 39 39 39 39 39 39 39 39 39 1[39 39 39 39 39 39 +1[39 39 39 39 39 39 39 39 39 39 39 39 1[39 39 39 5[39 +39 39 39 39 39 39 39 39 1[39 39 39 39 39 1[39 39 1[39 +33[{}81 74.7198 /CMTT9 rf /Ff 167[62 3[60 46 2[57 1[62 +76 52 1[43 1[62 65 54 1[63 60 67[{}13 83.022 /CMR10 rf +/Fg 135[67 2[67 1[50 2[61 69 5[33 1[70 2[68 52[60 47[{}9 +109.174 /CMCSC10 rf /Fh 140[56 3[56 56 1[56 2[56 56 56 +57[56 45[{}8 109.091 /CMTT12 rf /Fi 130[45 1[45 123[{ + T1Encoding ReEncodeFont }2 91.3242 /SFRM1095 rf /Fj +134[48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 +48 48 48 48 48 48 48 48 1[48 2[48 3[48 3[48 1[48 1[48 +1[48 48 48 1[48 48 48 1[48 48 48 48 1[48 6[48 6[48 48 +48 48 2[48 5[48 39[{}49 90.9091 /CMSLTT10 rf /Fk 134[65 +65 89 65 68 48 48 50 65 68 61 68 102 34 65 1[34 68 61 +37 56 68 55 68 60 7[93 1[127 1[94 85 68 92 92 84 92 96 116 74 96 1[46 96 96 77 81 94 89 87 93 1[58 5[61 61 61 -61 61 61 61 61 61 61 1[34 41 34 4[34 26[68 72 11[{}64 -109.091 /CMBX12 rf /Fk 135[42 1[42 1[30 37 38 1[46 46 -51 74 23 2[28 1[42 1[42 46 42 1[46 51[33 32[51 12[{}18 -90.9091 /CMTI10 rf /Fl 135[56 2[56 1[42 55 1[51 58 56 -68 47 2[27 1[58 49 51 57 54 53 56 46[50 2[50 1[34 45[{}20 -90.9091 /CMCSC10 rf /Fm 197[25 58[{}1 90.9091 /CMMI10 -rf /Fn 197[33 58[{}1 119.552 /CMMI12 rf /Fo 134[85 85 -1[85 90 63 64 66 1[90 81 90 134 45 1[49 45 90 81 49 74 -90 72 90 78 10[122 124 112 90 120 3[126 153 97 1[83 60 -126 127 101 106 124 117 115 122 7[81 81 81 81 81 81 81 -81 81 81 35[90 94 11[{}52 143.462 /CMBX12 rf /Fp 200[0 -21[91 17[45 1[91 12[71{}5 90.9091 /CMSY10 rf /Fq 134[48 -48 66 48 51 35 36 36 48 51 45 51 76 25 48 28 25 51 45 -28 40 51 40 51 45 7[68 68 93 1[68 66 51 67 1[62 71 68 -83 57 71 1[33 68 71 59 62 69 66 64 68 12[45 45 45 45 -3[30 8[45 21[76 1[51 53 11[{}56 90.9091 /CMSL10 rf /Fr -134[71 71 97 71 75 52 53 55 1[75 67 75 112 37 71 41 37 -75 67 41 61 75 60 75 65 3[37 1[37 1[102 102 139 102 103 -94 75 100 101 92 101 105 128 81 105 69 50 105 106 85 -88 103 97 96 102 105 64 4[37 67 67 67 67 67 67 67 67 -67 67 1[37 45 37 1[67 5[67 112 1[41 20[75 78 11[{}73 -119.552 /CMBX12 rf /Fs 129[48 48 48 48 48 48 48 48 48 +61 61 61 61 61 61 61 1[34 41 34 31[68 72 11[{}62 109.091 +/CMBX12 rf /Fl 135[42 1[42 1[30 37 38 1[46 46 51 74 23 +2[28 1[42 1[42 46 42 1[46 51[33 32[51 12[{}18 90.9091 +/CMTI10 rf /Fm 135[56 2[56 1[42 55 1[51 58 56 68 47 2[27 +1[58 49 51 57 54 53 56 46[50 2[50 1[34 45[{}20 90.9091 +/CMCSC10 rf /Fn 197[25 58[{}1 90.9091 /CMMI10 rf /Fo +197[33 58[{}1 119.552 /CMMI12 rf /Fp 134[85 85 1[85 90 +63 64 66 1[90 81 90 134 45 1[49 45 90 81 49 74 90 72 +90 78 10[122 124 112 90 120 3[126 153 97 1[83 60 126 +127 101 106 124 117 115 122 7[81 81 81 81 81 81 81 81 +81 81 35[90 94 11[{}52 143.462 /CMBX12 rf /Fq 200[0 21[91 +17[45 1[91 12[71{}5 90.9091 /CMSY10 rf /Fr 134[48 48 +66 48 51 35 36 36 48 51 45 51 76 25 48 28 25 51 45 28 +40 51 40 51 45 7[68 68 93 1[68 66 51 67 1[62 71 68 83 +57 71 1[33 68 71 59 62 69 66 64 68 12[45 45 45 45 3[30 +8[45 21[76 1[51 53 11[{}56 90.9091 /CMSL10 rf /Fs 134[71 +71 97 71 75 52 53 55 1[75 67 75 112 37 71 41 37 75 67 +41 61 75 60 75 65 3[37 1[37 1[102 102 139 102 103 94 +75 100 101 92 101 105 128 81 105 69 50 105 106 85 88 +103 97 96 102 105 64 4[37 67 67 67 67 67 67 67 67 67 +67 1[37 45 37 1[67 5[67 112 1[41 20[75 78 11[{}73 119.552 +/CMBX12 rf /Ft 129[48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 -48 48 48 48 48 48 48 1[48 48 48 48 48 48 48 48 48 48 +48 48 48 48 1[48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 -48 48 48 48 48 48 48 48 48 48 48 48 48 33[{}93 90.9091 -/CMTT10 rf /Ft 131[91 45 40 48 48 66 48 51 35 36 36 48 -51 45 51 76 25 48 28 25 51 45 28 40 51 40 51 45 25 2[25 -45 25 56 68 68 93 68 68 66 51 67 71 62 71 68 83 57 71 -47 33 68 71 59 62 69 66 64 68 1[43 1[71 1[25 25 45 45 -45 45 45 45 45 45 45 45 45 25 30 25 1[45 35 35 25 71 -76 45 1[45 25 18[76 51 51 53 11[{}89 90.9091 /CMR10 rf -/Fu 138[108 1[76 79 3[108 1[54 3[108 1[59 88 1[86 1[94 +48 48 48 48 48 48 48 48 48 48 33[{}93 90.9091 /CMTT10 +rf /Fu 131[91 45 40 48 48 66 48 51 35 36 36 48 51 45 +51 76 25 48 28 25 51 45 28 40 51 40 51 45 25 2[25 45 +25 56 68 68 93 68 68 66 51 67 71 62 71 68 83 57 71 47 +33 68 71 59 62 69 66 64 68 71 43 1[71 1[25 25 45 45 45 +45 45 45 45 45 45 45 45 25 30 25 1[45 35 35 25 71 76 +45 76 45 25 18[76 51 51 53 11[{}91 90.9091 /CMR10 rf +/Fv 138[108 1[76 79 3[108 1[54 3[108 1[59 88 1[86 1[94 14[144 4[184 10[138 66[{}13 172.154 /CMBX12 rf end %%EndProlog %%BeginSetup @@ -6969,23 +7525,23 @@ ifelse end %%EndSetup %%Page: 1 1 -TeXDict begin 1 0 bop 150 1318 a Fu(Bash)64 b(Reference)j(Man)-5 -b(ual)p 150 1385 3600 34 v 2361 1481 a Ft(Reference)31 +TeXDict begin 1 0 bop 150 1318 a Fv(Bash)64 b(Reference)j(Man)-5 +b(ual)p 150 1385 3600 34 v 2361 1481 a Fu(Reference)31 b(Do)s(cumen)m(tation)i(for)d(Bash)2428 1589 y(Edition)h(4.3,)g(for)f -Fs(Bash)g Ft(V)-8 b(ersion)31 b(4.3.)3217 1697 y(Octob)s(er)f(2013)150 -4935 y Fr(Chet)45 b(Ramey)-11 b(,)46 b(Case)g(W)-11 b(estern)46 +Ft(Bash)g Fu(V)-8 b(ersion)31 b(4.3.)3217 1697 y(Octob)s(er)f(2013)150 +4935 y Fs(Chet)45 b(Ramey)-11 b(,)46 b(Case)g(W)-11 b(estern)46 b(Reserv)l(e)g(Univ)l(ersit)l(y)150 5068 y(Brian)f(F)-11 b(o)l(x,)45 b(F)-11 b(ree)45 b(Soft)l(w)l(are)h(F)-11 b(oundation)p 150 5141 3600 17 v eop end %%Page: 2 2 -TeXDict begin 2 1 bop 150 4279 a Ft(This)35 b(text)h(is)g(a)g(brief)f +TeXDict begin 2 1 bop 150 4279 a Fu(This)35 b(text)h(is)g(a)g(brief)f (description)h(of)f(the)h(features)g(that)g(are)g(presen)m(t)g(in)f (the)h(Bash)f(shell)h(\(v)m(ersion)150 4389 y(4.3,)c(20)f(Octob)s(er)f (2013\).)150 4523 y(This)35 b(is)g(Edition)h(4.3,)i(last)f(up)s(dated)d -(20)i(Octob)s(er)g(2013,)j(of)c Fq(The)h(GNU)g(Bash)f(Reference)i(Man)m -(ual)p Ft(,)150 4633 y(for)30 b Fs(Bash)p Ft(,)g(V)-8 +(20)i(Octob)s(er)g(2013,)j(of)c Fr(The)h(GNU)g(Bash)f(Reference)i(Man)m +(ual)p Fu(,)150 4633 y(for)30 b Ft(Bash)p Fu(,)g(V)-8 b(ersion)31 b(4.3.)150 4767 y(Cop)m(yrigh)m(t)602 4764 -y(c)577 4767 y Fp(\015)f Ft(1988{2013)35 b(F)-8 b(ree)31 +y(c)577 4767 y Fq(\015)f Fu(1988{2013)35 b(F)-8 b(ree)31 b(Soft)m(w)m(are)h(F)-8 b(oundation,)31 b(Inc.)390 4902 y(P)m(ermission)21 b(is)f(gran)m(ted)h(to)g(cop)m(y)-8 b(,)24 b(distribute)c(and/or)h(mo)s(dify)e(this)i(do)s(cumen)m(t)f @@ -7000,508 +7556,508 @@ b(exts.)41 b(A)29 b(cop)m(y)h(of)f(the)g(license)h(is)f(included)390 5340 y(in)h(the)h(section)g(en)m(titled)h(\\GNU)f(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License".)p eop end %%Page: -1 3 -TeXDict begin -1 2 bop 3725 -116 a Ft(i)150 299 y Fo(T)-13 -b(able)53 b(of)h(Con)l(ten)l(ts)150 641 y Fr(1)135 b(In)l(tro)t -(duction)13 b Fn(:)19 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g +TeXDict begin -1 2 bop 3725 -116 a Fu(i)150 299 y Fp(T)-13 +b(able)53 b(of)h(Con)l(ten)l(ts)150 641 y Fs(1)135 b(In)l(tro)t +(duction)13 b Fo(:)19 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:) -g(:)h(:)f(:)h(:)f(:)h(:)57 b Fr(1)275 778 y Ft(1.1)92 -b(What)31 b(is)f(Bash?)22 b Fm(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g +g(:)h(:)f(:)h(:)f(:)h(:)57 b Fs(1)275 778 y Fu(1.1)92 +b(What)31 b(is)f(Bash?)22 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h -(:)f(:)g(:)h(:)f(:)52 b Ft(1)275 888 y(1.2)92 b(What)31 -b(is)f(a)h(shell?)13 b Fm(:)j(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h +(:)f(:)g(:)h(:)f(:)52 b Fu(1)275 888 y(1.2)92 b(What)31 +b(is)f(a)h(shell?)13 b Fn(:)j(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f -(:)g(:)44 b Ft(1)150 1130 y Fr(2)135 b(De\014nitions)13 -b Fn(:)20 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +(:)g(:)44 b Fu(1)150 1130 y Fs(2)135 b(De\014nitions)13 +b Fo(:)20 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) -f(:)h(:)f(:)h(:)f(:)57 b Fr(3)150 1400 y(3)135 b(Basic)45 -b(Shell)g(F)-11 b(eatures)27 b Fn(:)21 b(:)e(:)g(:)h(:)f(:)h(:)f(:)h(:) +f(:)h(:)f(:)h(:)f(:)57 b Fs(3)150 1400 y(3)135 b(Basic)45 +b(Shell)g(F)-11 b(eatures)27 b Fo(:)21 b(:)e(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h -(:)f(:)72 b Fr(5)275 1537 y Ft(3.1)92 b(Shell)30 b(Syn)m(tax)25 -b Fm(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h +(:)f(:)72 b Fs(5)275 1537 y Fu(3.1)92 b(Shell)30 b(Syn)m(tax)25 +b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)55 -b Ft(5)399 1646 y(3.1.1)93 b(Shell)30 b(Op)s(eration)c -Fm(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g +b Fu(5)399 1646 y(3.1.1)93 b(Shell)30 b(Op)s(eration)c +Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) -h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)56 b Ft(5)399 1756 -y(3.1.2)93 b(Quoting)15 b Fm(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) +h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)56 b Fu(5)399 1756 +y(3.1.2)93 b(Quoting)15 b Fn(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) -g(:)h(:)f(:)h(:)f(:)45 b Ft(6)524 1866 y(3.1.2.1)93 b(Escap)s(e)30 -b(Character)11 b Fm(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g +g(:)h(:)f(:)h(:)f(:)45 b Fu(6)524 1866 y(3.1.2.1)93 b(Escap)s(e)30 +b(Character)11 b Fn(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) -h(:)f(:)g(:)h(:)f(:)h(:)f(:)41 b Ft(6)524 1975 y(3.1.2.2)93 -b(Single)31 b(Quotes)d Fm(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) +h(:)f(:)g(:)h(:)f(:)h(:)f(:)41 b Fu(6)524 1975 y(3.1.2.2)93 +b(Single)31 b(Quotes)d Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g -(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)58 b Ft(6)524 -2085 y(3.1.2.3)93 b(Double)31 b(Quotes)26 b Fm(:)16 b(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)58 b Fu(6)524 +2085 y(3.1.2.3)93 b(Double)31 b(Quotes)26 b Fn(:)16 b(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)56 -b Ft(6)524 2194 y(3.1.2.4)93 b(ANSI-C)30 b(Quoting)d -Fm(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h +b Fu(6)524 2194 y(3.1.2.4)93 b(ANSI-C)30 b(Quoting)d +Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) -f(:)g(:)h(:)57 b Ft(6)524 2304 y(3.1.2.5)93 b(Lo)s(cale-Sp)s(eci\014c) -32 b(T)-8 b(ranslation)8 b Fm(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) +f(:)g(:)h(:)57 b Fu(6)524 2304 y(3.1.2.5)93 b(Lo)s(cale-Sp)s(eci\014c) +32 b(T)-8 b(ranslation)8 b Fn(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h -(:)38 b Ft(7)399 2413 y(3.1.3)93 b(Commen)m(ts)26 b Fm(:)15 +(:)38 b Fu(7)399 2413 y(3.1.3)93 b(Commen)m(ts)26 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)56 b -Ft(7)275 2523 y(3.2)92 b(Shell)30 b(Commands)21 b Fm(:)14 +Fu(7)275 2523 y(3.2)92 b(Shell)30 b(Commands)21 b Fn(:)14 b(:)i(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) -h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)51 b Ft(8)399 -2633 y(3.2.1)93 b(Simple)30 b(Commands)c Fm(:)15 b(:)h(:)f(:)h(:)f(:)g +h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)51 b Fu(8)399 +2633 y(3.2.1)93 b(Simple)30 b(Commands)c Fn(:)15 b(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)57 -b Ft(8)399 2742 y(3.2.2)93 b(Pip)s(elines)18 b Fm(:)d(:)g(:)h(:)f(:)g +b Fu(8)399 2742 y(3.2.2)93 b(Pip)s(elines)18 b Fn(:)d(:)g(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h -(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)48 b Ft(8)399 -2852 y(3.2.3)93 b(Lists)30 b(of)h(Commands)15 b Fm(:)f(:)h(:)h(:)f(:)g +(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)48 b Fu(8)399 +2852 y(3.2.3)93 b(Lists)30 b(of)h(Commands)15 b Fn(:)f(:)h(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)45 -b Ft(9)399 2961 y(3.2.4)93 b(Comp)s(ound)28 b(Commands)22 -b Fm(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h +b Fu(9)399 2961 y(3.2.4)93 b(Comp)s(ound)28 b(Commands)22 +b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) -f(:)g(:)54 b Ft(9)524 3071 y(3.2.4.1)93 b(Lo)s(oping)30 -b(Constructs)8 b Fm(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h +f(:)g(:)54 b Fu(9)524 3071 y(3.2.4.1)93 b(Lo)s(oping)30 +b(Constructs)8 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) -f(:)h(:)f(:)g(:)38 b Ft(10)524 3181 y(3.2.4.2)93 b(Conditional)31 -b(Constructs)18 b Fm(:)d(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) +f(:)h(:)f(:)g(:)38 b Fu(10)524 3181 y(3.2.4.2)93 b(Conditional)31 +b(Constructs)18 b Fn(:)d(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)47 -b Ft(10)524 3290 y(3.2.4.3)93 b(Grouping)30 b(Commands)15 -b Fm(:)f(:)i(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +b Fu(10)524 3290 y(3.2.4.3)93 b(Grouping)30 b(Commands)15 +b Fn(:)f(:)i(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)45 -b Ft(14)399 3400 y(3.2.5)93 b(Copro)s(cesses)18 b Fm(:)d(:)g(:)h(:)f(:) +b Fu(14)399 3400 y(3.2.5)93 b(Copro)s(cesses)18 b Fn(:)d(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) -h(:)f(:)g(:)h(:)f(:)h(:)47 b Ft(15)399 3509 y(3.2.6)93 -b(GNU)31 b(P)m(arallel)c Fm(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +h(:)f(:)g(:)h(:)f(:)h(:)47 b Fu(15)399 3509 y(3.2.6)93 +b(GNU)31 b(P)m(arallel)c Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)55 -b Ft(15)275 3619 y(3.3)92 b(Shell)30 b(F)-8 b(unctions)29 -b Fm(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +b Fu(15)275 3619 y(3.3)92 b(Shell)30 b(F)-8 b(unctions)29 +b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)58 -b Ft(17)275 3729 y(3.4)92 b(Shell)30 b(P)m(arameters)17 -b Fm(:)f(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) +b Fu(17)275 3729 y(3.4)92 b(Shell)30 b(P)m(arameters)17 +b Fn(:)f(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g -(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)46 b Ft(18)399 +(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)46 b Fu(18)399 3838 y(3.4.1)93 b(P)m(ositional)32 b(P)m(arameters)20 -b Fm(:)d(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +b Fn(:)d(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h -(:)f(:)50 b Ft(19)399 3948 y(3.4.2)93 b(Sp)s(ecial)30 -b(P)m(arameters)16 b Fm(:)h(:)f(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h +(:)f(:)50 b Fu(19)399 3948 y(3.4.2)93 b(Sp)s(ecial)30 +b(P)m(arameters)16 b Fn(:)h(:)f(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) -f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)46 b Ft(20)275 4057 -y(3.5)92 b(Shell)30 b(Expansions)17 b Fm(:)d(:)h(:)h(:)f(:)h(:)f(:)g(:) +f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)46 b Fu(20)275 4057 +y(3.5)92 b(Shell)30 b(Expansions)17 b Fn(:)d(:)h(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) -f(:)g(:)h(:)46 b Ft(21)399 4167 y(3.5.1)93 b(Brace)31 -b(Expansion)21 b Fm(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g +f(:)g(:)h(:)46 b Fu(21)399 4167 y(3.5.1)93 b(Brace)31 +b(Expansion)21 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) -h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)50 b Ft(21)399 -4276 y(3.5.2)93 b(Tilde)30 b(Expansion)10 b Fm(:)15 b(:)h(:)f(:)g(:)h +h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)50 b Fu(21)399 +4276 y(3.5.2)93 b(Tilde)30 b(Expansion)10 b Fn(:)15 b(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h -(:)f(:)40 b Ft(22)399 4386 y(3.5.3)93 b(Shell)30 b(P)m(arameter)i -(Expansion)18 b Fm(:)d(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g +(:)f(:)40 b Fu(22)399 4386 y(3.5.3)93 b(Shell)30 b(P)m(arameter)i +(Expansion)18 b Fn(:)d(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) -48 b Ft(23)399 4496 y(3.5.4)93 b(Command)29 b(Substitution)12 -b Fm(:)j(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) +48 b Fu(23)399 4496 y(3.5.4)93 b(Command)29 b(Substitution)12 +b Fn(:)j(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g -(:)42 b Ft(28)399 4605 y(3.5.5)93 b(Arithmetic)31 b(Expansion)19 -b Fm(:)c(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) +(:)42 b Fu(28)399 4605 y(3.5.5)93 b(Arithmetic)31 b(Expansion)19 +b Fn(:)c(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f -(:)h(:)48 b Ft(28)399 4715 y(3.5.6)93 b(Pro)s(cess)30 -b(Substitution)d Fm(:)15 b(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h +(:)h(:)48 b Fu(28)399 4715 y(3.5.6)93 b(Pro)s(cess)30 +b(Substitution)d Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) -h(:)f(:)h(:)f(:)g(:)h(:)f(:)57 b Ft(29)399 4824 y(3.5.7)93 -b(W)-8 b(ord)31 b(Splitting)20 b Fm(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f +h(:)f(:)h(:)f(:)g(:)h(:)f(:)57 b Fu(29)399 4824 y(3.5.7)93 +b(W)-8 b(ord)31 b(Splitting)20 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)49 -b Ft(29)399 4934 y(3.5.8)93 b(Filename)32 b(Expansion)13 -b Fm(:)i(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) +b Fu(29)399 4934 y(3.5.8)93 b(Filename)32 b(Expansion)13 +b Fn(:)i(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h -(:)f(:)h(:)f(:)43 b Ft(29)524 5044 y(3.5.8.1)93 b(P)m(attern)31 -b(Matc)m(hing)d Fm(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +(:)f(:)h(:)f(:)43 b Fu(29)524 5044 y(3.5.8.1)93 b(P)m(attern)31 +b(Matc)m(hing)d Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) -h(:)f(:)g(:)h(:)f(:)56 b Ft(30)399 5153 y(3.5.9)93 b(Quote)31 -b(Remo)m(v)-5 b(al)9 b Fm(:)17 b(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +h(:)f(:)g(:)h(:)f(:)56 b Fu(30)399 5153 y(3.5.9)93 b(Quote)31 +b(Remo)m(v)-5 b(al)9 b Fn(:)17 b(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)39 -b Ft(31)275 5263 y(3.6)92 b(Redirections)26 b Fm(:)15 +b Fu(31)275 5263 y(3.6)92 b(Redirections)26 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)55 -b Ft(31)p eop end +b Fu(31)p eop end %%Page: -2 4 -TeXDict begin -2 3 bop 3699 -116 a Ft(ii)399 83 y(3.6.1)93 -b(Redirecting)31 b(Input)23 b Fm(:)14 b(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)g +TeXDict begin -2 3 bop 3699 -116 a Fu(ii)399 83 y(3.6.1)93 +b(Redirecting)31 b(Input)23 b Fn(:)14 b(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)52 -b Ft(33)399 193 y(3.6.2)93 b(Redirecting)31 b(Output)26 -b Fm(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +b Fu(33)399 193 y(3.6.2)93 b(Redirecting)31 b(Output)26 +b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) -h(:)f(:)g(:)h(:)56 b Ft(33)399 302 y(3.6.3)93 b(App)s(ending)28 -b(Redirected)k(Output)12 b Fm(:)h(:)j(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +h(:)f(:)g(:)h(:)56 b Fu(33)399 302 y(3.6.3)93 b(App)s(ending)28 +b(Redirected)k(Output)12 b Fn(:)h(:)j(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) -41 b Ft(33)399 412 y(3.6.4)93 b(Redirecting)31 b(Standard)e(Output)h -(and)f(Standard)h(Error)d Fm(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)58 -b Ft(33)399 521 y(3.6.5)93 b(App)s(ending)28 b(Standard)i(Output)f(and) -h(Standard)f(Error)19 b Fm(:)14 b(:)h(:)h(:)f(:)h(:)f(:)g(:)h(:)48 -b Ft(33)399 631 y(3.6.6)93 b(Here)31 b(Do)s(cumen)m(ts)c -Fm(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +41 b Fu(33)399 412 y(3.6.4)93 b(Redirecting)31 b(Standard)e(Output)h +(and)f(Standard)h(Error)d Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)58 +b Fu(33)399 521 y(3.6.5)93 b(App)s(ending)28 b(Standard)i(Output)f(and) +h(Standard)f(Error)19 b Fn(:)14 b(:)h(:)h(:)f(:)h(:)f(:)g(:)h(:)48 +b Fu(33)399 631 y(3.6.6)93 b(Here)31 b(Do)s(cumen)m(ts)c +Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) -h(:)f(:)g(:)h(:)f(:)h(:)f(:)56 b Ft(34)399 741 y(3.6.7)93 -b(Here)31 b(Strings)c Fm(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h +h(:)f(:)g(:)h(:)f(:)h(:)f(:)56 b Fu(34)399 741 y(3.6.7)93 +b(Here)31 b(Strings)c Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)58 -b Ft(34)399 850 y(3.6.8)93 b(Duplicating)32 b(File)f(Descriptors)16 -b Fm(:)g(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) +b Fu(34)399 850 y(3.6.8)93 b(Duplicating)32 b(File)f(Descriptors)16 +b Fn(:)g(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)46 -b Ft(34)399 960 y(3.6.9)93 b(Mo)m(ving)32 b(File)f(Descriptors)19 -b Fm(:)d(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +b Fu(34)399 960 y(3.6.9)93 b(Mo)m(ving)32 b(File)f(Descriptors)19 +b Fn(:)d(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)49 -b Ft(35)399 1069 y(3.6.10)93 b(Op)s(ening)29 b(File)j(Descriptors)f -(for)f(Reading)h(and)f(W)-8 b(riting)19 b Fm(:)e(:)e(:)h(:)f(:)h(:)f(:) -49 b Ft(35)275 1179 y(3.7)92 b(Executing)31 b(Commands)17 -b Fm(:)d(:)h(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) +b Fu(35)399 1069 y(3.6.10)93 b(Op)s(ening)29 b(File)j(Descriptors)f +(for)f(Reading)h(and)f(W)-8 b(riting)19 b Fn(:)e(:)e(:)h(:)f(:)h(:)f(:) +49 b Fu(35)275 1179 y(3.7)92 b(Executing)31 b(Commands)17 +b Fn(:)d(:)h(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f -(:)h(:)f(:)g(:)h(:)f(:)h(:)46 b Ft(35)399 1289 y(3.7.1)93 -b(Simple)30 b(Command)f(Expansion)23 b Fm(:)15 b(:)g(:)h(:)f(:)g(:)h(:) +(:)h(:)f(:)g(:)h(:)f(:)h(:)46 b Fu(35)399 1289 y(3.7.1)93 +b(Simple)30 b(Command)f(Expansion)23 b Fn(:)15 b(:)g(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f -(:)g(:)h(:)f(:)h(:)52 b Ft(35)399 1398 y(3.7.2)93 b(Command)29 -b(Searc)m(h)i(and)f(Execution)d Fm(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f +(:)g(:)h(:)f(:)h(:)52 b Fu(35)399 1398 y(3.7.2)93 b(Command)29 +b(Searc)m(h)i(and)f(Execution)d Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)56 -b Ft(36)399 1508 y(3.7.3)93 b(Command)29 b(Execution)i(En)m(vironmen)m -(t)8 b Fm(:)16 b(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) -h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)38 b Ft(36)399 1617 -y(3.7.4)93 b(En)m(vironmen)m(t)18 b Fm(:)d(:)h(:)f(:)g(:)h(:)f(:)h(:)f +b Fu(36)399 1508 y(3.7.3)93 b(Command)29 b(Execution)i(En)m(vironmen)m +(t)8 b Fn(:)16 b(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)38 b Fu(36)399 1617 +y(3.7.4)93 b(En)m(vironmen)m(t)18 b Fn(:)d(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f -(:)h(:)47 b Ft(37)399 1727 y(3.7.5)93 b(Exit)31 b(Status)c -Fm(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h +(:)h(:)47 b Fu(37)399 1727 y(3.7.5)93 b(Exit)31 b(Status)c +Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)57 b -Ft(38)399 1836 y(3.7.6)93 b(Signals)15 b Fm(:)g(:)g(:)h(:)f(:)h(:)f(:)g +Fu(38)399 1836 y(3.7.6)93 b(Signals)15 b Fn(:)g(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h -(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)44 b Ft(38)275 1946 -y(3.8)92 b(Shell)30 b(Scripts)23 b Fm(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:) +(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)44 b Fu(38)275 1946 +y(3.8)92 b(Shell)30 b(Scripts)23 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:) -g(:)h(:)f(:)h(:)f(:)g(:)h(:)53 b Ft(39)150 2188 y Fr(4)135 -b(Shell)45 b(Builtin)g(Commands)22 b Fn(:)e(:)g(:)f(:)h(:)f(:)h(:)f(:)g +g(:)h(:)f(:)h(:)f(:)g(:)h(:)53 b Fu(39)150 2188 y Fs(4)135 +b(Shell)45 b(Builtin)g(Commands)22 b Fo(:)e(:)g(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)67 -b Fr(41)275 2325 y Ft(4.1)92 b(Bourne)30 b(Shell)g(Builtins)e -Fm(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +b Fs(41)275 2325 y Fu(4.1)92 b(Bourne)30 b(Shell)g(Builtins)e +Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) -h(:)f(:)g(:)h(:)f(:)h(:)f(:)57 b Ft(41)275 2435 y(4.2)92 -b(Bash)30 b(Builtin)h(Commands)24 b Fm(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g +h(:)f(:)g(:)h(:)f(:)h(:)f(:)57 b Fu(41)275 2435 y(4.2)92 +b(Bash)30 b(Builtin)h(Commands)24 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)54 -b Ft(48)275 2545 y(4.3)92 b(Mo)s(difying)30 b(Shell)g(Beha)m(vior)9 -b Fm(:)17 b(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h +b Fu(48)275 2545 y(4.3)92 b(Mo)s(difying)30 b(Shell)g(Beha)m(vior)9 +b Fn(:)17 b(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) -h(:)f(:)h(:)f(:)39 b Ft(59)399 2654 y(4.3.1)93 b(The)30 -b(Set)g(Builtin)c Fm(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +h(:)f(:)h(:)f(:)39 b Fu(58)399 2654 y(4.3.1)93 b(The)30 +b(Set)g(Builtin)c Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)55 b -Ft(59)399 2764 y(4.3.2)93 b(The)30 b(Shopt)f(Builtin)13 -b Fm(:)j(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) +Fu(58)399 2764 y(4.3.2)93 b(The)30 b(Shopt)f(Builtin)13 +b Fn(:)j(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g -(:)h(:)f(:)h(:)f(:)g(:)43 b Ft(63)275 2873 y(4.4)92 b(Sp)s(ecial)30 -b(Builtins)21 b Fm(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +(:)h(:)f(:)h(:)f(:)g(:)43 b Fu(62)275 2873 y(4.4)92 b(Sp)s(ecial)30 +b(Builtins)21 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)50 -b Ft(68)150 3116 y Fr(5)135 b(Shell)45 b(V)-11 b(ariables)19 -b Fn(:)h(:)g(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:) +b Fu(68)150 3116 y Fs(5)135 b(Shell)45 b(V)-11 b(ariables)19 +b Fo(:)h(:)g(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)64 -b Fr(69)275 3253 y Ft(5.1)92 b(Bourne)30 b(Shell)g(V)-8 -b(ariables)22 b Fm(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h +b Fs(69)275 3253 y Fu(5.1)92 b(Bourne)30 b(Shell)g(V)-8 +b(ariables)22 b Fn(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) -f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)51 b Ft(69)275 -3362 y(5.2)92 b(Bash)30 b(V)-8 b(ariables)16 b Fm(:)h(:)f(:)f(:)h(:)f +f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)51 b Fu(69)275 +3362 y(5.2)92 b(Bash)30 b(V)-8 b(ariables)16 b Fn(:)h(:)f(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f -(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)46 b Ft(69)150 3605 y -Fr(6)135 b(Bash)44 b(F)-11 b(eatures)13 b Fn(:)20 b(:)g(:)f(:)g(:)h(:)f +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)46 b Fu(69)150 3605 y +Fs(6)135 b(Bash)44 b(F)-11 b(eatures)13 b Fo(:)20 b(:)g(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) -f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)58 b Fr(80)275 -3742 y Ft(6.1)92 b(In)m(v)m(oking)31 b(Bash)d Fm(:)16 +f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)58 b Fs(80)275 +3742 y Fu(6.1)92 b(In)m(v)m(oking)31 b(Bash)d Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)58 b -Ft(80)275 3851 y(6.2)92 b(Bash)30 b(Startup)g(Files)20 -b Fm(:)c(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) +Fu(80)275 3851 y(6.2)92 b(Bash)30 b(Startup)g(Files)20 +b Fn(:)c(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f -(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)49 b Ft(82)275 -3961 y(6.3)92 b(In)m(teractiv)m(e)32 b(Shells)11 b Fm(:)16 +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)49 b Fu(82)275 +3961 y(6.3)92 b(In)m(teractiv)m(e)32 b(Shells)11 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) -h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)41 b Ft(83)399 +h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)41 b Fu(83)399 4071 y(6.3.1)93 b(What)31 b(is)f(an)h(In)m(teractiv)m(e)h(Shell?)17 -b Fm(:)f(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) +b Fn(:)f(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)47 b -Ft(84)399 4180 y(6.3.2)93 b(Is)30 b(this)g(Shell)g(In)m(teractiv)m(e?) -14 b Fm(:)k(:)e(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g +Fu(83)399 4180 y(6.3.2)93 b(Is)30 b(this)g(Shell)g(In)m(teractiv)m(e?) +14 b Fn(:)k(:)e(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) -44 b Ft(84)399 4290 y(6.3.3)93 b(In)m(teractiv)m(e)33 -b(Shell)d(Beha)m(vior)23 b Fm(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) +44 b Fu(84)399 4290 y(6.3.3)93 b(In)m(teractiv)m(e)33 +b(Shell)d(Beha)m(vior)23 b Fn(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f -(:)g(:)h(:)f(:)h(:)52 b Ft(84)275 4399 y(6.4)92 b(Bash)30 -b(Conditional)h(Expressions)22 b Fm(:)14 b(:)i(:)f(:)g(:)h(:)f(:)h(:)f +(:)g(:)h(:)f(:)h(:)52 b Fu(84)275 4399 y(6.4)92 b(Bash)30 +b(Conditional)h(Expressions)22 b Fn(:)14 b(:)i(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) -g(:)h(:)f(:)h(:)f(:)g(:)h(:)51 b Ft(85)275 4509 y(6.5)92 -b(Shell)30 b(Arithmetic)c Fm(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +g(:)h(:)f(:)h(:)f(:)g(:)h(:)51 b Fu(85)275 4509 y(6.5)92 +b(Shell)30 b(Arithmetic)c Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f -(:)55 b Ft(87)275 4619 y(6.6)92 b(Aliases)12 b Fm(:)k(:)g(:)f(:)h(:)f +(:)55 b Fu(87)275 4619 y(6.6)92 b(Aliases)12 b Fn(:)k(:)g(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)42 -b Ft(88)275 4728 y(6.7)92 b(Arra)m(ys)17 b Fm(:)e(:)h(:)f(:)h(:)f(:)g +b Fu(88)275 4728 y(6.7)92 b(Arra)m(ys)17 b Fn(:)e(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)47 -b Ft(89)275 4838 y(6.8)92 b(The)29 b(Directory)j(Stac)m(k)e -Fm(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +b Fu(89)275 4838 y(6.8)92 b(The)29 b(Directory)j(Stac)m(k)e +Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) -g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)58 b Ft(91)399 4947 y(6.8.1)93 -b(Directory)32 b(Stac)m(k)f(Builtins)14 b Fm(:)i(:)g(:)f(:)g(:)h(:)f(:) +g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)58 b Fu(90)399 4947 y(6.8.1)93 +b(Directory)32 b(Stac)m(k)f(Builtins)14 b Fn(:)i(:)g(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g -(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)44 b Ft(91)275 +(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)44 b Fu(90)275 5057 y(6.9)92 b(Con)m(trolling)31 b(the)g(Prompt)24 b -Fm(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) -g(:)h(:)f(:)h(:)f(:)54 b Ft(92)275 5166 y(6.10)92 b(The)30 -b(Restricted)h(Shell)23 b Fm(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +g(:)h(:)f(:)h(:)f(:)54 b Fu(92)275 5166 y(6.10)92 b(The)30 +b(Restricted)h(Shell)23 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)53 -b Ft(93)275 5276 y(6.11)92 b(Bash)31 b(POSIX)e(Mo)s(de)9 -b Fm(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +b Fu(93)275 5276 y(6.11)92 b(Bash)31 b(POSIX)e(Mo)s(de)9 +b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) -h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)38 b Ft(94)p eop +h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)38 b Fu(94)p eop end %%Page: -3 5 -TeXDict begin -3 4 bop 3674 -116 a Ft(iii)150 83 y Fr(7)135 -b(Job)45 b(Con)l(trol)24 b Fn(:)c(:)g(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g +TeXDict begin -3 4 bop 3674 -116 a Fu(iii)150 83 y Fs(7)135 +b(Job)45 b(Con)l(trol)24 b Fo(:)c(:)g(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) -f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)69 b Fr(98)275 220 y -Ft(7.1)92 b(Job)30 b(Con)m(trol)h(Basics)17 b Fm(:)f(:)g(:)f(:)h(:)f(:) +f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)69 b Fs(97)275 220 y +Fu(7.1)92 b(Job)30 b(Con)m(trol)h(Basics)17 b Fn(:)f(:)g(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) -g(:)h(:)f(:)47 b Ft(98)275 330 y(7.2)92 b(Job)30 b(Con)m(trol)h -(Builtins)25 b Fm(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) +g(:)h(:)f(:)47 b Fu(97)275 330 y(7.2)92 b(Job)30 b(Con)m(trol)h +(Builtins)25 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f -(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)55 b Ft(99)275 +(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)55 b Fu(98)275 439 y(7.3)92 b(Job)30 b(Con)m(trol)h(V)-8 b(ariables)17 -b Fm(:)f(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) +b Fn(:)f(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g -(:)h(:)f(:)h(:)f(:)g(:)47 b Ft(101)150 657 y Fr(8)135 -b(Command)45 b(Line)g(Editing)19 b Fn(:)i(:)e(:)h(:)f(:)h(:)f(:)g(:)h +(:)h(:)f(:)h(:)f(:)g(:)47 b Fu(100)150 657 y Fs(8)135 +b(Command)45 b(Line)g(Editing)19 b Fo(:)i(:)e(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)63 -b Fr(102)275 794 y Ft(8.1)92 b(In)m(tro)s(duction)30 -b(to)h(Line)f(Editing)24 b Fm(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) +b Fs(101)275 794 y Fu(8.1)92 b(In)m(tro)s(duction)30 +b(to)h(Line)f(Editing)24 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f -(:)g(:)h(:)f(:)h(:)f(:)54 b Ft(102)275 904 y(8.2)92 b(Readline)31 -b(In)m(teraction)c Fm(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +(:)g(:)h(:)f(:)h(:)f(:)54 b Fu(101)275 904 y(8.2)92 b(Readline)31 +b(In)m(teraction)c Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h -(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)56 b Ft(102)399 +(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)56 b Fu(101)399 1013 y(8.2.1)93 b(Readline)31 b(Bare)g(Essen)m(tials)26 -b Fm(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)55 -b Ft(103)399 1123 y(8.2.2)93 b(Readline)31 b(Mo)m(v)m(emen)m(t)i -(Commands)24 b Fm(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) +b Fu(102)399 1123 y(8.2.2)93 b(Readline)31 b(Mo)m(v)m(emen)m(t)i +(Commands)24 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)55 b -Ft(103)399 1233 y(8.2.3)93 b(Readline)31 b(Killing)g(Commands)16 -b Fm(:)f(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) +Fu(102)399 1233 y(8.2.3)93 b(Readline)31 b(Killing)g(Commands)16 +b Fn(:)f(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)46 b -Ft(104)399 1342 y(8.2.4)93 b(Readline)31 b(Argumen)m(ts)9 -b Fm(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f +Fu(103)399 1342 y(8.2.4)93 b(Readline)31 b(Argumen)m(ts)9 +b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) -g(:)h(:)f(:)39 b Ft(104)399 1452 y(8.2.5)93 b(Searc)m(hing)31 -b(for)f(Commands)f(in)h(the)h(History)c Fm(:)15 b(:)h(:)f(:)h(:)f(:)g -(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)57 b Ft(104)275 -1561 y(8.3)92 b(Readline)31 b(Init)f(File)20 b Fm(:)d(:)e(:)h(:)f(:)g +g(:)h(:)f(:)39 b Fu(103)399 1452 y(8.2.5)93 b(Searc)m(hing)31 +b(for)f(Commands)f(in)h(the)h(History)c Fn(:)15 b(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)57 b Fu(103)275 +1561 y(8.3)92 b(Readline)31 b(Init)f(File)20 b Fn(:)d(:)e(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g -(:)h(:)f(:)h(:)50 b Ft(105)399 1671 y(8.3.1)93 b(Readline)31 -b(Init)f(File)i(Syn)m(tax)12 b Fm(:)k(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h +(:)h(:)f(:)h(:)50 b Fu(104)399 1671 y(8.3.1)93 b(Readline)31 +b(Init)f(File)i(Syn)m(tax)12 b Fn(:)k(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) -f(:)g(:)h(:)f(:)h(:)42 b Ft(105)399 1781 y(8.3.2)93 b(Conditional)31 -b(Init)f(Constructs)25 b Fm(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +f(:)g(:)h(:)f(:)h(:)42 b Fu(104)399 1781 y(8.3.2)93 b(Conditional)31 +b(Init)f(Constructs)25 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) -g(:)56 b Ft(112)399 1890 y(8.3.3)93 b(Sample)30 b(Init)g(File)12 -b Fm(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h +g(:)56 b Fu(111)399 1890 y(8.3.3)93 b(Sample)30 b(Init)g(File)12 +b Fn(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) -h(:)f(:)h(:)f(:)g(:)h(:)f(:)42 b Ft(113)275 2000 y(8.4)92 -b(Bindable)30 b(Readline)h(Commands)11 b Fm(:)k(:)g(:)g(:)h(:)f(:)h(:)f +h(:)f(:)h(:)f(:)g(:)h(:)f(:)42 b Fu(112)275 2000 y(8.4)92 +b(Bindable)30 b(Readline)h(Commands)11 b Fn(:)k(:)g(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) -g(:)h(:)f(:)h(:)f(:)g(:)h(:)41 b Ft(116)399 2109 y(8.4.1)93 -b(Commands)29 b(F)-8 b(or)31 b(Mo)m(ving)e Fm(:)16 b(:)f(:)h(:)f(:)g(:) +g(:)h(:)f(:)h(:)f(:)g(:)h(:)41 b Fu(115)399 2109 y(8.4.1)93 +b(Commands)29 b(F)-8 b(or)31 b(Mo)m(ving)e Fn(:)16 b(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h -(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)58 b Ft(116)399 +(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)58 b Fu(115)399 2219 y(8.4.2)93 b(Commands)29 b(F)-8 b(or)31 b(Manipulating)g(The)f -(History)17 b Fm(:)g(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) -h(:)47 b Ft(117)399 2328 y(8.4.3)93 b(Commands)29 b(F)-8 -b(or)31 b(Changing)f(T)-8 b(ext)21 b Fm(:)c(:)e(:)h(:)f(:)h(:)f(:)g(:)h +(History)17 b Fn(:)g(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +h(:)47 b Fu(116)399 2328 y(8.4.3)93 b(Commands)29 b(F)-8 +b(or)31 b(Changing)f(T)-8 b(ext)21 b Fn(:)c(:)e(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) -51 b Ft(118)399 2438 y(8.4.4)93 b(Killing)31 b(And)e(Y)-8 -b(anking)22 b Fm(:)17 b(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h +51 b Fu(117)399 2438 y(8.4.4)93 b(Killing)31 b(And)e(Y)-8 +b(anking)22 b Fn(:)17 b(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) -f(:)g(:)h(:)f(:)h(:)52 b Ft(119)399 2548 y(8.4.5)93 b(Sp)s(ecifying)30 -b(Numeric)g(Argumen)m(ts)17 b Fm(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) +f(:)g(:)h(:)f(:)h(:)52 b Fu(118)399 2548 y(8.4.5)93 b(Sp)s(ecifying)30 +b(Numeric)g(Argumen)m(ts)17 b Fn(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)47 -b Ft(120)399 2657 y(8.4.6)93 b(Letting)31 b(Readline)g(T)m(yp)s(e)f(F) --8 b(or)31 b(Y)-8 b(ou)12 b Fm(:)k(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g +b Fu(119)399 2657 y(8.4.6)93 b(Letting)31 b(Readline)g(T)m(yp)s(e)f(F) +-8 b(or)31 b(Y)-8 b(ou)12 b Fn(:)k(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)42 -b Ft(121)399 2767 y(8.4.7)93 b(Keyb)s(oard)29 b(Macros)21 -b Fm(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g +b Fu(120)399 2767 y(8.4.7)93 b(Keyb)s(oard)29 b(Macros)21 +b Fn(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) -h(:)f(:)h(:)f(:)g(:)51 b Ft(122)399 2876 y(8.4.8)93 b(Some)30 -b(Miscellaneous)j(Commands)24 b Fm(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f +h(:)f(:)h(:)f(:)g(:)51 b Fu(121)399 2876 y(8.4.8)93 b(Some)30 +b(Miscellaneous)j(Commands)24 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)55 -b Ft(123)275 2986 y(8.5)92 b(Readline)31 b(vi)f(Mo)s(de)20 -b Fm(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g +b Fu(122)275 2986 y(8.5)92 b(Readline)31 b(vi)f(Mo)s(de)20 +b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) -h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(125)275 -3096 y(8.6)92 b(Programmable)30 b(Completion)16 b Fm(:)g(:)f(:)h(:)f(:) +h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Fu(124)275 +3096 y(8.6)92 b(Programmable)30 b(Completion)16 b Fn(:)g(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)46 -b Ft(125)275 3205 y(8.7)92 b(Programmable)30 b(Completion)h(Builtins)c -Fm(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f -(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)56 b Ft(127)275 +b Fu(124)275 3205 y(8.7)92 b(Programmable)30 b(Completion)h(Builtins)c +Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)56 b Fu(126)275 3315 y(8.8)92 b(A)30 b(Programmable)h(Completion)g(Example)20 -b Fm(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h -(:)f(:)g(:)h(:)f(:)h(:)f(:)50 b Ft(131)150 3533 y Fr(9)135 -b(Using)45 b(History)h(In)l(teractiv)l(ely)39 b Fn(:)19 +b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h +(:)f(:)g(:)h(:)f(:)h(:)f(:)50 b Fu(130)150 3533 y Fs(9)135 +b(Using)45 b(History)h(In)l(teractiv)l(ely)39 b Fo(:)19 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)80 -b Fr(134)275 3670 y Ft(9.1)92 b(Bash)30 b(History)h(F)-8 -b(acilities)21 b Fm(:)d(:)e(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +b Fs(133)275 3670 y Fu(9.1)92 b(Bash)30 b(History)h(F)-8 +b(acilities)21 b Fn(:)d(:)e(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) -g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)51 b Ft(134)275 3779 -y(9.2)92 b(Bash)30 b(History)h(Builtins)19 b Fm(:)d(:)g(:)f(:)g(:)h(:)f +g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)51 b Fu(133)275 3779 +y(9.2)92 b(Bash)30 b(History)h(Builtins)19 b Fn(:)d(:)g(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)49 -b Ft(134)275 3889 y(9.3)92 b(History)31 b(Expansion)21 -b Fm(:)15 b(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +b Fu(133)275 3889 y(9.3)92 b(History)31 b(Expansion)21 +b Fn(:)15 b(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) -f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)52 b Ft(136)399 3999 -y(9.3.1)93 b(Ev)m(en)m(t)31 b(Designators)10 b Fm(:)18 +f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)52 b Fu(135)399 3999 +y(9.3.1)93 b(Ev)m(en)m(t)31 b(Designators)10 b Fn(:)18 b(:)d(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) -h(:)f(:)h(:)40 b Ft(137)399 4108 y(9.3.2)93 b(W)-8 b(ord)31 -b(Designators)17 b Fm(:)g(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +h(:)f(:)h(:)40 b Fu(135)399 4108 y(9.3.2)93 b(W)-8 b(ord)31 +b(Designators)17 b Fn(:)g(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) -h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)47 b Ft(137)399 4218 -y(9.3.3)93 b(Mo)s(di\014ers)26 b Fm(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h +h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)47 b Fu(136)399 4218 +y(9.3.3)93 b(Mo)s(di\014ers)26 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h -(:)f(:)g(:)h(:)57 b Ft(138)150 4436 y Fr(10)135 b(Installing)46 -b(Bash)24 b Fn(:)c(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f +(:)f(:)g(:)h(:)57 b Fu(137)150 4436 y Fs(10)135 b(Installing)46 +b(Bash)24 b Fo(:)c(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)68 -b Fr(139)275 4573 y Ft(10.1)92 b(Basic)32 b(Installation)20 -b Fm(:)d(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) +b Fs(138)275 4573 y Fu(10.1)92 b(Basic)32 b(Installation)20 +b Fn(:)d(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g -(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)50 b Ft(139)275 4682 -y(10.2)92 b(Compilers)30 b(and)g(Options)8 b Fm(:)15 +(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)50 b Fu(138)275 4682 +y(10.2)92 b(Compilers)30 b(and)g(Options)8 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) -f(:)h(:)38 b Ft(140)275 4792 y(10.3)92 b(Compiling)30 -b(F)-8 b(or)32 b(Multiple)f(Arc)m(hitectures)21 b Fm(:)c(:)e(:)h(:)f(:) +f(:)h(:)38 b Fu(139)275 4792 y(10.3)92 b(Compiling)30 +b(F)-8 b(or)32 b(Multiple)f(Arc)m(hitectures)21 b Fn(:)c(:)e(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g -(:)52 b Ft(140)275 4902 y(10.4)92 b(Installation)32 b(Names)13 -b Fm(:)j(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +(:)52 b Fu(139)275 4902 y(10.4)92 b(Installation)32 b(Names)13 +b Fn(:)j(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h -(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)43 b Ft(140)275 5011 y(10.5)92 -b(Sp)s(ecifying)30 b(the)g(System)h(T)m(yp)s(e)12 b Fm(:)j(:)g(:)h(:)f +(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)43 b Fu(139)275 5011 y(10.5)92 +b(Sp)s(ecifying)30 b(the)g(System)h(T)m(yp)s(e)12 b Fn(:)j(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) -g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)42 b Ft(140)275 -5121 y(10.6)92 b(Sharing)30 b(Defaults)15 b Fm(:)i(:)e(:)g(:)h(:)f(:)h +g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)42 b Fu(139)275 +5121 y(10.6)92 b(Sharing)30 b(Defaults)15 b Fn(:)i(:)e(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h -(:)f(:)g(:)46 b Ft(141)275 5230 y(10.7)92 b(Op)s(eration)30 -b(Con)m(trols)24 b Fm(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) +(:)f(:)g(:)46 b Fu(140)275 5230 y(10.7)92 b(Op)s(eration)30 +b(Con)m(trols)24 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f -(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)54 b Ft(141)275 -5340 y(10.8)92 b(Optional)31 b(F)-8 b(eatures)10 b Fm(:)17 +(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)54 b Fu(140)275 +5340 y(10.8)92 b(Optional)31 b(F)-8 b(eatures)10 b Fn(:)17 b(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) -f(:)h(:)f(:)g(:)h(:)f(:)h(:)40 b Ft(141)p eop end +f(:)h(:)f(:)g(:)h(:)f(:)h(:)40 b Fu(140)p eop end %%Page: -4 6 -TeXDict begin -4 5 bop 3677 -116 a Ft(iv)150 83 y Fr(App)t(endix)44 -b(A)160 b(Rep)t(orting)46 b(Bugs)35 b Fn(:)20 b(:)f(:)g(:)h(:)f(:)h(:)f -(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)80 b Fr(146)150 +TeXDict begin -4 5 bop 3677 -116 a Fu(iv)150 83 y Fs(App)t(endix)44 +b(A)160 b(Rep)t(orting)46 b(Bugs)35 b Fo(:)20 b(:)f(:)g(:)h(:)f(:)h(:)f +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)80 b Fs(145)150 353 y(App)t(endix)44 b(B)166 b(Ma)7 b(jor)45 b(Di\013erences)i(F)-11 -b(rom)44 b(The)419 486 y(Bourne)g(Shell)35 b Fn(:)19 +b(rom)44 b(The)419 486 y(Bourne)g(Shell)35 b Fo(:)19 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)78 -b Fr(147)275 623 y Ft(B.1)92 b(Implemen)m(tation)31 b(Di\013erences)h -(F)-8 b(rom)31 b(The)e(SVR4.2)j(Shell)13 b Fm(:)i(:)h(:)f(:)h(:)f(:)g -(:)h(:)f(:)h(:)43 b Ft(151)150 865 y Fr(App)t(endix)h(C)165 +b Fs(146)275 623 y Fu(B.1)92 b(Implemen)m(tation)31 b(Di\013erences)h +(F)-8 b(rom)31 b(The)e(SVR4.2)j(Shell)13 b Fn(:)i(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)43 b Fu(150)150 865 y Fs(App)t(endix)h(C)165 b(GNU)45 b(F)-11 b(ree)45 b(Do)t(cumen)l(tation)h(License)439 -998 y Fn(:)19 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g +998 y Fo(:)19 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)64 -b Fr(153)150 1268 y(App)t(endix)44 b(D)159 b(Indexes)15 -b Fn(:)20 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f -(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)59 b Fr(161)275 -1405 y Ft(D.1)92 b(Index)29 b(of)i(Shell)f(Builtin)h(Commands)16 -b Fm(:)e(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) -h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)46 b Ft(161)275 +b Fs(152)150 1268 y(App)t(endix)44 b(D)159 b(Indexes)15 +b Fo(:)20 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f +(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)59 b Fs(160)275 +1405 y Fu(D.1)92 b(Index)29 b(of)i(Shell)f(Builtin)h(Commands)16 +b Fn(:)e(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) +h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)46 b Fu(160)275 1514 y(D.2)92 b(Index)29 b(of)i(Shell)f(Reserv)m(ed)h(W)-8 -b(ords)12 b Fm(:)j(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h +b(ords)12 b Fn(:)j(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)42 -b Ft(162)275 1624 y(D.3)92 b(P)m(arameter)31 b(and)f(V)-8 -b(ariable)32 b(Index)20 b Fm(:)14 b(:)i(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +b Fu(161)275 1624 y(D.3)92 b(P)m(arameter)31 b(and)f(V)-8 +b(ariable)32 b(Index)20 b Fn(:)14 b(:)i(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) -f(:)h(:)f(:)50 b Ft(162)275 1733 y(D.4)92 b(F)-8 b(unction)31 -b(Index)16 b Fm(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +f(:)h(:)f(:)50 b Fu(161)275 1733 y(D.4)92 b(F)-8 b(unction)31 +b(Index)16 b Fn(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)47 -b Ft(164)275 1843 y(D.5)92 b(Concept)30 b(Index)d Fm(:)15 +b Fu(163)275 1843 y(D.5)92 b(Concept)30 b(Index)d Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) -f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)57 b Ft(166)p +f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)57 b Fu(165)p eop end %%Page: 1 7 -TeXDict begin 1 6 bop 150 -116 a Ft(Chapter)30 b(1:)41 -b(In)m(tro)s(duction)2592 b(1)150 299 y Fo(1)80 b(In)l(tro)t(duction) -150 602 y Fr(1.1)68 b(What)45 b(is)g(Bash?)150 762 y -Ft(Bash)38 b(is)g(the)g(shell,)i(or)d(command)h(language)h(in)m -(terpreter,)h(for)e(the)g Fl(gnu)f Ft(op)s(erating)h(system.)63 +TeXDict begin 1 6 bop 150 -116 a Fu(Chapter)30 b(1:)41 +b(In)m(tro)s(duction)2592 b(1)150 299 y Fp(1)80 b(In)l(tro)t(duction) +150 602 y Fs(1.1)68 b(What)45 b(is)g(Bash?)150 762 y +Fu(Bash)38 b(is)g(the)g(shell,)i(or)d(command)h(language)h(in)m +(terpreter,)h(for)e(the)g Fm(gnu)f Fu(op)s(erating)h(system.)63 b(The)150 871 y(name)33 b(is)g(an)g(acron)m(ym)g(for)g(the)g(`)p -Fs(Bourne-Again)27 b(SHell)p Ft(',)32 b(a)i(pun)d(on)i(Stephen)f +Ft(Bourne-Again)27 b(SHell)p Fu(',)32 b(a)i(pun)d(on)i(Stephen)f (Bourne,)h(the)g(author)150 981 y(of)f(the)f(direct)h(ancestor)h(of)e -(the)h(curren)m(t)f(Unix)g(shell)h Fs(sh)p Ft(,)f(whic)m(h)g(app)s +(the)h(curren)m(t)f(Unix)g(shell)h Ft(sh)p Fu(,)f(whic)m(h)g(app)s (eared)g(in)g(the)h(Sev)m(en)m(th)g(Edition)150 1091 y(Bell)g(Labs)e(Researc)m(h)h(v)m(ersion)g(of)f(Unix.)275 -1220 y(Bash)f(is)g(largely)i(compatible)f(with)f Fs(sh)g -Ft(and)g(incorp)s(orates)g(useful)g(features)g(from)g(the)g(Korn)g -(shell)150 1330 y Fs(ksh)37 b Ft(and)h(the)g(C)g(shell)g -Fs(csh)p Ft(.)64 b(It)38 b(is)g(in)m(tended)g(to)h(b)s(e)f(a)g -(conforman)m(t)h(implemen)m(tation)h(of)e(the)g Fl(ieee)150 -1439 y(posix)c Ft(Shell)g(and)g(T)-8 b(o)s(ols)35 b(p)s(ortion)f(of)g -(the)h Fl(ieee)f(posix)f Ft(sp)s(eci\014cation)j(\()p -Fl(ieee)e Ft(Standard)f(1003.1\).)56 b(It)150 1549 y(o\013ers)31 -b(functional)f(impro)m(v)m(emen)m(ts)i(o)m(v)m(er)g Fs(sh)d -Ft(for)i(b)s(oth)e(in)m(teractiv)m(e)k(and)d(programming)g(use.)275 -1679 y(While)h(the)g Fl(gnu)f Ft(op)s(erating)h(system)g(pro)m(vides)f +1220 y(Bash)f(is)g(largely)i(compatible)f(with)f Ft(sh)g +Fu(and)g(incorp)s(orates)g(useful)g(features)g(from)g(the)g(Korn)g +(shell)150 1330 y Ft(ksh)37 b Fu(and)h(the)g(C)g(shell)g +Ft(csh)p Fu(.)64 b(It)38 b(is)g(in)m(tended)g(to)h(b)s(e)f(a)g +(conforman)m(t)h(implemen)m(tation)h(of)e(the)g Fm(ieee)150 +1439 y(posix)c Fu(Shell)g(and)g(T)-8 b(o)s(ols)35 b(p)s(ortion)f(of)g +(the)h Fm(ieee)f(posix)f Fu(sp)s(eci\014cation)j(\()p +Fm(ieee)e Fu(Standard)f(1003.1\).)56 b(It)150 1549 y(o\013ers)31 +b(functional)f(impro)m(v)m(emen)m(ts)i(o)m(v)m(er)g Ft(sh)d +Fu(for)i(b)s(oth)e(in)m(teractiv)m(e)k(and)d(programming)g(use.)275 +1679 y(While)h(the)g Fm(gnu)f Fu(op)s(erating)h(system)g(pro)m(vides)f (other)h(shells,)g(including)f(a)h(v)m(ersion)g(of)g -Fs(csh)p Ft(,)f(Bash)150 1788 y(is)j(the)h(default)f(shell.)49 -b(Lik)m(e)34 b(other)g Fl(gnu)f Ft(soft)m(w)m(are,)i(Bash)f(is)f(quite) +Ft(csh)p Fu(,)f(Bash)150 1788 y(is)j(the)h(default)f(shell.)49 +b(Lik)m(e)34 b(other)g Fm(gnu)f Fu(soft)m(w)m(are,)i(Bash)f(is)f(quite) h(p)s(ortable.)49 b(It)33 b(curren)m(tly)g(runs)f(on)150 1898 y(nearly)c(ev)m(ery)g(v)m(ersion)g(of)f(Unix)h(and)e(a)i(few)f -(other)h(op)s(erating)g(systems)f Fp(\000)g Ft(indep)s(enden)m +(other)h(op)s(erating)g(systems)f Fq(\000)g Fu(indep)s(enden)m (tly-supp)s(orted)150 2008 y(p)s(orts)j(exist)h(for)f -Fl(ms-dos)p Ft(,)f Fl(os/2)p Ft(,)i(and)f(Windo)m(ws)g(platforms.)150 -2231 y Fr(1.2)68 b(What)45 b(is)g(a)h(shell?)150 2390 -y Ft(A)m(t)32 b(its)f(base,)h(a)f(shell)g(is)h(simply)e(a)h(macro)h +Fm(ms-dos)p Fu(,)f Fm(os/2)p Fu(,)i(and)f(Windo)m(ws)g(platforms.)150 +2231 y Fs(1.2)68 b(What)45 b(is)g(a)h(shell?)150 2390 +y Fu(A)m(t)32 b(its)f(base,)h(a)f(shell)g(is)h(simply)e(a)h(macro)h (pro)s(cessor)f(that)g(executes)i(commands.)42 b(The)30 b(term)h(macro)150 2500 y(pro)s(cessor)25 b(means)g(functionalit)m(y)i (where)d(text)j(and)d(sym)m(b)s(ols)h(are)h(expanded)e(to)i(create)h @@ -7509,15 +8065,15 @@ b(term)h(macro)150 2500 y(pro)s(cessor)25 b(means)g(functionalit)m(y)i (is)f(b)s(oth)g(a)h(command)g(in)m(terpreter)g(and)f(a)h(programming)f (language.)55 b(As)35 b(a)g(com-)150 2848 y(mand)30 b(in)m(terpreter,)i (the)g(shell)f(pro)m(vides)g(the)h(user)e(in)m(terface)j(to)f(the)f -(ric)m(h)h(set)g(of)f Fl(gnu)g Ft(utilities.)44 b(The)150 +(ric)m(h)h(set)g(of)f Fm(gnu)g Fu(utilities.)44 b(The)150 2958 y(programming)30 b(language)h(features)f(allo)m(w)h(these)g (utilities)g(to)g(b)s(e)e(com)m(bined.)41 b(Files)31 b(con)m(taining)g(com-)150 3068 y(mands)e(can)i(b)s(e)e(created,)j(and) d(b)s(ecome)i(commands)f(themselv)m(es.)42 b(These)30 -b(new)f(commands)h(ha)m(v)m(e)i(the)150 3177 y(same)f(status)h(as)f -(system)g(commands)g(in)g(directories)h(suc)m(h)f(as)g(`)p -Fs(/bin)p Ft(',)g(allo)m(wing)i(users)d(or)h(groups)f(to)150 -3287 y(establish)h(custom)f(en)m(vironmen)m(ts)h(to)g(automate)h(their) +b(new)f(commands)h(ha)m(v)m(e)i(the)150 3177 y(same)j(status)g(as)g +(system)g(commands)f(in)g(directories)i(suc)m(h)e(as)h +Ft(/bin)p Fu(,)g(allo)m(wing)h(users)e(or)g(groups)g(to)150 +3287 y(establish)d(custom)f(en)m(vironmen)m(ts)h(to)g(automate)h(their) f(common)f(tasks.)275 3417 y(Shells)j(ma)m(y)h(b)s(e)f(used)g(in)m (teractiv)m(ely)k(or)d(non-in)m(teractiv)m(ely)-8 b(.)54 b(In)33 b(in)m(teractiv)m(e)j(mo)s(de,)f(they)e(accept)150 @@ -7525,27 +8081,27 @@ b(In)33 b(in)m(teractiv)m(e)j(mo)s(de,)f(they)e(accept)150 b(When)22 b(executing)i(non-in)m(teractiv)m(ely)-8 b(,)27 b(shells)c(execute)g(commands)150 3636 y(read)30 b(from)g(a)h(\014le.) 275 3765 y(A)41 b(shell)g(allo)m(ws)h(execution)h(of)e -Fl(gnu)g Ft(commands,)i(b)s(oth)e(sync)m(hronously)f(and)h(async)m +Fm(gnu)g Fu(commands,)i(b)s(oth)e(sync)m(hronously)f(and)h(async)m (hronously)-8 b(.)150 3875 y(The)29 b(shell)g(w)m(aits)i(for)e(sync)m (hronous)f(commands)h(to)h(complete)h(b)s(efore)e(accepting)i(more)e (input;)g(asyn-)150 3985 y(c)m(hronous)22 b(commands)h(con)m(tin)m(ue)h (to)f(execute)h(in)e(parallel)i(with)f(the)f(shell)h(while)g(it)g (reads)g(and)f(executes)150 4094 y(additional)35 b(commands.)50 -b(The)33 b Fq(redirection)h Ft(constructs)g(p)s(ermit)f(\014ne-grained) +b(The)33 b Fr(redirection)h Fu(constructs)g(p)s(ermit)f(\014ne-grained) g(con)m(trol)i(of)f(the)g(input)150 4204 y(and)40 b(output)f(of)i (those)f(commands.)70 b(Moreo)m(v)m(er,)45 b(the)c(shell)f(allo)m(ws)h (con)m(trol)h(o)m(v)m(er)g(the)e(con)m(ten)m(ts)i(of)150 4313 y(commands')30 b(en)m(vironmen)m(ts.)275 4443 y(Shells)k(also)i (pro)m(vide)g(a)f(small)h(set)f(of)g(built-in)g(commands)g(\()p -Fq(builtins)t Ft(\))g(implemen)m(ting)h(function-)150 +Fr(builtins)t Fu(\))g(implemen)m(ting)h(function-)150 4553 y(alit)m(y)i(imp)s(ossible)e(or)g(incon)m(v)m(enien)m(t)j(to)e (obtain)g(via)g(separate)g(utilities.)61 b(F)-8 b(or)37 -b(example,)i Fs(cd)p Ft(,)e Fs(break)p Ft(,)150 4662 -y Fs(continue)p Ft(,)28 b(and)i Fs(exec)f Ft(cannot)i(b)s(e)f(implemen) +b(example,)i Ft(cd)p Fu(,)e Ft(break)p Fu(,)150 4662 +y Ft(continue)p Fu(,)28 b(and)i Ft(exec)f Fu(cannot)i(b)s(e)f(implemen) m(ted)h(outside)g(of)f(the)h(shell)f(b)s(ecause)h(they)f(directly)h (ma-)150 4772 y(nipulate)d(the)g(shell)g(itself.)41 b(The)27 -b Fs(history)p Ft(,)g Fs(getopts)p Ft(,)f Fs(kill)p Ft(,)i(or)g -Fs(pwd)f Ft(builtins,)h(among)g(others,)h(could)150 4881 +b Ft(history)p Fu(,)g Ft(getopts)p Fu(,)f Ft(kill)p Fu(,)i(or)g +Ft(pwd)f Fu(builtins,)h(among)g(others,)h(could)150 4881 y(b)s(e)34 b(implemen)m(ted)g(in)g(separate)h(utilities,)i(but)d(they)g (are)g(more)h(con)m(v)m(enien)m(t)h(to)f(use)f(as)g(builtin)g(com-)150 4991 y(mands.)40 b(All)31 b(of)f(the)h(shell)f(builtins)g(are)h @@ -7558,7 +8114,7 @@ b(most)c(of)g(the)g(p)s(o)m(w)m(er)f(\(and)g(complexit)m(y\))j(of)e b(ariables,)32 b(\015o)m(w)e(con)m(trol)i(constructs,)f(quoting,)g(and) f(functions.)p eop end %%Page: 2 8 -TeXDict begin 2 7 bop 150 -116 a Ft(Chapter)30 b(1:)41 +TeXDict begin 2 7 bop 150 -116 a Fu(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2592 b(2)275 299 y(Shells)21 b(o\013er)i(features) f(geared)h(sp)s(eci\014cally)g(for)f(in)m(teractiv)m(e)j(use)d(rather)g (than)g(to)h(augmen)m(t)g(the)f(pro-)150 408 y(gramming)32 @@ -7568,111 +8124,111 @@ y(command)d(history)g(and)g(aliases.)42 b(Eac)m(h)31 b(of)g(these)g(features)f(is)h(describ)s(ed)e(in)h(this)g(man)m(ual.)p eop end %%Page: 3 9 -TeXDict begin 3 8 bop 150 -116 a Ft(Chapter)30 b(2:)41 -b(De\014nitions)2662 b(3)150 299 y Fo(2)80 b(De\014nitions)150 -552 y Ft(These)30 b(de\014nitions)g(are)h(used)e(throughout)h(the)h -(remainder)f(of)g(this)h(man)m(ual.)150 720 y Fs(POSIX)240 -b Ft(A)27 b(family)g(of)g(op)s(en)f(system)g(standards)g(based)g(on)h +TeXDict begin 3 8 bop 150 -116 a Fu(Chapter)30 b(2:)41 +b(De\014nitions)2662 b(3)150 299 y Fp(2)80 b(De\014nitions)150 +552 y Fu(These)30 b(de\014nitions)g(are)h(used)e(throughout)h(the)h +(remainder)f(of)g(this)h(man)m(ual.)150 720 y Ft(POSIX)240 +b Fu(A)27 b(family)g(of)g(op)s(en)f(system)g(standards)g(based)g(on)h (Unix.)39 b(Bash)27 b(is)g(primarily)f(concerned)630 830 y(with)k(the)h(Shell)f(and)g(Utilities)i(p)s(ortion)e(of)h(the)f -Fl(posix)g Ft(1003.1)j(standard.)150 995 y Fs(blank)240 -b Ft(A)30 b(space)h(or)g(tab)f(c)m(haracter.)150 1161 -y Fs(builtin)144 b Ft(A)35 b(command)g(that)g(is)g(implemen)m(ted)g(in) +Fm(posix)g Fu(1003.1)j(standard.)150 995 y Ft(blank)240 +b Fu(A)30 b(space)h(or)g(tab)f(c)m(haracter.)150 1161 +y Ft(builtin)144 b Fu(A)35 b(command)g(that)g(is)g(implemen)m(ted)g(in) m(ternally)h(b)m(y)f(the)g(shell)g(itself,)i(rather)d(than)h(b)m(y)630 1271 y(an)30 b(executable)i(program)e(somewhere)h(in)f(the)g(\014le)h -(system.)150 1436 y Fs(control)d(operator)630 1546 y -Ft(A)20 b Fs(token)f Ft(that)i(p)s(erforms)e(a)i(con)m(trol)g -(function.)37 b(It)21 b(is)f(a)h Fs(newline)d Ft(or)j(one)f(of)h(the)f -(follo)m(wing:)630 1655 y(`)p Fs(||)p Ft(',)31 b(`)p -Fs(&&)p Ft(',)f(`)p Fs(&)p Ft(',)h(`)p Fs(;)p Ft(',)g(`)p -Fs(;;)p Ft(',)f(`)p Fs(|)p Ft(',)h(`)p Fs(|&)p Ft(',)f(`)p -Fs(\()p Ft(',)h(or)g(`)p Fs(\))p Ft('.)150 1821 y Fs(exit)e(status)630 -1931 y Ft(The)f(v)-5 b(alue)29 b(returned)e(b)m(y)h(a)h(command)f(to)h +(system.)150 1436 y Ft(control)d(operator)630 1546 y +Fu(A)20 b Ft(token)f Fu(that)i(p)s(erforms)e(a)i(con)m(trol)g +(function.)37 b(It)21 b(is)f(a)h Ft(newline)d Fu(or)j(one)f(of)h(the)f +(follo)m(wing:)630 1655 y(`)p Ft(||)p Fu(',)31 b(`)p +Ft(&&)p Fu(',)f(`)p Ft(&)p Fu(',)h(`)p Ft(;)p Fu(',)g(`)p +Ft(;;)p Fu(',)f(`)p Ft(|)p Fu(',)h(`)p Ft(|&)p Fu(',)f(`)p +Ft(\()p Fu(',)h(or)g(`)p Ft(\))p Fu('.)150 1821 y Ft(exit)e(status)630 +1931 y Fu(The)f(v)-5 b(alue)29 b(returned)e(b)m(y)h(a)h(command)f(to)h (its)g(caller.)41 b(The)28 b(v)-5 b(alue)29 b(is)f(restricted)h(to)h (eigh)m(t)630 2040 y(bits,)h(so)f(the)h(maxim)m(um)f(v)-5 -b(alue)31 b(is)f(255.)150 2206 y Fs(field)240 b Ft(A)27 +b(alue)31 b(is)f(255.)150 2206 y Ft(field)240 b Fu(A)27 b(unit)g(of)g(text)h(that)g(is)f(the)g(result)g(of)g(one)h(of)f(the)g (shell)g(expansions.)40 b(After)27 b(expansion,)630 2315 y(when)e(executing)h(a)g(command,)h(the)f(resulting)f(\014elds)g(are)h (used)f(as)h(the)g(command)f(name)630 2425 y(and)30 b(argumen)m(ts.)150 -2591 y Fs(filename)96 b Ft(A)30 b(string)h(of)f(c)m(haracters)i(used)e -(to)h(iden)m(tify)g(a)f(\014le.)150 2756 y Fs(job)336 -b Ft(A)31 b(set)h(of)f(pro)s(cesses)g(comprising)g(a)g(pip)s(eline,)g +2591 y Ft(filename)96 b Fu(A)30 b(string)h(of)f(c)m(haracters)i(used)e +(to)h(iden)m(tify)g(a)f(\014le.)150 2756 y Ft(job)336 +b Fu(A)31 b(set)h(of)f(pro)s(cesses)g(comprising)g(a)g(pip)s(eline,)g (and)g(an)m(y)g(pro)s(cesses)g(descended)g(from)f(it,)630 2866 y(that)h(are)g(all)g(in)f(the)h(same)f(pro)s(cess)g(group.)150 -3031 y Fs(job)f(control)630 3141 y Ft(A)22 b(mec)m(hanism)g(b)m(y)f +3031 y Ft(job)f(control)630 3141 y Fu(A)22 b(mec)m(hanism)g(b)m(y)f (whic)m(h)h(users)f(can)h(selectiv)m(ely)i(stop)e(\(susp)s(end\))e(and) h(restart)i(\(resume\))630 3251 y(execution)32 b(of)e(pro)s(cesses.)150 -3416 y Fs(metacharacter)630 3526 y Ft(A)25 b(c)m(haracter)i(that,)g +3416 y Ft(metacharacter)630 3526 y Fu(A)25 b(c)m(haracter)i(that,)g (when)d(unquoted,)i(separates)g(w)m(ords.)38 b(A)26 b(metac)m(haracter) -i(is)d(a)g Fs(blank)630 3635 y Ft(or)30 b(one)h(of)g(the)f(follo)m -(wing)i(c)m(haracters:)42 b(`)p Fs(|)p Ft(',)31 b(`)p -Fs(&)p Ft(',)g(`)p Fs(;)p Ft(',)g(`)p Fs(\()p Ft(',)f(`)p -Fs(\))p Ft(',)h(`)p Fs(<)p Ft(',)g(or)f(`)p Fs(>)p Ft('.)150 -3801 y Fs(name)288 b Ft(A)37 b Fs(word)f Ft(consisting)i(solely)h(of)e +i(is)d(a)g Ft(blank)630 3635 y Fu(or)30 b(one)h(of)g(the)f(follo)m +(wing)i(c)m(haracters:)42 b(`)p Ft(|)p Fu(',)31 b(`)p +Ft(&)p Fu(',)g(`)p Ft(;)p Fu(',)g(`)p Ft(\()p Fu(',)f(`)p +Ft(\))p Fu(',)h(`)p Ft(<)p Fu(',)g(or)f(`)p Ft(>)p Fu('.)150 +3801 y Ft(name)288 b Fu(A)37 b Ft(word)f Fu(consisting)i(solely)h(of)e (letters,)j(n)m(um)m(b)s(ers,)e(and)f(underscores,)h(and)f(b)s (eginning)630 3910 y(with)23 b(a)g(letter)h(or)f(underscore.)38 -b Fs(Name)p Ft(s)22 b(are)h(used)f(as)i(shell)f(v)-5 +b Ft(Name)p Fu(s)22 b(are)h(used)f(as)i(shell)f(v)-5 b(ariable)24 b(and)e(function)h(names.)630 4020 y(Also)31 -b(referred)f(to)h(as)f(an)h Fs(identifier)p Ft(.)150 -4186 y Fs(operator)96 b Ft(A)38 b Fs(control)28 b(operator)36 -b Ft(or)h(a)i Fs(redirection)27 b(operator)p Ft(.)61 +b(referred)f(to)h(as)f(an)h Ft(identifier)p Fu(.)150 +4186 y Ft(operator)96 b Fu(A)38 b Ft(control)28 b(operator)36 +b Fu(or)h(a)i Ft(redirection)27 b(operator)p Fu(.)61 b(See)38 b(Section)g(3.6)h([Redirec-)630 4295 y(tions],)f(page)f(31,)i (for)d(a)g(list)h(of)f(redirection)h(op)s(erators.)58 b(Op)s(erators)35 b(con)m(tain)j(at)f(least)630 4405 -y(one)31 b(unquoted)e Fs(metacharacter)p Ft(.)150 4570 -y Fs(process)f(group)630 4680 y Ft(A)i(collection)k(of)c(related)h(pro) +y(one)31 b(unquoted)e Ft(metacharacter)p Fu(.)150 4570 +y Ft(process)f(group)630 4680 y Fu(A)i(collection)k(of)c(related)h(pro) s(cesses)g(eac)m(h)g(ha)m(ving)g(the)g(same)f(pro)s(cess)g(group)g -Fl(id)p Ft(.)150 4846 y Fs(process)e(group)h(ID)630 4955 -y Ft(A)h(unique)g(iden)m(ti\014er)h(that)f(represen)m(ts)h(a)g -Fs(process)d(group)h Ft(during)g(its)i(lifetime.)150 -5121 y Fs(reserved)d(word)630 5230 y Ft(A)h Fs(word)e -Ft(that)i(has)f(a)h(sp)s(ecial)g(meaning)f(to)h(the)g(shell.)40 +Fm(id)p Fu(.)150 4846 y Ft(process)e(group)h(ID)630 4955 +y Fu(A)h(unique)g(iden)m(ti\014er)h(that)f(represen)m(ts)h(a)g +Ft(process)d(group)h Fu(during)g(its)i(lifetime.)150 +5121 y Ft(reserved)d(word)630 5230 y Fu(A)h Ft(word)e +Fu(that)i(has)f(a)h(sp)s(ecial)g(meaning)f(to)h(the)g(shell.)40 b(Most)30 b(reserv)m(ed)e(w)m(ords)g(in)m(tro)s(duce)630 5340 y(shell)j(\015o)m(w)f(con)m(trol)i(constructs,)f(suc)m(h)f(as)g -Fs(for)g Ft(and)g Fs(while)p Ft(.)p eop end +Ft(for)g Fu(and)g Ft(while)p Fu(.)p eop end %%Page: 4 10 -TeXDict begin 4 9 bop 150 -116 a Ft(Chapter)30 b(2:)41 -b(De\014nitions)2662 b(4)150 299 y Fs(return)29 b(status)630 -408 y Ft(A)h(synon)m(ym)g(for)g Fs(exit)g(status)p Ft(.)150 -568 y Fs(signal)192 b Ft(A)40 b(mec)m(hanism)h(b)m(y)e(whic)m(h)h(a)h +TeXDict begin 4 9 bop 150 -116 a Fu(Chapter)30 b(2:)41 +b(De\014nitions)2662 b(4)150 299 y Ft(return)29 b(status)630 +408 y Fu(A)h(synon)m(ym)g(for)g Ft(exit)g(status)p Fu(.)150 +568 y Ft(signal)192 b Fu(A)40 b(mec)m(hanism)h(b)m(y)e(whic)m(h)h(a)h (pro)s(cess)e(ma)m(y)i(b)s(e)e(noti\014ed)h(b)m(y)g(the)h(k)m(ernel)f (of)g(an)g(ev)m(en)m(t)630 677 y(o)s(ccurring)30 b(in)g(the)h(system.) -150 837 y Fs(special)d(builtin)630 946 y Ft(A)j(shell)f(builtin)g +150 837 y Ft(special)d(builtin)630 946 y Fu(A)j(shell)f(builtin)g (command)h(that)g(has)f(b)s(een)g(classi\014ed)h(as)g(sp)s(ecial)g(b)m -(y)f(the)h Fl(posix)f Ft(stan-)630 1056 y(dard.)150 1215 -y Fs(token)240 b Ft(A)38 b(sequence)h(of)f(c)m(haracters)h(considered)f +(y)f(the)h Fm(posix)f Fu(stan-)630 1056 y(dard.)150 1215 +y Ft(token)240 b Fu(A)38 b(sequence)h(of)f(c)m(haracters)h(considered)f (a)h(single)g(unit)e(b)m(y)h(the)h(shell.)64 b(It)38 -b(is)g(either)h(a)630 1325 y Fs(word)29 b Ft(or)i(an)f -Fs(operator)p Ft(.)150 1484 y Fs(word)288 b Ft(A)28 b(sequence)g(of)g +b(is)g(either)h(a)630 1325 y Ft(word)29 b Fu(or)i(an)f +Ft(operator)p Fu(.)150 1484 y Ft(word)288 b Fu(A)28 b(sequence)g(of)g (c)m(haracters)h(treated)g(as)f(a)g(unit)f(b)m(y)h(the)g(shell.)40 b(W)-8 b(ords)28 b(ma)m(y)g(not)g(include)630 1594 y(unquoted)i -Fs(metacharacters)p Ft(.)p eop end +Ft(metacharacters)p Fu(.)p eop end %%Page: 5 11 -TeXDict begin 5 10 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 5 10 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2292 b(5)150 299 -y Fo(3)80 b(Basic)54 b(Shell)e(F)-13 b(eatures)150 603 -y Ft(Bash)21 b(is)g(an)f(acron)m(ym)i(for)e(`)p Fs(Bourne-Again)27 -b(SHell)p Ft('.)37 b(The)20 b(Bourne)g(shell)h(is)g(the)g(traditional)h +y Fp(3)80 b(Basic)54 b(Shell)e(F)-13 b(eatures)150 603 +y Fu(Bash)21 b(is)g(an)f(acron)m(ym)i(for)e(`)p Ft(Bourne-Again)27 +b(SHell)p Fu('.)37 b(The)20 b(Bourne)g(shell)h(is)g(the)g(traditional)h (Unix)f(shell)150 712 y(originally)h(written)f(b)m(y)f(Stephen)g (Bourne.)38 b(All)21 b(of)g(the)g(Bourne)f(shell)h(builtin)f(commands)g (are)i(a)m(v)-5 b(ailable)150 822 y(in)26 b(Bash,)h(The)f(rules)f(for)h (ev)-5 b(aluation)28 b(and)d(quoting)h(are)h(tak)m(en)g(from)f(the)g -Fl(posix)f Ft(sp)s(eci\014cation)i(for)f(the)150 931 +Fm(posix)f Fu(sp)s(eci\014cation)i(for)f(the)150 931 y(`standard')k(Unix)g(shell.)275 1089 y(This)h(c)m(hapter)i(brie\015y)e (summarizes)h(the)h(shell's)f(`building)g(blo)s(c)m(ks':)45 b(commands,)32 b(con)m(trol)i(struc-)150 1199 y(tures,)k(shell)e -(functions,)h(shell)g Fk(p)-5 b(ar)g(ameters)p Ft(,)41 -b(shell)36 b(expansions,)i Fk(r)-5 b(e)g(dir)g(e)g(ctions)p -Ft(,)40 b(whic)m(h)c(are)h(a)f(w)m(a)m(y)h(to)150 1308 +(functions,)h(shell)g Fl(p)-5 b(ar)g(ameters)p Fu(,)41 +b(shell)36 b(expansions,)i Fl(r)-5 b(e)g(dir)g(e)g(ctions)p +Fu(,)40 b(whic)m(h)c(are)h(a)f(w)m(a)m(y)h(to)150 1308 y(direct)31 b(input)e(and)h(output)g(from)g(and)g(to)h(named)f (\014les,)g(and)g(ho)m(w)g(the)h(shell)g(executes)g(commands.)150 -1576 y Fr(3.1)68 b(Shell)45 b(Syn)l(tax)150 1735 y Ft(When)40 +1576 y Fs(3.1)68 b(Shell)45 b(Syn)l(tax)150 1735 y Fu(When)40 b(the)h(shell)g(reads)f(input,)i(it)f(pro)s(ceeds)f(through)g(a)h (sequence)g(of)g(op)s(erations.)71 b(If)40 b(the)h(input)150 1845 y(indicates)31 b(the)f(b)s(eginning)f(of)h(a)g(commen)m(t,)h(the)f (shell)g(ignores)g(the)g(commen)m(t)h(sym)m(b)s(ol)f(\(`)p -Fs(#)p Ft('\),)h(and)e(the)150 1954 y(rest)i(of)f(that)h(line.)275 +Ft(#)p Fu('\),)h(and)e(the)150 1954 y(rest)i(of)f(that)h(line.)275 2112 y(Otherwise,)h(roughly)f(sp)s(eaking,)i(the)f(shell)g(reads)g(its) g(input)f(and)h(divides)f(the)i(input)e(in)m(to)h(w)m(ords)150 2222 y(and)23 b(op)s(erators,)j(emplo)m(ying)e(the)g(quoting)h(rules)e @@ -7686,20 +8242,20 @@ b(arious)23 b(w)m(ords)150 2331 y(and)30 b(c)m(haracters.)275 (aits)f(for)f(the)g(command's)g(exit)i(status,)f(and)f(mak)m(es)150 2818 y(that)31 b(exit)g(status)g(a)m(v)-5 b(ailable)33 b(for)d(further)f(insp)s(ection)h(or)h(pro)s(cessing.)150 -3040 y Fj(3.1.1)63 b(Shell)41 b(Op)s(eration)150 3187 -y Ft(The)c(follo)m(wing)h(is)f(a)h(brief)e(description)i(of)f(the)g +3040 y Fk(3.1.1)63 b(Shell)41 b(Op)s(eration)150 3187 +y Fu(The)c(follo)m(wing)h(is)f(a)h(brief)e(description)i(of)f(the)g (shell's)h(op)s(eration)f(when)f(it)i(reads)f(and)f(executes)j(a)150 3297 y(command.)h(Basically)-8 b(,)34 b(the)c(shell)h(do)s(es)f(the)h (follo)m(wing:)199 3454 y(1.)61 b(Reads)42 b(its)h(input)e(from)h(a)g (\014le)h(\(see)g(Section)g(3.8)g([Shell)f(Scripts],)j(page)e(39\),)k -(from)41 b(a)i(string)330 3564 y(supplied)26 b(as)i(an)f(argumen)m(t)g -(to)h(the)g(`)p Fs(-c)p Ft(')f(in)m(v)m(o)s(cation)i(option)f(\(see)g -(Section)h(6.1)f([In)m(v)m(oking)g(Bash],)330 3673 y(page)j(80\),)h(or) -e(from)g(the)h(user's)f(terminal.)199 3820 y(2.)61 b(Breaks)43 +(from)41 b(a)i(string)330 3564 y(supplied)30 b(as)h(an)g(argumen)m(t)h +(to)g(the)f Ft(-c)g Fu(in)m(v)m(o)s(cation)i(option)f(\(see)g(Section)g +(6.1)g([In)m(v)m(oking)g(Bash],)330 3673 y(page)f(80\),)h(or)e(from)g +(the)h(user's)f(terminal.)199 3820 y(2.)61 b(Breaks)43 b(the)g(input)f(in)m(to)h(w)m(ords)f(and)g(op)s(erators,)k(ob)s(eying)d (the)g(quoting)g(rules)f(describ)s(ed)f(in)330 3929 y(Section)27 b(3.1.2)i([Quoting],)f(page)f(6.)40 b(These)26 b(tok)m(ens)i(are)f -(separated)g(b)m(y)f Fs(metacharacters)p Ft(.)36 b(Alias)330 +(separated)g(b)m(y)f Ft(metacharacters)p Fu(.)36 b(Alias)330 4039 y(expansion)30 b(is)h(p)s(erformed)d(b)m(y)j(this)f(step)g(\(see)i (Section)f(6.6)g([Aliases],)i(page)e(88\).)199 4185 y(3.)61 b(P)m(arses)35 b(the)g(tok)m(ens)g(in)m(to)h(simple)e(and)g(comp)s @@ -7721,9 +8277,9 @@ f(collects)i(its)f(exit)g(status)f(\(see)h(Sec-)330 5317 y(tion)31 b(3.7.5)h([Exit)f(Status],)g(page)g(38\).)p eop end %%Page: 6 12 -TeXDict begin 6 11 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 6 11 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2292 b(6)150 299 -y Fj(3.1.2)63 b(Quoting)150 446 y Ft(Quoting)32 b(is)h(used)e(to)i +y Fk(3.1.2)63 b(Quoting)150 446 y Fu(Quoting)32 b(is)h(used)e(to)i (remo)m(v)m(e)h(the)e(sp)s(ecial)h(meaning)f(of)h(certain)g(c)m (haracters)g(or)f(w)m(ords)g(to)h(the)f(shell.)150 555 y(Quoting)c(can)f(b)s(e)g(used)f(to)j(disable)e(sp)s(ecial)h(treatmen)m @@ -7736,46 +8292,46 @@ y(Quoting)c(can)f(b)s(e)g(used)f(to)j(disable)e(sp)s(ecial)h(treatmen)m (quoted)g(if)h(it)g(is)f(to)h(represen)m(t)g(itself.)68 b(When)39 b(the)h(command)f(history)150 1012 y(expansion)i(facilities)j (are)e(b)s(eing)f(used)g(\(see)h(Section)h(9.3)f([History)h(In)m -(teraction],)j(page)c(136\),)47 b(the)150 1122 y Fq(history)30 -b(expansion)h Ft(c)m(haracter,)h(usually)f(`)p Fs(!)p -Ft(',)g(m)m(ust)f(b)s(e)g(quoted)h(to)g(prev)m(en)m(t)g(history)g +(teraction],)j(page)c(135\),)47 b(the)150 1122 y Fr(history)30 +b(expansion)h Fu(c)m(haracter,)h(usually)f(`)p Ft(!)p +Fu(',)g(m)m(ust)f(b)s(e)g(quoted)h(to)g(prev)m(en)m(t)g(history)g (expansion.)41 b(See)150 1231 y(Section)22 b(9.1)g([Bash)f(History)h(F) --8 b(acilities],)26 b(page)c(134,)j(for)20 b(more)h(details)h -(concerning)g(history)f(expansion.)275 1359 y(There)36 -b(are)i(three)f(quoting)g(mec)m(hanisms:)55 b(the)37 -b Fq(escap)s(e)h(c)m(haracter)7 b Ft(,)40 b(single)d(quotes,)j(and)c -(double)150 1469 y(quotes.)150 1655 y Fj(3.1.2.1)63 b(Escap)s(e)41 -b(Character)150 1802 y Ft(A)36 b(non-quoted)f(bac)m(kslash)h(`)p -Fs(\\)p Ft(')g(is)f(the)h(Bash)g(escap)s(e)f(c)m(haracter.)58 +-8 b(acilities],)26 b(page)c(133,)j(for)20 b(more)h(details)h +(concerning)g(history)f(expansion.)275 1359 y(There)37 +b(are)h(three)f(quoting)h(mec)m(hanisms:)56 b(the)38 +b Fr(escap)s(e)g(c)m(haracter)p Fu(,)j(single)d(quotes,)i(and)d(double) +150 1469 y(quotes.)150 1655 y Fk(3.1.2.1)63 b(Escap)s(e)41 +b(Character)150 1802 y Fu(A)36 b(non-quoted)f(bac)m(kslash)h(`)p +Ft(\\)p Fu(')g(is)f(the)h(Bash)g(escap)s(e)f(c)m(haracter.)58 b(It)36 b(preserv)m(es)f(the)h(literal)h(v)-5 b(alue)36 b(of)150 1911 y(the)27 b(next)g(c)m(haracter)h(that)f(follo)m(ws,)i -(with)d(the)h(exception)g(of)g Fs(newline)p Ft(.)38 b(If)26 -b(a)h Fs(\\newline)d Ft(pair)i(app)s(ears,)150 2021 y(and)k(the)h(bac)m -(kslash)g(itself)g(is)g(not)g(quoted,)g(the)f Fs(\\newline)f -Ft(is)h(treated)i(as)f(a)g(line)g(con)m(tin)m(uation)h(\(that)150 +(with)d(the)h(exception)g(of)g Ft(newline)p Fu(.)38 b(If)26 +b(a)h Ft(\\newline)d Fu(pair)i(app)s(ears,)150 2021 y(and)k(the)h(bac)m +(kslash)g(itself)g(is)g(not)g(quoted,)g(the)f Ft(\\newline)f +Fu(is)h(treated)i(as)f(a)g(line)g(con)m(tin)m(uation)h(\(that)150 2131 y(is,)f(it)g(is)f(remo)m(v)m(ed)h(from)f(the)h(input)e(stream)i -(and)f(e\013ectiv)m(ely)j(ignored\).)150 2317 y Fj(3.1.2.2)63 -b(Single)42 b(Quotes)150 2464 y Ft(Enclosing)24 b(c)m(haracters)h(in)e -(single)h(quotes)g(\(`)p Fs(')p Ft('\))g(preserv)m(es)g(the)f(literal)i +(and)f(e\013ectiv)m(ely)j(ignored\).)150 2317 y Fk(3.1.2.2)63 +b(Single)42 b(Quotes)150 2464 y Fu(Enclosing)24 b(c)m(haracters)h(in)e +(single)h(quotes)g(\(`)p Ft(')p Fu('\))g(preserv)m(es)g(the)f(literal)i (v)-5 b(alue)24 b(of)g(eac)m(h)g(c)m(haracter)h(within)150 2573 y(the)31 b(quotes.)42 b(A)31 b(single)h(quote)f(ma)m(y)g(not)g(o)s (ccur)g(b)s(et)m(w)m(een)g(single)h(quotes,)f(ev)m(en)h(when)d (preceded)i(b)m(y)g(a)150 2683 y(bac)m(kslash.)150 2869 -y Fj(3.1.2.3)63 b(Double)42 b(Quotes)150 3016 y Ft(Enclosing)24 -b(c)m(haracters)h(in)f(double)f(quotes)h(\(`)p Fs(")p -Ft('\))g(preserv)m(es)g(the)g(literal)h(v)-5 b(alue)24 +y Fk(3.1.2.3)63 b(Double)42 b(Quotes)150 3016 y Fu(Enclosing)24 +b(c)m(haracters)h(in)f(double)f(quotes)h(\(`)p Ft(")p +Fu('\))g(preserv)m(es)g(the)g(literal)h(v)-5 b(alue)24 b(of)g(all)g(c)m(haracters)h(within)150 3125 y(the)34 -b(quotes,)h(with)f(the)g(exception)h(of)f(`)p Fs($)p -Ft(',)h(`)p Fs(`)p Ft(',)g(`)p Fs(\\)p Ft(',)g(and,)f(when)f(history)g -(expansion)h(is)g(enabled,)h(`)p Fs(!)p Ft('.)150 3235 -y(The)25 b(c)m(haracters)h(`)p Fs($)p Ft(')g(and)f(`)p -Fs(`)p Ft(')g(retain)h(their)f(sp)s(ecial)h(meaning)f(within)g(double)g +b(quotes,)h(with)f(the)g(exception)h(of)f(`)p Ft($)p +Fu(',)h(`)p Ft(`)p Fu(',)g(`)p Ft(\\)p Fu(',)g(and,)f(when)f(history)g +(expansion)h(is)g(enabled,)h(`)p Ft(!)p Fu('.)150 3235 +y(The)25 b(c)m(haracters)h(`)p Ft($)p Fu(')g(and)f(`)p +Ft(`)p Fu(')g(retain)h(their)f(sp)s(ecial)h(meaning)f(within)g(double)g (quotes)h(\(see)g(Section)g(3.5)150 3345 y([Shell)j(Expansions],)g (page)h(21\).)41 b(The)28 b(bac)m(kslash)i(retains)f(its)h(sp)s(ecial)f (meaning)g(only)g(when)f(follo)m(w)m(ed)150 3454 y(b)m(y)41 b(one)f(of)h(the)g(follo)m(wing)h(c)m(haracters:)63 b(`)p -Fs($)p Ft(',)43 b(`)p Fs(`)p Ft(',)h(`)p Fs(")p Ft(',)g(`)p -Fs(\\)p Ft(',)f(or)e Fs(newline)p Ft(.)69 b(Within)41 +Ft($)p Fu(',)43 b(`)p Ft(`)p Fu(',)h(`)p Ft(")p Fu(',)g(`)p +Ft(\\)p Fu(',)f(or)e Ft(newline)p Fu(.)69 b(Within)41 b(double)f(quotes,)150 3564 y(bac)m(kslashes)25 b(that)h(are)f(follo)m (w)m(ed)h(b)m(y)e(one)h(of)g(these)g(c)m(haracters)h(are)f(remo)m(v)m (ed.)40 b(Bac)m(kslashes)26 b(preceding)150 3673 y(c)m(haracters)35 @@ -7783,94 +8339,94 @@ b(without)e(a)h(sp)s(ecial)f(meaning)h(are)f(left)h(unmo)s(di\014ed.)47 b(A)34 b(double)f(quote)g(ma)m(y)h(b)s(e)f(quoted)150 3783 y(within)h(double)h(quotes)g(b)m(y)g(preceding)g(it)g(with)g(a)g (bac)m(kslash.)55 b(If)35 b(enabled,)h(history)f(expansion)g(will)150 -3892 y(b)s(e)f(p)s(erformed)g(unless)g(an)h(`)p Fs(!)p -Ft(')g(app)s(earing)f(in)h(double)f(quotes)i(is)f(escap)s(ed)g(using)f +3892 y(b)s(e)f(p)s(erformed)g(unless)g(an)h(`)p Ft(!)p +Fu(')g(app)s(earing)f(in)h(double)f(quotes)i(is)f(escap)s(ed)g(using)f (a)h(bac)m(kslash.)55 b(The)150 4002 y(bac)m(kslash)31 -b(preceding)f(the)h(`)p Fs(!)p Ft(')f(is)h(not)g(remo)m(v)m(ed.)275 -4130 y(The)41 b(sp)s(ecial)h(parameters)f(`)p Fs(*)p -Ft(')h(and)f(`)p Fs(@)p Ft(')h(ha)m(v)m(e)g(sp)s(ecial)g(meaning)g +b(preceding)f(the)h(`)p Ft(!)p Fu(')f(is)h(not)g(remo)m(v)m(ed.)275 +4130 y(The)41 b(sp)s(ecial)h(parameters)f(`)p Ft(*)p +Fu(')h(and)f(`)p Ft(@)p Fu(')h(ha)m(v)m(e)g(sp)s(ecial)g(meaning)g (when)f(in)g(double)g(quotes)h(\(see)150 4240 y(Section)31 b(3.5.3)h([Shell)f(P)m(arameter)h(Expansion],)e(page)h(23\).)150 -4426 y Fj(3.1.2.4)63 b(ANSI-C)40 b(Quoting)150 4573 y -Ft(W)-8 b(ords)41 b(of)h(the)f(form)g Fs($')p Fi(string)11 -b Fs(')38 b Ft(are)k(treated)g(sp)s(ecially)-8 b(.)75 -b(The)41 b(w)m(ord)g(expands)f(to)i Fq(string)8 b Ft(,)44 -b(with)150 4682 y(bac)m(kslash-escap)s(ed)g(c)m(haracters)h(replaced)f -(as)g(sp)s(eci\014ed)f(b)m(y)g(the)g(ANSI)g(C)g(standard.)79 -b(Bac)m(kslash)150 4792 y(escap)s(e)31 b(sequences,)g(if)f(presen)m(t,) -h(are)g(deco)s(ded)f(as)g(follo)m(ws:)150 4938 y Fs(\\a)384 -b Ft(alert)31 b(\(b)s(ell\))150 5084 y Fs(\\b)384 b Ft(bac)m(kspace)150 -5230 y Fs(\\e)150 5340 y(\\E)g Ft(an)30 b(escap)s(e)h(c)m(haracter)h +4426 y Fk(3.1.2.4)63 b(ANSI-C)40 b(Quoting)150 4573 y +Fu(W)-8 b(ords)43 b(of)f(the)h(form)f Ft($')p Fj(string)p +Ft(')e Fu(are)j(treated)g(sp)s(ecially)-8 b(.)79 b(The)42 +b(w)m(ord)g(expands)f(to)j Fr(string)p Fu(,)h(with)150 +4682 y(bac)m(kslash-escap)s(ed)f(c)m(haracters)h(replaced)f(as)g(sp)s +(eci\014ed)f(b)m(y)g(the)g(ANSI)g(C)g(standard.)79 b(Bac)m(kslash)150 +4792 y(escap)s(e)31 b(sequences,)g(if)f(presen)m(t,)h(are)g(deco)s(ded) +f(as)g(follo)m(ws:)150 4938 y Ft(\\a)384 b Fu(alert)31 +b(\(b)s(ell\))150 5084 y Ft(\\b)384 b Fu(bac)m(kspace)150 +5230 y Ft(\\e)150 5340 y(\\E)g Fu(an)30 b(escap)s(e)h(c)m(haracter)h (\(not)f(ANSI)f(C\))p eop end %%Page: 7 13 -TeXDict begin 7 12 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 7 12 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2292 b(7)150 299 -y Fs(\\f)384 b Ft(form)30 b(feed)150 488 y Fs(\\n)384 -b Ft(newline)150 678 y Fs(\\r)g Ft(carriage)32 b(return)150 -868 y Fs(\\t)384 b Ft(horizon)m(tal)32 b(tab)150 1057 -y Fs(\\v)384 b Ft(v)m(ertical)32 b(tab)150 1247 y Fs(\\\\)384 -b Ft(bac)m(kslash)150 1436 y Fs(\\')g Ft(single)31 b(quote)150 -1626 y Fs(\\")384 b Ft(double)30 b(quote)150 1816 y Fs(\\)p -Fi(nnn)288 b Ft(the)31 b(eigh)m(t-bit)h(c)m(haracter)g(whose)e(v)-5 -b(alue)31 b(is)f(the)h(o)s(ctal)g(v)-5 b(alue)31 b Fq(nnn)e -Ft(\(one)i(to)g(three)g(digits\))150 2005 y Fs(\\x)p -Fi(HH)288 b Ft(the)36 b(eigh)m(t-bit)i(c)m(haracter)f(whose)f(v)-5 +y Ft(\\f)384 b Fu(form)30 b(feed)150 488 y Ft(\\n)384 +b Fu(newline)150 678 y Ft(\\r)g Fu(carriage)32 b(return)150 +868 y Ft(\\t)384 b Fu(horizon)m(tal)32 b(tab)150 1057 +y Ft(\\v)384 b Fu(v)m(ertical)32 b(tab)150 1247 y Ft(\\\\)384 +b Fu(bac)m(kslash)150 1436 y Ft(\\')g Fu(single)31 b(quote)150 +1626 y Ft(\\")384 b Fu(double)30 b(quote)150 1816 y Ft(\\)p +Fj(nnn)288 b Fu(the)31 b(eigh)m(t-bit)h(c)m(haracter)g(whose)e(v)-5 +b(alue)31 b(is)f(the)h(o)s(ctal)g(v)-5 b(alue)31 b Fr(nnn)e +Fu(\(one)i(to)g(three)g(digits\))150 2005 y Ft(\\x)p +Fj(HH)288 b Fu(the)36 b(eigh)m(t-bit)i(c)m(haracter)f(whose)f(v)-5 b(alue)36 b(is)g(the)g(hexadecimal)h(v)-5 b(alue)36 b -Fq(HH)46 b Ft(\(one)37 b(or)f(t)m(w)m(o)630 2115 y(hex)30 -b(digits\))150 2304 y Fs(\\u)p Fi(HHHH)192 b Ft(the)33 +Fr(HH)46 b Fu(\(one)37 b(or)f(t)m(w)m(o)630 2115 y(hex)30 +b(digits\))150 2304 y Ft(\\u)p Fj(HHHH)192 b Fu(the)33 b(Unico)s(de)f(\(ISO/IEC)g(10646\))j(c)m(haracter)f(whose)e(v)-5 b(alue)33 b(is)g(the)g(hexadecimal)g(v)-5 b(alue)630 -2414 y Fq(HHHH)41 b Ft(\(one)31 b(to)g(four)f(hex)g(digits\))150 -2604 y Fs(\\U)p Fi(HHHHHHHH)630 2713 y Ft(the)j(Unico)s(de)f(\(ISO/IEC) +2414 y Fr(HHHH)41 b Fu(\(one)31 b(to)g(four)f(hex)g(digits\))150 +2604 y Ft(\\U)p Fj(HHHHHHHH)630 2713 y Fu(the)j(Unico)s(de)f(\(ISO/IEC) g(10646\))j(c)m(haracter)f(whose)e(v)-5 b(alue)33 b(is)g(the)g -(hexadecimal)g(v)-5 b(alue)630 2823 y Fq(HHHHHHHH)42 -b Ft(\(one)31 b(to)g(eigh)m(t)g(hex)g(digits\))150 3012 -y Fs(\\c)p Fi(x)336 b Ft(a)31 b(con)m(trol-)p Fq(x)38 -b Ft(c)m(haracter)150 3217 y(The)30 b(expanded)f(result)i(is)f +(hexadecimal)g(v)-5 b(alue)630 2823 y Fr(HHHHHHHH)42 +b Fu(\(one)31 b(to)g(eigh)m(t)g(hex)g(digits\))150 3012 +y Ft(\\c)p Fj(x)336 b Fu(a)31 b(con)m(trol-)p Fr(x)38 +b Fu(c)m(haracter)150 3217 y(The)30 b(expanded)f(result)i(is)f (single-quoted,)i(as)f(if)f(the)g(dollar)h(sign)g(had)e(not)i(b)s(een)f -(presen)m(t.)150 3446 y Fj(3.1.2.5)63 b(Lo)s(cale-Sp)s(eci\014c)41 -b(T)-10 b(ranslation)150 3593 y Ft(A)28 b(double-quoted)g(string)f -(preceded)h(b)m(y)f(a)h(dollar)h(sign)e(\(`)p Fs($)p -Ft('\))i(will)f(cause)g(the)g(string)g(to)g(b)s(e)f(translated)150 +(presen)m(t.)150 3446 y Fk(3.1.2.5)63 b(Lo)s(cale-Sp)s(eci\014c)41 +b(T)-10 b(ranslation)150 3593 y Fu(A)28 b(double-quoted)g(string)f +(preceded)h(b)m(y)f(a)h(dollar)h(sign)e(\(`)p Ft($)p +Fu('\))i(will)f(cause)g(the)g(string)g(to)g(b)s(e)f(translated)150 3703 y(according)f(to)f(the)g(curren)m(t)g(lo)s(cale.)41 -b(If)24 b(the)h(curren)m(t)g(lo)s(cale)h(is)f Fs(C)g -Ft(or)g Fs(POSIX)p Ft(,)f(the)h(dollar)h(sign)f(is)g(ignored.)150 +b(If)24 b(the)h(curren)m(t)g(lo)s(cale)h(is)f Ft(C)g +Fu(or)g Ft(POSIX)p Fu(,)f(the)h(dollar)h(sign)f(is)g(ignored.)150 3813 y(If)30 b(the)g(string)h(is)f(translated)h(and)f(replaced,)h(the)g (replacemen)m(t)h(is)e(double-quoted.)275 3977 y(Some)20 b(systems)h(use)f(the)h(message)h(catalog)h(selected)f(b)m(y)f(the)g -Fs(LC_MESSAGES)c Ft(shell)k(v)-5 b(ariable.)39 b(Others)150 +Ft(LC_MESSAGES)c Fu(shell)k(v)-5 b(ariable.)39 b(Others)150 4087 y(create)g(the)e(name)g(of)g(the)g(message)h(catalog)i(from)d(the) -g(v)-5 b(alue)37 b(of)g(the)h Fs(TEXTDOMAIN)c Ft(shell)j(v)-5 +g(v)-5 b(alue)37 b(of)g(the)h Ft(TEXTDOMAIN)c Fu(shell)j(v)-5 b(ariable,)150 4196 y(p)s(ossibly)31 b(adding)g(a)g(su\016x)g(of)h(`)p -Fs(.mo)p Ft('.)43 b(If)31 b(y)m(ou)h(use)f(the)h Fs(TEXTDOMAIN)c -Ft(v)-5 b(ariable,)33 b(y)m(ou)f(ma)m(y)g(need)f(to)h(set)150 -4306 y(the)22 b Fs(TEXTDOMAINDIR)d Ft(v)-5 b(ariable)23 +Ft(.mo)p Fu('.)43 b(If)31 b(y)m(ou)h(use)f(the)h Ft(TEXTDOMAIN)c +Fu(v)-5 b(ariable,)33 b(y)m(ou)f(ma)m(y)g(need)f(to)h(set)150 +4306 y(the)22 b Ft(TEXTDOMAINDIR)d Fu(v)-5 b(ariable)23 b(to)g(the)f(lo)s(cation)i(of)e(the)h(message)g(catalog)i(\014les.)38 b(Still)23 b(others)f(use)g(b)s(oth)150 4416 y(v)-5 b(ariables)31 -b(in)f(this)g(fashion:)41 b Fs(TEXTDOMAINDIR)p Ft(/)p -Fs(LC_MESSAGES)p Ft(/LC)p 2528 4416 28 4 v 34 w(MESSA)m(GES/)p -Fs(TEXTDOMAIN)p Ft(.mo.)150 4645 y Fj(3.1.3)63 b(Commen)m(ts)150 -4792 y Ft(In)21 b(a)i(non-in)m(teractiv)m(e)h(shell,)g(or)e(an)g(in)m -(teractiv)m(e)j(shell)d(in)g(whic)m(h)g(the)g Fs(interactive_comments) -16 b Ft(option)150 4902 y(to)40 b(the)f Fs(shopt)e Ft(builtin)h(is)h +b(in)f(this)g(fashion:)41 b Ft(TEXTDOMAINDIR)p Fu(/)p +Ft(LC_MESSAGES)p Fu(/LC)p 2528 4416 28 4 v 34 w(MESSA)m(GES/)p +Ft(TEXTDOMAIN)p Fu(.mo.)150 4645 y Fk(3.1.3)63 b(Commen)m(ts)150 +4792 y Fu(In)21 b(a)i(non-in)m(teractiv)m(e)h(shell,)g(or)e(an)g(in)m +(teractiv)m(e)j(shell)d(in)g(whic)m(h)g(the)g Ft(interactive_comments) +16 b Fu(option)150 4902 y(to)40 b(the)f Ft(shopt)e Fu(builtin)h(is)h (enabled)g(\(see)h(Section)g(4.3.2)g([The)f(Shopt)f(Builtin],)k(page)e -(63\),)i(a)d(w)m(ord)150 5011 y(b)s(eginning)26 b(with)g(`)p -Fs(#)p Ft(')g(causes)h(that)f(w)m(ord)g(and)g(all)h(remaining)g(c)m +(62\),)i(a)d(w)m(ord)150 5011 y(b)s(eginning)26 b(with)g(`)p +Ft(#)p Fu(')g(causes)h(that)f(w)m(ord)g(and)g(all)h(remaining)g(c)m (haracters)g(on)f(that)h(line)g(to)g(b)s(e)f(ignored.)150 5121 y(An)43 b(in)m(teractiv)m(e)j(shell)e(without)f(the)g -Fs(interactive_comments)38 b Ft(option)44 b(enabled)f(do)s(es)g(not)g -(allo)m(w)150 5230 y(commen)m(ts.)56 b(The)34 b Fs -(interactive_comments)c Ft(option)35 b(is)g(on)g(b)m(y)g(default)g(in)g +Ft(interactive_comments)38 b Fu(option)44 b(enabled)f(do)s(es)g(not)g +(allo)m(w)150 5230 y(commen)m(ts.)56 b(The)34 b Ft +(interactive_comments)c Fu(option)35 b(is)g(on)g(b)m(y)g(default)g(in)g (in)m(teractiv)m(e)j(shells.)55 b(See)150 5340 y(Section)30 b(6.3)f([In)m(teractiv)m(e)j(Shells],)d(page)h(83,)g(for)e(a)i (description)e(of)h(what)g(mak)m(es)h(a)f(shell)g(in)m(teractiv)m(e.)p eop end %%Page: 8 14 -TeXDict begin 8 13 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 8 13 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2292 b(8)150 299 -y Fr(3.2)68 b(Shell)45 b(Commands)150 458 y Ft(A)d(simple)g(shell)g -(command)f(suc)m(h)h(as)g Fs(echo)29 b(a)h(b)g(c)41 b -Ft(consists)i(of)f(the)f(command)h(itself)h(follo)m(w)m(ed)g(b)m(y)150 +y Fs(3.2)68 b(Shell)45 b(Commands)150 458 y Fu(A)d(simple)g(shell)g +(command)f(suc)m(h)h(as)g Ft(echo)29 b(a)h(b)g(c)41 b +Fu(consists)i(of)f(the)f(command)h(itself)h(follo)m(w)m(ed)g(b)m(y)150 568 y(argumen)m(ts,)31 b(separated)g(b)m(y)f(spaces.)275 704 y(More)h(complex)h(shell)f(commands)g(are)g(comp)s(osed)g(of)g (simple)g(commands)g(arranged)g(together)h(in)150 814 @@ -7878,11 +8434,11 @@ y(a)f(v)-5 b(ariet)m(y)32 b(of)f(w)m(a)m(ys:)41 b(in)31 b(a)g(pip)s(eline)f(in)g(whic)m(h)g(the)h(output)f(of)h(one)f(command)h (b)s(ecomes)f(the)h(input)f(of)150 923 y(a)h(second,)f(in)h(a)f(lo)s (op)h(or)f(conditional)i(construct,)f(or)f(in)g(some)h(other)g -(grouping.)150 1124 y Fj(3.2.1)63 b(Simple)41 b(Commands)150 -1271 y Ft(A)29 b(simple)f(command)g(is)h(the)g(kind)e(of)i(command)f +(grouping.)150 1124 y Fk(3.2.1)63 b(Simple)41 b(Commands)150 +1271 y Fu(A)29 b(simple)f(command)g(is)h(the)g(kind)e(of)i(command)f (encoun)m(tered)h(most)g(often.)40 b(It's)29 b(just)f(a)h(sequence)g -(of)150 1381 y(w)m(ords)22 b(separated)i(b)m(y)e Fs(blank)p -Ft(s,)i(terminated)f(b)m(y)g(one)g(of)g(the)g(shell's)g(con)m(trol)h +(of)150 1381 y(w)m(ords)22 b(separated)i(b)m(y)e Ft(blank)p +Fu(s,)i(terminated)f(b)m(y)g(one)g(of)g(the)g(shell's)g(con)m(trol)h (op)s(erators)f(\(see)h(Chapter)f(2)150 1491 y([De\014nitions],)37 b(page)e(3\).)54 b(The)35 b(\014rst)e(w)m(ord)i(generally)g(sp)s (eci\014es)g(a)g(command)f(to)h(b)s(e)f(executed,)j(with)150 @@ -7890,139 +8446,139 @@ b(page)e(3\).)54 b(The)35 b(\014rst)e(w)m(ord)i(generally)g(sp)s (command's)f(argumen)m(ts.)275 1736 y(The)h(return)h(status)g(\(see)i (Section)f(3.7.5)h([Exit)f(Status],)h(page)f(38\))g(of)g(a)g(simple)f (command)g(is)h(its)150 1846 y(exit)38 b(status)f(as)g(pro)m(vided)f(b) -m(y)h(the)g Fl(posix)f Ft(1003.1)j Fs(waitpid)c Ft(function,)j(or)f -(128)p Fs(+)p Fq(n)g Ft(if)g(the)g(command)150 1956 y(w)m(as)31 -b(terminated)g(b)m(y)f(signal)h Fq(n)p Ft(.)150 2157 -y Fj(3.2.2)63 b(Pip)s(elines)150 2304 y Ft(A)35 b Fs(pipeline)e -Ft(is)j(a)f(sequence)h(of)f(simple)g(commands)g(separated)h(b)m(y)f +m(y)h(the)g Fm(posix)f Fu(1003.1)j Ft(waitpid)c Fu(function,)j(or)f +(128)p Ft(+)p Fr(n)g Fu(if)g(the)g(command)150 1956 y(w)m(as)31 +b(terminated)g(b)m(y)f(signal)h Fr(n)p Fu(.)150 2157 +y Fk(3.2.2)63 b(Pip)s(elines)150 2304 y Fu(A)35 b Ft(pipeline)e +Fu(is)j(a)f(sequence)h(of)f(simple)g(commands)g(separated)h(b)m(y)f (one)g(of)h(the)f(con)m(trol)i(op)s(erators)150 2413 -y(`)p Fs(|)p Ft(')31 b(or)f(`)p Fs(|&)p Ft('.)275 2550 +y(`)p Ft(|)p Fu(')31 b(or)f(`)p Ft(|&)p Fu('.)275 2550 y(The)f(format)i(for)f(a)h(pip)s(eline)f(is)390 2686 -y Fs([time)46 b([-p]])h([!])g Fi(command1)56 b Fs([)47 -b(|)h(or)f(|&)g Fi(command2)56 b Fs(])47 b(...)150 2822 -y Ft(The)25 b(output)f(of)i(eac)m(h)g(command)f(in)f(the)i(pip)s(eline) -e(is)i(connected)g(via)f(a)h(pip)s(e)e(to)i(the)f(input)f(of)h(the)h -(next)150 2932 y(command.)40 b(That)29 b(is,)h(eac)m(h)h(command)e -(reads)g(the)h(previous)f(command's)g(output.)40 b(This)29 -b(connection)150 3041 y(is)h(p)s(erformed)f(b)s(efore)h(an)m(y)h -(redirections)g(sp)s(eci\014ed)f(b)m(y)g(the)g(command.)275 -3178 y(If)k(`)p Fs(|&)p Ft(')h(is)f(used,)i Fq(command1)7 -b Ft('s)35 b(standard)f(error,)i(in)e(addition)h(to)h(its)f(standard)f -(output,)i(is)e(con-)150 3287 y(nected)h(to)g Fq(command2)7 -b Ft('s)35 b(standard)f(input)f(through)h(the)g(pip)s(e;)i(it)f(is)g -(shorthand)e(for)h Fs(2>&1)29 b(|)p Ft(.)53 b(This)150 -3397 y(implicit)41 b(redirection)f(of)g(the)g(standard)f(error)g(to)h -(the)g(standard)f(output)g(is)h(p)s(erformed)e(after)j(an)m(y)150 -3506 y(redirections)31 b(sp)s(eci\014ed)f(b)m(y)g(the)g(command.)275 -3643 y(The)36 b(reserv)m(ed)g(w)m(ord)g Fs(time)g Ft(causes)h(timing)g +y Ft([time)46 b([-p]])h([!])g Fj(command1)e Ft([)j(|)f(or)g(|&)g +Fj(command2)f Ft(])h(...)150 2822 y Fu(The)25 b(output)f(of)i(eac)m(h)g +(command)f(in)f(the)i(pip)s(eline)e(is)i(connected)g(via)f(a)h(pip)s(e) +e(to)i(the)f(input)f(of)h(the)h(next)150 2932 y(command.)40 +b(That)29 b(is,)h(eac)m(h)h(command)e(reads)g(the)h(previous)f +(command's)g(output.)40 b(This)29 b(connection)150 3041 +y(is)h(p)s(erformed)f(b)s(efore)h(an)m(y)h(redirections)g(sp)s +(eci\014ed)f(b)m(y)g(the)g(command.)275 3178 y(If)k(`)p +Ft(|&)p Fu(')h(is)f(used,)i Fr(command1)7 b Fu('s)35 +b(standard)f(error,)i(in)e(addition)h(to)h(its)f(standard)f(output,)i +(is)e(con-)150 3287 y(nected)h(to)g Fr(command2)7 b Fu('s)35 +b(standard)f(input)f(through)h(the)g(pip)s(e;)i(it)f(is)g(shorthand)e +(for)h Ft(2>&1)29 b(|)p Fu(.)53 b(This)150 3397 y(implicit)41 +b(redirection)f(of)g(the)g(standard)f(error)g(to)h(the)g(standard)f +(output)g(is)h(p)s(erformed)e(after)j(an)m(y)150 3506 +y(redirections)31 b(sp)s(eci\014ed)f(b)m(y)g(the)g(command.)275 +3643 y(The)36 b(reserv)m(ed)g(w)m(ord)g Ft(time)g Fu(causes)h(timing)g (statistics)h(to)f(b)s(e)f(prin)m(ted)g(for)g(the)h(pip)s(eline)f(once) h(it)150 3752 y(\014nishes.)51 b(The)34 b(statistics)i(curren)m(tly)e (consist)h(of)f(elapsed)h(\(w)m(all-clo)s(c)m(k\))i(time)e(and)f(user)f -(and)h(system)150 3862 y(time)28 b(consumed)e(b)m(y)h(the)h(command's)f -(execution.)40 b(The)27 b(`)p Fs(-p)p Ft(')g(option)h(c)m(hanges)g(the) -f(output)g(format)g(to)150 3971 y(that)34 b(sp)s(eci\014ed)e(b)m(y)h -Fl(posix)p Ft(.)49 b(When)33 b(the)g(shell)g(is)h(in)e -Fl(posix)h Ft(mo)s(de)g(\(see)h(Section)g(6.11)g([Bash)g(POSIX)150 +(and)h(system)150 3862 y(time)e(consumed)e(b)m(y)h(the)g(command's)g +(execution.)44 b(The)31 b Ft(-p)f Fu(option)i(c)m(hanges)g(the)f +(output)g(format)g(to)150 3971 y(that)j(sp)s(eci\014ed)e(b)m(y)h +Fm(posix)p Fu(.)49 b(When)33 b(the)g(shell)g(is)h(in)e +Fm(posix)h Fu(mo)s(de)g(\(see)h(Section)g(6.11)g([Bash)g(POSIX)150 4081 y(Mo)s(de],)40 b(page)f(94\),)i(it)d(do)s(es)f(not)h(recognize)i -Fs(time)c Ft(as)i(a)g(reserv)m(ed)g(w)m(ord)f(if)h(the)g(next)g(tok)m -(en)g(b)s(egins)150 4191 y(with)33 b(a)g(`)p Fs(-)p Ft('.)49 -b(The)33 b Fs(TIMEFORMAT)d Ft(v)-5 b(ariable)34 b(ma)m(y)g(b)s(e)f(set) +Ft(time)c Fu(as)i(a)g(reserv)m(ed)g(w)m(ord)f(if)h(the)g(next)g(tok)m +(en)g(b)s(egins)150 4191 y(with)33 b(a)g(`)p Ft(-)p Fu('.)49 +b(The)33 b Ft(TIMEFORMAT)d Fu(v)-5 b(ariable)34 b(ma)m(y)g(b)s(e)f(set) g(to)h(a)g(format)f(string)g(that)h(sp)s(eci\014es)f(ho)m(w)g(the)150 4300 y(timing)38 b(information)g(should)e(b)s(e)h(displa)m(y)m(ed.)62 b(See)38 b(Section)g(5.2)g([Bash)g(V)-8 b(ariables],)41 b(page)d(69,)i(for)e(a)150 4410 y(description)27 b(of)g(the)h(a)m(v)-5 -b(ailable)29 b(formats.)40 b(The)26 b(use)h(of)g Fs(time)f -Ft(as)i(a)f(reserv)m(ed)g(w)m(ord)g(p)s(ermits)f(the)h(timing)150 +b(ailable)29 b(formats.)40 b(The)26 b(use)h(of)g Ft(time)f +Fu(as)i(a)f(reserv)m(ed)g(w)m(ord)g(p)s(ermits)f(the)h(timing)150 4519 y(of)38 b(shell)g(builtins,)i(shell)e(functions,)i(and)d(pip)s -(elines.)63 b(An)38 b(external)h Fs(time)e Ft(command)h(cannot)g(time) +(elines.)63 b(An)38 b(external)h Ft(time)e Fu(command)h(cannot)g(time) 150 4629 y(these)31 b(easily)-8 b(.)275 4765 y(When)29 -b(the)h(shell)h(is)f(in)f Fl(posix)g Ft(mo)s(de)h(\(see)h(Section)f -(6.11)i([Bash)e(POSIX)f(Mo)s(de],)i(page)g(94\),)g Fs(time)150 -4875 y Ft(ma)m(y)26 b(b)s(e)f(follo)m(w)m(ed)j(b)m(y)d(a)h(newline.)39 +b(the)h(shell)h(is)f(in)f Fm(posix)g Fu(mo)s(de)h(\(see)h(Section)f +(6.11)i([Bash)e(POSIX)f(Mo)s(de],)i(page)g(94\),)g Ft(time)150 +4875 y Fu(ma)m(y)26 b(b)s(e)f(follo)m(w)m(ed)j(b)m(y)d(a)h(newline.)39 b(In)25 b(this)h(case,)i(the)d(shell)h(displa)m(ys)g(the)g(total)h (user)e(and)g(system)h(time)150 4984 y(consumed)33 b(b)m(y)h(the)h -(shell)f(and)f(its)i(c)m(hildren.)51 b(The)34 b Fs(TIMEFORMAT)d -Ft(v)-5 b(ariable)35 b(ma)m(y)g(b)s(e)e(used)g(to)i(sp)s(ecify)150 +(shell)f(and)f(its)i(c)m(hildren.)51 b(The)34 b Ft(TIMEFORMAT)d +Fu(v)-5 b(ariable)35 b(ma)m(y)g(b)s(e)e(used)g(to)i(sp)s(ecify)150 5094 y(the)c(format)f(of)h(the)f(time)h(information.)275 5230 y(If)24 b(the)h(pip)s(eline)g(is)g(not)g(executed)h(async)m (hronously)f(\(see)h(Section)g(3.2.3)h([Lists],)g(page)e(9\),)i(the)f (shell)150 5340 y(w)m(aits)31 b(for)f(all)i(commands)e(in)g(the)g(pip)s (eline)g(to)h(complete.)p eop end %%Page: 9 15 -TeXDict begin 9 14 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 9 14 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2292 b(9)275 299 y(Eac)m(h)25 b(command)g(in)g(a)g(pip)s(eline)g(is)g(executed)h(in)f (its)g(o)m(wn)h(subshell)e(\(see)i(Section)g(3.7.3)h([Command)150 408 y(Execution)36 b(En)m(vironmen)m(t],)i(page)e(36\).)58 b(The)36 b(exit)g(status)g(of)g(a)g(pip)s(eline)g(is)f(the)h(exit)h (status)f(of)g(the)150 518 y(last)27 b(command)f(in)f(the)i(pip)s -(eline,)f(unless)g(the)g Fs(pipefail)e Ft(option)i(is)g(enabled)g +(eline,)f(unless)g(the)g Ft(pipefail)e Fu(option)i(is)g(enabled)g (\(see)h(Section)g(4.3.1)h([The)150 628 y(Set)34 b(Builtin],)j(page)e -(59\).)53 b(If)34 b Fs(pipefail)e Ft(is)i(enabled,)h(the)g(pip)s +(58\).)53 b(If)34 b Ft(pipefail)e Fu(is)i(enabled,)h(the)g(pip)s (eline's)f(return)f(status)h(is)h(the)f(v)-5 b(alue)35 b(of)150 737 y(the)d(last)h(\(righ)m(tmost\))h(command)e(to)h(exit)g (with)e(a)i(non-zero)f(status,)h(or)f(zero)h(if)f(all)h(commands)f (exit)150 847 y(successfully)-8 b(.)67 b(If)38 b(the)h(reserv)m(ed)g(w) -m(ord)g(`)p Fs(!)p Ft(')g(precedes)g(the)g(pip)s(eline,)h(the)g(exit)f +m(ord)g(`)p Ft(!)p Fu(')g(precedes)g(the)g(pip)s(eline,)h(the)g(exit)f (status)g(is)g(the)g(logical)150 956 y(negation)h(of)f(the)f(exit)i (status)f(as)f(describ)s(ed)g(ab)s(o)m(v)m(e.)66 b(The)38 b(shell)h(w)m(aits)h(for)e(all)h(commands)g(in)f(the)150 1066 y(pip)s(eline)30 b(to)h(terminate)g(b)s(efore)f(returning)g(a)h(v) --5 b(alue.)150 1262 y Fj(3.2.3)63 b(Lists)41 b(of)h(Commands)150 -1409 y Ft(A)37 b Fs(list)e Ft(is)i(a)g(sequence)g(of)g(one)g(or)f(more) +-5 b(alue.)150 1262 y Fk(3.2.3)63 b(Lists)41 b(of)h(Commands)150 +1409 y Fu(A)37 b Ft(list)e Fu(is)i(a)g(sequence)g(of)g(one)g(or)f(more) h(pip)s(elines)f(separated)h(b)m(y)g(one)g(of)f(the)h(op)s(erators)g(`) -p Fs(;)p Ft(',)i(`)p Fs(&)p Ft(',)150 1518 y(`)p Fs(&&)p -Ft(',)31 b(or)f(`)p Fs(||)p Ft(',)g(and)g(optionally)i(terminated)f(b)m -(y)f(one)h(of)f(`)p Fs(;)p Ft(',)h(`)p Fs(&)p Ft(',)g(or)f(a)h -Fs(newline)p Ft(.)275 1651 y(Of)23 b(these)h(list)g(op)s(erators,)i(`)p -Fs(&&)p Ft(')d(and)g(`)p Fs(||)p Ft(')h(ha)m(v)m(e)h(equal)f -(precedence,)i(follo)m(w)m(ed)f(b)m(y)f(`)p Fs(;)p Ft(')g(and)f(`)p -Fs(&)p Ft(',)i(whic)m(h)150 1761 y(ha)m(v)m(e)32 b(equal)e(precedence.) +p Ft(;)p Fu(',)i(`)p Ft(&)p Fu(',)150 1518 y(`)p Ft(&&)p +Fu(',)31 b(or)f(`)p Ft(||)p Fu(',)g(and)g(optionally)i(terminated)f(b)m +(y)f(one)h(of)f(`)p Ft(;)p Fu(',)h(`)p Ft(&)p Fu(',)g(or)f(a)h +Ft(newline)p Fu(.)275 1651 y(Of)23 b(these)h(list)g(op)s(erators,)i(`)p +Ft(&&)p Fu(')d(and)g(`)p Ft(||)p Fu(')h(ha)m(v)m(e)h(equal)f +(precedence,)i(follo)m(w)m(ed)f(b)m(y)f(`)p Ft(;)p Fu(')g(and)f(`)p +Ft(&)p Fu(',)i(whic)m(h)150 1761 y(ha)m(v)m(e)32 b(equal)e(precedence.) 275 1893 y(A)f(sequence)h(of)g(one)g(or)g(more)g(newlines)f(ma)m(y)h -(app)s(ear)f(in)h(a)g Fs(list)e Ft(to)j(delimit)f(commands,)g(equiv-) +(app)s(ear)f(in)h(a)g Ft(list)e Fu(to)j(delimit)f(commands,)g(equiv-) 150 2003 y(alen)m(t)i(to)f(a)g(semicolon.)275 2136 y(If)c(a)h(command)f (is)h(terminated)g(b)m(y)g(the)g(con)m(trol)h(op)s(erator)f(`)p -Fs(&)p Ft(',)h(the)e(shell)h(executes)h(the)f(command)150 -2245 y(async)m(hronously)g(in)g(a)h(subshell.)39 b(This)28 -b(is)g(kno)m(wn)g(as)h(executing)h(the)e(command)h(in)f(the)g -Fq(bac)m(kground)t Ft(.)150 2355 y(The)g(shell)h(do)s(es)f(not)h(w)m +Ft(&)p Fu(',)h(the)e(shell)h(executes)h(the)f(command)150 +2245 y(async)m(hronously)g(in)h(a)g(subshell.)39 b(This)28 +b(is)h(kno)m(wn)f(as)h(executing)h(the)f(command)g(in)f(the)h +Fr(bac)m(kground)p Fu(.)150 2355 y(The)f(shell)h(do)s(es)f(not)h(w)m (ait)g(for)f(the)h(command)f(to)i(\014nish,)d(and)h(the)h(return)e (status)i(is)g(0)g(\(true\).)40 b(When)150 2464 y(job)g(con)m(trol)h (is)g(not)f(activ)m(e)i(\(see)f(Chapter)f(7)h([Job)f(Con)m(trol],)j -(page)e(98\),)j(the)d(standard)e(input)g(for)150 2574 +(page)e(97\),)j(the)d(standard)e(input)g(for)150 2574 y(async)m(hronous)k(commands,)k(in)d(the)f(absence)i(of)f(an)m(y)g (explicit)h(redirections,)j(is)43 b(redirected)h(from)150 -2684 y Fs(/dev/null)p Ft(.)275 2816 y(Commands)19 b(separated)j(b)m(y)f -(a)g(`)p Fs(;)p Ft(')g(are)h(executed)g(sequen)m(tially;)k(the)21 +2684 y Ft(/dev/null)p Fu(.)275 2816 y(Commands)19 b(separated)j(b)m(y)f +(a)g(`)p Ft(;)p Fu(')g(are)h(executed)g(sequen)m(tially;)k(the)21 b(shell)g(w)m(aits)h(for)f(eac)m(h)h(command)150 2926 y(to)31 b(terminate)h(in)e(turn.)39 b(The)30 b(return)f(status)i(is)f (the)h(exit)g(status)g(of)g(the)f(last)h(command)f(executed.)275 -3059 y Fl(and)g Ft(and)h Fl(or)g Ft(lists)h(are)g(sequences)f(of)h(one) +3059 y Fm(and)g Fu(and)h Fm(or)g Fu(lists)h(are)g(sequences)f(of)h(one) g(or)f(more)h(pip)s(elines)e(separated)i(b)m(y)g(the)f(con)m(trol)i(op) -s(er-)150 3168 y(ators)e(`)p Fs(&&)p Ft(')f(and)g(`)p -Fs(||)p Ft(',)h(resp)s(ectiv)m(ely)-8 b(.)42 b Fl(and)30 -b Ft(and)f Fl(or)h Ft(lists)h(are)g(executed)g(with)f(left)h(asso)s -(ciativit)m(y)-8 b(.)275 3301 y(An)30 b Fl(and)f Ft(list)i(has)f(the)h -(form)390 3434 y Fi(command1)56 b Fs(&&)47 b Fi(command2)150 -3566 y Fq(command2)38 b Ft(is)30 b(executed)i(if,)e(and)g(only)g(if,)h -Fq(command1)38 b Ft(returns)29 b(an)h(exit)h(status)g(of)g(zero.)275 -3699 y(An)f Fl(or)f Ft(list)i(has)f(the)h(form)390 3832 -y Fi(command1)56 b Fs(||)47 b Fi(command2)150 3965 y -Fq(command2)38 b Ft(is)30 b(executed)i(if,)e(and)g(only)g(if,)h -Fq(command1)38 b Ft(returns)29 b(a)i(non-zero)g(exit)g(status.)275 -4097 y(The)h(return)g(status)i(of)f Fl(and)f Ft(and)h -Fl(or)f Ft(lists)i(is)f(the)g(exit)h(status)g(of)f(the)g(last)h -(command)f(executed)150 4207 y(in)d(the)h(list.)150 4403 -y Fj(3.2.4)63 b(Comp)s(ound)42 b(Commands)150 4550 y -Ft(Comp)s(ound)32 b(commands)j(are)g(the)g(shell)g(programming)f -(constructs.)54 b(Eac)m(h)35 b(construct)g(b)s(egins)f(with)150 -4659 y(a)k(reserv)m(ed)f(w)m(ord)h(or)f(con)m(trol)i(op)s(erator)f(and) -f(is)g(terminated)h(b)m(y)f(a)h(corresp)s(onding)f(reserv)m(ed)g(w)m -(ord)150 4769 y(or)44 b(op)s(erator.)81 b(An)m(y)44 b(redirections)g -(\(see)h(Section)g(3.6)g([Redirections],)j(page)d(31\))g(asso)s(ciated) -g(with)150 4878 y(a)g(comp)s(ound)e(command)i(apply)f(to)h(all)h -(commands)e(within)g(that)h(comp)s(ound)e(command)i(unless)150 -4988 y(explicitly)32 b(o)m(v)m(erridden.)275 5121 y(In)20 +s(er-)150 3168 y(ators)e(`)p Ft(&&)p Fu(')f(and)g(`)p +Ft(||)p Fu(',)h(resp)s(ectiv)m(ely)-8 b(.)42 b Fm(and)30 +b Fu(and)f Fm(or)h Fu(lists)h(are)g(executed)g(with)f(left)h(asso)s +(ciativit)m(y)-8 b(.)275 3301 y(An)30 b Fm(and)f Fu(list)i(has)f(the)h +(form)390 3434 y Fj(command1)46 b Ft(&&)h Fj(command2)150 +3566 y Fr(command2)38 b Fu(is)30 b(executed)i(if,)e(and)g(only)g(if,)h +Fr(command1)38 b Fu(returns)29 b(an)h(exit)h(status)g(of)g(zero.)275 +3699 y(An)f Fm(or)f Fu(list)i(has)f(the)h(form)390 3832 +y Fj(command1)46 b Ft(||)h Fj(command2)150 3965 y Fr(command2)38 +b Fu(is)30 b(executed)i(if,)e(and)g(only)g(if,)h Fr(command1)38 +b Fu(returns)29 b(a)i(non-zero)g(exit)g(status.)275 4097 +y(The)h(return)g(status)i(of)f Fm(and)f Fu(and)h Fm(or)f +Fu(lists)i(is)f(the)g(exit)h(status)g(of)f(the)g(last)h(command)f +(executed)150 4207 y(in)d(the)h(list.)150 4403 y Fk(3.2.4)63 +b(Comp)s(ound)42 b(Commands)150 4550 y Fu(Comp)s(ound)32 +b(commands)j(are)g(the)g(shell)g(programming)f(constructs.)54 +b(Eac)m(h)35 b(construct)g(b)s(egins)f(with)150 4659 +y(a)k(reserv)m(ed)f(w)m(ord)h(or)f(con)m(trol)i(op)s(erator)f(and)f(is) +g(terminated)h(b)m(y)f(a)h(corresp)s(onding)f(reserv)m(ed)g(w)m(ord)150 +4769 y(or)44 b(op)s(erator.)81 b(An)m(y)44 b(redirections)g(\(see)h +(Section)g(3.6)g([Redirections],)j(page)d(31\))g(asso)s(ciated)g(with) +150 4878 y(a)g(comp)s(ound)e(command)i(apply)f(to)h(all)h(commands)e +(within)g(that)h(comp)s(ound)e(command)i(unless)150 4988 +y(explicitly)32 b(o)m(v)m(erridden.)275 5121 y(In)20 b(most)h(cases)g(a)g(list)h(of)f(commands)f(in)g(a)h(comp)s(ound)f (command's)g(description)h(ma)m(y)g(b)s(e)f(separated)150 5230 y(from)30 b(the)h(rest)g(of)g(the)g(command)g(b)m(y)f(one)h(or)g @@ -8030,268 +8586,265 @@ b(most)h(cases)g(a)g(list)h(of)f(commands)f(in)g(a)h(comp)s(ound)f (newline)150 5340 y(in)f(place)h(of)g(a)g(semicolon.)p eop end %%Page: 10 16 -TeXDict begin 10 15 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 10 15 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(10)275 299 y(Bash)45 b(pro)m(vides)h(lo)s(oping)g(constructs,)j(conditional)e (commands,)j(and)44 b(mec)m(hanisms)i(to)g(group)150 408 y(commands)30 b(and)g(execute)i(them)e(as)g(a)h(unit.)150 -609 y Fj(3.2.4.1)63 b(Lo)s(oping)43 b(Constructs)150 -756 y Ft(Bash)31 b(supp)s(orts)d(the)j(follo)m(wing)g(lo)s(oping)g +609 y Fk(3.2.4.1)63 b(Lo)s(oping)43 b(Constructs)150 +756 y Fu(Bash)31 b(supp)s(orts)d(the)j(follo)m(wing)g(lo)s(oping)g (constructs.)275 891 y(Note)k(that)f(wherev)m(er)g(a)g(`)p -Fs(;)p Ft(')g(app)s(ears)f(in)h(the)g(description)g(of)g(a)g(command's) +Ft(;)p Fu(')g(app)s(ears)f(in)h(the)g(description)g(of)g(a)g(command's) g(syn)m(tax,)i(it)e(ma)m(y)h(b)s(e)150 1001 y(replaced)c(with)f(one)h -(or)f(more)g(newlines.)150 1162 y Fs(until)240 b Ft(The)30 -b(syn)m(tax)h(of)f(the)h Fs(until)e Ft(command)h(is:)870 -1297 y Fs(until)46 b Fi(test-commands)11 b Fs(;)44 b(do)j -Fi(consequent-commands)11 b Fs(;)42 b(done)630 1432 y -Ft(Execute)g Fq(consequen)m(t-commands)k Ft(as)41 b(long)h(as)f -Fq(test-commands)46 b Ft(has)41 b(an)g(exit)h(status)630 -1542 y(whic)m(h)c(is)h(not)g(zero.)67 b(The)38 b(return)g(status)h(is)f -(the)h(exit)h(status)f(of)g(the)g(last)g(command)630 -1651 y(executed)31 b(in)f Fq(consequen)m(t-commands)t -Ft(,)h(or)g(zero)g(if)f(none)h(w)m(as)f(executed.)150 -1812 y Fs(while)240 b Ft(The)30 b(syn)m(tax)h(of)f(the)h -Fs(while)e Ft(command)h(is:)870 1947 y Fs(while)46 b -Fi(test-commands)11 b Fs(;)44 b(do)j Fi(consequent-commands)11 -b Fs(;)42 b(done)630 2082 y Ft(Execute)g Fq(consequen)m(t-commands)k -Ft(as)41 b(long)h(as)f Fq(test-commands)46 b Ft(has)41 +(or)f(more)g(newlines.)150 1162 y Ft(until)240 b Fu(The)30 +b(syn)m(tax)h(of)f(the)h Ft(until)e Fu(command)h(is:)870 +1297 y Ft(until)46 b Fj(test-commands)p Ft(;)e(do)j Fj +(consequent-commands)p Ft(;)c(done)630 1432 y Fu(Execute)f +Fr(consequen)m(t-commands)k Fu(as)41 b(long)h(as)f Fr(test-commands)46 +b Fu(has)41 b(an)g(exit)h(status)630 1542 y(whic)m(h)c(is)h(not)g +(zero.)67 b(The)38 b(return)g(status)h(is)f(the)h(exit)h(status)f(of)g +(the)g(last)g(command)630 1651 y(executed)31 b(in)f Fr(consequen)m +(t-commands)p Fu(,)i(or)e(zero)h(if)g(none)f(w)m(as)h(executed.)150 +1812 y Ft(while)240 b Fu(The)30 b(syn)m(tax)h(of)f(the)h +Ft(while)e Fu(command)h(is:)870 1947 y Ft(while)46 b +Fj(test-commands)p Ft(;)e(do)j Fj(consequent-commands)p +Ft(;)c(done)630 2082 y Fu(Execute)f Fr(consequen)m(t-commands)k +Fu(as)41 b(long)h(as)f Fr(test-commands)46 b Fu(has)41 b(an)g(exit)h(status)630 2192 y(of)34 b(zero.)53 b(The)34 b(return)f(status)h(is)h(the)f(exit)h(status)g(of)f(the)g(last)h -(command)f(executed)h(in)630 2301 y Fq(consequen)m(t-commands)t -Ft(,)c(or)g(zero)g(if)f(none)g(w)m(as)h(executed.)150 -2462 y Fs(for)336 b Ft(The)30 b(syn)m(tax)h(of)f(the)h -Fs(for)e Ft(command)i(is:)870 2597 y Fs(for)47 b Fi(name)57 -b Fs([)48 b([in)e([)p Fi(words)57 b Fs(...)o(])48 b(])f(;)h(])f(do)g -Fi(commands)11 b Fs(;)45 b(done)630 2732 y Ft(Expand)31 -b Fq(w)m(ords)t Ft(,)i(and)e(execute)j Fq(commands)i -Ft(once)d(for)f(eac)m(h)i(mem)m(b)s(er)e(in)g(the)g(resultan)m(t)630 -2841 y(list,)d(with)f Fq(name)33 b Ft(b)s(ound)26 b(to)j(the)f(curren)m -(t)g(mem)m(b)s(er.)40 b(If)27 b(`)p Fs(in)j Fi(words)11 -b Ft(')27 b(is)h(not)g(presen)m(t,)h(the)630 2951 y Fs(for)g -Ft(command)g(executes)i(the)e Fq(commands)k Ft(once)d(for)f(eac)m(h)i -(p)s(ositional)f(parameter)g(that)630 3060 y(is)d(set,)h(as)f(if)g(`)p -Fs(in)j("$@")p Ft(')c(had)g(b)s(een)g(sp)s(eci\014ed)g(\(see)i(Section) -f(3.4.2)i([Sp)s(ecial)e(P)m(arameters],)630 3170 y(page)c(20\).)39 -b(The)21 b(return)g(status)h(is)g(the)g(exit)h(status)f(of)g(the)g -(last)g(command)g(that)g(executes.)630 3280 y(If)37 b(there)h(are)g(no) -g(items)g(in)g(the)g(expansion)g(of)f Fq(w)m(ords)t Ft(,)j(no)d -(commands)h(are)g(executed,)630 3389 y(and)30 b(the)g(return)g(status)g -(is)h(zero.)630 3524 y(An)f(alternate)i(form)e(of)h(the)f -Fs(for)g Ft(command)g(is)g(also)h(supp)s(orted:)870 3659 -y Fs(for)47 b(\(\()g Fi(expr1)57 b Fs(;)47 b Fi(expr2)57 -b Fs(;)48 b Fi(expr3)57 b Fs(\)\))47 b(;)g(do)g Fi(commands)57 -b Fs(;)47 b(done)630 3794 y Ft(First,)38 b(the)f(arithmetic)h -(expression)e Fq(expr1)43 b Ft(is)36 b(ev)-5 b(aluated)38 +(command)f(executed)h(in)630 2301 y Fr(consequen)m(t-commands)p +Fu(,)c(or)g(zero)g(if)f(none)g(w)m(as)h(executed.)150 +2462 y Ft(for)336 b Fu(The)30 b(syn)m(tax)h(of)f(the)h +Ft(for)e Fu(command)i(is:)870 2597 y Ft(for)47 b Fj(name)g +Ft([)g([in)g([)p Fj(words)f Ft(...)o(])i(])f(;)h(])f(do)g +Fj(commands)p Ft(;)e(done)630 2732 y Fu(Expand)31 b Fr(w)m(ords)p +Fu(,)j(and)e(execute)i Fr(commands)i Fu(once)d(for)g(eac)m(h)h(mem)m(b) +s(er)e(in)g(the)h(resultan)m(t)630 2841 y(list,)d(with)f +Fr(name)34 b Fu(b)s(ound)27 b(to)i(the)h(curren)m(t)e(mem)m(b)s(er.)40 +b(If)28 b(`)p Ft(in)i Fj(words)p Fu(')e(is)h(not)g(presen)m(t,)h(the) +630 2951 y Ft(for)f Fu(command)g(executes)i(the)e Fr(commands)k +Fu(once)d(for)f(eac)m(h)i(p)s(ositional)f(parameter)g(that)630 +3060 y(is)d(set,)h(as)f(if)g(`)p Ft(in)j("$@")p Fu(')c(had)g(b)s(een)g +(sp)s(eci\014ed)g(\(see)i(Section)f(3.4.2)i([Sp)s(ecial)e(P)m +(arameters],)630 3170 y(page)c(20\).)39 b(The)21 b(return)g(status)h +(is)g(the)g(exit)h(status)f(of)g(the)g(last)g(command)g(that)g +(executes.)630 3280 y(If)i(there)h(are)h(no)e(items)i(in)e(the)h +(expansion)g(of)g Fr(w)m(ords)p Fu(,)h(no)f(commands)f(are)h(executed,) +j(and)630 3389 y(the)j(return)e(status)i(is)f(zero.)630 +3524 y(An)g(alternate)i(form)e(of)h(the)f Ft(for)g Fu(command)g(is)g +(also)h(supp)s(orted:)870 3659 y Ft(for)47 b(\(\()g Fj(expr1)f +Ft(;)i Fj(expr2)e Ft(;)i Fj(expr3)e Ft(\)\))h(;)h(do)f +Fj(commands)e Ft(;)j(done)630 3794 y Fu(First,)38 b(the)f(arithmetic)h +(expression)e Fr(expr1)43 b Fu(is)36 b(ev)-5 b(aluated)38 b(according)f(to)g(the)g(rules)f(de-)630 3904 y(scrib)s(ed)41 b(b)s(elo)m(w)h(\(see)h(Section)g(6.5)g([Shell)g(Arithmetic],)j(page)d (87\).)77 b(The)42 b(arithmetic)630 4014 y(expression)33 -b Fq(expr2)41 b Ft(is)34 b(then)f(ev)-5 b(aluated)35 +b Fr(expr2)41 b Fu(is)34 b(then)f(ev)-5 b(aluated)35 b(rep)s(eatedly)f(un)m(til)g(it)g(ev)-5 b(aluates)35 -b(to)g(zero.)51 b(Eac)m(h)630 4123 y(time)23 b Fq(expr2)30 -b Ft(ev)-5 b(aluates)25 b(to)e(a)g(non-zero)h(v)-5 b(alue,)25 -b Fq(commands)h Ft(are)d(executed)g(and)g(the)g(arith-)630 -4233 y(metic)29 b(expression)f Fq(expr3)36 b Ft(is)28 +b(to)g(zero.)51 b(Eac)m(h)630 4123 y(time)23 b Fr(expr2)30 +b Fu(ev)-5 b(aluates)25 b(to)e(a)g(non-zero)h(v)-5 b(alue,)25 +b Fr(commands)h Fu(are)d(executed)g(and)g(the)g(arith-)630 +4233 y(metic)29 b(expression)f Fr(expr3)36 b Fu(is)28 b(ev)-5 b(aluated.)41 b(If)28 b(an)m(y)h(expression)f(is)g(omitted,)i (it)f(b)s(eha)m(v)m(es)g(as)630 4342 y(if)i(it)h(ev)-5 b(aluates)32 b(to)g(1.)44 b(The)30 b(return)g(v)-5 b(alue)32 b(is)f(the)g(exit)h(status)g(of)f(the)g(last)h(command)f(in)630 -4452 y Fq(commands)j Ft(that)d(is)f(executed,)i(or)e(false)h(if)f(an)m +4452 y Fr(commands)j Fu(that)d(is)f(executed,)i(or)e(false)h(if)f(an)m (y)h(of)g(the)f(expressions)g(is)h(in)m(v)-5 b(alid.)275 -4613 y(The)26 b Fs(break)g Ft(and)h Fs(continue)e Ft(builtins)i(\(see)h +4613 y(The)26 b Ft(break)g Fu(and)h Ft(continue)e Fu(builtins)i(\(see)h (Section)h(4.1)f([Bourne)g(Shell)f(Builtins],)i(page)f(41\))g(ma)m(y) 150 4723 y(b)s(e)i(used)f(to)i(con)m(trol)h(lo)s(op)f(execution.)150 -4923 y Fj(3.2.4.2)63 b(Conditional)42 b(Constructs)150 -5095 y Fs(if)384 b Ft(The)30 b(syn)m(tax)h(of)f(the)h -Fs(if)f Ft(command)g(is:)870 5230 y Fs(if)47 b Fi(test-commands)11 -b Fs(;)44 b(then)965 5340 y Fi(consequent-commands)11 -b Fs(;)p eop end +4923 y Fk(3.2.4.2)63 b(Conditional)42 b(Constructs)150 +5095 y Ft(if)384 b Fu(The)30 b(syn)m(tax)h(of)f(the)h +Ft(if)f Fu(command)g(is:)870 5230 y Ft(if)47 b Fj(test-commands)p +Ft(;)d(then)965 5340 y Fj(consequent-commands)p Ft(;)p +eop end %%Page: 11 17 -TeXDict begin 11 16 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 11 16 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(11)870 299 -y Fs([elif)46 b Fi(more-test-commands)11 b Fs(;)42 b(then)965 -408 y Fi(more-consequents)11 b Fs(;])870 518 y([else)46 -b Fi(alternate-consequents)11 b Fs(;])870 628 y(fi)630 -757 y Ft(The)53 b Fq(test-commands)58 b Ft(list)c(is)g(executed,)60 +y Ft([elif)46 b Fj(more-test-commands)p Ft(;)d(then)965 +408 y Fj(more-consequents)p Ft(;])870 518 y([else)j Fj +(alternate-consequents)p Ft(;])870 628 y(fi)630 757 y +Fu(The)53 b Fr(test-commands)58 b Fu(list)c(is)g(executed,)60 b(and)53 b(if)g(its)h(return)e(status)i(is)f(zero,)61 -b(the)630 867 y Fq(consequen)m(t-commands)44 b Ft(list)d(is)f -(executed.)70 b(If)40 b Fq(test-commands)k Ft(returns)39 -b(a)h(non-zero)630 976 y(status,)45 b(eac)m(h)e Fs(elif)d -Ft(list)i(is)g(executed)h(in)e(turn,)j(and)d(if)g(its)h(exit)h(status)f +b(the)630 867 y Fr(consequen)m(t-commands)44 b Fu(list)d(is)f +(executed.)70 b(If)40 b Fr(test-commands)k Fu(returns)39 +b(a)h(non-zero)630 976 y(status,)45 b(eac)m(h)e Ft(elif)d +Fu(list)i(is)g(executed)h(in)e(turn,)j(and)d(if)g(its)h(exit)h(status)f (is)f(zero,)46 b(the)630 1086 y(corresp)s(onding)37 b -Fq(more-consequen)m(ts)42 b Ft(is)c(executed)g(and)f(the)h(command)g -(completes.)63 b(If)630 1196 y(`)p Fs(else)29 b Fi -(alternate-consequents)11 b Ft(')23 b(is)30 b(presen)m(t,)f(and)g(the)g -(\014nal)g(command)f(in)h(the)g(\014nal)630 1305 y Fs(if)44 -b Ft(or)g Fs(elif)f Ft(clause)i(has)f(a)h(non-zero)g(exit)g(status,)j -(then)c Fq(alternate-consequen)m(ts)51 b Ft(is)630 1415 +Fr(more-consequen)m(ts)42 b Fu(is)c(executed)g(and)f(the)h(command)g +(completes.)63 b(If)630 1196 y(`)p Ft(else)29 b Fj +(alternate-consequents)p Fu(')c(is)30 b(presen)m(t,)h(and)f(the)g +(\014nal)g(command)g(in)g(the)g(\014nal)630 1305 y Ft(if)44 +b Fu(or)g Ft(elif)f Fu(clause)i(has)f(a)h(non-zero)g(exit)g(status,)j +(then)c Fr(alternate-consequen)m(ts)51 b Fu(is)630 1415 y(executed.)k(The)34 b(return)g(status)h(is)f(the)h(exit)h(status)f(of) g(the)g(last)g(command)g(executed,)630 1524 y(or)30 b(zero)i(if)e(no)g -(condition)h(tested)g(true.)150 1674 y Fs(case)288 b -Ft(The)30 b(syn)m(tax)h(of)f(the)h Fs(case)e Ft(command)h(is:)870 -1803 y Fs(case)47 b Fi(word)57 b Fs(in)47 b([)g([\(])g -Fi(pattern)57 b Fs([|)47 b Fi(pattern)11 b Fs(]...)l(\))48 -b Fi(command-list)55 b Fs(;;]...)46 b(esac)630 1933 y(case)20 -b Ft(will)i(selectiv)m(ely)j(execute)e(the)e Fq(command-list)k -Ft(corresp)s(onding)20 b(to)i(the)g(\014rst)f Fq(pattern)630 -2042 y Ft(that)42 b(matc)m(hes)g Fq(w)m(ord)t Ft(.)71 -b(If)41 b(the)g(shell)g(option)g Fs(nocasematch)d Ft(\(see)k(the)f -(description)g(of)630 2152 y Fs(shopt)34 b Ft(in)h(Section)h(4.3.2)h -([The)e(Shopt)f(Builtin],)k(page)e(63\))g(is)g(enabled,)g(the)g(matc)m -(h)g(is)630 2262 y(p)s(erformed)29 b(without)i(regard)g(to)g(the)g -(case)h(of)f(alphab)s(etic)g(c)m(haracters.)44 b(The)30 -b(`)p Fs(|)p Ft(')h(is)g(used)630 2371 y(to)e(separate)g(m)m(ultiple)g -(patterns,)g(and)e(the)i(`)p Fs(\))p Ft(')f(op)s(erator)g(terminates)h -(a)g(pattern)f(list.)41 b(A)630 2481 y(list)31 b(of)g(patterns)f(and)g -(an)g(asso)s(ciated)i(command-list)f(is)f(kno)m(wn)g(as)h(a)g -Fq(clause)5 b Ft(.)630 2610 y(Eac)m(h)42 b(clause)g(m)m(ust)f(b)s(e)g -(terminated)h(with)e(`)p Fs(;;)p Ft(',)45 b(`)p Fs(;&)p -Ft(',)f(or)d(`)p Fs(;;&)p Ft('.)73 b(The)41 b Fq(w)m(ord)j -Ft(under-)630 2720 y(go)s(es)35 b(tilde)f(expansion,)h(parameter)g -(expansion,)g(command)f(substitution,)h(arithmetic)630 -2829 y(expansion,)47 b(and)d(quote)g(remo)m(v)-5 b(al)45 -b(b)s(efore)f(matc)m(hing)h(is)f(attempted.)82 b(Eac)m(h)45 -b Fq(pattern)630 2939 y Ft(undergo)s(es)38 b(tilde)h(expansion,)i -(parameter)e(expansion,)i(command)d(substitution,)j(and)630 -3049 y(arithmetic)32 b(expansion.)630 3178 y(There)e(ma)m(y)g(b)s(e)f -(an)h(arbitrary)g(n)m(um)m(b)s(er)f(of)h Fs(case)f Ft(clauses,)i(eac)m -(h)g(terminated)g(b)m(y)e(a)i(`)p Fs(;;)p Ft(',)630 3288 -y(`)p Fs(;&)p Ft(',)c(or)e(`)p Fs(;;&)p Ft('.)39 b(The)25 -b(\014rst)g(pattern)h(that)g(matc)m(hes)h(determines)e(the)h -(command-list)g(that)630 3397 y(is)35 b(executed.)55 -b(It's)35 b(a)g(common)g(idiom)g(to)g(use)g(`)p Fs(*)p -Ft(')g(as)g(the)g(\014nal)f(pattern)h(to)h(de\014ne)e(the)630 +(condition)h(tested)g(true.)150 1674 y Ft(case)288 b +Fu(The)30 b(syn)m(tax)h(of)f(the)h Ft(case)e Fu(command)h(is:)870 +1803 y Ft(case)47 b Fj(word)f Ft(in)h([)h([\(])f Fj(pattern)f +Ft([|)h Fj(pattern)p Ft(]...)m(\))g Fj(command-list)e +Ft(;;]...)h(esac)630 1933 y(case)20 b Fu(will)i(selectiv)m(ely)j +(execute)e(the)e Fr(command-list)k Fu(corresp)s(onding)20 +b(to)i(the)g(\014rst)f Fr(pattern)630 2042 y Fu(that)42 +b(matc)m(hes)g Fr(w)m(ord)p Fu(.)73 b(If)41 b(the)g(shell)g(option)h +Ft(nocasematch)c Fu(\(see)k(the)g(description)f(of)630 +2152 y Ft(shopt)34 b Fu(in)h(Section)h(4.3.2)h([The)e(Shopt)f +(Builtin],)k(page)e(62\))g(is)g(enabled,)g(the)g(matc)m(h)g(is)630 +2262 y(p)s(erformed)29 b(without)i(regard)g(to)g(the)g(case)h(of)f +(alphab)s(etic)g(c)m(haracters.)44 b(The)30 b(`)p Ft(|)p +Fu(')h(is)g(used)630 2371 y(to)e(separate)g(m)m(ultiple)g(patterns,)g +(and)e(the)i(`)p Ft(\))p Fu(')f(op)s(erator)g(terminates)h(a)g(pattern) +f(list.)41 b(A)630 2481 y(list)31 b(of)g(patterns)f(and)g(an)g(asso)s +(ciated)i(command-list)f(is)f(kno)m(wn)g(as)h(a)g Fr(clause)p +Fu(.)630 2610 y(Eac)m(h)42 b(clause)g(m)m(ust)f(b)s(e)g(terminated)h +(with)e(`)p Ft(;;)p Fu(',)45 b(`)p Ft(;&)p Fu(',)f(or)d(`)p +Ft(;;&)p Fu('.)73 b(The)41 b Fr(w)m(ord)j Fu(under-)630 +2720 y(go)s(es)35 b(tilde)f(expansion,)h(parameter)g(expansion,)g +(command)f(substitution,)h(arithmetic)630 2829 y(expansion,)47 +b(and)d(quote)g(remo)m(v)-5 b(al)45 b(b)s(efore)f(matc)m(hing)h(is)f +(attempted.)82 b(Eac)m(h)45 b Fr(pattern)630 2939 y Fu(undergo)s(es)38 +b(tilde)h(expansion,)i(parameter)e(expansion,)i(command)d +(substitution,)j(and)630 3049 y(arithmetic)32 b(expansion.)630 +3178 y(There)e(ma)m(y)g(b)s(e)f(an)h(arbitrary)g(n)m(um)m(b)s(er)f(of)h +Ft(case)f Fu(clauses,)i(eac)m(h)g(terminated)g(b)m(y)e(a)i(`)p +Ft(;;)p Fu(',)630 3288 y(`)p Ft(;&)p Fu(',)c(or)e(`)p +Ft(;;&)p Fu('.)39 b(The)25 b(\014rst)g(pattern)h(that)g(matc)m(hes)h +(determines)e(the)h(command-list)g(that)630 3397 y(is)35 +b(executed.)55 b(It's)35 b(a)g(common)g(idiom)g(to)g(use)g(`)p +Ft(*)p Fu(')g(as)g(the)g(\014nal)f(pattern)h(to)h(de\014ne)e(the)630 3507 y(default)d(case,)g(since)g(that)g(pattern)f(will)h(alw)m(a)m(ys)h (matc)m(h.)630 3636 y(Here)j(is)g(an)g(example)h(using)e -Fs(case)g Ft(in)g(a)h(script)g(that)h(could)f(b)s(e)f(used)g(to)h +Ft(case)g Fu(in)g(a)h(script)g(that)h(could)f(b)s(e)f(used)g(to)h (describ)s(e)g(one)630 3746 y(in)m(teresting)d(feature)f(of)f(an)g -(animal:)870 3875 y Fs(echo)47 b(-n)g("Enter)f(the)h(name)f(of)i(an)f +(animal:)870 3875 y Ft(echo)47 b(-n)g("Enter)f(the)h(name)f(of)i(an)f (animal:)f(")870 3985 y(read)h(ANIMAL)870 4095 y(echo)g(-n)g("The)f ($ANIMAL)g(has)h(")870 4204 y(case)g($ANIMAL)e(in)965 4314 y(horse)i(|)g(dog)g(|)h(cat\))e(echo)h(-n)g("four";;)965 4423 y(man)g(|)h(kangaroo)d(\))j(echo)e(-n)i("two";;)965 4533 y(*\))g(echo)e(-n)h("an)g(unknown)f(number)g(of";;)870 -4643 y(esac)870 4752 y(echo)h(")g(legs.")630 4902 y Ft(If)25 -b(the)h(`)p Fs(;;)p Ft(')g(op)s(erator)g(is)g(used,)g(no)g(subsequen)m +4643 y(esac)870 4752 y(echo)h(")g(legs.")630 4902 y Fu(If)25 +b(the)h(`)p Ft(;;)p Fu(')g(op)s(erator)g(is)g(used,)g(no)g(subsequen)m (t)f(matc)m(hes)i(are)f(attempted)h(after)g(the)f(\014rst)630 -5011 y(pattern)g(matc)m(h.)40 b(Using)26 b(`)p Fs(;&)p -Ft(')f(in)h(place)g(of)g(`)p Fs(;;)p Ft(')g(causes)g(execution)h(to)f -(con)m(tin)m(ue)h(with)f(the)630 5121 y Fq(command-list)39 -b Ft(asso)s(ciated)f(with)e(the)g(next)g(clause,)j(if)d(an)m(y)-8 -b(.)59 b(Using)37 b(`)p Fs(;;&)p Ft(')f(in)g(place)h(of)630 -5230 y(`)p Fs(;;)p Ft(')30 b(causes)g(the)g(shell)g(to)g(test)h(the)f +5011 y(pattern)g(matc)m(h.)40 b(Using)26 b(`)p Ft(;&)p +Fu(')f(in)h(place)g(of)g(`)p Ft(;;)p Fu(')g(causes)g(execution)h(to)f +(con)m(tin)m(ue)h(with)f(the)630 5121 y Fr(command-list)39 +b Fu(asso)s(ciated)f(with)e(the)g(next)g(clause,)j(if)d(an)m(y)-8 +b(.)59 b(Using)37 b(`)p Ft(;;&)p Fu(')f(in)g(place)h(of)630 +5230 y(`)p Ft(;;)p Fu(')30 b(causes)g(the)g(shell)g(to)g(test)h(the)f (patterns)g(in)f(the)h(next)g(clause,)h(if)e(an)m(y)-8 b(,)31 b(and)f(execute)630 5340 y(an)m(y)h(asso)s(ciated)h -Fq(command-list)h Ft(on)d(a)h(successful)f(matc)m(h.)p +Fr(command-list)h Fu(on)d(a)h(successful)f(matc)m(h.)p eop end %%Page: 12 18 -TeXDict begin 12 17 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 12 17 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(12)630 299 -y(The)26 b(return)f(status)h(is)g(zero)h(if)f(no)g Fq(pattern)g -Ft(is)g(matc)m(hed.)40 b(Otherwise,)27 b(the)g(return)e(status)630 -408 y(is)30 b(the)h(exit)g(status)g(of)f(the)h Fq(command-list)i -Ft(executed.)150 564 y Fs(select)630 697 y Ft(The)g Fs(select)f -Ft(construct)i(allo)m(ws)h(the)f(easy)g(generation)h(of)e(men)m(us.)50 +y(The)26 b(return)f(status)h(is)g(zero)h(if)f(no)g Fr(pattern)g +Fu(is)g(matc)m(hed.)40 b(Otherwise,)27 b(the)g(return)e(status)630 +408 y(is)30 b(the)h(exit)g(status)g(of)f(the)h Fr(command-list)i +Fu(executed.)150 564 y Ft(select)630 697 y Fu(The)g Ft(select)f +Fu(construct)i(allo)m(ws)h(the)f(easy)g(generation)h(of)e(men)m(us.)50 b(It)34 b(has)f(almost)i(the)630 806 y(same)c(syn)m(tax)g(as)f(the)h -Fs(for)e Ft(command:)870 939 y Fs(select)46 b Fi(name)57 -b Fs([in)47 b Fi(words)57 b Fs(...)o(];)47 b(do)h Fi(commands)11 -b Fs(;)44 b(done)630 1072 y Ft(The)d(list)i(of)e(w)m(ords)h(follo)m -(wing)h Fs(in)e Ft(is)h(expanded,)i(generating)f(a)f(list)g(of)g -(items.)75 b(The)630 1181 y(set)41 b(of)f(expanded)f(w)m(ords)g(is)i -(prin)m(ted)e(on)h(the)g(standard)f(error)h(output)g(stream,)j(eac)m(h) -630 1291 y(preceded)30 b(b)m(y)g(a)h(n)m(um)m(b)s(er.)40 -b(If)29 b(the)i(`)p Fs(in)f Fi(words)11 b Ft(')29 b(is)h(omitted,)i -(the)e(p)s(ositional)i(parameters)630 1401 y(are)22 b(prin)m(ted,)h(as) -f(if)f(`)p Fs(in)30 b("$@")p Ft(')21 b(had)g(b)s(een)f(sp)s(eci\014ed.) -37 b(The)21 b Fs(PS3)g Ft(prompt)g(is)g(then)g(displa)m(y)m(ed)630 -1510 y(and)38 b(a)h(line)g(is)f(read)h(from)f(the)h(standard)e(input.) -65 b(If)38 b(the)h(line)g(consists)g(of)f(a)h(n)m(um)m(b)s(er)630 -1620 y(corresp)s(onding)33 b(to)i(one)f(of)g(the)g(displa)m(y)m(ed)h(w) -m(ords,)f(then)g(the)g(v)-5 b(alue)34 b(of)h Fq(name)k -Ft(is)34 b(set)g(to)630 1729 y(that)g(w)m(ord.)49 b(If)32 -b(the)i(line)f(is)h(empt)m(y)-8 b(,)35 b(the)e(w)m(ords)g(and)f(prompt) -h(are)g(displa)m(y)m(ed)h(again.)50 b(If)630 1839 y Fs(EOF)23 -b Ft(is)g(read,)j(the)d Fs(select)f Ft(command)i(completes.)40 -b(An)m(y)23 b(other)h(v)-5 b(alue)24 b(read)g(causes)g -Fq(name)630 1948 y Ft(to)31 b(b)s(e)f(set)h(to)g(n)m(ull.)41 -b(The)29 b(line)i(read)f(is)h(sa)m(v)m(ed)g(in)f(the)h(v)-5 -b(ariable)31 b Fs(REPLY)p Ft(.)630 2081 y(The)42 b Fq(commands)j -Ft(are)d(executed)h(after)g(eac)m(h)g(selection)h(un)m(til)e(a)h -Fs(break)d Ft(command)i(is)630 2191 y(executed,)32 b(at)f(whic)m(h)f(p) -s(oin)m(t)g(the)h Fs(select)d Ft(command)i(completes.)630 +Ft(for)e Fu(command:)870 939 y Ft(select)46 b Fj(name)h +Ft([in)g Fj(words)f Ft(...)o(];)h(do)h Fj(commands)p +Ft(;)d(done)630 1072 y Fu(The)25 b(list)h(of)f(w)m(ords)g(follo)m(wing) +i Ft(in)d Fu(is)h(expanded,)h(generating)h(a)e(list)h(of)g(items.)39 +b(The)25 b(set)h(of)630 1181 y(expanded)i(w)m(ords)h(is)g(prin)m(ted)f +(on)h(the)g(standard)f(error)h(output)f(stream,)i(eac)m(h)g(preceded) +630 1291 y(b)m(y)21 b(a)g(n)m(um)m(b)s(er.)37 b(If)20 +b(the)i(`)p Ft(in)30 b Fj(words)p Fu(')20 b(is)h(omitted,)j(the)d(p)s +(ositional)h(parameters)g(are)f(prin)m(ted,)630 1401 +y(as)28 b(if)f(`)p Ft(in)j("$@")p Fu(')d(had)f(b)s(een)h(sp)s +(eci\014ed.)39 b(The)27 b Ft(PS3)g Fu(prompt)f(is)i(then)f(displa)m(y)m +(ed)h(and)f(a)h(line)630 1510 y(is)h(read)f(from)h(the)f(standard)g +(input.)39 b(If)29 b(the)g(line)g(consists)g(of)g(a)g(n)m(um)m(b)s(er)e +(corresp)s(onding)630 1620 y(to)36 b(one)f(of)h(the)f(displa)m(y)m(ed)h +(w)m(ords,)g(then)f(the)g(v)-5 b(alue)36 b(of)f Fr(name)40 +b Fu(is)35 b(set)h(to)g(that)g(w)m(ord.)54 b(If)630 1729 +y(the)37 b(line)h(is)f(empt)m(y)-8 b(,)39 b(the)e(w)m(ords)g(and)f +(prompt)g(are)i(displa)m(y)m(ed)f(again.)62 b(If)37 b +Ft(EOF)f Fu(is)h(read,)630 1839 y(the)c Ft(select)e Fu(command)i +(completes.)50 b(An)m(y)33 b(other)g(v)-5 b(alue)33 b(read)g(causes)g +Fr(name)38 b Fu(to)c(b)s(e)e(set)630 1948 y(to)f(n)m(ull.)41 +b(The)30 b(line)g(read)h(is)f(sa)m(v)m(ed)h(in)g(the)f(v)-5 +b(ariable)31 b Ft(REPLY)p Fu(.)630 2081 y(The)42 b Fr(commands)j +Fu(are)d(executed)h(after)g(eac)m(h)g(selection)h(un)m(til)e(a)h +Ft(break)d Fu(command)i(is)630 2191 y(executed,)32 b(at)f(whic)m(h)f(p) +s(oin)m(t)g(the)h Ft(select)d Fu(command)i(completes.)630 2323 y(Here)39 b(is)g(an)g(example)h(that)f(allo)m(ws)i(the)e(user)f (to)i(pic)m(k)f(a)g(\014lename)h(from)e(the)h(curren)m(t)630 2433 y(directory)-8 b(,)32 b(and)d(displa)m(ys)i(the)f(name)h(and)f -(index)f(of)i(the)g(\014le)f(selected.)870 2566 y Fs(select)46 +(index)f(of)i(the)g(\014le)f(selected.)870 2566 y Ft(select)46 b(fname)g(in)i(*;)870 2675 y(do)870 2785 y(echo)f(you)g(picked)f ($fname)g(\\\($REPLY\\\))870 2894 y(break;)870 3004 y(done)150 -3160 y(\(\(...)o(\)\))870 3292 y(\(\()h Fi(expression)56 -b Fs(\)\))630 3425 y Ft(The)33 b(arithmetic)i Fq(expression)f -Ft(is)f(ev)-5 b(aluated)35 b(according)g(to)f(the)g(rules)f(describ)s +3160 y(\(\(...)o(\)\))870 3292 y(\(\()h Fj(expression)e +Ft(\)\))630 3425 y Fu(The)33 b(arithmetic)i Fr(expression)f +Fu(is)f(ev)-5 b(aluated)35 b(according)g(to)f(the)g(rules)f(describ)s (ed)g(b)s(elo)m(w)630 3535 y(\(see)j(Section)f(6.5)h([Shell)f (Arithmetic],)i(page)f(87\).)55 b(If)34 b(the)h(v)-5 b(alue)35 b(of)g(the)g(expression)g(is)630 3644 y(non-zero,)27 b(the)f(return)e(status)i(is)g(0;)h(otherwise)f(the)g(return)e(status)i (is)g(1.)39 b(This)25 b(is)g(exactly)630 3754 y(equiv)-5 -b(alen)m(t)32 b(to)870 3886 y Fs(let)47 b(")p Fi(expression)11 -b Fs(")630 4019 y Ft(See)25 b(Section)h(4.2)h([Bash)e(Builtins],)i -(page)f(48,)i(for)c(a)i(full)f(description)g(of)g(the)h -Fs(let)e Ft(builtin.)150 4175 y Fs([[...)o(]])870 4308 -y([[)47 b Fi(expression)56 b Fs(]])630 4440 y Ft(Return)25 -b(a)h(status)f(of)h(0)g(or)g(1)g(dep)s(ending)e(on)h(the)h(ev)-5 -b(aluation)27 b(of)e(the)h(conditional)h(expres-)630 -4550 y(sion)j Fq(expression)p Ft(.)41 b(Expressions)29 -b(are)i(comp)s(osed)f(of)g(the)h(primaries)f(describ)s(ed)f(b)s(elo)m -(w)h(in)630 4659 y(Section)36 b(6.4)h([Bash)f(Conditional)g -(Expressions],)h(page)f(85.)57 b(W)-8 b(ord)36 b(splitting)h(and)e -(\014le-)630 4769 y(name)d(expansion)g(are)h(not)g(p)s(erformed)d(on)j -(the)f(w)m(ords)g(b)s(et)m(w)m(een)h(the)f Fs([[)g Ft(and)f -Fs(]])p Ft(;)i(tilde)630 4879 y(expansion,)e(parameter)g(and)f(v)-5 +b(alen)m(t)32 b(to)870 3886 y Ft(let)47 b(")p Fj(expression)p +Ft(")630 4019 y Fu(See)25 b(Section)h(4.2)h([Bash)e(Builtins],)i(page)f +(48,)i(for)c(a)i(full)f(description)g(of)g(the)h Ft(let)e +Fu(builtin.)150 4175 y Ft([[...)o(]])870 4308 y([[)47 +b Fj(expression)e Ft(]])630 4440 y Fu(Return)25 b(a)h(status)f(of)h(0)g +(or)g(1)g(dep)s(ending)e(on)h(the)h(ev)-5 b(aluation)27 +b(of)e(the)h(conditional)h(expres-)630 4550 y(sion)j +Fr(expression)p Fu(.)41 b(Expressions)29 b(are)i(comp)s(osed)f(of)g +(the)h(primaries)f(describ)s(ed)f(b)s(elo)m(w)h(in)630 +4659 y(Section)36 b(6.4)h([Bash)f(Conditional)g(Expressions],)h(page)f +(85.)57 b(W)-8 b(ord)36 b(splitting)h(and)e(\014le-)630 +4769 y(name)d(expansion)g(are)h(not)g(p)s(erformed)d(on)j(the)f(w)m +(ords)g(b)s(et)m(w)m(een)h(the)f Ft([[)g Fu(and)f Ft(]])p +Fu(;)i(tilde)630 4879 y(expansion,)e(parameter)g(and)f(v)-5 b(ariable)31 b(expansion,)g(arithmetic)g(expansion,)g(command)630 4988 y(substitution,)40 b(pro)s(cess)f(substitution,)h(and)e(quote)h (remo)m(v)-5 b(al)40 b(are)f(p)s(erformed.)63 b(Condi-)630 5098 y(tional)32 b(op)s(erators)e(suc)m(h)g(as)h(`)p -Fs(-f)p Ft(')f(m)m(ust)g(b)s(e)g(unquoted)g(to)h(b)s(e)e(recognized)j -(as)f(primaries.)630 5230 y(When)k(used)f(with)h Fs([[)p -Ft(,)h(the)f(`)p Fs(<)p Ft(')g(and)g(`)p Fs(>)p Ft(')g(op)s(erators)g +Ft(-f)p Fu(')f(m)m(ust)g(b)s(e)g(unquoted)g(to)h(b)s(e)e(recognized)j +(as)f(primaries.)630 5230 y(When)k(used)f(with)h Ft([[)p +Fu(,)h(the)f(`)p Ft(<)p Fu(')g(and)g(`)p Ft(>)p Fu(')g(op)s(erators)g (sort)g(lexicographically)j(using)d(the)630 5340 y(curren)m(t)30 b(lo)s(cale.)p eop end %%Page: 13 19 -TeXDict begin 13 18 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 13 18 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(13)630 299 -y(When)22 b(the)h(`)p Fs(==)p Ft(')f(and)g(`)p Fs(!=)p -Ft(')g(op)s(erators)h(are)g(used,)g(the)g(string)f(to)i(the)e(righ)m(t) +y(When)22 b(the)h(`)p Ft(==)p Fu(')f(and)g(`)p Ft(!=)p +Fu(')g(op)s(erators)h(are)g(used,)g(the)g(string)f(to)i(the)e(righ)m(t) h(of)g(the)g(op)s(erator)630 408 y(is)31 b(considered)g(a)h(pattern)f (and)g(matc)m(hed)h(according)g(to)g(the)g(rules)f(describ)s(ed)f(b)s (elo)m(w)h(in)630 518 y(Section)d(3.5.8.1)h([P)m(attern)f(Matc)m -(hing],)h(page)f(30,)g(as)f(if)g(the)g Fs(extglob)d Ft(shell)j(option)g -(w)m(ere)630 628 y(enabled.)46 b(The)31 b(`)p Fs(=)p -Ft(')h(op)s(erator)h(is)f(iden)m(tical)h(to)g(`)p Fs(==)p -Ft('.)46 b(If)31 b(the)h(shell)h(option)f Fs(nocasematch)630 -737 y Ft(\(see)42 b(the)f(description)g(of)h Fs(shopt)d -Ft(in)i(Section)h(4.3.2)h([The)e(Shopt)f(Builtin],)45 -b(page)d(63\))630 847 y(is)e(enabled,)i(the)e(matc)m(h)h(is)e(p)s +(hing],)h(page)f(30,)g(as)f(if)g(the)g Ft(extglob)d Fu(shell)j(option)g +(w)m(ere)630 628 y(enabled.)46 b(The)31 b(`)p Ft(=)p +Fu(')h(op)s(erator)h(is)f(iden)m(tical)h(to)g(`)p Ft(==)p +Fu('.)46 b(If)31 b(the)h(shell)h(option)f Ft(nocasematch)630 +737 y Fu(\(see)42 b(the)f(description)g(of)h Ft(shopt)d +Fu(in)i(Section)h(4.3.2)h([The)e(Shopt)f(Builtin],)45 +b(page)d(62\))630 847 y(is)e(enabled,)i(the)e(matc)m(h)h(is)e(p)s (erformed)g(without)g(regard)h(to)h(the)f(case)g(of)g(alphab)s(etic)630 956 y(c)m(haracters.)h(The)28 b(return)e(v)-5 b(alue)28 -b(is)g(0)g(if)g(the)g(string)g(matc)m(hes)h(\(`)p Fs(==)p -Ft('\))f(or)g(do)s(es)f(not)h(matc)m(h)630 1066 y(\(`)p -Fs(!=)p Ft('\)the)33 b(pattern,)g(and)f(1)g(otherwise.)47 +b(is)g(0)g(if)g(the)g(string)g(matc)m(hes)h(\(`)p Ft(==)p +Fu('\))f(or)g(do)s(es)f(not)h(matc)m(h)630 1066 y(\(`)p +Ft(!=)p Fu('\)the)33 b(pattern,)g(and)f(1)g(otherwise.)47 b(An)m(y)32 b(part)g(of)h(the)f(pattern)g(ma)m(y)h(b)s(e)f(quoted)g(to) 630 1176 y(force)f(the)g(quoted)f(p)s(ortion)g(to)h(b)s(e)f(matc)m(hed) h(as)g(a)f(string.)630 1316 y(An)j(additional)i(binary)e(op)s(erator,)i -(`)p Fs(=~)p Ft(',)g(is)f(a)m(v)-5 b(ailable,)37 b(with)c(the)h(same)g -(precedence)h(as)630 1426 y(`)p Fs(==)p Ft(')29 b(and)f(`)p -Fs(!=)p Ft('.)40 b(When)29 b(it)g(is)g(used,)f(the)h(string)g(to)h(the) +(`)p Ft(=~)p Fu(',)g(is)f(a)m(v)-5 b(ailable,)37 b(with)c(the)h(same)g +(precedence)h(as)630 1426 y(`)p Ft(==)p Fu(')29 b(and)f(`)p +Ft(!=)p Fu('.)40 b(When)29 b(it)g(is)g(used,)f(the)h(string)g(to)h(the) e(righ)m(t)i(of)f(the)g(op)s(erator)g(is)g(consid-)630 1536 y(ered)34 b(an)g(extended)g(regular)g(expression)g(and)f(matc)m -(hed)i(accordingly)g(\(as)f(in)g Fk(r)-5 b(e)g(gex)11 -b Ft(3\)\).)630 1645 y(The)29 b(return)f(v)-5 b(alue)30 +(hed)i(accordingly)g(\(as)f(in)g Fl(r)-5 b(e)g(gex)11 +b Fu(3\)\).)630 1645 y(The)29 b(return)f(v)-5 b(alue)30 b(is)g(0)g(if)f(the)h(string)g(matc)m(hes)g(the)g(pattern,)g(and)f(1)h (otherwise.)41 b(If)29 b(the)630 1755 y(regular)e(expression)g(is)h (syn)m(tactically)i(incorrect,)f(the)e(conditional)i(expression's)e (return)630 1864 y(v)-5 b(alue)40 b(is)g(2.)68 b(If)39 -b(the)h(shell)f(option)h Fs(nocasematch)d Ft(\(see)j(the)g(description) -g(of)f Fs(shopt)f Ft(in)630 1974 y(Section)32 b(4.3.2)g([The)f(Shopt)f -(Builtin],)i(page)g(63\))g(is)f(enabled,)g(the)g(matc)m(h)h(is)e(p)s +b(the)h(shell)f(option)h Ft(nocasematch)d Fu(\(see)j(the)g(description) +g(of)f Ft(shopt)f Fu(in)630 1974 y(Section)32 b(4.3.2)g([The)f(Shopt)f +(Builtin],)i(page)g(62\))g(is)f(enabled,)g(the)g(matc)m(h)h(is)e(p)s (erformed)630 2084 y(without)36 b(regard)g(to)h(the)f(case)h(of)f (alphab)s(etic)h(c)m(haracters.)59 b(An)m(y)36 b(part)g(of)h(the)f (pattern)630 2193 y(ma)m(y)31 b(b)s(e)f(quoted)h(to)g(force)g(the)g @@ -8306,24 +8859,24 @@ b(quoting)f(the)g(v)-5 b(ariable)35 b(expansion)e(forces)i(the)f(en)m 56 b(Substrings)34 b(matc)m(hed)j(b)m(y)f(paren)m(thesized)g(sub)s (expressions)630 2741 y(within)k(the)g(regular)g(expression)g(are)g(sa) m(v)m(ed)i(in)d(the)i(arra)m(y)f(v)-5 b(ariable)41 b -Fs(BASH_REMATCH)p Ft(.)630 2851 y(The)30 b(elemen)m(t)i(of)e -Fs(BASH_REMATCH)d Ft(with)j(index)g(0)h(is)g(the)f(p)s(ortion)g(of)h +Ft(BASH_REMATCH)p Fu(.)630 2851 y(The)30 b(elemen)m(t)i(of)e +Ft(BASH_REMATCH)d Fu(with)j(index)g(0)h(is)g(the)f(p)s(ortion)g(of)h (the)f(string)h(matc)m(h-)630 2960 y(ing)j(the)g(en)m(tire)g(regular)g -(expression.)50 b(The)34 b(elemen)m(t)h(of)f Fs(BASH_REMATCH)c -Ft(with)j(index)g Fq(n)630 3070 y Ft(is)d(the)h(p)s(ortion)f(of)g(the)h -(string)f(matc)m(hing)i(the)e Fq(n)p Ft(th)g(paren)m(thesized)h(sub)s +(expression.)50 b(The)34 b(elemen)m(t)h(of)f Ft(BASH_REMATCH)c +Fu(with)j(index)g Fr(n)630 3070 y Fu(is)d(the)h(p)s(ortion)f(of)g(the)h +(string)f(matc)m(hing)i(the)e Fr(n)p Fu(th)g(paren)m(thesized)h(sub)s (expression.)630 3211 y(F)-8 b(or)28 b(example,)h(the)e(follo)m(wing)i (will)e(matc)m(h)h(a)g(line)f(\(stored)h(in)e(the)i(shell)f(v)-5 -b(ariable)28 b Fq(line)5 b Ft(\))28 b(if)630 3320 y(there)22 +b(ariable)28 b Fr(line)5 b Fu(\))28 b(if)630 3320 y(there)22 b(is)g(a)h(sequence)f(of)h(c)m(haracters)g(in)f(the)g(v)-5 b(alue)23 b(consisting)g(of)f(an)m(y)h(n)m(um)m(b)s(er,)f(including)630 3430 y(zero,)31 b(of)g(space)g(c)m(haracters,)h(zero)f(or)g(one)f -(instances)h(of)g(`)p Fs(a)p Ft(',)f(then)g(a)h(`)p Fs(b)p -Ft(':)870 3571 y Fs([[)47 b($line)g(=~)g([[:space:]]*\(a\)?b)c(]])630 -3712 y Ft(That)24 b(means)g(v)-5 b(alues)24 b(lik)m(e)h(`)p -Fs(aab)p Ft(')e(and)h(`)30 b Fs(aaaaaab)p Ft(')22 b(will)i(matc)m(h,)j +(instances)h(of)g(`)p Ft(a)p Fu(',)f(then)g(a)h(`)p Ft(b)p +Fu(':)870 3571 y Ft([[)47 b($line)g(=~)g([[:space:]]*\(a\)?b)c(]])630 +3712 y Fu(That)24 b(means)g(v)-5 b(alues)24 b(lik)m(e)h(`)p +Ft(aab)p Fu(')e(and)h(`)30 b Ft(aaaaaab)p Fu(')22 b(will)i(matc)m(h,)j (as)d(will)g(a)g(line)g(con)m(taining)630 3821 y(a)31 -b(`)p Fs(b)p Ft(')f(an)m(ywhere)h(in)f(its)g(v)-5 b(alue.)630 +b(`)p Ft(b)p Fu(')f(an)m(ywhere)h(in)f(its)g(v)-5 b(alue.)630 3962 y(Storing)31 b(the)g(regular)g(expression)f(in)h(a)g(shell)g(v)-5 b(ariable)31 b(is)g(often)g(a)g(useful)f(w)m(a)m(y)i(to)f(a)m(v)m(oid) 630 4072 y(problems)f(with)g(quoting)h(c)m(haracters)i(that)e(are)g(sp) @@ -8336,131 +8889,131 @@ s(ecial)g(to)h(the)f(shell.)41 b(It)31 b(is)g(sometimes)630 b(a)g(shell)g(v)-5 b(ariable)26 b(to)f(store)g(the)g(pattern)g (decreases)g(these)630 4510 y(problems.)40 b(F)-8 b(or)31 b(example,)g(the)g(follo)m(wing)h(is)e(equiv)-5 b(alen)m(t)32 -b(to)f(the)g(ab)s(o)m(v)m(e:)870 4651 y Fs(pattern='[[:space:]]*\(a\))o +b(to)f(the)g(ab)s(o)m(v)m(e:)870 4651 y Ft(pattern='[[:space:]]*\(a\))o (?b')870 4761 y([[)47 b($line)g(=~)g($pattern)e(]])630 -4902 y Ft(If)28 b(y)m(ou)h(w)m(an)m(t)g(to)g(matc)m(h)h(a)e(c)m +4902 y Fu(If)28 b(y)m(ou)h(w)m(an)m(t)g(to)g(matc)m(h)h(a)e(c)m (haracter)j(that's)e(sp)s(ecial)g(to)g(the)g(regular)f(expression)g (gram-)630 5011 y(mar,)g(it)g(has)g(to)g(b)s(e)f(quoted)h(to)g(remo)m (v)m(e)h(its)f(sp)s(ecial)g(meaning.)40 b(This)27 b(means)g(that)h(in)g -(the)630 5121 y(pattern)e(`)p Fs(xxx.txt)p Ft(',)g(the)h(`)p -Fs(.)p Ft(')f(matc)m(hes)i(an)m(y)e(c)m(haracter)i(in)e(the)h(string)f +(the)630 5121 y(pattern)e(`)p Ft(xxx.txt)p Fu(',)g(the)h(`)p +Ft(.)p Fu(')f(matc)m(hes)i(an)m(y)e(c)m(haracter)i(in)e(the)h(string)f (\(its)h(usual)f(regular)630 5230 y(expression)g(meaning\),)i(but)e(in) -g(the)h(pattern)f(`)p Fs("xxx.txt")p Ft(')f(it)i(can)g(only)f(matc)m(h) -i(a)e(literal)630 5340 y(`)p Fs(.)p Ft('.)56 b(Shell)35 +g(the)h(pattern)f(`)p Ft("xxx.txt")p Fu(')f(it)i(can)g(only)f(matc)m(h) +i(a)e(literal)630 5340 y(`)p Ft(.)p Fu('.)56 b(Shell)35 b(programmers)f(should)h(tak)m(e)i(sp)s(ecial)e(care)i(with)e(bac)m (kslashes,)i(since)f(bac)m(k-)p eop end %%Page: 14 20 -TeXDict begin 14 19 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 14 19 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(14)630 299 y(slashes)27 b(are)g(used)f(b)s(oth)g(b)m(y)h(the)f(shell)h(and)f (regular)h(expressions)g(to)g(remo)m(v)m(e)h(the)f(sp)s(ecial)630 408 y(meaning)h(from)f(the)h(follo)m(wing)i(c)m(haracter.)41 b(The)27 b(follo)m(wing)j(t)m(w)m(o)f(sets)f(of)g(commands)g(are)630 -518 y Fk(not)40 b Ft(equiv)-5 b(alen)m(t:)870 655 y Fs(pattern='\\.') +518 y Fl(not)40 b Fu(equiv)-5 b(alen)m(t:)870 655 y Ft(pattern='\\.') 870 874 y([[)47 b(.)h(=~)f($pattern)e(]])870 984 y([[)i(.)h(=~)f(\\.)g (]])870 1203 y([[)g(.)h(=~)f("$pattern")e(]])870 1313 -y([[)i(.)h(=~)f('\\.')f(]])630 1450 y Ft(The)28 b(\014rst)h(t)m(w)m(o)h +y([[)i(.)h(=~)f('\\.')f(]])630 1450 y Fu(The)28 b(\014rst)h(t)m(w)m(o)h (matc)m(hes)g(will)f(succeed,)h(but)f(the)g(second)g(t)m(w)m(o)h(will)f (not,)h(b)s(ecause)f(in)g(the)630 1559 y(second)39 b(t)m(w)m(o)i(the)e (bac)m(kslash)h(will)f(b)s(e)g(part)g(of)g(the)h(pattern)f(to)h(b)s(e)e (matc)m(hed.)68 b(In)39 b(the)630 1669 y(\014rst)31 b(t)m(w)m(o)h (examples,)h(the)e(bac)m(kslash)h(remo)m(v)m(es)h(the)f(sp)s(ecial)g -(meaning)f(from)g(`)p Fs(.)p Ft(',)h(so)g(the)630 1779 -y(literal)f(`)p Fs(.)p Ft(')e(matc)m(hes.)42 b(If)28 +(meaning)f(from)g(`)p Ft(.)p Fu(',)h(so)g(the)630 1779 +y(literal)f(`)p Ft(.)p Fu(')e(matc)m(hes.)42 b(If)28 b(the)i(string)f(in)g(the)g(\014rst)g(examples)g(w)m(ere)h(an)m(ything) -g(other)f(than)630 1888 y(`)p Fs(.)p Ft(',)g(sa)m(y)g(`)p -Fs(a)p Ft(',)g(the)f(pattern)g(w)m(ould)g(not)h(matc)m(h,)h(b)s(ecause) -e(the)g(quoted)g(`)p Fs(.)p Ft(')h(in)e(the)i(pattern)630 +g(other)f(than)630 1888 y(`)p Ft(.)p Fu(',)g(sa)m(y)g(`)p +Ft(a)p Fu(',)g(the)f(pattern)g(w)m(ould)g(not)h(matc)m(h,)h(b)s(ecause) +e(the)g(quoted)g(`)p Ft(.)p Fu(')h(in)e(the)i(pattern)630 1998 y(loses)i(its)g(sp)s(ecial)g(meaning)f(of)h(matc)m(hing)g(an)m(y)g (single)g(c)m(haracter.)630 2135 y(Expressions)23 b(ma)m(y)h(b)s(e)e (com)m(bined)i(using)f(the)h(follo)m(wing)h(op)s(erators,)g(listed)f (in)f(decreasing)630 2244 y(order)30 b(of)g(precedence:)630 -2409 y Fs(\()g Fi(expression)38 b Fs(\))1110 2519 y Ft(Returns)30 -b(the)h(v)-5 b(alue)31 b(of)g Fq(expression)p Ft(.)42 -b(This)30 b(ma)m(y)i(b)s(e)e(used)g(to)i(o)m(v)m(erride)g(the)1110 +2409 y Ft(\()g Fj(expression)e Ft(\))1110 2519 y Fu(Returns)i(the)h(v) +-5 b(alue)31 b(of)g Fr(expression)p Fu(.)42 b(This)30 +b(ma)m(y)i(b)s(e)e(used)g(to)i(o)m(v)m(erride)g(the)1110 2628 y(normal)e(precedence)h(of)g(op)s(erators.)630 2793 -y Fs(!)f Fi(expression)1110 2902 y Ft(T)-8 b(rue)30 b(if)g -Fq(expression)g Ft(is)h(false.)630 3067 y Fi(expression1)38 -b Fs(&&)30 b Fi(expression2)1110 3177 y Ft(T)-8 b(rue)30 -b(if)g(b)s(oth)g Fq(expression1)38 b Ft(and)29 b Fq(expression2)38 -b Ft(are)31 b(true.)630 3341 y Fi(expression1)38 b Fs(||)30 -b Fi(expression2)1110 3451 y Ft(T)-8 b(rue)30 b(if)g(either)h -Fq(expression1)38 b Ft(or)30 b Fq(expression2)38 b Ft(is)30 -b(true.)630 3615 y(The)25 b Fs(&&)g Ft(and)g Fs(||)f -Ft(op)s(erators)i(do)f(not)h(ev)-5 b(aluate)27 b Fq(expression2)33 -b Ft(if)26 b(the)f(v)-5 b(alue)26 b(of)g Fq(expression1)630 -3725 y Ft(is)k(su\016cien)m(t)h(to)g(determine)g(the)f(return)g(v)-5 -b(alue)31 b(of)f(the)h(en)m(tire)g(conditional)h(expression.)150 -3929 y Fj(3.2.4.3)63 b(Grouping)43 b(Commands)150 4076 -y Ft(Bash)30 b(pro)m(vides)g(t)m(w)m(o)h(w)m(a)m(ys)f(to)h(group)e(a)h -(list)g(of)g(commands)f(to)i(b)s(e)e(executed)h(as)g(a)h(unit.)40 -b(When)29 b(com-)150 4186 y(mands)h(are)i(group)s(ed,)f(redirections)h -(ma)m(y)g(b)s(e)e(applied)i(to)g(the)f(en)m(tire)h(command)g(list.)44 -b(F)-8 b(or)32 b(example,)150 4296 y(the)f(output)f(of)g(all)h(the)g -(commands)f(in)g(the)h(list)g(ma)m(y)g(b)s(e)e(redirected)i(to)g(a)g -(single)g(stream.)150 4463 y Fs(\(\))870 4600 y(\()47 -b Fi(list)58 b Fs(\))630 4737 y Ft(Placing)30 b(a)f(list)g(of)g -(commands)f(b)s(et)m(w)m(een)i(paren)m(theses)e(causes)i(a)f(subshell)e -(en)m(vironmen)m(t)630 4847 y(to)k(b)s(e)e(created)j(\(see)f(Section)g -(3.7.3)h([Command)d(Execution)i(En)m(vironmen)m(t],)g(page)f(36\),)630 -4956 y(and)d(eac)m(h)i(of)e(the)h(commands)f(in)g Fq(list)j -Ft(to)f(b)s(e)e(executed)h(in)f(that)h(subshell.)39 b(Since)28 -b(the)f Fq(list)630 5066 y Ft(is)i(executed)g(in)f(a)h(subshell,)g(v)-5 +y Ft(!)f Fj(expression)1110 2902 y Fu(T)-8 b(rue)30 b(if)g +Fr(expression)g Fu(is)h(false.)630 3067 y Fj(expression1)c +Ft(&&)j Fj(expression2)1110 3177 y Fu(T)-8 b(rue)30 b(if)g(b)s(oth)g +Fr(expression1)38 b Fu(and)29 b Fr(expression2)38 b Fu(are)31 +b(true.)630 3341 y Fj(expression1)c Ft(||)j Fj(expression2)1110 +3451 y Fu(T)-8 b(rue)30 b(if)g(either)h Fr(expression1)38 +b Fu(or)30 b Fr(expression2)38 b Fu(is)30 b(true.)630 +3615 y(The)24 b Ft(&&)h Fu(and)f Ft(||)g Fu(op)s(erators)h(do)g(not)g +(ev)-5 b(aluate)27 b Fr(expression2)32 b Fu(if)25 b(the)g(v)-5 +b(alue)25 b(of)g Fr(expression1)630 3725 y Fu(is)30 b(su\016cien)m(t)h +(to)g(determine)g(the)f(return)g(v)-5 b(alue)31 b(of)f(the)h(en)m(tire) +g(conditional)h(expression.)150 3929 y Fk(3.2.4.3)63 +b(Grouping)43 b(Commands)150 4076 y Fu(Bash)30 b(pro)m(vides)g(t)m(w)m +(o)h(w)m(a)m(ys)f(to)h(group)e(a)h(list)g(of)g(commands)f(to)i(b)s(e)e +(executed)h(as)g(a)h(unit.)40 b(When)29 b(com-)150 4186 +y(mands)h(are)i(group)s(ed,)f(redirections)h(ma)m(y)g(b)s(e)e(applied)i +(to)g(the)f(en)m(tire)h(command)g(list.)44 b(F)-8 b(or)32 +b(example,)150 4296 y(the)f(output)f(of)g(all)h(the)g(commands)f(in)g +(the)h(list)g(ma)m(y)g(b)s(e)e(redirected)i(to)g(a)g(single)g(stream.) +150 4463 y Ft(\(\))870 4600 y(\()47 b Fj(list)g Ft(\))630 +4737 y Fu(Placing)30 b(a)f(list)g(of)g(commands)f(b)s(et)m(w)m(een)i +(paren)m(theses)e(causes)i(a)f(subshell)e(en)m(vironmen)m(t)630 +4847 y(to)k(b)s(e)e(created)j(\(see)f(Section)g(3.7.3)h([Command)d +(Execution)i(En)m(vironmen)m(t],)g(page)f(36\),)630 4956 +y(and)d(eac)m(h)h(of)g(the)f(commands)g(in)g Fr(list)j +Fu(to)f(b)s(e)d(executed)j(in)e(that)h(subshell.)38 b(Since)28 +b(the)f Fr(list)630 5066 y Fu(is)i(executed)g(in)f(a)h(subshell,)g(v)-5 b(ariable)29 b(assignmen)m(ts)g(do)g(not)g(remain)f(in)g(e\013ect)j (after)e(the)630 5175 y(subshell)g(completes.)150 5340 -y Fs({})p eop end +y Ft({})p eop end %%Page: 15 21 -TeXDict begin 15 20 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 15 20 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(15)870 299 -y Fs({)47 b Fi(list)11 b Fs(;)46 b(})630 434 y Ft(Placing)30 +y Ft({)47 b Fj(list)p Ft(;)g(})630 434 y Fu(Placing)30 b(a)g(list)g(of)g(commands)f(b)s(et)m(w)m(een)h(curly)f(braces)g (causes)h(the)f(list)h(to)g(b)s(e)f(executed)630 544 y(in)d(the)h(curren)m(t)g(shell)f(con)m(text.)42 b(No)27 b(subshell)f(is)g(created.)41 b(The)26 b(semicolon)i(\(or)f(newline\)) -630 653 y(follo)m(wing)32 b Fq(list)h Ft(is)d(required.)275 +630 653 y(follo)m(wing)32 b Fr(list)h Fu(is)d(required.)275 815 y(In)44 b(addition)h(to)h(the)f(creation)i(of)e(a)g(subshell,)j (there)e(is)f(a)g(subtle)g(di\013erence)h(b)s(et)m(w)m(een)f(these)150 925 y(t)m(w)m(o)c(constructs)e(due)g(to)g(historical)i(reasons.)67 -b(The)39 b(braces)g(are)h Fs(reserved)28 b(words)p Ft(,)40 +b(The)39 b(braces)g(are)h Ft(reserved)28 b(words)p Fu(,)40 b(so)g(they)f(m)m(ust)150 1034 y(b)s(e)d(separated)h(from)f(the)g -Fq(list)j Ft(b)m(y)e Fs(blank)p Ft(s)e(or)h(other)h(shell)f(metac)m +Fr(list)j Fu(b)m(y)e Ft(blank)p Fu(s)e(or)h(other)h(shell)f(metac)m (haracters.)62 b(The)36 b(paren)m(theses)h(are)150 1144 -y Fs(operators)p Ft(,)23 b(and)h(are)g(recognized)i(as)e(separate)i +y Ft(operators)p Fu(,)23 b(and)h(are)g(recognized)i(as)e(separate)i (tok)m(ens)f(b)m(y)f(the)g(shell)h(ev)m(en)g(if)f(they)g(are)h(not)f -(separated)150 1254 y(from)30 b(the)g Fq(list)j Ft(b)m(y)e(whitespace.) +(separated)150 1254 y(from)30 b(the)g Fr(list)j Fu(b)m(y)e(whitespace.) 275 1390 y(The)e(exit)j(status)e(of)h(b)s(oth)f(of)g(these)h -(constructs)g(is)f(the)h(exit)g(status)f(of)h Fq(list)r -Ft(.)150 1591 y Fj(3.2.5)63 b(Copro)s(cesses)150 1738 -y Ft(A)37 b Fs(coprocess)c Ft(is)k(a)g(shell)f(command)h(preceded)f(b)m -(y)g(the)h Fs(coproc)d Ft(reserv)m(ed)j(w)m(ord.)59 b(A)36 +(constructs)g(is)f(the)h(exit)g(status)f(of)h Fr(list)p +Fu(.)150 1591 y Fk(3.2.5)63 b(Copro)s(cesses)150 1738 +y Fu(A)37 b Ft(coprocess)c Fu(is)k(a)g(shell)f(command)h(preceded)f(b)m +(y)g(the)h Ft(coproc)d Fu(reserv)m(ed)j(w)m(ord.)59 b(A)36 b(copro)s(cess)h(is)150 1847 y(executed)g(async)m(hronously)g(in)f(a)h (subshell,)g(as)g(if)g(the)f(command)h(had)f(b)s(een)f(terminated)i -(with)g(the)150 1957 y(`)p Fs(&)p Ft(')d(con)m(trol)h(op)s(erator,)g +(with)g(the)150 1957 y(`)p Ft(&)p Fu(')d(con)m(trol)h(op)s(erator,)g (with)f(a)g(t)m(w)m(o-w)m(a)m(y)i(pip)s(e)d(established)h(b)s(et)m(w)m (een)h(the)f(executing)h(shell)f(and)f(the)150 2066 y(copro)s(cess.)275 2203 y(The)c(format)i(for)f(a)h(copro)s(cess)g(is:)390 -2339 y Fs(coproc)46 b([)p Fi(NAME)11 b Fs(])46 b Fi(command)56 -b Fs([)p Fi(redirections)11 b Fs(])150 2475 y Ft(This)41 -b(creates)i(a)g(copro)s(cess)f(named)f Fq(NAME)5 b Ft(.)43 -b(If)f Fq(NAME)47 b Ft(is)42 b(not)g(supplied,)i(the)e(default)g(name)g -(is)150 2584 y Fq(COPR)m(OC)8 b Ft(.)22 b Fq(NAME)29 -b Ft(m)m(ust)23 b(not)g(b)s(e)g(supplied)e(if)i Fq(command)k -Ft(is)c(a)g(simple)g(command)g(\(see)h(Section)g(3.2.1)150 -2694 y([Simple)39 b(Commands],)h(page)g(8\);)k(otherwise,)e(it)d(is)g -(in)m(terpreted)h(as)f(the)g(\014rst)f(w)m(ord)h(of)g(the)g(simple)150 +2339 y Ft(coproc)46 b([)p Fj(NAME)p Ft(])g Fj(command)g +Ft([)p Fj(redirections)p Ft(])150 2475 y Fu(This)39 b(creates)j(a)e +(copro)s(cess)h(named)f Fr(NAME)p Fu(.)70 b(If)40 b Fr(NAME)46 +b Fu(is)40 b(not)g(supplied,)i(the)e(default)h(name)f(is)150 +2584 y Fr(COPR)m(OC)p Fu(.)d Fr(NAME)28 b Fu(m)m(ust)23 +b(not)g(b)s(e)e(supplied)h(if)g Fr(command)k Fu(is)d(a)g(simple)f +(command)g(\(see)i(Section)f(3.2.1)150 2694 y([Simple)39 +b(Commands],)h(page)g(8\);)k(otherwise,)e(it)d(is)g(in)m(terpreted)h +(as)f(the)g(\014rst)f(w)m(ord)h(of)g(the)g(simple)150 2804 y(command.)275 2940 y(When)j(the)i(copro)s(cess)f(is)g(executed,) 48 b(the)43 b(shell)g(creates)i(an)e(arra)m(y)g(v)-5 b(ariable)44 b(\(see)g(Section)g(6.7)150 3049 y([Arra)m(ys],)32 -b(page)g(89\))h(named)e Fs(NAME)f Ft(in)h(the)h(con)m(text)h(of)e(the)h +b(page)g(89\))h(named)e Ft(NAME)f Fu(in)h(the)h(con)m(text)h(of)e(the)h (executing)g(shell.)44 b(The)31 b(standard)f(output)150 -3159 y(of)g Fq(command)j Ft(is)d(connected)g(via)g(a)g(pip)s(e)f(to)i +3159 y(of)g Fr(command)j Fu(is)d(connected)g(via)g(a)g(pip)s(e)f(to)i (a)f(\014le)g(descriptor)f(in)g(the)h(executing)h(shell,)f(and)g(that)g (\014le)150 3269 y(descriptor)i(is)f(assigned)h(to)g -Fs(NAME)p Ft([0].)45 b(The)31 b(standard)g(input)f(of)i -Fq(command)j Ft(is)d(connected)h(via)f(a)g(pip)s(e)150 +Ft(NAME)p Fu([0].)45 b(The)31 b(standard)g(input)f(of)i +Fr(command)j Fu(is)d(connected)h(via)f(a)g(pip)s(e)150 3378 y(to)39 b(a)g(\014le)f(descriptor)g(in)g(the)g(executing)i(shell,) g(and)e(that)h(\014le)f(descriptor)g(is)g(assigned)h(to)g -Fs(NAME)p Ft([1].)150 3488 y(This)31 b(pip)s(e)g(is)h(established)g(b)s +Ft(NAME)p Fu([1].)150 3488 y(This)31 b(pip)s(e)g(is)h(established)g(b)s (efore)g(an)m(y)g(redirections)g(sp)s(eci\014ed)g(b)m(y)f(the)i (command)e(\(see)i(Section)g(3.6)150 3597 y([Redirections],)25 b(page)e(31\).)39 b(The)21 b(\014le)h(descriptors)g(can)g(b)s(e)f @@ -8470,15 +9023,15 @@ b(page)e(31\).)39 b(The)21 b(\014le)h(descriptors)g(can)g(b)s(e)f b(ailable)35 b(in)150 3817 y(subshells.)275 3953 y(The)27 b(pro)s(cess)h(ID)h(of)f(the)h(shell)f(spa)m(wned)g(to)h(execute)h(the) e(copro)s(cess)h(is)f(a)m(v)-5 b(ailable)31 b(as)d(the)h(v)-5 -b(alue)29 b(of)150 4062 y(the)k(v)-5 b(ariable)33 b Fs(NAME)p -850 4062 28 4 v 39 w Ft(PID.)g(The)f Fs(wait)f Ft(builtin)h(command)g +b(alue)29 b(of)150 4062 y(the)k(v)-5 b(ariable)33 b Ft(NAME)p +850 4062 28 4 v 39 w Fu(PID.)g(The)f Ft(wait)f Fu(builtin)h(command)g (ma)m(y)h(b)s(e)f(used)g(to)h(w)m(ait)h(for)e(the)h(copro)s(cess)150 4172 y(to)e(terminate.)275 4308 y(Since)20 b(the)g(copro)s(cess)h(is)g (created)g(as)g(an)f(async)m(hronous)g(command,)i(the)f -Fs(coproc)d Ft(command)i(alw)m(a)m(ys)150 4418 y(returns)29 +Ft(coproc)d Fu(command)i(alw)m(a)m(ys)150 4418 y(returns)29 b(success.)41 b(The)30 b(return)f(status)i(of)f(a)h(copro)s(cess)g(is)f -(the)h(exit)g(status)g(of)f Fq(command)t Ft(.)150 4619 -y Fj(3.2.6)63 b(GNU)41 b(P)m(arallel)150 4765 y Ft(There)30 +(the)h(exit)g(status)g(of)f Fr(command)p Fu(.)150 4619 +y Fk(3.2.6)63 b(GNU)41 b(P)m(arallel)150 4765 y Fu(There)30 b(are)h(w)m(a)m(ys)g(to)g(run)f(commands)g(in)g(parallel)h(that)h(are)e (not)h(built)g(in)m(to)g(Bash.)41 b(GNU)31 b(P)m(arallel)i(is)150 4875 y(a)e(to)s(ol)g(to)g(do)f(just)g(that.)275 5011 @@ -8492,137 +9045,136 @@ y(GNU)e(P)m(arallel,)i(as)e(its)g(name)f(suggests,)j(can)d(b)s(e)g (common)g(op)s(erations)g(\(input)f(lines,)j(v)-5 b(arious)38 b(p)s(ortions)f(of)h(the)g(input)e(line,)p eop end %%Page: 16 22 -TeXDict begin 16 21 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 16 21 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(16)150 299 y(di\013eren)m(t)35 b(w)m(a)m(ys)h(to)f(sp)s(ecify)f(the)h(input)f (source,)i(and)e(so)h(on\).)54 b(P)m(arallel)36 b(can)f(replace)h -Fs(xargs)d Ft(or)i(feed)150 408 y(commands)30 b(from)g(its)h(input)e +Ft(xargs)d Fu(or)i(feed)150 408 y(commands)30 b(from)g(its)h(input)e (sources)h(to)i(sev)m(eral)f(di\013eren)m(t)g(instances)g(of)g(Bash.) 275 553 y(F)-8 b(or)33 b(a)g(complete)h(description,)g(refer)e(to)i (the)f(GNU)g(P)m(arallel)i(do)s(cumen)m(tation.)48 b(A)33 b(few)f(examples)150 663 y(should)d(pro)m(vide)i(a)g(brief)e(in)m(tro)s (duction)i(to)g(its)g(use.)275 807 y(F)-8 b(or)37 b(example,)i(it)e(is) -f(easy)h(to)g(replace)h Fs(xargs)d Ft(to)i(gzip)g(all)g(h)m(tml)g +f(easy)h(to)g(replace)h Ft(xargs)d Fu(to)i(gzip)g(all)g(h)m(tml)g (\014les)f(in)h(the)f(curren)m(t)g(directory)150 917 -y(and)30 b(its)h(sub)s(directories:)390 1061 y Fs(find)47 +y(and)30 b(its)h(sub)s(directories:)390 1061 y Ft(find)47 b(.)g(-type)f(f)i(-name)e('*.html')g(-print)g(|)h(parallel)f(gzip)150 -1205 y Ft(If)27 b(y)m(ou)g(need)g(to)g(protect)i(sp)s(ecial)e(c)m -(haracters)i(suc)m(h)d(as)i(newlines)e(in)h(\014le)g(names,)h(use)f -(\014nd's)e(`)p Fs(-print0)p Ft(')150 1315 y(option)31 -b(and)f(parallel's)h(`)p Fs(-0)p Ft(')f(option.)275 1460 -y(Y)-8 b(ou)34 b(can)g(use)f(P)m(arallel)j(to)e(mo)m(v)m(e)h(\014les)f -(from)f(the)h(curren)m(t)f(directory)h(when)f(the)h(n)m(um)m(b)s(er)e -(of)i(\014les)150 1569 y(is)c(to)s(o)i(large)f(to)g(pro)s(cess)f(with)g -(one)h Fs(mv)f Ft(in)m(v)m(o)s(cation:)390 1714 y Fs(ls)47 -b(|)h(parallel)d(mv)i({})h(destdir)275 1858 y Ft(As)28 -b(y)m(ou)g(can)h(see,)g(the)g Fs({})e Ft(is)i(replaced)f(with)g(eac)m -(h)i(line)e(read)g(from)g(standard)f(input.)39 b(While)29 -b(using)150 1968 y Fs(ls)g Ft(will)h(w)m(ork)g(in)f(most)h(instances,)h -(it)f(is)g(not)g(su\016cien)m(t)g(to)h(deal)f(with)f(all)i -(\014lenames.)40 b(If)30 b(y)m(ou)g(need)f(to)150 2077 -y(accommo)s(date)j(sp)s(ecial)f(c)m(haracters)h(in)e(\014lenames,)h(y)m -(ou)f(can)h(use)390 2222 y Fs(find)47 b(.)g(-depth)f(1)i(\\!)f(-name)f -('.*')h(-print0)f(|)h(parallel)f(-0)h(mv)g({})g(destdir)150 -2366 y Ft(as)31 b(alluded)f(to)h(ab)s(o)m(v)m(e.)275 -2511 y(This)e(will)i(run)e(as)h(man)m(y)h Fs(mv)e Ft(commands)h(as)h -(there)f(are)h(\014les)f(in)h(the)f(curren)m(t)g(directory)-8 -b(.)42 b(Y)-8 b(ou)31 b(can)150 2620 y(em)m(ulate)h(a)f(parallel)g -Fs(xargs)e Ft(b)m(y)h(adding)g(the)h(`)p Fs(-X)p Ft(')f(option:)390 -2765 y Fs(find)47 b(.)g(-depth)f(1)i(\\!)f(-name)f('.*')h(-print0)f(|)h -(parallel)f(-0)h(-X)g(mv)g({})g(destdir)275 2909 y Ft(GNU)31 -b(P)m(arallel)i(can)e(replace)h(certain)g(common)g(idioms)f(that)g(op)s -(erate)h(on)f(lines)g(read)g(from)f(a)i(\014le)150 3019 -y(\(in)e(this)h(case,)g(\014lenames)g(listed)g(one)f(p)s(er)g(line\):) -390 3163 y Fs(while)46 b(IFS=)h(read)g(-r)g(x;)g(do)390 +1205 y Fu(If)30 b(y)m(ou)h(need)f(to)h(protect)h(sp)s(ecial)f(c)m +(haracters)g(suc)m(h)g(as)f(newlines)h(in)f(\014le)g(names,)h(use)f +(\014nd's)f Ft(-print0)150 1315 y Fu(option)i(and)f(parallel's)h +Ft(-0)f Fu(option.)275 1460 y(Y)-8 b(ou)34 b(can)g(use)f(P)m(arallel)j +(to)e(mo)m(v)m(e)h(\014les)f(from)f(the)h(curren)m(t)f(directory)h +(when)f(the)h(n)m(um)m(b)s(er)e(of)i(\014les)150 1569 +y(is)c(to)s(o)i(large)f(to)g(pro)s(cess)f(with)g(one)h +Ft(mv)f Fu(in)m(v)m(o)s(cation:)390 1714 y Ft(ls)47 b(|)h(parallel)d +(mv)i({})h(destdir)275 1858 y Fu(As)28 b(y)m(ou)h(can)g(see,)g(the)g +Fi({})g Fu(is)g(replaced)g(with)f(eac)m(h)i(line)f(read)f(from)g +(standard)g(input.)39 b(While)29 b(using)150 1968 y Ft(ls)g +Fu(will)h(w)m(ork)g(in)f(most)h(instances,)h(it)f(is)g(not)g +(su\016cien)m(t)g(to)h(deal)f(with)f(all)i(\014lenames.)40 +b(If)30 b(y)m(ou)g(need)f(to)150 2077 y(accommo)s(date)j(sp)s(ecial)f +(c)m(haracters)h(in)e(\014lenames,)h(y)m(ou)f(can)h(use)390 +2222 y Ft(find)47 b(.)g(-depth)f(1)i(\\!)f(-name)f('.*')h(-print0)f(|)h +(parallel)f(-0)h(mv)g({})g(destdir)150 2366 y Fu(as)31 +b(alluded)f(to)h(ab)s(o)m(v)m(e.)275 2511 y(This)e(will)i(run)e(as)h +(man)m(y)h Ft(mv)e Fu(commands)h(as)h(there)f(are)h(\014les)f(in)h(the) +f(curren)m(t)g(directory)-8 b(.)42 b(Y)-8 b(ou)31 b(can)150 +2620 y(em)m(ulate)h(a)f(parallel)g Ft(xargs)e Fu(b)m(y)h(adding)g(the)h +Ft(-X)f Fu(option:)390 2765 y Ft(find)47 b(.)g(-depth)f(1)i(\\!)f +(-name)f('.*')h(-print0)f(|)h(parallel)f(-0)h(-X)g(mv)g({})g(destdir) +275 2909 y Fu(GNU)31 b(P)m(arallel)i(can)e(replace)h(certain)g(common)g +(idioms)f(that)g(op)s(erate)h(on)f(lines)g(read)g(from)f(a)i(\014le)150 +3019 y(\(in)e(this)h(case,)g(\014lenames)g(listed)g(one)f(p)s(er)g +(line\):)390 3163 y Ft(while)46 b(IFS=)h(read)g(-r)g(x;)g(do)390 3273 y(do-something1)d("$x")j("config-$x")390 3382 y(do-something2)d(<) k("$x")390 3492 y(done)f(<)g(file)g(|)g(process-output)150 -3636 y Ft(with)30 b(a)h(more)f(compact)i(syn)m(tax)f(reminiscen)m(t)g -(of)g(lam)m(b)s(das:)390 3781 y Fs(cat)47 b(list)g(|)g(parallel)f +3636 y Fu(with)30 b(a)h(more)f(compact)i(syn)m(tax)f(reminiscen)m(t)g +(of)g(lam)m(b)s(das:)390 3781 y Ft(cat)47 b(list)g(|)g(parallel)f ("do-something1)d({})48 b(config-{})d(;)i(do-something2)e(<)i({}")g(|)g -(process-output)275 3925 y Ft(P)m(arallel)31 b(pro)m(vides)e(a)h +(process-output)275 3925 y Fu(P)m(arallel)31 b(pro)m(vides)e(a)h (built-in)g(mec)m(hanism)g(to)g(remo)m(v)m(e)h(\014lename)e (extensions,)i(whic)m(h)e(lends)g(itself)150 4035 y(to)i(batc)m(h)g (\014le)g(transformations)f(or)g(renaming:)390 4179 y -Fs(ls)47 b(*.gz)g(|)g(parallel)f(-j+0)g("zcat)h({})g(|)g(bzip2)g -(>{.}.bz2)e(&&)j(rm)f({}")150 4324 y Ft(This)28 b(will)i(recompress)e +Ft(ls)47 b(*.gz)g(|)g(parallel)f(-j+0)g("zcat)h({})g(|)g(bzip2)g +(>{.}.bz2)e(&&)j(rm)f({}")150 4324 y Fu(This)28 b(will)i(recompress)e (all)i(\014les)f(in)g(the)g(curren)m(t)g(directory)g(with)g(names)g (ending)f(in)h(.gz)h(using)f(bzip2,)150 4433 y(running)37 -b(one)i(job)f(p)s(er)f(CPU)h(\(-j)p Fs(+)p Ft(0\))i(in)e(parallel.)66 -b(\(W)-8 b(e)40 b(use)e Fs(ls)g Ft(for)h(brevit)m(y)g(here;)j(using)c -Fs(find)g Ft(as)150 4543 y(ab)s(o)m(v)m(e)e(is)g(more)f(robust)f(in)h +b(one)i(job)f(p)s(er)f(CPU)h(\(-j)p Ft(+)p Fu(0\))i(in)e(parallel.)66 +b(\(W)-8 b(e)40 b(use)e Ft(ls)g Fu(for)h(brevit)m(y)g(here;)j(using)c +Ft(find)g Fu(as)150 4543 y(ab)s(o)m(v)m(e)e(is)g(more)f(robust)f(in)h (the)h(face)g(of)f(\014lenames)h(con)m(taining)g(unexp)s(ected)f(c)m (haracters.\))57 b(P)m(arallel)150 4653 y(can)31 b(tak)m(e)h(argumen)m (ts)e(from)g(the)h(command)f(line;)h(the)f(ab)s(o)m(v)m(e)i(can)f(also) -g(b)s(e)f(written)g(as)390 4797 y Fs(parallel)46 b("zcat)g({})h(|)h +g(b)s(e)f(written)g(as)390 4797 y Ft(parallel)46 b("zcat)g({})h(|)h (bzip2)e(>{.}.bz2)f(&&)j(rm)f({}")g(:::)g(*.gz)275 4941 -y Ft(If)24 b(a)i(command)f(generates)h(output,)g(y)m(ou)g(ma)m(y)f(w)m +y Fu(If)24 b(a)i(command)f(generates)h(output,)g(y)m(ou)g(ma)m(y)f(w)m (an)m(t)h(to)g(preserv)m(e)g(the)f(input)f(order)h(in)g(the)g(output.) 150 5051 y(F)-8 b(or)31 b(instance,)g(the)g(follo)m(wing)h(command)390 -5196 y Fs({)47 b(echo)g(foss.org.my)e(;)i(echo)g(debian.org;)e(echo)h +5196 y Ft({)47 b(echo)g(foss.org.my)e(;)i(echo)g(debian.org;)e(echo)h (freenetproject.org;)d(})k(|)h(parallel)d(traceroute)150 -5340 y Ft(will)31 b(displa)m(y)f(as)h(output)f(the)g(traceroute)i(in)m +5340 y Fu(will)31 b(displa)m(y)f(as)h(output)f(the)g(traceroute)i(in)m (v)m(o)s(cation)h(that)e(\014nishes)e(\014rst.)40 b(Adding)30 -b(the)g(`)p Fs(-k)p Ft(')g(option)p eop end +b(the)g Ft(-k)g Fu(option)p eop end %%Page: 17 23 -TeXDict begin 17 22 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 17 22 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(17)390 299 -y Fs({)47 b(echo)g(foss.org.my)e(;)i(echo)g(debian.org;)e(echo)h +y Ft({)47 b(echo)g(foss.org.my)e(;)i(echo)g(debian.org;)e(echo)h (freenetproject.org;)d(})k(|)h(parallel)d(-k)i(traceroute)150 -430 y Ft(will)31 b(ensure)e(that)i(the)g(output)f(of)g -Fs(traceroute)e(foss.org.my)f Ft(is)k(displa)m(y)m(ed)g(\014rst.)275 +430 y Fu(will)31 b(ensure)e(that)i(the)g(output)f(of)g +Ft(traceroute)e(foss.org.my)f Fu(is)k(displa)m(y)m(ed)g(\014rst.)275 560 y(Finally)-8 b(,)31 b(P)m(arallel)h(can)e(b)s(e)f(used)g(to)i(run)d (a)i(sequence)h(of)f(shell)g(commands)f(in)h(parallel,)h(similar)f(to) -150 670 y(`)p Fs(cat)g(file)f(|)h(bash)p Ft('.)53 b(It)35 +150 670 y(`)p Ft(cat)g(file)f(|)h(bash)p Fu('.)53 b(It)35 b(is)g(not)g(uncommon)f(to)i(tak)m(e)g(a)f(list)h(of)f(\014lenames,)h (create)g(a)g(series)f(of)g(shell)150 779 y(commands)27 b(to)h(op)s(erate)h(on)e(them,)h(and)f(feed)h(that)g(list)g(of)g (commnds)e(to)j(a)f(shell.)40 b(P)m(arallel)29 b(can)f(sp)s(eed)150 -889 y(this)i(up.)40 b(Assuming)30 b(that)h(`)p Fs(file)p -Ft(')e(con)m(tains)j(a)f(list)g(of)f(shell)h(commands,)f(one)h(p)s(er)e -(line,)390 1020 y Fs(parallel)46 b(-j)h(10)g(<)g(file)150 -1150 y Ft(will)37 b(ev)-5 b(aluate)38 b(the)f(commands)f(using)g(the)h +889 y(this)i(up.)40 b(Assuming)30 b(that)h Ft(file)e +Fu(con)m(tains)i(a)g(list)g(of)g(shell)f(commands,)h(one)f(p)s(er)g +(line,)390 1020 y Ft(parallel)46 b(-j)h(10)g(<)g(file)150 +1150 y Fu(will)37 b(ev)-5 b(aluate)38 b(the)f(commands)f(using)g(the)h (shell)g(\(since)g(no)f(explicit)i(command)e(is)h(supplied)e(as)i(an) 150 1260 y(argumen)m(t\),)31 b(in)f(blo)s(c)m(ks)h(of)g(ten)f(shell)h -(jobs)f(at)h(a)g(time.)150 1484 y Fr(3.3)68 b(Shell)45 -b(F)-11 b(unctions)150 1644 y Ft(Shell)35 b(functions)h(are)g(a)g(w)m +(jobs)f(at)h(a)g(time.)150 1484 y Fs(3.3)68 b(Shell)45 +b(F)-11 b(unctions)150 1644 y Fu(Shell)35 b(functions)h(are)g(a)g(w)m (a)m(y)g(to)h(group)e(commands)g(for)h(later)g(execution)h(using)e(a)h (single)g(name)g(for)150 1753 y(the)f(group.)55 b(They)35 -b(are)g(executed)h(just)f(lik)m(e)h(a)g Fs(")p Ft(regular)p -Fs(")f Ft(command.)54 b(When)35 b(the)h(name)f(of)g(a)h(shell)150 +b(are)g(executed)h(just)f(lik)m(e)h(a)g Ft(")p Fu(regular)p +Ft(")f Fu(command.)54 b(When)35 b(the)h(name)f(of)g(a)h(shell)150 1863 y(function)j(is)g(used)f(as)h(a)h(simple)f(command)g(name,)i(the)e (list)h(of)f(commands)g(asso)s(ciated)i(with)d(that)150 1973 y(function)25 b(name)h(is)g(executed.)40 b(Shell)25 b(functions)g(are)i(executed)f(in)f(the)h(curren)m(t)g(shell)g(con)m (text;)j(no)c(new)150 2082 y(pro)s(cess)30 b(is)g(created)i(to)f(in)m (terpret)g(them.)275 2213 y(F)-8 b(unctions)30 b(are)h(declared)g -(using)f(this)g(syn)m(tax:)390 2343 y Fi(name)57 b Fs(\(\))47 -b Fi(compound-command)54 b Fs([)48 b Fi(redirections)55 -b Fs(])275 2474 y Ft(or)390 2605 y Fs(function)46 b Fi(name)57 -b Fs([\(\)])46 b Fi(compound-command)54 b Fs([)48 b Fi(redirections)55 -b Fs(])275 2735 y Ft(This)31 b(de\014nes)h(a)g(shell)h(function)f -(named)g Fq(name)5 b Ft(.)47 b(The)32 b(reserv)m(ed)h(w)m(ord)f -Fs(function)e Ft(is)i(optional.)48 b(If)150 2845 y(the)39 -b Fs(function)f Ft(reserv)m(ed)h(w)m(ord)g(is)g(supplied,)i(the)e -(paren)m(theses)h(are)f(optional.)69 b(The)39 b Fq(b)s(o)s(dy)45 -b Ft(of)40 b(the)150 2954 y(function)h(is)h(the)g(comp)s(ound)e -(command)h Fq(comp)s(ound-command)j Ft(\(see)e(Section)h(3.2.4)g([Comp) -s(ound)150 3064 y(Commands],)33 b(page)g(9\).)48 b(That)33 -b(command)g(is)f(usually)h(a)g Fq(list)i Ft(enclosed)e(b)s(et)m(w)m -(een)h Fs({)e Ft(and)g Fs(})p Ft(,)h(but)f(ma)m(y)150 -3174 y(b)s(e)27 b(an)m(y)h(comp)s(ound)e(command)h(listed)h(ab)s(o)m(v) -m(e.)41 b Fq(comp)s(ound-command)30 b Ft(is)e(executed)g(whenev)m(er)g -Fq(name)150 3283 y Ft(is)j(sp)s(eci\014ed)f(as)g(the)h(name)g(of)g(a)g -(command.)41 b(When)31 b(the)f(shell)h(is)g(in)f Fl(posix)g -Ft(mo)s(de)g(\(see)i(Section)f(6.11)150 3393 y([Bash)36 -b(POSIX)f(Mo)s(de],)j(page)e(94\),)j Fq(name)i Ft(ma)m(y)36 +(using)f(this)g(syn)m(tax:)390 2343 y Fj(name)47 b Ft(\(\))g +Fj(compound-command)c Ft([)48 b Fj(redirections)c Ft(])275 +2474 y Fu(or)390 2605 y Ft(function)i Fj(name)g Ft([\(\)])h +Fj(compound-command)c Ft([)48 b Fj(redirections)c Ft(])275 +2735 y Fu(This)31 b(de\014nes)h(a)h(shell)g(function)g(named)f +Fr(name)p Fu(.)48 b(The)32 b(reserv)m(ed)h(w)m(ord)f +Ft(function)f Fu(is)h(optional.)49 b(If)150 2845 y(the)39 +b Ft(function)f Fu(reserv)m(ed)h(w)m(ord)g(is)g(supplied,)i(the)e +(paren)m(theses)h(are)f(optional.)69 b(The)39 b Fr(b)s(o)s(dy)45 +b Fu(of)40 b(the)150 2954 y(function)h(is)h(the)g(comp)s(ound)e +(command)h Fr(comp)s(ound-command)j Fu(\(see)e(Section)h(3.2.4)g([Comp) +s(ound)150 3064 y(Commands],)33 b(page)h(9\).)49 b(That)33 +b(command)f(is)h(usually)g(a)g Fr(list)j Fu(enclosed)e(b)s(et)m(w)m +(een)f Fi({)h Fu(and)e Fi(})p Fu(,)i(but)e(ma)m(y)150 +3174 y(b)s(e)26 b(an)m(y)i(comp)s(ound)d(command)i(listed)h(ab)s(o)m(v) +m(e.)41 b Fr(comp)s(ound-command)29 b Fu(is)e(executed)h(whenev)m(er)f +Fr(name)150 3283 y Fu(is)k(sp)s(eci\014ed)f(as)g(the)h(name)g(of)g(a)g +(command.)41 b(When)31 b(the)f(shell)h(is)g(in)f Fm(posix)g +Fu(mo)s(de)g(\(see)i(Section)f(6.11)150 3393 y([Bash)36 +b(POSIX)f(Mo)s(de],)j(page)e(94\),)j Fr(name)i Fu(ma)m(y)36 b(not)h(b)s(e)e(the)h(same)g(as)g(one)g(of)g(the)g(sp)s(ecial)h (builtins)150 3502 y(\(see)24 b(Section)g(4.4)g([Sp)s(ecial)g (Builtins],)h(page)f(68\).)40 b(An)m(y)23 b(redirections)h(\(see)g (Section)g(3.6)g([Redirections],)150 3612 y(page)31 b(31\))h(asso)s (ciated)g(with)e(the)g(shell)h(function)f(are)h(p)s(erformed)d(when)i -(the)g(function)g(is)h(executed.)275 3743 y(A)41 b(function)f -(de\014nition)h(ma)m(y)g(b)s(e)g(deleted)g(using)g(the)g(`)p -Fs(-f)p Ft(')g(option)g(to)h(the)f Fs(unset)e Ft(builtin)i(\(see)150 +(the)g(function)g(is)h(executed.)275 3743 y(A)44 b(function)g +(de\014nition)h(ma)m(y)g(b)s(e)f(deleted)h(using)f(the)h +Ft(-f)f Fu(option)h(to)g(the)g Ft(unset)e Fu(builtin)h(\(see)150 3852 y(Section)31 b(4.1)h([Bourne)e(Shell)g(Builtins],)h(page)h(41\).) 275 3983 y(The)26 b(exit)i(status)g(of)f(a)h(function)f(de\014nition)g (is)g(zero)h(unless)f(a)g(syn)m(tax)h(error)f(o)s(ccurs)g(or)g(a)h @@ -8633,176 +9185,175 @@ Fs(-f)p Ft(')g(option)g(to)h(the)f Fs(unset)e Ft(builtin)i(\(see)150 4333 y(Note)22 b(that)f(for)f(historical)i(reasons,)h(in)e(the)g(most)g (common)g(usage)g(the)g(curly)f(braces)h(that)g(surround)150 4442 y(the)38 b(b)s(o)s(dy)d(of)j(the)f(function)g(m)m(ust)g(b)s(e)g -(separated)h(from)f(the)g(b)s(o)s(dy)f(b)m(y)h Fs(blank)p -Ft(s)f(or)h(newlines.)62 b(This)150 4552 y(is)38 b(b)s(ecause)g(the)h +(separated)h(from)f(the)g(b)s(o)s(dy)f(b)m(y)h Ft(blank)p +Fu(s)f(or)h(newlines.)62 b(This)150 4552 y(is)38 b(b)s(ecause)g(the)h (braces)f(are)h(reserv)m(ed)f(w)m(ords)g(and)f(are)i(only)f(recognized) i(as)e(suc)m(h)g(when)f(they)i(are)150 4661 y(separated)26 b(from)f(the)h(command)f(list)i(b)m(y)e(whitespace)h(or)g(another)g (shell)g(metac)m(haracter.)41 b(Also,)28 b(when)150 4771 -y(using)i(the)g(braces,)h(the)g Fq(list)i Ft(m)m(ust)d(b)s(e)g -(terminated)h(b)m(y)f(a)h(semicolon,)h(a)e(`)p Fs(&)p -Ft(',)h(or)g(a)f(newline.)275 4902 y(When)i(a)i(function)f(is)g +y(using)i(the)g(braces,)h(the)g Fr(list)i Fu(m)m(ust)d(b)s(e)g +(terminated)h(b)m(y)f(a)h(semicolon,)h(a)e(`)p Ft(&)p +Fu(',)h(or)g(a)f(newline.)275 4902 y(When)i(a)i(function)f(is)g (executed,)i(the)e(argumen)m(ts)h(to)g(the)f(function)g(b)s(ecome)g (the)h(p)s(ositional)g(pa-)150 5011 y(rameters)42 b(during)e(its)i (execution)h(\(see)f(Section)g(3.4.1)h([P)m(ositional)h(P)m (arameters],)i(page)c(19\).)75 b(The)150 5121 y(sp)s(ecial)37 -b(parameter)f(`)p Fs(#)p Ft(')g(that)h(expands)e(to)i(the)f(n)m(um)m(b) +b(parameter)f(`)p Ft(#)p Fu(')g(that)h(expands)e(to)i(the)f(n)m(um)m(b) s(er)f(of)h(p)s(ositional)h(parameters)f(is)g(up)s(dated)f(to)150 5230 y(re\015ect)h(the)f(c)m(hange.)56 b(Sp)s(ecial)35 -b(parameter)h Fs(0)f Ft(is)g(unc)m(hanged.)54 b(The)35 -b(\014rst)f(elemen)m(t)j(of)e(the)g Fs(FUNCNAME)150 5340 -y Ft(v)-5 b(ariable)31 b(is)g(set)f(to)i(the)e(name)h(of)f(the)h +b(parameter)h Ft(0)f Fu(is)g(unc)m(hanged.)54 b(The)35 +b(\014rst)f(elemen)m(t)j(of)e(the)g Ft(FUNCNAME)150 5340 +y Fu(v)-5 b(ariable)31 b(is)g(set)f(to)i(the)e(name)h(of)f(the)h (function)f(while)g(the)h(function)f(is)g(executing.)p eop end %%Page: 18 24 -TeXDict begin 18 23 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 18 23 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(18)275 299 y(All)25 b(other)g(asp)s(ects)g(of)g(the)g(shell)g(execution)h(en)m (vironmen)m(t)g(are)f(iden)m(tical)h(b)s(et)m(w)m(een)g(a)f(function)g (and)150 408 y(its)35 b(caller)i(with)d(these)i(exceptions:)50 -b(the)36 b Fs(DEBUG)d Ft(and)h Fs(RETURN)g Ft(traps)g(are)i(not)f +b(the)36 b Ft(DEBUG)d Fu(and)h Ft(RETURN)g Fu(traps)g(are)i(not)f (inherited)f(unless)h(the)150 518 y(function)26 b(has)g(b)s(een)f(giv)m -(en)i(the)g Fs(trace)d Ft(attribute)j(using)f(the)g Fs(declare)e -Ft(builtin)i(or)g(the)h Fs(-o)i(functrace)150 628 y Ft(option)f(has)e -(b)s(een)h(enabled)g(with)g(the)g Fs(set)f Ft(builtin,)i(\(in)f(whic)m -(h)f(case)j(all)f(functions)e(inherit)h(the)g Fs(DEBUG)150 -737 y Ft(and)33 b Fs(RETURN)f Ft(traps\),)j(and)e(the)h -Fs(ERR)f Ft(trap)h(is)g(not)g(inherited)f(unless)g(the)h -Fs(-o)c(errtrace)h Ft(shell)j(option)150 847 y(has)h(b)s(een)f +(en)i(the)g Ft(trace)d Fu(attribute)j(using)f(the)g Ft(declare)e +Fu(builtin)i(or)g(the)h Ft(-o)i(functrace)150 628 y Fu(option)f(has)e +(b)s(een)h(enabled)g(with)g(the)g Ft(set)f Fu(builtin,)i(\(in)f(whic)m +(h)f(case)j(all)f(functions)e(inherit)h(the)g Ft(DEBUG)150 +737 y Fu(and)33 b Ft(RETURN)f Fu(traps\),)j(and)e(the)h +Ft(ERR)f Fu(trap)h(is)g(not)g(inherited)f(unless)g(the)h +Ft(-o)c(errtrace)h Fu(shell)j(option)150 847 y(has)h(b)s(een)f (enabled.)55 b(See)35 b(Section)h(4.1)g([Bourne)f(Shell)g(Builtins],)i (page)f(41,)i(for)c(the)i(description)f(of)150 956 y(the)c -Fs(trap)e Ft(builtin.)275 1095 y(The)38 b Fs(FUNCNEST)f -Ft(v)-5 b(ariable,)42 b(if)d(set)h(to)g(a)g(n)m(umeric)f(v)-5 +Ft(trap)e Fu(builtin.)275 1095 y(The)38 b Ft(FUNCNEST)f +Fu(v)-5 b(ariable,)42 b(if)d(set)h(to)g(a)g(n)m(umeric)f(v)-5 b(alue)39 b(greater)h(than)f(0,)j(de\014nes)d(a)g(maxim)m(um)150 1204 y(function)24 b(nesting)h(lev)m(el.)40 b(F)-8 b(unction)25 b(in)m(v)m(o)s(cations)i(that)e(exceed)g(the)g(limit)g(cause)g(the)g (en)m(tire)g(command)150 1314 y(to)31 b(ab)s(ort.)275 -1452 y(If)37 b(the)g(builtin)g(command)h Fs(return)d -Ft(is)j(executed)g(in)g(a)g(function,)h(the)e(function)h(completes)h +1452 y(If)37 b(the)g(builtin)g(command)h Ft(return)d +Fu(is)j(executed)g(in)g(a)g(function,)h(the)e(function)h(completes)h (and)150 1562 y(execution)25 b(resumes)e(with)h(the)g(next)g(command)f (after)i(the)f(function)f(call.)40 b(An)m(y)24 b(command)f(asso)s -(ciated)150 1672 y(with)36 b(the)h Fs(RETURN)d Ft(trap)i(is)h(executed) +(ciated)150 1672 y(with)36 b(the)h Ft(RETURN)d Fu(trap)i(is)h(executed) g(b)s(efore)f(execution)i(resumes.)57 b(When)37 b(a)f(function)g (completes,)150 1781 y(the)h(v)-5 b(alues)38 b(of)f(the)g(p)s (ositional)h(parameters)f(and)g(the)g(sp)s(ecial)h(parameter)f(`)p -Fs(#)p Ft(')g(are)h(restored)f(to)h(the)150 1891 y(v)-5 +Ft(#)p Fu(')g(are)h(restored)f(to)h(the)150 1891 y(v)-5 b(alues)26 b(they)f(had)g(prior)f(to)i(the)g(function's)f(execution.)40 b(If)25 b(a)h(n)m(umeric)f(argumen)m(t)h(is)f(giv)m(en)h(to)g -Fs(return)p Ft(,)150 2000 y(that)j(is)g(the)f(function's)h(return)e +Ft(return)p Fu(,)150 2000 y(that)j(is)g(the)f(function's)h(return)e (status;)j(otherwise)f(the)f(function's)h(return)e(status)i(is)f(the)h (exit)h(status)150 2110 y(of)h(the)f(last)h(command)f(executed)i(b)s -(efore)e(the)g Fs(return)p Ft(.)275 2248 y(V)-8 b(ariables)31 +(efore)e(the)g Ft(return)p Fu(.)275 2248 y(V)-8 b(ariables)31 b(lo)s(cal)g(to)f(the)g(function)f(ma)m(y)i(b)s(e)e(declared)h(with)f -(the)h Fs(local)f Ft(builtin.)40 b(These)29 b(v)-5 b(ariables)150 +(the)h Ft(local)f Fu(builtin.)40 b(These)29 b(v)-5 b(ariables)150 2358 y(are)31 b(visible)g(only)f(to)h(the)g(function)f(and)g(the)g -(commands)g(it)h(in)m(v)m(ok)m(es.)275 2497 y(F)-8 b(unction)47 -b(names)g(and)f(de\014nitions)g(ma)m(y)h(b)s(e)f(listed)i(with)e(the)h -(`)p Fs(-f)p Ft(')f(option)i(to)f(the)g Fs(declare)150 -2606 y Ft(\()p Fs(typeset)p Ft(\))39 b(builtin)i(command)f(\(see)i -(Section)f(4.2)h([Bash)f(Builtins],)j(page)d(48\).)73 -b(The)40 b(`)p Fs(-F)p Ft(')g(option)150 2716 y(to)29 -b Fs(declare)d Ft(or)i Fs(typeset)f Ft(will)h(list)h(the)f(function)g -(names)h(only)f(\(and)g(optionally)h(the)g(source)f(\014le)h(and)150 -2825 y(line)k(n)m(um)m(b)s(er,)g(if)f(the)h Fs(extdebug)e -Ft(shell)i(option)g(is)g(enabled\).)49 b(F)-8 b(unctions)33 -b(ma)m(y)h(b)s(e)e(exp)s(orted)g(so)h(that)150 2935 y(subshells)f -(automatically)37 b(ha)m(v)m(e)d(them)g(de\014ned)e(with)h(the)g(`)p -Fs(-f)p Ft(')h(option)g(to)g(the)f Fs(export)f Ft(builtin)h(\(see)150 -3044 y(Section)g(4.1)g([Bourne)f(Shell)g(Builtins],)i(page)f(41\).)47 -b(Note)33 b(that)g(shell)f(functions)g(and)f(v)-5 b(ariables)33 -b(with)150 3154 y(the)d(same)g(name)g(ma)m(y)g(result)g(in)g(m)m -(ultiple)g(iden)m(tically-named)i(en)m(tries)f(in)e(the)h(en)m -(vironmen)m(t)g(passed)150 3264 y(to)h(the)g(shell's)f(c)m(hildren.)41 -b(Care)30 b(should)g(b)s(e)f(tak)m(en)j(in)e(cases)h(where)f(this)g(ma) -m(y)h(cause)g(a)g(problem.)275 3402 y(F)-8 b(unctions)33 -b(ma)m(y)g(b)s(e)g(recursiv)m(e.)48 b(The)32 b Fs(FUNCNEST)f -Ft(v)-5 b(ariable)34 b(ma)m(y)f(b)s(e)f(used)g(to)i(limit)g(the)f -(depth)f(of)150 3512 y(the)27 b(function)f(call)i(stac)m(k)h(and)d -(restrict)h(the)g(n)m(um)m(b)s(er)f(of)h(function)f(in)m(v)m(o)s -(cations.)42 b(By)27 b(default,)g(no)g(limit)150 3621 -y(is)j(placed)h(on)g(the)f(n)m(um)m(b)s(er)f(of)i(recursiv)m(e)f -(calls.)150 3860 y Fr(3.4)68 b(Shell)45 b(P)l(arameters)150 -4019 y Ft(A)23 b Fq(parameter)31 b Ft(is)23 b(an)g(en)m(tit)m(y)i(that) +(commands)g(it)h(in)m(v)m(ok)m(es.)275 2497 y(F)-8 b(unction)51 +b(names)f(and)g(de\014nitions)g(ma)m(y)i(b)s(e)e(listed)h(with)f(the)h +Ft(-f)f Fu(option)h(to)g(the)g Ft(declare)150 2606 y +Fu(\()p Ft(typeset)p Fu(\))35 b(builtin)g(command)h(\(see)h(Section)g +(4.2)g([Bash)f(Builtins],)i(page)f(48\).)59 b(The)35 +b Ft(-F)h Fu(option)g(to)150 2716 y Ft(declare)e Fu(or)i +Ft(typeset)e Fu(will)i(list)h(the)f(function)g(names)g(only)g(\(and)g +(optionally)h(the)f(source)g(\014le)h(and)150 2825 y(line)c(n)m(um)m(b) +s(er,)g(if)f(the)h Ft(extdebug)e Fu(shell)i(option)g(is)g(enabled\).)49 +b(F)-8 b(unctions)33 b(ma)m(y)h(b)s(e)e(exp)s(orted)g(so)h(that)150 +2935 y(subshells)j(automatically)k(ha)m(v)m(e)f(them)e(de\014ned)f +(with)h(the)h Ft(-f)e Fu(option)i(to)g(the)g Ft(export)d +Fu(builtin)i(\(see)150 3044 y(Section)c(4.1)g([Bourne)f(Shell)g +(Builtins],)i(page)f(41\).)47 b(Note)33 b(that)g(shell)f(functions)g +(and)f(v)-5 b(ariables)33 b(with)150 3154 y(the)d(same)g(name)g(ma)m(y) +g(result)g(in)g(m)m(ultiple)g(iden)m(tically-named)i(en)m(tries)f(in)e +(the)h(en)m(vironmen)m(t)g(passed)150 3264 y(to)h(the)g(shell's)f(c)m +(hildren.)41 b(Care)30 b(should)g(b)s(e)f(tak)m(en)j(in)e(cases)h +(where)f(this)g(ma)m(y)h(cause)g(a)g(problem.)275 3402 +y(F)-8 b(unctions)33 b(ma)m(y)g(b)s(e)g(recursiv)m(e.)48 +b(The)32 b Ft(FUNCNEST)f Fu(v)-5 b(ariable)34 b(ma)m(y)f(b)s(e)f(used)g +(to)i(limit)g(the)f(depth)f(of)150 3512 y(the)27 b(function)f(call)i +(stac)m(k)h(and)d(restrict)h(the)g(n)m(um)m(b)s(er)f(of)h(function)f +(in)m(v)m(o)s(cations.)42 b(By)27 b(default,)g(no)g(limit)150 +3621 y(is)j(placed)h(on)g(the)f(n)m(um)m(b)s(er)f(of)i(recursiv)m(e)f +(calls.)150 3860 y Fs(3.4)68 b(Shell)45 b(P)l(arameters)150 +4019 y Fu(A)23 b Fr(parameter)31 b Fu(is)23 b(an)g(en)m(tit)m(y)i(that) f(stores)g(v)-5 b(alues.)39 b(It)23 b(can)h(b)s(e)f(a)g -Fs(name)p Ft(,)h(a)g(n)m(um)m(b)s(er,)f(or)h(one)f(of)h(the)f(sp)s -(ecial)150 4129 y(c)m(haracters)i(listed)f(b)s(elo)m(w.)39 -b(A)24 b Fq(v)-5 b(ariable)29 b Ft(is)24 b(a)g(parameter)g(denoted)f(b) -m(y)h(a)g Fs(name)p Ft(.)37 b(A)24 b(v)-5 b(ariable)24 -b(has)f(a)h Fq(v)-5 b(alue)150 4238 y Ft(and)33 b(zero)i(or)e(more)h -Fq(attributes)t Ft(.)51 b(A)m(ttributes)34 b(are)g(assigned)g(using)f -(the)h Fs(declare)e Ft(builtin)h(command)150 4348 y(\(see)e(the)g -(description)f(of)h(the)f Fs(declare)f Ft(builtin)h(in)g(Section)h(4.2) +Ft(name)p Fu(,)h(a)g(n)m(um)m(b)s(er,)f(or)h(one)f(of)h(the)f(sp)s +(ecial)150 4129 y(c)m(haracters)i(listed)e(b)s(elo)m(w.)39 +b(A)23 b Fr(v)-5 b(ariable)30 b Fu(is)23 b(a)g(parameter)h(denoted)f(b) +m(y)h(a)f Ft(name)p Fu(.)37 b(A)24 b(v)-5 b(ariable)24 +b(has)f(a)g Fr(v)-5 b(alue)150 4238 y Fu(and)33 b(zero)i(or)f(more)g +Fr(attributes)p Fu(.)52 b(A)m(ttributes)35 b(are)f(assigned)g(using)g +(the)g Ft(declare)e Fu(builtin)h(command)150 4348 y(\(see)e(the)g +(description)f(of)h(the)f Ft(declare)f Fu(builtin)h(in)g(Section)h(4.2) g([Bash)g(Builtins],)g(page)g(48\).)275 4486 y(A)d(parameter)h(is)g (set)g(if)f(it)h(has)f(b)s(een)g(assigned)h(a)g(v)-5 b(alue.)40 b(The)28 b(n)m(ull)h(string)f(is)h(a)g(v)-5 b(alid)28 b(v)-5 b(alue.)41 b(Once)150 4596 y(a)31 b(v)-5 b(ariable)31 b(is)f(set,)i(it)e(ma)m(y)h(b)s(e)f(unset)g(only)h(b)m(y)f -(using)g(the)g Fs(unset)f Ft(builtin)h(command.)275 4734 +(using)g(the)g Ft(unset)f Fu(builtin)h(command.)275 4734 y(A)g(v)-5 b(ariable)31 b(ma)m(y)g(b)s(e)f(assigned)g(to)i(b)m(y)e(a)h -(statemen)m(t)h(of)e(the)h(form)390 4873 y Fi(name)11 -b Fs(=[)p Fi(value)g Fs(])150 5011 y Ft(If)34 b Fq(v)-5 -b(alue)40 b Ft(is)35 b(not)g(giv)m(en,)h(the)f(v)-5 b(ariable)35 +(statemen)m(t)h(of)e(the)h(form)390 4873 y Fj(name)p +Ft(=[)p Fj(value)p Ft(])150 5011 y Fu(If)j Fr(v)-5 b(alue)40 +b Fu(is)35 b(not)g(giv)m(en,)h(the)f(v)-5 b(ariable)35 b(is)g(assigned)g(the)f(n)m(ull)h(string.)53 b(All)35 -b Fq(v)-5 b(alue)5 b Ft(s)35 b(undergo)f(tilde)h(ex-)150 +b Fr(v)-5 b(alue)5 b Fu(s)35 b(undergo)f(tilde)h(ex-)150 5121 y(pansion,)h(parameter)f(and)f(v)-5 b(ariable)36 b(expansion,)f(command)g(substitution,)h(arithmetic)g(expansion,)150 5230 y(and)k(quote)h(remo)m(v)-5 b(al)42 b(\(detailed)h(b)s(elo)m(w\).) -72 b(If)40 b(the)h(v)-5 b(ariable)41 b(has)g(its)g Fs(integer)e -Ft(attribute)i(set,)j(then)150 5340 y Fq(v)-5 b(alue)38 -b Ft(is)33 b(ev)-5 b(aluated)34 b(as)f(an)g(arithmetic)h(expression)f -(ev)m(en)h(if)e(the)h Fs($\(\(...)o(\)\))f Ft(expansion)h(is)g(not)g +72 b(If)40 b(the)h(v)-5 b(ariable)41 b(has)g(its)g Ft(integer)e +Fu(attribute)i(set,)j(then)150 5340 y Fr(v)-5 b(alue)38 +b Fu(is)33 b(ev)-5 b(aluated)34 b(as)f(an)g(arithmetic)h(expression)f +(ev)m(en)h(if)e(the)h Ft($\(\(...)o(\)\))f Fu(expansion)h(is)g(not)g (used)p eop end %%Page: 19 25 -TeXDict begin 19 24 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 19 24 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(19)150 299 y(\(see)31 b(Section)g(3.5.5)i([Arithmetic)e(Expansion],)f(page)h (28\).)42 b(W)-8 b(ord)31 b(splitting)g(is)g(not)f(p)s(erformed,)f -(with)150 408 y(the)35 b(exception)h(of)f Fs("$@")f Ft(as)h(explained)g +(with)150 408 y(the)35 b(exception)h(of)f Ft("$@")f Fu(as)h(explained)g (b)s(elo)m(w.)54 b(Filename)36 b(expansion)f(is)g(not)g(p)s(erformed.) 53 b(Assign-)150 518 y(men)m(t)33 b(statemen)m(ts)h(ma)m(y)f(also)g -(app)s(ear)f(as)g(argumen)m(ts)h(to)g(the)g Fs(alias)p -Ft(,)e Fs(declare)p Ft(,)g Fs(typeset)p Ft(,)g Fs(export)p -Ft(,)150 628 y Fs(readonly)p Ft(,)41 b(and)f Fs(local)f -Ft(builtin)h(commands.)71 b(When)40 b(in)h Fl(posix)e -Ft(mo)s(de)i(\(see)g(Section)g(6.11)i([Bash)150 737 y(POSIX)36 +(app)s(ear)f(as)g(argumen)m(ts)h(to)g(the)g Ft(alias)p +Fu(,)e Ft(declare)p Fu(,)g Ft(typeset)p Fu(,)g Ft(export)p +Fu(,)150 628 y Ft(readonly)p Fu(,)41 b(and)f Ft(local)f +Fu(builtin)h(commands.)71 b(When)40 b(in)h Fm(posix)e +Fu(mo)s(de)i(\(see)g(Section)g(6.11)i([Bash)150 737 y(POSIX)36 b(Mo)s(de],)k(page)e(94\),)i(these)e(builtins)f(ma)m(y)h(app)s(ear)e (in)h(a)h(command)f(after)h(one)f(or)h(more)f(in-)150 -847 y(stances)31 b(of)g(the)f Fs(command)f Ft(builtin)h(and)f(retain)i +847 y(stances)31 b(of)g(the)f Ft(command)f Fu(builtin)h(and)f(retain)i (these)g(assignmen)m(t)g(statemen)m(t)h(prop)s(erties.)275 994 y(In)d(the)h(con)m(text)i(where)d(an)h(assignmen)m(t)h(statemen)m (t)h(is)e(assigning)g(a)h(v)-5 b(alue)30 b(to)h(a)f(shell)g(v)-5 b(ariable)31 b(or)150 1104 y(arra)m(y)f(index)g(\(see)h(Section)g(6.7)g -([Arra)m(ys],)g(page)g(89\),)g(the)f(`)p Fs(+=)p Ft(')g(op)s(erator)g +([Arra)m(ys],)g(page)g(89\),)g(the)f(`)p Ft(+=)p Fu(')g(op)s(erator)g (can)h(b)s(e)e(used)g(to)i(app)s(end)d(to)150 1213 y(or)36 b(add)g(to)h(the)f(v)-5 b(ariable's)37 b(previous)f(v)-5 -b(alue.)59 b(When)36 b(`)p Fs(+=)p Ft(')g(is)g(applied)g(to)h(a)g(v)-5 -b(ariable)37 b(for)f(whic)m(h)g(the)150 1323 y Fq(in)m(teger)46 -b Ft(attribute)38 b(has)f(b)s(een)g(set,)k Fq(v)-5 b(alue)43 -b Ft(is)38 b(ev)-5 b(aluated)39 b(as)f(an)f(arithmetic)i(expression)f +b(alue.)59 b(When)36 b(`)p Ft(+=)p Fu(')g(is)g(applied)g(to)h(a)g(v)-5 +b(ariable)37 b(for)f(whic)m(h)g(the)150 1323 y Fr(in)m(teger)46 +b Fu(attribute)38 b(has)f(b)s(een)g(set,)k Fr(v)-5 b(alue)43 +b Fu(is)38 b(ev)-5 b(aluated)39 b(as)f(an)f(arithmetic)i(expression)f (and)f(added)150 1433 y(to)f(the)f(v)-5 b(ariable's)36 b(curren)m(t)f(v)-5 b(alue,)37 b(whic)m(h)e(is)g(also)h(ev)-5 -b(aluated.)56 b(When)35 b(`)p Fs(+=)p Ft(')g(is)h(applied)f(to)g(an)g +b(aluated.)56 b(When)35 b(`)p Ft(+=)p Fu(')g(is)h(applied)f(to)g(an)g (arra)m(y)150 1542 y(v)-5 b(ariable)26 b(using)e(comp)s(ound)f (assignmen)m(t)j(\(see)f(Section)h(6.7)f([Arra)m(ys],)i(page)f(89\),)h (the)e(v)-5 b(ariable's)25 b(v)-5 b(alue)150 1652 y(is)32 -b(not)f(unset)h(\(as)g(it)g(is)f(when)g(using)g(`)p Fs(=)p -Ft('\),)i(and)e(new)g(v)-5 b(alues)32 b(are)g(app)s(ended)d(to)k(the)f +b(not)f(unset)h(\(as)g(it)g(is)f(when)g(using)g(`)p Ft(=)p +Fu('\),)i(and)e(new)g(v)-5 b(alues)32 b(are)g(app)s(ended)d(to)k(the)f (arra)m(y)g(b)s(eginning)150 1761 y(at)27 b(one)f(greater)i(than)e(the) g(arra)m(y's)h(maxim)m(um)f(index)g(\(for)g(indexed)g(arra)m(ys\),)i (or)e(added)g(as)g(additional)150 1871 y(k)m(ey-v)-5 b(alue)35 b(pairs)e(in)g(an)g(asso)s(ciativ)m(e)j(arra)m(y)-8 b(.)51 b(When)33 b(applied)g(to)h(a)g(string-v)-5 b(alued)34 -b(v)-5 b(ariable,)35 b Fq(v)-5 b(alue)39 b Ft(is)150 +b(v)-5 b(ariable,)35 b Fr(v)-5 b(alue)39 b Fu(is)150 1980 y(expanded)30 b(and)f(app)s(ended)g(to)i(the)g(v)-5 -b(ariable's)31 b(v)-5 b(alue.)275 2128 y(A)37 b(v)-5 -b(ariable)38 b(can)g(b)s(e)f(assigned)h(the)f Fq(nameref)55 -b Ft(attribute)38 b(using)f(the)h(`)p Fs(-n)p Ft(')f(option)h(to)g(the) -g Fs(\\)p Ft(fBde-)150 2237 y(clare)p Fs(\\)p Ft(fP)44 -b(or)f Fs(\\)p Ft(fBlo)s(cal)p Fs(\\)p Ft(fP)h(builtin)e(commands)h -(\(see)h(Section)h(4.2)f([Bash)g(Builtins],)j(page)d(48\))g(to)150 -2347 y(create)36 b(a)e Fq(nameref)17 b Ft(,)35 b(or)f(a)h(reference)f -(to)h(another)f(v)-5 b(ariable.)53 b(This)33 b(allo)m(ws)i(v)-5 -b(ariables)35 b(to)f(b)s(e)g(manipu-)150 2457 y(lated)d(indirectly)-8 +b(ariable's)31 b(v)-5 b(alue.)275 2128 y(A)41 b(v)-5 +b(ariable)42 b(can)f(b)s(e)f(assigned)i(the)f Fr(nameref)58 +b Fu(attribute)42 b(using)f(the)g Ft(-n)f Fu(option)i(to)g(the)f +Ft(\\)p Fu(fBde-)150 2237 y(clare)p Ft(\\)p Fu(fP)j(or)f +Ft(\\)p Fu(fBlo)s(cal)p Ft(\\)p Fu(fP)h(builtin)e(commands)h(\(see)h +(Section)h(4.2)f([Bash)g(Builtins],)j(page)d(48\))g(to)150 +2347 y(create)37 b(a)e Fr(nameref)p Fu(,)h(or)f(a)h(reference)f(to)h +(another)g(v)-5 b(ariable.)55 b(This)34 b(allo)m(ws)j(v)-5 +b(ariables)35 b(to)h(b)s(e)f(manipu-)150 2457 y(lated)c(indirectly)-8 b(.)43 b(Whenev)m(er)31 b(the)g(nameref)f(v)-5 b(ariable)32 b(is)e(referenced)h(or)f(assigned)h(to,)h(the)e(op)s(eration)150 2566 y(is)i(actually)h(p)s(erformed)d(on)i(the)g(v)-5 @@ -8813,45 +9364,45 @@ b(ariable's)33 b(v)-5 b(alue.)45 b(A)32 b(nameref)150 2785 y(argumen)m(t)g(to)g(the)g(function.)46 b(F)-8 b(or)33 b(instance,)h(if)e(a)h(v)-5 b(ariable)33 b(name)g(is)f(passed)g(to)h(a) g(shell)g(function)f(as)150 2895 y(its)f(\014rst)e(argumen)m(t,)i -(running)390 3042 y Fs(declare)46 b(-n)h(ref=$1)150 3190 -y Ft(inside)31 b(the)h(function)f(creates)i(a)g(nameref)e(v)-5 -b(ariable)32 b Fq(ref)49 b Ft(whose)32 b(v)-5 b(alue)32 +(running)390 3042 y Ft(declare)46 b(-n)h(ref=$1)150 3190 +y Fu(inside)31 b(the)h(function)f(creates)i(a)g(nameref)e(v)-5 +b(ariable)32 b Fr(ref)49 b Fu(whose)32 b(v)-5 b(alue)32 b(is)g(the)f(v)-5 b(ariable)33 b(name)e(passed)150 3299 y(as)42 b(the)g(\014rst)f(argumen)m(t.)74 b(References)43 -b(and)e(assignmen)m(ts)h(to)g Fq(ref)59 b Ft(are)42 b(treated)h(as)f +b(and)e(assignmen)m(ts)h(to)g Fr(ref)59 b Fu(are)42 b(treated)h(as)f (references)g(and)150 3409 y(assignmen)m(ts)31 b(to)g(the)g(v)-5 b(ariable)31 b(whose)f(name)g(w)m(as)h(passed)f(as)h -Fs($1)p Ft(.)275 3556 y(If)38 b(the)i(con)m(trol)g(v)-5 -b(ariable)40 b(in)f(a)g Fs(for)g Ft(lo)s(op)g(has)g(the)g(nameref)g +Ft($1)p Fu(.)275 3556 y(If)38 b(the)i(con)m(trol)g(v)-5 +b(ariable)40 b(in)f(a)g Ft(for)g Fu(lo)s(op)g(has)g(the)g(nameref)g (attribute,)k(the)c(list)h(of)f(w)m(ords)g(can)150 3666 y(b)s(e)c(a)i(list)f(of)g(shell)h(v)-5 b(ariables,)38 b(and)d(a)h(name)g(reference)h(will)f(b)s(e)f(established)i(for)e(eac)m -(h)j(w)m(ord)d(in)h(the)150 3775 y(list,)30 b(in)f(turn,)g(when)f(the)i -(lo)s(op)f(is)g(executed.)41 b(Arra)m(y)30 b(v)-5 b(ariables)30 -b(cannot)g(b)s(e)e(giv)m(en)i(the)g(`)p Fs(-n)p Ft(')f(attribute.)150 +(h)j(w)m(ord)d(in)h(the)150 3775 y(list,)e(in)e(turn,)g(when)f(the)i +(lo)s(op)f(is)h(executed.)47 b(Arra)m(y)33 b(v)-5 b(ariables)33 +b(cannot)g(b)s(e)e(giv)m(en)j(the)e Ft(-n)g Fu(attribute.)150 3885 y(Ho)m(w)m(ev)m(er,)39 b(nameref)d(v)-5 b(ariables)36 b(can)g(reference)g(arra)m(y)g(v)-5 b(ariables)37 b(and)e(subscripted)f -(arra)m(y)i(v)-5 b(ariables.)150 3995 y(Namerefs)32 b(can)h(b)s(e)e -(unset)h(using)f(the)h(`)p Fs(-n)p Ft(')g(option)h(to)g(the)f -Fs(unset)e Ft(builtin)i(\(see)h(Section)g(4.1)g([Bourne)150 +(arra)m(y)i(v)-5 b(ariables.)150 3995 y(Namerefs)36 b(can)f(b)s(e)g +(unset)g(using)g(the)h Ft(-n)e Fu(option)i(to)g(the)g +Ft(unset)e Fu(builtin)h(\(see)h(Section)g(4.1)h([Bourne)150 4104 y(Shell)43 b(Builtins],)j(page)e(41\).)79 b(Otherwise,)45 -b(if)e Fs(unset)e Ft(is)i(executed)h(with)e(the)h(name)g(of)g(a)g +b(if)e Ft(unset)e Fu(is)i(executed)h(with)e(the)h(name)g(of)g(a)g (nameref)150 4214 y(v)-5 b(ariable)31 b(as)g(an)f(argumen)m(t,)h(the)g (v)-5 b(ariable)31 b(referenced)f(b)m(y)g(the)h(nameref)f(v)-5 -b(ariable)31 b(will)g(b)s(e)f(unset.)150 4426 y Fj(3.4.1)63 -b(P)m(ositional)41 b(P)m(arameters)150 4573 y Ft(A)28 -b Fq(p)s(ositional)h(parameter)35 b Ft(is)28 b(a)g(parameter)g(denoted) +b(ariable)31 b(will)g(b)s(e)f(unset.)150 4426 y Fk(3.4.1)63 +b(P)m(ositional)41 b(P)m(arameters)150 4573 y Fu(A)28 +b Fr(p)s(ositional)h(parameter)35 b Fu(is)28 b(a)g(parameter)g(denoted) g(b)m(y)g(one)g(or)g(more)g(digits,)h(other)g(than)e(the)h(single)150 -4682 y(digit)34 b Fs(0)p Ft(.)48 b(P)m(ositional)36 b(parameters)d(are) +4682 y(digit)34 b Ft(0)p Fu(.)48 b(P)m(ositional)36 b(parameters)d(are) g(assigned)h(from)e(the)i(shell's)f(argumen)m(ts)g(when)f(it)i(is)f(in) m(v)m(ok)m(ed,)150 4792 y(and)38 b(ma)m(y)i(b)s(e)e(reassigned)i(using) -e(the)h Fs(set)g Ft(builtin)f(command.)67 b(P)m(ositional)41 -b(parameter)e Fs(N)g Ft(ma)m(y)h(b)s(e)150 4902 y(referenced)34 -b(as)h Fs(${N})p Ft(,)g(or)f(as)h Fs($N)e Ft(when)h Fs(N)g -Ft(consists)h(of)f(a)h(single)g(digit.)54 b(P)m(ositional)37 +e(the)h Ft(set)g Fu(builtin)f(command.)67 b(P)m(ositional)41 +b(parameter)e Ft(N)g Fu(ma)m(y)h(b)s(e)150 4902 y(referenced)34 +b(as)h Ft(${N})p Fu(,)g(or)f(as)h Ft($N)e Fu(when)h Ft(N)g +Fu(consists)h(of)f(a)h(single)g(digit.)54 b(P)m(ositional)37 b(parameters)d(ma)m(y)150 5011 y(not)j(b)s(e)f(assigned)h(to)g(with)f -(assignmen)m(t)i(statemen)m(ts.)61 b(The)36 b Fs(set)g -Ft(and)g Fs(shift)f Ft(builtins)h(are)h(used)f(to)150 +(assignmen)m(t)i(statemen)m(ts.)61 b(The)36 b Ft(set)g +Fu(and)g Ft(shift)f Fu(builtins)h(are)h(used)f(to)150 5121 y(set)k(and)f(unset)f(them)i(\(see)g(Chapter)f(4)g([Shell)h (Builtin)g(Commands],)h(page)f(41\).)68 b(The)39 b(p)s(ositional)150 5230 y(parameters)44 b(are)g(temp)s(orarily)g(replaced)h(when)e(a)h @@ -8859,168 +9410,169 @@ Ft(and)g Fs(shift)f Ft(builtins)h(are)h(used)f(to)150 5340 y([Shell)30 b(F)-8 b(unctions],)32 b(page)f(17\).)p eop end %%Page: 20 26 -TeXDict begin 20 25 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 20 25 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(20)275 299 y(When)27 b(a)i(p)s(ositional)g(parameter)g(consisting)f(of)h(more)f (than)g(a)g(single)h(digit)g(is)f(expanded,)g(it)h(m)m(ust)150 -408 y(b)s(e)h(enclosed)h(in)f(braces.)150 624 y Fj(3.4.2)63 -b(Sp)s(ecial)41 b(P)m(arameters)150 771 y Ft(The)d(shell)g(treats)h +408 y(b)s(e)h(enclosed)h(in)f(braces.)150 614 y Fk(3.4.2)63 +b(Sp)s(ecial)41 b(P)m(arameters)150 761 y Fu(The)d(shell)g(treats)h (sev)m(eral)g(parameters)f(sp)s(ecially)-8 b(.)65 b(These)38 b(parameters)h(ma)m(y)f(only)g(b)s(e)g(referenced;)150 -881 y(assignmen)m(t)31 b(to)g(them)g(is)f(not)h(allo)m(w)m(ed.)150 -1065 y Fs(*)432 b Ft(Expands)29 b(to)h(the)h(p)s(ositional)f -(parameters,)h(starting)g(from)e(one.)41 b(When)30 b(the)g(expansion) -630 1175 y(o)s(ccurs)e(within)f(double)h(quotes,)h(it)g(expands)e(to)i -(a)f(single)h(w)m(ord)f(with)g(the)g(v)-5 b(alue)29 b(of)f(eac)m(h)630 -1284 y(parameter)i(separated)g(b)m(y)f(the)g(\014rst)g(c)m(haracter)i -(of)e(the)h Fs(IFS)e Ft(sp)s(ecial)i(v)-5 b(ariable.)41 -b(That)30 b(is,)630 1394 y Fs("$*")h Ft(is)i(equiv)-5 -b(alen)m(t)33 b(to)h Fs("$1)p Fi(c)11 b Fs($2)p Fi(c)g -Fs(...)l(")p Ft(,)33 b(where)f Fq(c)38 b Ft(is)32 b(the)h(\014rst)e(c)m -(haracter)j(of)f(the)f(v)-5 b(alue)630 1503 y(of)30 b(the)g -Fs(IFS)g Ft(v)-5 b(ariable.)41 b(If)30 b Fs(IFS)f Ft(is)h(unset,)g(the) -g(parameters)g(are)h(separated)f(b)m(y)g(spaces.)41 b(If)630 -1613 y Fs(IFS)29 b Ft(is)i(n)m(ull,)f(the)h(parameters)g(are)f(joined)h -(without)f(in)m(terv)m(ening)i(separators.)150 1789 y -Fs(@)432 b Ft(Expands)29 b(to)h(the)h(p)s(ositional)f(parameters,)h -(starting)g(from)e(one.)41 b(When)30 b(the)g(expansion)630 -1899 y(o)s(ccurs)c(within)g(double)f(quotes,)j(eac)m(h)f(parameter)g -(expands)e(to)i(a)g(separate)g(w)m(ord.)39 b(That)630 -2008 y(is,)29 b Fs("$@")e Ft(is)i(equiv)-5 b(alen)m(t)30 -b(to)f Fs("$1")g("$2")h(...)o Ft(.)40 b(If)28 b(the)g(double-quoted)h -(expansion)f(o)s(ccurs)630 2118 y(within)d(a)h(w)m(ord,)g(the)g -(expansion)f(of)h(the)g(\014rst)f(parameter)h(is)f(joined)h(with)f(the) -h(b)s(eginning)630 2227 y(part)f(of)g(the)g(original)g(w)m(ord,)h(and)e -(the)h(expansion)g(of)g(the)g(last)h(parameter)f(is)g(joined)f(with)630 -2337 y(the)37 b(last)g(part)g(of)f(the)h(original)h(w)m(ord.)59 -b(When)36 b(there)h(are)g(no)f(p)s(ositional)h(parameters,)630 -2447 y Fs("$@")29 b Ft(and)h Fs($@)g Ft(expand)f(to)j(nothing)e -(\(i.e.,)i(they)e(are)h(remo)m(v)m(ed\).)150 2623 y Fs(#)432 -b Ft(Expands)29 b(to)i(the)g(n)m(um)m(b)s(er)e(of)h(p)s(ositional)h -(parameters)g(in)f(decimal.)150 2799 y Fs(?)432 b Ft(Expands)29 -b(to)i(the)g(exit)g(status)g(of)f(the)h(most)f(recen)m(tly)i(executed)f -(foreground)f(pip)s(eline.)150 2975 y Fs(-)432 b Ft(\(A)31 -b(h)m(yphen.\))42 b(Expands)30 b(to)h(the)g(curren)m(t)g(option)h -(\015ags)f(as)g(sp)s(eci\014ed)f(up)s(on)g(in)m(v)m(o)s(cation,)630 -3084 y(b)m(y)35 b(the)h Fs(set)e Ft(builtin)h(command,)h(or)g(those)g -(set)f(b)m(y)h(the)f(shell)h(itself)g(\(suc)m(h)f(as)h(the)f(`)p -Fs(-i)p Ft(')630 3194 y(option\).)150 3370 y Fs($)432 -b Ft(Expands)39 b(to)j(the)f(pro)s(cess)f Fl(id)h Ft(of)g(the)g(shell.) -73 b(In)40 b(a)h Fs(\(\))f Ft(subshell,)j(it)e(expands)f(to)i(the)630 -3479 y(pro)s(cess)30 b Fl(id)g Ft(of)h(the)g(in)m(v)m(oking)g(shell,)g -(not)g(the)f(subshell.)150 3655 y Fs(!)432 b Ft(Expands)26 -b(to)i(the)f(pro)s(cess)g Fl(id)g Ft(of)g(the)h(job)f(most)g(recen)m -(tly)i(placed)e(in)m(to)i(the)e(bac)m(kground,)630 3765 -y(whether)39 b(executed)i(as)f(an)g(async)m(hronous)f(command)h(or)g -(using)f(the)h Fs(bg)g Ft(builtin)f(\(see)630 3874 y(Section)31 -b(7.2)h([Job)e(Con)m(trol)h(Builtins],)g(page)g(99\).)150 -4050 y Fs(0)432 b Ft(Expands)20 b(to)j(the)f(name)g(of)g(the)g(shell)g -(or)f(shell)h(script.)38 b(This)21 b(is)h(set)g(at)h(shell)f -(initialization.)630 4160 y(If)44 b(Bash)g(is)g(in)m(v)m(ok)m(ed)i -(with)e(a)g(\014le)g(of)h(commands)e(\(see)j(Section)f(3.8)g([Shell)f -(Scripts],)630 4270 y(page)39 b(39\),)i Fs($0)d Ft(is)g(set)g(to)h(the) -f(name)g(of)g(that)h(\014le.)64 b(If)37 b(Bash)i(is)f(started)g(with)g -(the)g(`)p Fs(-c)p Ft(')630 4379 y(option)i(\(see)g(Section)h(6.1)f -([In)m(v)m(oking)h(Bash],)h(page)e(80\),)j(then)d Fs($0)e -Ft(is)i(set)g(to)g(the)g(\014rst)630 4489 y(argumen)m(t)31 -b(after)g(the)g(string)g(to)g(b)s(e)f(executed,)i(if)f(one)g(is)f -(presen)m(t.)42 b(Otherwise,)31 b(it)g(is)f(set)630 4598 -y(to)h(the)g(\014lename)f(used)g(to)h(in)m(v)m(ok)m(e)h(Bash,)f(as)g -(giv)m(en)g(b)m(y)f(argumen)m(t)h(zero.)150 4774 y Fs(_)432 -b Ft(\(An)27 b(underscore.\))39 b(A)m(t)29 b(shell)e(startup,)h(set)f -(to)h(the)g(absolute)g(pathname)f(used)f(to)i(in)m(v)m(ok)m(e)630 -4884 y(the)22 b(shell)g(or)g(shell)g(script)f(b)s(eing)h(executed)h(as) -f(passed)f(in)g(the)h(en)m(vironmen)m(t)h(or)e(argumen)m(t)630 -4994 y(list.)72 b(Subsequen)m(tly)-8 b(,)43 b(expands)c(to)j(the)e -(last)i(argumen)m(t)f(to)g(the)g(previous)f(command,)630 -5103 y(after)35 b(expansion.)54 b(Also)36 b(set)f(to)h(the)f(full)f -(pathname)h(used)f(to)h(in)m(v)m(ok)m(e)i(eac)m(h)f(command)630 -5213 y(executed)42 b(and)e(placed)i(in)e(the)h(en)m(vironmen)m(t)h(exp) -s(orted)f(to)g(that)h(command.)72 b(When)630 5322 y(c)m(hec)m(king)32 -b(mail,)f(this)g(parameter)g(holds)e(the)i(name)f(of)h(the)g(mail)g -(\014le.)p eop end +870 y(assignmen)m(t)31 b(to)g(them)g(is)f(not)h(allo)m(w)m(ed.)150 +1039 y Ft(*)432 b Fu(\($*\))38 b(Expands)d(to)i(the)f(p)s(ositional)h +(parameters,)h(starting)f(from)f(one.)59 b(When)36 b(the)g(ex-)630 +1149 y(pansion)25 b(o)s(ccurs)h(within)f(double)h(quotes,)h(it)g +(expands)e(to)h(a)h(single)f(w)m(ord)g(with)f(the)h(v)-5 +b(alue)630 1258 y(of)33 b(eac)m(h)i(parameter)e(separated)h(b)m(y)f +(the)h(\014rst)e(c)m(haracter)j(of)e(the)h Ft(IFS)e Fu(sp)s(ecial)i(v) +-5 b(ariable.)630 1368 y(That)37 b(is,)j Ft("$*")c Fu(is)h(equiv)-5 +b(alen)m(t)39 b(to)f Ft("$1)p Fj(c)p Ft($2)p Fj(c)p Ft(...)n(")p +Fu(,)h(where)e Fr(c)43 b Fu(is)37 b(the)h(\014rst)f(c)m(haracter)i(of) +630 1477 y(the)31 b(v)-5 b(alue)32 b(of)f(the)g Ft(IFS)f +Fu(v)-5 b(ariable.)43 b(If)31 b Ft(IFS)f Fu(is)h(unset,)g(the)g +(parameters)g(are)h(separated)f(b)m(y)630 1587 y(spaces.)40 +b(If)25 b Ft(IFS)g Fu(is)h(n)m(ull,)h(the)f(parameters)g(are)h(joined)e +(without)h(in)m(terv)m(ening)h(separators.)150 1753 y +Ft(@)432 b Fu(\($@\))35 b(Expands)e(to)i(the)g(p)s(ositional)g +(parameters,)h(starting)f(from)f(one.)53 b(When)34 b(the)g(ex-)630 +1862 y(pansion)41 b(o)s(ccurs)g(within)f(double)h(quotes,)k(eac)m(h)d +(parameter)g(expands)e(to)i(a)g(separate)630 1972 y(w)m(ord.)50 +b(That)34 b(is,)g Ft("$@")f Fu(is)g(equiv)-5 b(alen)m(t)35 +b(to)g Ft("$1")29 b("$2")g(...)o Fu(.)51 b(If)33 b(the)h(double-quoted) +f(ex-)630 2081 y(pansion)38 b(o)s(ccurs)h(within)f(a)h(w)m(ord,)i(the)e +(expansion)g(of)g(the)g(\014rst)f(parameter)h(is)g(joined)630 +2191 y(with)i(the)h(b)s(eginning)e(part)i(of)f(the)h(original)g(w)m +(ord,)i(and)d(the)h(expansion)f(of)g(the)h(last)630 2300 +y(parameter)31 b(is)f(joined)g(with)f(the)i(last)g(part)e(of)i(the)f +(original)h(w)m(ord.)40 b(When)30 b(there)h(are)f(no)630 +2410 y(p)s(ositional)e(parameters,)h Ft("$@")d Fu(and)h +Ft($@)f Fu(expand)h(to)h(nothing)f(\(i.e.,)j(they)e(are)f(remo)m(v)m +(ed\).)150 2576 y Ft(#)432 b Fu(\($#\))31 b(Expands)e(to)i(the)g(n)m +(um)m(b)s(er)e(of)h(p)s(ositional)i(parameters)e(in)g(decimal.)150 +2741 y Ft(?)432 b Fu(\($?\))88 b(Expands)45 b(to)h(the)g(exit)h(status) +f(of)g(the)g(most)h(recen)m(tly)g(executed)g(foreground)630 +2851 y(pip)s(eline.)150 3016 y Ft(-)432 b Fu(\($-,)24 +b(a)e(h)m(yphen.\))37 b(Expands)20 b(to)i(the)f(curren)m(t)h(option)f +(\015ags)h(as)f(sp)s(eci\014ed)g(up)s(on)f(in)m(v)m(o)s(cation,)630 +3126 y(b)m(y)38 b(the)h Ft(set)f Fu(builtin)g(command,)j(or)d(those)i +(set)f(b)m(y)f(the)h(shell)g(itself)g(\(suc)m(h)g(as)g(the)g +Ft(-i)630 3235 y Fu(option\).)150 3401 y Ft($)432 b Fu(\($$\))31 +b(Expands)d(to)j(the)e(pro)s(cess)h Fm(id)f Fu(of)h(the)g(shell.)41 +b(In)28 b(a)i Ft(\(\))f Fu(subshell,)h(it)g(expands)e(to)j(the)630 +3511 y(pro)s(cess)f Fm(id)g Fu(of)h(the)g(in)m(v)m(oking)g(shell,)g +(not)g(the)f(subshell.)150 3676 y Ft(!)432 b Fu(\($!\))51 +b(Expands)32 b(to)i(the)g(pro)s(cess)f Fm(id)h Fu(of)f(the)h(job)f +(most)h(recen)m(tly)h(placed)f(in)m(to)g(the)g(bac)m(k-)630 +3786 y(ground,)26 b(whether)g(executed)g(as)h(an)f(async)m(hronous)f +(command)h(or)g(using)g(the)g Ft(bg)f Fu(builtin)630 +3895 y(\(see)31 b(Section)h(7.2)f([Job)f(Con)m(trol)h(Builtins],)g +(page)h(98\).)150 4061 y Ft(0)432 b Fu(\($0\))46 b(Expands)d(to)i(the)g +(name)g(of)f(the)h(shell)g(or)f(shell)h(script.)83 b(This)44 +b(is)g(set)h(at)h(shell)630 4170 y(initialization.)d(If)27 +b(Bash)h(is)g(in)m(v)m(ok)m(ed)h(with)e(a)i(\014le)e(of)h(commands)g +(\(see)g(Section)h(3.8)g([Shell)630 4280 y(Scripts],)g(page)g(39\),)h +Ft($0)e Fu(is)h(set)g(to)g(the)f(name)h(of)f(that)h(\014le.)41 +b(If)28 b(Bash)g(is)h(started)g(with)f(the)630 4390 y +Ft(-c)i Fu(option)h(\(see)h(Section)g(6.1)f([In)m(v)m(oking)h(Bash],)g +(page)f(80\),)i(then)d Ft($0)g Fu(is)h(set)g(to)h(the)f(\014rst)630 +4499 y(argumen)m(t)g(after)g(the)g(string)g(to)g(b)s(e)f(executed,)i +(if)f(one)g(is)f(presen)m(t.)42 b(Otherwise,)31 b(it)g(is)f(set)630 +4609 y(to)h(the)g(\014lename)f(used)g(to)h(in)m(v)m(ok)m(e)h(Bash,)f +(as)g(giv)m(en)g(b)m(y)f(argumen)m(t)h(zero.)150 4774 +y Ft(_)432 b Fu(\($)p 716 4774 28 4 v 41 w(,)41 b(an)e(underscore.\))67 +b(A)m(t)40 b(shell)f(startup,)i(set)f(to)g(the)f(absolute)h(pathname)f +(used)f(to)630 4884 y(in)m(v)m(ok)m(e)43 b(the)e(shell)g(or)g(shell)g +(script)g(b)s(eing)f(executed)i(as)f(passed)g(in)f(the)h(en)m(vironmen) +m(t)630 4994 y(or)34 b(argumen)m(t)g(list.)52 b(Subsequen)m(tly)-8 +b(,)34 b(expands)f(to)i(the)f(last)h(argumen)m(t)f(to)g(the)g(previous) +630 5103 y(command,)g(after)f(expansion.)48 b(Also)34 +b(set)g(to)f(the)g(full)g(pathname)g(used)f(to)i(in)m(v)m(ok)m(e)h(eac) +m(h)630 5213 y(command)29 b(executed)h(and)f(placed)g(in)g(the)h(en)m +(vironmen)m(t)f(exp)s(orted)g(to)h(that)g(command.)630 +5322 y(When)g(c)m(hec)m(king)i(mail,)g(this)e(parameter)h(holds)f(the)g +(name)h(of)f(the)h(mail)g(\014le.)p eop end %%Page: 21 27 -TeXDict begin 21 26 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 21 26 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(21)150 299 -y Fr(3.5)68 b(Shell)45 b(Expansions)150 458 y Ft(Expansion)27 +y Fs(3.5)68 b(Shell)45 b(Expansions)150 458 y Fu(Expansion)27 b(is)i(p)s(erformed)d(on)i(the)g(command)g(line)h(after)f(it)h(has)f(b) -s(een)f(split)h(in)m(to)i Fs(token)p Ft(s.)38 b(There)28 +s(een)f(split)h(in)m(to)i Ft(token)p Fu(s.)38 b(There)28 b(are)150 568 y(sev)m(en)j(kinds)e(of)i(expansion)f(p)s(erformed:)225 -702 y Fp(\017)60 b Ft(brace)31 b(expansion)225 837 y -Fp(\017)60 b Ft(tilde)31 b(expansion)225 971 y Fp(\017)60 -b Ft(parameter)31 b(and)f(v)-5 b(ariable)31 b(expansion)225 -1105 y Fp(\017)60 b Ft(command)30 b(substitution)225 -1240 y Fp(\017)60 b Ft(arithmetic)32 b(expansion)225 -1374 y Fp(\017)60 b Ft(w)m(ord)30 b(splitting)225 1508 -y Fp(\017)60 b Ft(\014lename)31 b(expansion)275 1667 +702 y Fq(\017)60 b Fu(brace)31 b(expansion)225 837 y +Fq(\017)60 b Fu(tilde)31 b(expansion)225 971 y Fq(\017)60 +b Fu(parameter)31 b(and)f(v)-5 b(ariable)31 b(expansion)225 +1105 y Fq(\017)60 b Fu(command)30 b(substitution)225 +1240 y Fq(\017)60 b Fu(arithmetic)32 b(expansion)225 +1374 y Fq(\017)60 b Fu(w)m(ord)30 b(splitting)225 1508 +y Fq(\017)60 b Fu(\014lename)31 b(expansion)275 1667 y(The)24 b(order)h(of)h(expansions)f(is:)39 b(brace)25 b(expansion;)j(tilde)e(expansion,)g(parameter)g(and)f(v)-5 b(ariable)26 b(ex-)150 1777 y(pansion,)j(arithmetic)i(expansion,)f(and) f(command)g(substitution)g(\(done)g(in)h(a)f(left-to-righ)m(t)k (fashion\);)150 1887 y(w)m(ord)d(splitting;)h(and)f(\014lename)h -(expansion.)275 2021 y(On)c(systems)h(that)h(can)g(supp)s(ort)e(it,)i -(there)g(is)f(an)g(additional)i(expansion)e(a)m(v)-5 -b(ailable:)42 b Fq(pro)s(cess)28 b(sub-)150 2131 y(stitution)p -Ft(.)42 b(This)30 b(is)g(p)s(erformed)f(at)j(the)e(same)h(time)h(as)e -(tilde,)i(parameter,)f(v)-5 b(ariable,)32 b(and)e(arithmetic)150 -2240 y(expansion)g(and)g(command)g(substitution.)275 -2374 y(Only)35 b(brace)i(expansion,)h(w)m(ord)e(splitting,)j(and)d +(expansion.)275 2021 y(On)42 b(systems)h(that)h(can)g(supp)s(ort)e(it,) +47 b(there)d(is)f(an)h(additional)g(expansion)f(a)m(v)-5 +b(ailable:)69 b Fr(pro)s(cess)150 2131 y(substitution)p +Fu(.)50 b(This)33 b(is)h(p)s(erformed)e(at)j(the)f(same)g(time)g(as)g +(tilde,)i(parameter,)f(v)-5 b(ariable,)35 b(and)f(arith-)150 +2240 y(metic)d(expansion)g(and)e(command)i(substitution.)275 +2374 y(Only)k(brace)i(expansion,)h(w)m(ord)e(splitting,)j(and)d (\014lename)g(expansion)g(can)h(c)m(hange)h(the)e(n)m(um)m(b)s(er)150 2484 y(of)h(w)m(ords)f(of)g(the)h(expansion;)i(other)e(expansions)f (expand)g(a)h(single)g(w)m(ord)f(to)h(a)g(single)g(w)m(ord.)58 b(The)150 2594 y(only)32 b(exceptions)i(to)f(this)f(are)h(the)f -(expansions)g(of)h Fs("$@")e Ft(\(see)i(Section)g(3.4.2)h([Sp)s(ecial)f -(P)m(arameters],)150 2703 y(page)e(20\))h(and)d Fs("${)p -Fi(name)11 b Fs([@]}")27 b Ft(\(see)k(Section)h(6.7)f([Arra)m(ys],)g -(page)g(89\).)275 2838 y(After)41 b(all)i(expansions,)h -Fs(quote)29 b(removal)40 b Ft(\(see)i(Section)h(3.5.9)g([Quote)f(Remo)m -(v)-5 b(al],)47 b(page)42 b(31\))h(is)150 2947 y(p)s(erformed.)150 -3146 y Fj(3.5.1)63 b(Brace)40 b(Expansion)150 3293 y -Ft(Brace)32 b(expansion)f(is)f(a)i(mec)m(hanism)f(b)m(y)f(whic)m(h)h +(expansions)g(of)h Ft("$@")e Fu(\(see)i(Section)g(3.4.2)h([Sp)s(ecial)f +(P)m(arameters],)150 2703 y(page)e(20\))h(and)d Ft("${)p +Fj(name)p Ft([@]}")e Fu(\(see)32 b(Section)f(6.7)g([Arra)m(ys],)h(page) +f(89\).)275 2838 y(After)41 b(all)i(expansions,)h Ft(quote)29 +b(removal)40 b Fu(\(see)i(Section)h(3.5.9)g([Quote)f(Remo)m(v)-5 +b(al],)47 b(page)42 b(31\))h(is)150 2947 y(p)s(erformed.)150 +3146 y Fk(3.5.1)63 b(Brace)40 b(Expansion)150 3293 y +Fu(Brace)32 b(expansion)f(is)f(a)i(mec)m(hanism)f(b)m(y)f(whic)m(h)h (arbitrary)f(strings)h(ma)m(y)g(b)s(e)f(generated.)43 b(This)30 b(mec)m(h-)150 3403 y(anism)35 b(is)h(similar)f(to)h -Fq(\014lename)g(expansion)f Ft(\(see)i(Section)f(3.5.8)h([Filename)g +Fr(\014lename)g(expansion)f Fu(\(see)i(Section)f(3.5.8)h([Filename)g (Expansion],)f(page)g(29\),)150 3512 y(but)26 b(the)h(\014lenames)g (generated)h(need)f(not)g(exist.)40 b(P)m(atterns)28 b(to)f(b)s(e)g(brace)g(expanded)f(tak)m(e)i(the)f(form)g(of)150 -3622 y(an)i(optional)i Fq(pream)m(ble)5 b Ft(,)30 b(follo)m(w)m(ed)i(b) -m(y)d(either)h(a)g(series)g(of)g(comma-separated)h(strings)e(or)h(a)g -(sequence)150 3731 y(expression)36 b(b)s(et)m(w)m(een)g(a)g(pair)g(of)g -(braces,)i(follo)m(w)m(ed)f(b)m(y)f(an)g(optional)h Fq(p)s(ostscript)r -Ft(.)56 b(The)36 b(pream)m(ble)g(is)150 3841 y(pre\014xed)28 +3622 y(an)j(optional)h Fr(pream)m(ble)p Fu(,)g(follo)m(w)m(ed)g(b)m(y)f +(either)g(a)h(series)f(of)g(comma-separated)i(strings)d(or)h(a)h +(sequence)150 3731 y(expression)36 b(b)s(et)m(w)m(een)g(a)h(pair)e(of)i +(braces,)g(follo)m(w)m(ed)h(b)m(y)e(an)g(optional)h Fr(p)s(ostscript)p +Fu(.)57 b(The)36 b(pream)m(ble)g(is)150 3841 y(pre\014xed)28 b(to)h(eac)m(h)h(string)f(con)m(tained)h(within)e(the)h(braces,)g(and)g (the)g(p)s(ostscript)f(is)h(then)f(app)s(ended)f(to)150 3951 y(eac)m(h)32 b(resulting)e(string,)h(expanding)e(left)j(to)f(righ) m(t.)275 4085 y(Brace)37 b(expansions)f(ma)m(y)h(b)s(e)f(nested.)59 b(The)36 b(results)g(of)h(eac)m(h)g(expanded)f(string)g(are)h(not)g (sorted;)150 4195 y(left)31 b(to)g(righ)m(t)g(order)f(is)g(preserv)m -(ed.)41 b(F)-8 b(or)31 b(example,)390 4329 y Fs(bash$)46 +(ed.)41 b(F)-8 b(or)31 b(example,)390 4329 y Ft(bash$)46 b(echo)h(a{d,c,b}e)390 4439 y(ade)g(ace)g(abe)275 4573 -y Ft(A)20 b(sequence)h(expression)g(tak)m(es)h(the)f(form)f -Fs({)p Fi(x)11 b Fs(..)p Fi(y)g Fs([..)p Fi(incr)g Fs(]})p -Ft(,)18 b(where)i Fq(x)27 b Ft(and)20 b Fq(y)28 b Ft(are)22 -b(either)f(in)m(tegers)150 4682 y(or)42 b(single)h(c)m(haracters,)j -(and)c Fq(incr)7 b Ft(,)44 b(an)e(optional)h(incremen)m(t,)j(is)c(an)g -(in)m(teger.)77 b(When)41 b(in)m(tegers)j(are)150 4792 -y(supplied,)e(the)f(expression)g(expands)f(to)h(eac)m(h)h(n)m(um)m(b)s -(er)e(b)s(et)m(w)m(een)h Fq(x)47 b Ft(and)40 b Fq(y)8 -b Ft(,)44 b(inclusiv)m(e.)73 b(Supplied)150 4902 y(in)m(tegers)33 -b(ma)m(y)e(b)s(e)g(pre\014xed)f(with)h(`)p Fs(0)p Ft(')h(to)g(force)g +y Fu(A)23 b(sequence)g(expression)g(tak)m(es)i(the)e(form)g +Ft({)p Fj(x)p Ft(..)p Fj(y)p Ft([..)p Fj(incr)p Ft(]})p +Fu(,)e(where)i Fr(x)29 b Fu(and)23 b Fr(y)30 b Fu(are)24 +b(either)g(in)m(tegers)150 4682 y(or)42 b(single)h(c)m(haracters,)48 +b(and)41 b Fr(incr)p Fu(,)46 b(an)c(optional)i(incremen)m(t,)i(is)c(an) +h(in)m(teger.)78 b(When)42 b(in)m(tegers)i(are)150 4792 +y(supplied,)f(the)f(expression)f(expands)f(to)i(eac)m(h)h(n)m(um)m(b)s +(er)d(b)s(et)m(w)m(een)i Fr(x)47 b Fu(and)41 b Fr(y)p +Fu(,)j(inclusiv)m(e.)75 b(Supplied)150 4902 y(in)m(tegers)33 +b(ma)m(y)e(b)s(e)g(pre\014xed)f(with)h(`)p Ft(0)p Fu(')h(to)g(force)g (eac)m(h)g(term)g(to)g(ha)m(v)m(e)g(the)g(same)g(width.)42 -b(When)31 b(either)150 5011 y Fq(x)43 b Ft(or)36 b Fq(y)44 -b Ft(b)s(egins)36 b(with)g(a)h(zero,)i(the)e(shell)g(attempts)g(to)g +b(When)31 b(either)150 5011 y Fr(x)43 b Fu(or)36 b Fr(y)44 +b Fu(b)s(egins)36 b(with)g(a)h(zero,)i(the)e(shell)g(attempts)g(to)g (force)g(all)h(generated)f(terms)g(to)g(con)m(tain)h(the)150 5121 y(same)e(n)m(um)m(b)s(er)e(of)i(digits,)i(zero-padding)d(where)h (necessary)-8 b(.)57 b(When)35 b(c)m(haracters)i(are)f(supplied,)g(the) -150 5230 y(expression)24 b(expands)e(to)j(eac)m(h)g(c)m(haracter)g -(lexicographically)i(b)s(et)m(w)m(een)d Fq(x)30 b Ft(and)23 -b Fq(y)8 b Ft(,)25 b(inclusiv)m(e,)h(using)e(the)150 -5340 y(default)32 b(C)g(lo)s(cale.)48 b(Note)34 b(that)f(b)s(oth)e -Fq(x)39 b Ft(and)31 b Fq(y)40 b Ft(m)m(ust)32 b(b)s(e)g(of)g(the)h +150 5230 y(expression)24 b(expands)g(to)h(eac)m(h)h(c)m(haracter)g +(lexicographically)h(b)s(et)m(w)m(een)e Fr(x)30 b Fu(and)24 +b Fr(y)p Fu(,)i(inclusiv)m(e,)h(using)d(the)150 5340 +y(default)32 b(C)g(lo)s(cale.)48 b(Note)34 b(that)f(b)s(oth)e +Fr(x)39 b Fu(and)31 b Fr(y)40 b Fu(m)m(ust)32 b(b)s(e)g(of)g(the)h (same)f(t)m(yp)s(e.)47 b(When)32 b(the)g(incremen)m(t)p eop end %%Page: 22 28 -TeXDict begin 22 27 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 22 27 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(22)150 299 y(is)29 b(supplied,)g(it)h(is)f(used)f(as)i(the)f(di\013erence)h(b)s (et)m(w)m(een)g(eac)m(h)g(term.)41 b(The)29 b(default)g(incremen)m(t)h @@ -9033,212 +9585,211 @@ b(do)s(es)f(not)h(apply)150 764 y(an)m(y)27 b(syn)m(tactic)i(in)m (terpretation)g(to)f(the)f(con)m(text)i(of)e(the)g(expansion)g(or)g (the)h(text)g(b)s(et)m(w)m(een)f(the)h(braces.)150 873 y(T)-8 b(o)37 b(a)m(v)m(oid)g(con\015icts)g(with)f(parameter)h -(expansion,)g(the)g(string)f(`)p Fs(${)p Ft(')g(is)g(not)g(considered)g +(expansion,)g(the)g(string)f(`)p Ft(${)p Fu(')g(is)g(not)g(considered)g (eligible)i(for)150 983 y(brace)31 b(expansion.)275 1119 y(A)e(correctly-formed)i(brace)f(expansion)f(m)m(ust)h(con)m(tain)h (unquoted)e(op)s(ening)g(and)g(closing)i(braces,)150 1228 y(and)h(at)i(least)g(one)f(unquoted)g(comma)g(or)g(a)h(v)-5 b(alid)33 b(sequence)g(expression.)48 b(An)m(y)33 b(incorrectly)h (formed)150 1338 y(brace)d(expansion)f(is)g(left)h(unc)m(hanged.)275 -1474 y(A)25 b Fs({)g Ft(or)g(`)p Fs(,)p Ft(')g(ma)m(y)h(b)s(e)f(quoted) -g(with)g(a)h(bac)m(kslash)f(to)h(prev)m(en)m(t)g(its)g(b)s(eing)f -(considered)g(part)g(of)g(a)h(brace)150 1583 y(expression.)51 +1474 y(A)25 b Fi({)h Fu(or)f(`)p Ft(,)p Fu(')g(ma)m(y)h(b)s(e)f(quoted) +h(with)f(a)g(bac)m(kslash)h(to)g(prev)m(en)m(t)g(its)g(b)s(eing)f +(considered)g(part)g(of)h(a)g(brace)150 1583 y(expression.)51 b(T)-8 b(o)34 b(a)m(v)m(oid)i(con\015icts)e(with)g(parameter)g -(expansion,)h(the)f(string)g(`)p Fs(${)p Ft(')g(is)g(not)g(considered) +(expansion,)h(the)f(string)g(`)p Ft(${)p Fu(')g(is)g(not)g(considered) 150 1693 y(eligible)e(for)e(brace)h(expansion.)275 1829 y(This)f(construct)h(is)g(t)m(ypically)i(used)d(as)h(shorthand)f(when)g (the)h(common)g(pre\014x)f(of)h(the)g(strings)g(to)150 1939 y(b)s(e)f(generated)h(is)g(longer)g(than)f(in)g(the)g(ab)s(o)m(v)m -(e)i(example:)390 2074 y Fs(mkdir)46 b(/usr/local/src/bash/{old,n)o -(ew,)o(dist)o(,bug)o(s})275 2210 y Ft(or)390 2346 y Fs(chown)g(root)h +(e)i(example:)390 2074 y Ft(mkdir)46 b(/usr/local/src/bash/{old,n)o +(ew,)o(dist)o(,bug)o(s})275 2210 y Fu(or)390 2346 y Ft(chown)g(root)h (/usr/{ucb/{ex,edit},lib/)o({ex?)o(.?*,)o(how)o(_ex})o(})150 -2547 y Fj(3.5.2)63 b(Tilde)41 b(Expansion)150 2694 y -Ft(If)29 b(a)h(w)m(ord)g(b)s(egins)f(with)g(an)h(unquoted)f(tilde)h(c)m -(haracter)h(\(`)p Fs(~)p Ft('\),)g(all)g(of)f(the)g(c)m(haracters)h(up) -d(to)j(the)f(\014rst)150 2804 y(unquoted)23 b(slash)h(\(or)h(all)g(c)m -(haracters,)i(if)d(there)g(is)h(no)f(unquoted)f(slash\))h(are)h -(considered)f(a)g Fq(tilde-pre\014x)6 b Ft(.)150 2913 -y(If)38 b(none)g(of)g(the)h(c)m(haracters)g(in)f(the)h(tilde-pre\014x)f -(are)h(quoted,)h(the)f(c)m(haracters)h(in)d(the)i(tilde-pre\014x)150 -3023 y(follo)m(wing)28 b(the)f(tilde)g(are)g(treated)h(as)f(a)g(p)s -(ossible)f Fq(login)i(name)5 b Ft(.)40 b(If)26 b(this)g(login)i(name)f -(is)f(the)h(n)m(ull)g(string,)150 3132 y(the)35 b(tilde)g(is)g +2547 y Fk(3.5.2)63 b(Tilde)41 b(Expansion)150 2694 y +Fu(If)29 b(a)h(w)m(ord)g(b)s(egins)f(with)g(an)h(unquoted)f(tilde)h(c)m +(haracter)h(\(`)p Ft(~)p Fu('\),)g(all)g(of)f(the)g(c)m(haracters)h(up) +d(to)j(the)f(\014rst)150 2804 y(unquoted)24 b(slash)g(\(or)h(all)h(c)m +(haracters,)h(if)e(there)g(is)f(no)h(unquoted)e(slash\))i(are)g +(considered)g(a)g Fr(tilde-pre\014x)p Fu(.)150 2913 y(If)38 +b(none)g(of)g(the)h(c)m(haracters)g(in)f(the)h(tilde-pre\014x)f(are)h +(quoted,)h(the)f(c)m(haracters)h(in)d(the)i(tilde-pre\014x)150 +3023 y(follo)m(wing)28 b(the)g(tilde)f(are)h(treated)g(as)f(a)g(p)s +(ossible)g Fr(login)h(name)p Fu(.)39 b(If)27 b(this)g(login)h(name)f +(is)g(the)g(n)m(ull)g(string,)150 3132 y(the)35 b(tilde)g(is)g (replaced)g(with)f(the)h(v)-5 b(alue)35 b(of)g(the)g -Fs(HOME)e Ft(shell)i(v)-5 b(ariable.)54 b(If)34 b Fs(HOME)g -Ft(is)h(unset,)g(the)g(home)150 3242 y(directory)e(of)g(the)f(user)g +Ft(HOME)e Fu(shell)i(v)-5 b(ariable.)54 b(If)34 b Ft(HOME)g +Fu(is)h(unset,)g(the)g(home)150 3242 y(directory)e(of)g(the)f(user)g (executing)i(the)e(shell)h(is)f(substituted)g(instead.)47 b(Otherwise,)33 b(the)g(tilde-pre\014x)150 3352 y(is)d(replaced)h(with) f(the)h(home)f(directory)h(asso)s(ciated)h(with)e(the)h(sp)s(eci\014ed) e(login)j(name.)275 3487 y(If)g(the)h(tilde-pre\014x)f(is)h(`)p -Fs(~+)p Ft(',)g(the)g(v)-5 b(alue)33 b(of)g(the)g(shell)g(v)-5 -b(ariable)34 b Fs(PWD)d Ft(replaces)j(the)f(tilde-pre\014x.)47 -b(If)150 3597 y(the)31 b(tilde-pre\014x)f(is)g(`)p Fs(~-)p -Ft(',)h(the)f(v)-5 b(alue)31 b(of)g(the)f(shell)h(v)-5 -b(ariable)31 b Fs(OLDPWD)p Ft(,)e(if)h(it)h(is)g(set,)g(is)f -(substituted.)275 3733 y(If)e(the)i(c)m(haracters)g(follo)m(wing)h(the) -e(tilde)h(in)f(the)g(tilde-pre\014x)h(consist)f(of)h(a)f(n)m(um)m(b)s -(er)f Fq(N)10 b Ft(,)30 b(optionally)150 3843 y(pre\014xed)22 -b(b)m(y)h(a)h(`)p Fs(+)p Ft(')f(or)h(a)f(`)p Fs(-)p Ft(',)j(the)d +Ft(~+)p Fu(',)g(the)g(v)-5 b(alue)33 b(of)g(the)g(shell)g(v)-5 +b(ariable)34 b Ft(PWD)d Fu(replaces)j(the)f(tilde-pre\014x.)47 +b(If)150 3597 y(the)31 b(tilde-pre\014x)f(is)g(`)p Ft(~-)p +Fu(',)h(the)f(v)-5 b(alue)31 b(of)g(the)f(shell)h(v)-5 +b(ariable)31 b Ft(OLDPWD)p Fu(,)e(if)h(it)h(is)g(set,)g(is)f +(substituted.)275 3733 y(If)f(the)h(c)m(haracters)h(follo)m(wing)h(the) +e(tilde)g(in)g(the)g(tilde-pre\014x)g(consist)g(of)g(a)h(n)m(um)m(b)s +(er)d Fr(N)p Fu(,)j(optionally)150 3843 y(pre\014xed)22 +b(b)m(y)h(a)h(`)p Ft(+)p Fu(')f(or)h(a)f(`)p Ft(-)p Fu(',)j(the)d (tilde-pre\014x)g(is)h(replaced)f(with)g(the)h(corresp)s(onding)e (elemen)m(t)j(from)e(the)150 3952 y(directory)36 b(stac)m(k,)i(as)e(it) g(w)m(ould)f(b)s(e)g(displa)m(y)m(ed)h(b)m(y)g(the)f -Fs(dirs)g Ft(builtin)g(in)m(v)m(ok)m(ed)i(with)e(the)g(c)m(haracters) +Ft(dirs)g Fu(builtin)g(in)m(v)m(ok)m(ed)i(with)e(the)g(c)m(haracters) 150 4062 y(follo)m(wing)40 b(tilde)f(in)g(the)f(tilde-pre\014x)h(as)g (an)f(argumen)m(t)h(\(see)h(Section)f(6.8)h([The)e(Directory)i(Stac)m -(k],)150 4171 y(page)c(91\).)57 b(If)35 b(the)g(tilde-pre\014x,)i(sans) +(k],)150 4171 y(page)c(90\).)57 b(If)35 b(the)g(tilde-pre\014x,)i(sans) e(the)h(tilde,)h(consists)f(of)g(a)f(n)m(um)m(b)s(er)f(without)i(a)f -(leading)h(`)p Fs(+)p Ft(')g(or)150 4281 y(`)p Fs(-)p -Ft(',)31 b(`)p Fs(+)p Ft(')f(is)h(assumed.)275 4417 y(If)e(the)i(login) +(leading)h(`)p Ft(+)p Fu(')g(or)150 4281 y(`)p Ft(-)p +Fu(',)31 b(`)p Ft(+)p Fu(')f(is)h(assumed.)275 4417 y(If)e(the)i(login) g(name)g(is)f(in)m(v)-5 b(alid,)31 b(or)g(the)f(tilde)h(expansion)f (fails,)i(the)e(w)m(ord)g(is)h(left)g(unc)m(hanged.)275 4553 y(Eac)m(h)38 b(v)-5 b(ariable)38 b(assignmen)m(t)h(is)e(c)m(hec)m (k)m(ed)j(for)d(unquoted)g(tilde-pre\014xes)h(immediately)g(follo)m -(wing)150 4662 y(a)d(`)p Fs(:)p Ft(')g(or)g(the)g(\014rst)f(`)p -Fs(=)p Ft('.)54 b(In)34 b(these)h(cases,)i(tilde)e(expansion)g(is)g +(wing)150 4662 y(a)d(`)p Ft(:)p Fu(')g(or)g(the)g(\014rst)f(`)p +Ft(=)p Fu('.)54 b(In)34 b(these)h(cases,)i(tilde)e(expansion)g(is)g (also)h(p)s(erformed.)52 b(Consequen)m(tly)-8 b(,)37 b(one)150 4772 y(ma)m(y)29 b(use)e(\014lenames)h(with)g(tildes)g(in)g -(assignmen)m(ts)g(to)h Fs(PATH)p Ft(,)f Fs(MAILPATH)p -Ft(,)e(and)h Fs(CDPATH)p Ft(,)g(and)h(the)g(shell)150 +(assignmen)m(ts)g(to)h Ft(PATH)p Fu(,)f Ft(MAILPATH)p +Fu(,)e(and)h Ft(CDPATH)p Fu(,)g(and)h(the)g(shell)150 4882 y(assigns)j(the)f(expanded)g(v)-5 b(alue.)275 5018 y(The)29 b(follo)m(wing)j(table)g(sho)m(ws)e(ho)m(w)g(Bash)h(treats)g -(unquoted)e(tilde-pre\014xes:)150 5179 y Fs(~)432 b Ft(The)30 -b(v)-5 b(alue)31 b(of)f Fs($HOME)150 5340 y(~/foo)240 -b Ft(`)p Fs($HOME/foo)p Ft(')p eop end +(unquoted)e(tilde-pre\014xes:)150 5179 y Ft(~)432 b Fu(The)30 +b(v)-5 b(alue)31 b(of)f Ft($HOME)150 5340 y(~/foo)240 +b($HOME/foo)p eop end %%Page: 23 29 -TeXDict begin 23 28 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 23 28 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(23)150 299 -y Fs(~fred/foo)630 408 y Ft(The)30 b(sub)s(directory)f -Fs(foo)h Ft(of)g(the)h(home)f(directory)h(of)g(the)f(user)g -Fs(fred)150 572 y(~+/foo)192 b Ft(`)p Fs($PWD/foo)p Ft(')150 -736 y Fs(~-/foo)g Ft(`)p Fs(${OLDPWD-'~-'}/foo)p Ft(')150 -899 y Fs(~)p Fi(N)384 b Ft(The)30 b(string)g(that)h(w)m(ould)f(b)s(e)g -(displa)m(y)m(ed)h(b)m(y)f(`)p Fs(dirs)g(+)p Fi(N)11 -b Ft(')150 1063 y Fs(~+)p Fi(N)336 b Ft(The)30 b(string)g(that)h(w)m -(ould)f(b)s(e)g(displa)m(y)m(ed)h(b)m(y)f(`)p Fs(dirs)g(+)p -Fi(N)11 b Ft(')150 1227 y Fs(~-)p Fi(N)336 b Ft(The)30 +y Ft(~fred/foo)630 408 y Fu(The)30 b(sub)s(directory)f +Ft(foo)h Fu(of)g(the)h(home)f(directory)h(of)g(the)f(user)g +Ft(fred)150 572 y(~+/foo)192 b($PWD/foo)150 736 y(~-/foo)g +(${OLDPWD-'~-'}/foo)150 899 y(~)p Fj(N)384 b Fu(The)30 b(string)g(that)h(w)m(ould)f(b)s(e)g(displa)m(y)m(ed)h(b)m(y)f(`)p -Fs(dirs)g(-)p Fi(N)11 b Ft(')150 1430 y Fj(3.5.3)63 b(Shell)41 -b(P)m(arameter)f(Expansion)150 1577 y Ft(The)g(`)p Fs($)p -Ft(')h(c)m(haracter)i(in)m(tro)s(duces)d(parameter)h(expansion,)j -(command)d(substitution,)i(or)e(arithmetic)150 1687 y(expansion.)d(The) -22 b(parameter)h(name)f(or)g(sym)m(b)s(ol)h(to)g(b)s(e)e(expanded)h(ma) -m(y)h(b)s(e)f(enclosed)h(in)f(braces,)i(whic)m(h)150 -1796 y(are)31 b(optional)g(but)f(serv)m(e)h(to)h(protect)f(the)g(v)-5 -b(ariable)31 b(to)g(b)s(e)f(expanded)g(from)g(c)m(haracters)i +Ft(dirs)g(+)p Fj(N)p Fu(')150 1063 y Ft(~+)p Fj(N)336 +b Fu(The)30 b(string)g(that)h(w)m(ould)f(b)s(e)g(displa)m(y)m(ed)h(b)m +(y)f(`)p Ft(dirs)g(+)p Fj(N)p Fu(')150 1227 y Ft(~-)p +Fj(N)336 b Fu(The)30 b(string)g(that)h(w)m(ould)f(b)s(e)g(displa)m(y)m +(ed)h(b)m(y)f(`)p Ft(dirs)g(-)p Fj(N)p Fu(')150 1430 +y Fk(3.5.3)63 b(Shell)41 b(P)m(arameter)f(Expansion)150 +1577 y Fu(The)g(`)p Ft($)p Fu(')h(c)m(haracter)i(in)m(tro)s(duces)d +(parameter)h(expansion,)j(command)d(substitution,)i(or)e(arithmetic)150 +1687 y(expansion.)d(The)22 b(parameter)h(name)f(or)g(sym)m(b)s(ol)h(to) +g(b)s(e)e(expanded)h(ma)m(y)h(b)s(e)f(enclosed)h(in)f(braces,)i(whic)m +(h)150 1796 y(are)31 b(optional)g(but)f(serv)m(e)h(to)h(protect)f(the)g +(v)-5 b(ariable)31 b(to)g(b)s(e)f(expanded)g(from)g(c)m(haracters)i (immediately)150 1906 y(follo)m(wing)g(it)f(whic)m(h)f(could)g(b)s(e)g (in)m(terpreted)h(as)f(part)h(of)f(the)h(name.)275 2045 y(When)44 b(braces)i(are)f(used,)j(the)e(matc)m(hing)g(ending)f(brace)g -(is)g(the)g(\014rst)g(`)p Fs(})p Ft(')g(not)g(escap)s(ed)h(b)m(y)f(a) +(is)g(the)g(\014rst)g(`)p Ft(})p Fu(')g(not)g(escap)s(ed)h(b)m(y)f(a) 150 2154 y(bac)m(kslash)40 b(or)f(within)g(a)g(quoted)g(string,)j(and)c (not)i(within)e(an)h(em)m(b)s(edded)f(arithmetic)j(expansion,)150 2264 y(command)30 b(substitution,)g(or)h(parameter)g(expansion.)275 -2403 y(The)40 b(basic)h(form)g(of)g(parameter)h(expansion)e(is)h($)p -Fs({)p Fq(parameter)7 b Fs(})p Ft(.)73 b(The)40 b(v)-5 -b(alue)42 b(of)f Fq(parameter)48 b Ft(is)150 2512 y(substituted.)43 -b(The)31 b Fq(parameter)39 b Ft(is)31 b(a)h(shell)f(parameter)h(as)g +2403 y(The)40 b(basic)i(form)f(of)g(parameter)h(expansion)f(is)h($)p +Fi({)p Fr(parameter)7 b Fi(})p Fu(.)74 b(The)41 b(v)-5 +b(alue)42 b(of)g Fr(parameter)48 b Fu(is)150 2512 y(substituted.)43 +b(The)31 b Fr(parameter)39 b Fu(is)31 b(a)h(shell)f(parameter)h(as)g (describ)s(ed)e(ab)s(o)m(v)m(e)j(\(see)f(Section)g(3.4)h([Shell)150 2622 y(P)m(arameters],)e(page)f(18\))h(or)e(an)g(arra)m(y)h(reference)f (\(see)i(Section)f(6.7)g([Arra)m(ys],)g(page)g(89\).)42 b(The)29 b(braces)150 2731 y(are)j(required)g(when)f -Fq(parameter)39 b Ft(is)32 b(a)h(p)s(ositional)f(parameter)h(with)f -(more)g(than)g(one)g(digit,)i(or)e(when)150 2841 y Fq(parameter)37 -b Ft(is)31 b(follo)m(w)m(ed)h(b)m(y)e(a)h(c)m(haracter)h(that)f(is)f +Fr(parameter)39 b Fu(is)32 b(a)h(p)s(ositional)f(parameter)h(with)f +(more)g(than)g(one)g(digit,)i(or)e(when)150 2841 y Fr(parameter)37 +b Fu(is)31 b(follo)m(w)m(ed)h(b)m(y)e(a)h(c)m(haracter)h(that)f(is)f (not)h(to)g(b)s(e)f(in)m(terpreted)g(as)h(part)f(of)h(its)f(name.)275 -2980 y(If)36 b(the)h(\014rst)f(c)m(haracter)i(of)f Fq(parameter)44 -b Ft(is)37 b(an)f(exclamation)j(p)s(oin)m(t)e(\(!\),)i(it)f(in)m(tro)s -(duces)e(a)h(lev)m(el)i(of)150 3089 y(v)-5 b(ariable)31 -b(indirection.)41 b(Bash)30 b(uses)f(the)h(v)-5 b(alue)31 -b(of)f(the)g(v)-5 b(ariable)30 b(formed)g(from)f(the)h(rest)g(of)g -Fq(parameter)150 3199 y Ft(as)c(the)g(name)g(of)g(the)h(v)-5 +2980 y(If)36 b(the)h(\014rst)f(c)m(haracter)i(of)f Fr(parameter)44 +b Fu(is)37 b(an)f(exclamation)j(p)s(oin)m(t)e(\(!\),)i(it)f(in)m(tro)s +(duces)e(a)h(lev)m(el)i(of)150 3089 y(v)-5 b(ariable)30 +b(indirection.)41 b(Bash)30 b(uses)f(the)g(v)-5 b(alue)30 +b(of)g(the)f(v)-5 b(ariable)30 b(formed)f(from)g(the)h(rest)f(of)h +Fr(parameter)150 3199 y Fu(as)c(the)g(name)g(of)g(the)h(v)-5 b(ariable;)28 b(this)e(v)-5 b(ariable)27 b(is)f(then)f(expanded)g(and)h (that)g(v)-5 b(alue)27 b(is)f(used)f(in)h(the)g(rest)150 3308 y(of)34 b(the)f(substitution,)i(rather)e(than)g(the)h(v)-5 -b(alue)34 b(of)g Fq(parameter)40 b Ft(itself.)51 b(This)33 -b(is)g(kno)m(wn)g(as)h Fs(indirect)150 3418 y(expansion)p -Ft(.)81 b(The)44 b(exceptions)i(to)f(this)g(are)g(the)g(expansions)f -(of)h($)p Fs({)p Ft(!)p Fq(pre\014x)6 b Ft(*)p Fs(})44 -b Ft(and)g($)p Fs({)p Ft(!)p Fq(name)5 b Ft([)p Fs(@)p -Ft(])p Fs(})150 3528 y Ft(describ)s(ed)28 b(b)s(elo)m(w.)41 -b(The)28 b(exclamation)j(p)s(oin)m(t)f(m)m(ust)f(immediately)h(follo)m -(w)g(the)g(left)f(brace)h(in)f(order)f(to)150 3637 y(in)m(tro)s(duce)i +b(alue)34 b(of)g Fr(parameter)40 b Fu(itself.)51 b(This)33 +b(is)g(kno)m(wn)g(as)h Ft(indirect)150 3418 y(expansion)p +Fu(.)78 b(The)43 b(exceptions)i(to)f(this)f(are)h(the)g(expansions)g +(of)f($)p Fi({)p Fu(!)p Fr(pre\014x)6 b Fu(*)p Fi(})45 +b Fu(and)e($)p Fi({)p Fu(!)p Fr(name)5 b Fu([@])p Fi(})150 +3528 y Fu(describ)s(ed)28 b(b)s(elo)m(w.)41 b(The)28 +b(exclamation)j(p)s(oin)m(t)f(m)m(ust)f(immediately)h(follo)m(w)g(the)g +(left)f(brace)h(in)f(order)f(to)150 3637 y(in)m(tro)s(duce)i (indirection.)275 3776 y(In)39 b(eac)m(h)i(of)g(the)f(cases)h(b)s(elo)m -(w,)i Fq(w)m(ord)h Ft(is)c(sub)5 b(ject)40 b(to)h(tilde)f(expansion,)j +(w,)i Fr(w)m(ord)h Fu(is)c(sub)5 b(ject)40 b(to)h(tilde)f(expansion,)j (parameter)e(expansion,)150 3886 y(command)30 b(substitution,)g(and)g (arithmetic)i(expansion.)275 4024 y(When)h(not)h(p)s(erforming)e (substring)h(expansion,)h(using)g(the)f(form)h(describ)s(ed)e(b)s(elo)m -(w)i(\(e.g.,)i(`)p Fs(:-)p Ft('\),)150 4134 y(Bash)d(tests)h(for)e(a)i +(w)i(\(e.g.,)i(`)p Ft(:-)p Fu('\),)150 4134 y(Bash)d(tests)h(for)e(a)i (parameter)f(that)h(is)e(unset)h(or)g(n)m(ull.)48 b(Omitting)33 b(the)h(colon)f(results)g(in)g(a)g(test)h(only)150 4243 y(for)c(a)i(parameter)f(that)g(is)g(unset.)41 b(Put)31 b(another)f(w)m(a)m(y)-8 b(,)33 b(if)e(the)f(colon)i(is)f(included,)f (the)h(op)s(erator)g(tests)150 4353 y(for)36 b(b)s(oth)g -Fq(parameter)7 b Ft('s)37 b(existence)h(and)e(that)i(its)f(v)-5 +Fr(parameter)7 b Fu('s)37 b(existence)h(and)e(that)i(its)f(v)-5 b(alue)37 b(is)g(not)f(n)m(ull;)k(if)d(the)g(colon)h(is)e(omitted,)k (the)150 4463 y(op)s(erator)31 b(tests)g(only)f(for)g(existence.)150 -4628 y Fs(${)p Fi(parameter)11 b Fs(:)p Fp(\000)p Fi(word)g -Fs(})630 4738 y Ft(If)30 b Fq(parameter)37 b Ft(is)30 -b(unset)g(or)h(n)m(ull,)f(the)h(expansion)f(of)g Fq(w)m(ord)k -Ft(is)c(substituted.)40 b(Otherwise,)630 4848 y(the)31 -b(v)-5 b(alue)30 b(of)h Fq(parameter)37 b Ft(is)31 b(substituted.)150 -5011 y Fs(${)p Fi(parameter)11 b Fs(:=)p Fi(word)g Fs(})630 -5121 y Ft(If)32 b Fq(parameter)40 b Ft(is)32 b(unset)g(or)h(n)m(ull,)g -(the)f(expansion)h(of)f Fq(w)m(ord)k Ft(is)d(assigned)f(to)i -Fq(parameter)7 b Ft(.)630 5230 y(The)30 b(v)-5 b(alue)32 -b(of)f Fq(parameter)38 b Ft(is)31 b(then)g(substituted.)42 -b(P)m(ositional)33 b(parameters)e(and)f(sp)s(ecial)630 -5340 y(parameters)h(ma)m(y)g(not)f(b)s(e)g(assigned)h(to)g(in)f(this)g -(w)m(a)m(y)-8 b(.)p eop end +4628 y Ft(${)p Fj(parameter)p Ft(:)p Fq(\000)p Fj(word)p +Ft(})630 4738 y Fu(If)g Fr(parameter)37 b Fu(is)30 b(unset)g(or)h(n)m +(ull,)f(the)h(expansion)f(of)g Fr(w)m(ord)k Fu(is)c(substituted.)40 +b(Otherwise,)630 4848 y(the)31 b(v)-5 b(alue)30 b(of)h +Fr(parameter)37 b Fu(is)31 b(substituted.)150 5011 y +Ft(${)p Fj(parameter)p Ft(:=)p Fj(word)p Ft(})630 5121 +y Fu(If)i Fr(parameter)40 b Fu(is)33 b(unset)f(or)h(n)m(ull,)h(the)f +(expansion)g(of)g Fr(w)m(ord)j Fu(is)d(assigned)g(to)h +Fr(parameter)p Fu(.)630 5230 y(The)c(v)-5 b(alue)32 b(of)f +Fr(parameter)38 b Fu(is)31 b(then)g(substituted.)42 b(P)m(ositional)33 +b(parameters)e(and)f(sp)s(ecial)630 5340 y(parameters)h(ma)m(y)g(not)f +(b)s(e)g(assigned)h(to)g(in)f(this)g(w)m(a)m(y)-8 b(.)p +eop end %%Page: 24 30 -TeXDict begin 24 29 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 24 29 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(24)150 299 -y Fs(${)p Fi(parameter)11 b Fs(:?)p Fi(word)g Fs(})630 -408 y Ft(If)26 b Fq(parameter)33 b Ft(is)26 b(n)m(ull)g(or)g(unset,)h -(the)f(expansion)g(of)g Fq(w)m(ord)k Ft(\(or)c(a)h(message)g(to)g(that) -f(e\013ect)630 518 y(if)i Fq(w)m(ord)j Ft(is)d(not)g(presen)m(t\))h(is) -f(written)g(to)h(the)f(standard)f(error)h(and)f(the)h(shell,)h(if)f(it) -h(is)f(not)630 628 y(in)m(teractiv)m(e,)33 b(exits.)42 -b(Otherwise,)30 b(the)h(v)-5 b(alue)31 b(of)f Fq(parameter)38 -b Ft(is)30 b(substituted.)150 800 y Fs(${)p Fi(parameter)11 -b Fs(:+)p Fi(word)g Fs(})630 909 y Ft(If)35 b Fq(parameter)42 -b Ft(is)36 b(n)m(ull)f(or)h(unset,)g(nothing)g(is)f(substituted,)i -(otherwise)e(the)h(expansion)630 1019 y(of)31 b Fq(w)m(ord)i -Ft(is)e(substituted.)150 1191 y Fs(${)p Fi(parameter)11 -b Fs(:)p Fi(offset)g Fs(})150 1301 y(${)p Fi(parameter)g -Fs(:)p Fi(offset)g Fs(:)p Fi(le)o(ngt)o(h)g Fs(})630 -1410 y Ft(This)30 b(is)h(referred)f(to)h(as)g(Substring)f(Expansion.)41 -b(It)31 b(expands)f(to)h(up)f(to)h Fq(length)g Ft(c)m(harac-)630 -1520 y(ters)k(of)g(the)g(v)-5 b(alue)35 b(of)h Fq(parameter)41 -b Ft(starting)36 b(at)g(the)f(c)m(haracter)h(sp)s(eci\014ed)e(b)m(y)h -Fq(o\013set)r Ft(.)55 b(If)630 1630 y Fq(parameter)32 -b Ft(is)26 b(`)p Fs(@)p Ft(',)g(an)f(indexed)g(arra)m(y)h(subscripted)e -(b)m(y)h(`)p Fs(@)p Ft(')g(or)h(`)p Fs(*)p Ft(',)g(or)g(an)f(asso)s +y Ft(${)p Fj(parameter)p Ft(:?)p Fj(word)p Ft(})630 408 +y Fu(If)26 b Fr(parameter)33 b Fu(is)26 b(n)m(ull)g(or)g(unset,)h(the)f +(expansion)g(of)g Fr(w)m(ord)k Fu(\(or)c(a)h(message)g(to)g(that)f +(e\013ect)630 518 y(if)i Fr(w)m(ord)j Fu(is)d(not)g(presen)m(t\))h(is)f +(written)g(to)h(the)f(standard)f(error)h(and)f(the)h(shell,)h(if)f(it)h +(is)f(not)630 628 y(in)m(teractiv)m(e,)33 b(exits.)42 +b(Otherwise,)30 b(the)h(v)-5 b(alue)31 b(of)f Fr(parameter)38 +b Fu(is)30 b(substituted.)150 800 y Ft(${)p Fj(parameter)p +Ft(:+)p Fj(word)p Ft(})630 909 y Fu(If)35 b Fr(parameter)42 +b Fu(is)36 b(n)m(ull)f(or)h(unset,)g(nothing)g(is)f(substituted,)i +(otherwise)e(the)h(expansion)630 1019 y(of)31 b Fr(w)m(ord)i +Fu(is)e(substituted.)150 1191 y Ft(${)p Fj(parameter)p +Ft(:)p Fj(offset)p Ft(})150 1301 y(${)p Fj(parameter)p +Ft(:)p Fj(offset)p Ft(:)p Fj(lengt)o(h)p Ft(})630 1410 +y Fu(This)f(is)h(referred)f(to)h(as)g(Substring)f(Expansion.)41 +b(It)31 b(expands)f(to)h(up)f(to)h Fr(length)g Fu(c)m(harac-)630 +1520 y(ters)k(of)g(the)h(v)-5 b(alue)35 b(of)g Fr(parameter)42 +b Fu(starting)36 b(at)g(the)f(c)m(haracter)i(sp)s(eci\014ed)d(b)m(y)h +Fr(o\013set)p Fu(.)55 b(If)630 1630 y Fr(parameter)32 +b Fu(is)26 b(`)p Ft(@)p Fu(',)g(an)f(indexed)g(arra)m(y)h(subscripted)e +(b)m(y)h(`)p Ft(@)p Fu(')g(or)h(`)p Ft(*)p Fu(',)g(or)g(an)f(asso)s (ciativ)m(e)j(ar-)630 1739 y(ra)m(y)g(name,)h(the)f(results)g(di\013er) -g(as)g(describ)s(ed)f(b)s(elo)m(w.)40 b(If)28 b Fq(length)g -Ft(is)g(omitted,)i(it)f(expands)630 1849 y(to)e(the)g(substring)f(of)g -(the)h(v)-5 b(alue)27 b(of)g Fq(parameter)33 b Ft(starting)28 +g(as)g(describ)s(ed)f(b)s(elo)m(w.)40 b(If)28 b Fr(length)g +Fu(is)g(omitted,)i(it)f(expands)630 1849 y(to)e(the)g(substring)f(of)g +(the)h(v)-5 b(alue)27 b(of)g Fr(parameter)33 b Fu(starting)28 b(at)f(the)g(c)m(haracter)h(sp)s(eci\014ed)e(b)m(y)630 -1958 y Fq(o\013set)37 b Ft(and)d(extending)g(to)h(the)f(end)g(of)g(the) -g(v)-5 b(alue.)53 b Fq(length)34 b Ft(and)g Fq(o\013set)j -Ft(are)e(arithmetic)630 2068 y(expressions)30 b(\(see)h(Section)g(6.5)h +1958 y Fr(o\013set)37 b Fu(and)d(extending)g(to)h(the)f(end)g(of)g(the) +g(v)-5 b(alue.)53 b Fr(length)34 b Fu(and)g Fr(o\013set)j +Fu(are)e(arithmetic)630 2068 y(expressions)30 b(\(see)h(Section)g(6.5)h ([Shell)e(Arithmetic],)i(page)f(87\).)630 2209 y(If)39 -b Fq(o\013set)k Ft(ev)-5 b(aluates)41 b(to)f(a)g(n)m(um)m(b)s(er)f +b Fr(o\013set)k Fu(ev)-5 b(aluates)41 b(to)f(a)g(n)m(um)m(b)s(er)f (less)h(than)f(zero,)k(the)d(v)-5 b(alue)40 b(is)g(used)e(as)i(an)g -(o\013set)630 2318 y(in)33 b(c)m(haracters)i(from)d(the)i(end)e(of)i -(the)f(v)-5 b(alue)34 b(of)f Fq(parameter)7 b Ft(.)49 -b(If)33 b Fq(length)h Ft(ev)-5 b(aluates)35 b(to)f(a)630 -2428 y(n)m(um)m(b)s(er)23 b(less)h(than)g(zero,)j(it)d(is)h(in)m -(terpreted)f(as)g(an)h(o\013set)g(in)f(c)m(haracters)h(from)f(the)g -(end)g(of)630 2538 y(the)31 b(v)-5 b(alue)31 b(of)g Fq(parameter)38 -b Ft(rather)30 b(than)h(a)g(n)m(um)m(b)s(er)f(of)g(c)m(haracters,)j +(o\013set)630 2318 y(in)33 b(c)m(haracters)i(from)f(the)f(end)g(of)h +(the)g(v)-5 b(alue)34 b(of)g Fr(parameter)p Fu(.)51 b(If)33 +b Fr(length)h Fu(ev)-5 b(aluates)35 b(to)g(a)630 2428 +y(n)m(um)m(b)s(er)23 b(less)h(than)g(zero,)j(it)d(is)h(in)m(terpreted)f +(as)g(an)h(o\013set)g(in)f(c)m(haracters)h(from)f(the)g(end)g(of)630 +2538 y(the)31 b(v)-5 b(alue)31 b(of)g Fr(parameter)38 +b Fu(rather)30 b(than)h(a)g(n)m(um)m(b)s(er)f(of)g(c)m(haracters,)j (and)d(the)h(expansion)630 2647 y(is)39 b(the)g(c)m(haracters)i(b)s(et) -m(w)m(een)f Fq(o\013set)i Ft(and)c(that)i(result.)67 +m(w)m(een)f Fr(o\013set)i Fu(and)c(that)i(result.)67 b(Note)40 b(that)g(a)g(negativ)m(e)h(o\013set)630 2757 y(m)m(ust)27 b(b)s(e)g(separated)g(from)g(the)g(colon)i(b)m(y)e(at)h (least)g(one)f(space)h(to)g(a)m(v)m(oid)h(b)s(eing)e(confused)630 -2866 y(with)j(the)h(`)p Fs(:-)p Ft(')f(expansion.)630 +2866 y(with)j(the)h(`)p Ft(:-)p Fu(')f(expansion.)630 3007 y(Here)43 b(are)g(some)f(examples)h(illustrating)g(substring)f (expansion)g(on)g(parameters)h(and)630 3117 y(subscripted)29 -b(arra)m(ys:)630 3258 y Fs($)47 b(string=01234567890abcdefgh)630 +b(arra)m(ys:)630 3258 y Ft($)47 b(string=01234567890abcdefgh)630 3367 y($)g(echo)g(${string:7})630 3477 y(7890abcdefgh)630 3587 y($)g(echo)g(${string:7:0})630 3806 y($)g(echo)g(${string:7:2})630 3915 y(78)630 4025 y($)g(echo)g(${string:7:-2})630 4134 @@ -9249,9 +9800,9 @@ y(7890abcdef)630 4244 y($)g(echo)g(${string:)e(-7})630 5121 y($)i(set)g(--)h(01234567890abcdefgh)630 5230 y($)f(echo)g(${1:7}) 630 5340 y(7890abcdefgh)p eop end %%Page: 25 31 -TeXDict begin 25 30 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 25 30 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(25)630 299 -y Fs($)47 b(echo)g(${1:7:0})630 518 y($)g(echo)g(${1:7:2})630 +y Ft($)47 b(echo)g(${1:7:0})630 518 y($)g(echo)g(${1:7:2})630 628 y(78)630 737 y($)g(echo)g(${1:7:-2})630 847 y(7890abcdef)630 956 y($)g(echo)g(${1:)g(-7})630 1066 y(bcdefgh)630 1176 y($)g(echo)g(${1:)g(-7:0})630 1395 y($)g(echo)g(${1:)g(-7:2})630 @@ -9264,18 +9815,18 @@ y(bcdef)630 1833 y($)g(array[0]=01234567890abcdef)o(gh)630 2929 y(bcdefgh)630 3039 y($)i(echo)g(${array[0]:)e(-7:0})630 3258 y($)i(echo)g(${array[0]:)e(-7:2})630 3367 y(bc)630 3477 y($)i(echo)g(${array[0]:)e(-7:-2})630 3587 y(bcdef)630 -3733 y Ft(If)22 b Fq(parameter)30 b Ft(is)23 b(`)p Fs(@)p -Ft(',)i(the)e(result)f(is)h Fq(length)g Ft(p)s(ositional)h(parameters)f -(b)s(eginning)f(at)i Fq(o\013set)r Ft(.)630 3842 y(A)36 -b(negativ)m(e)j Fq(o\013set)g Ft(is)e(tak)m(en)g(relativ)m(e)i(to)e +3733 y Fu(If)22 b Fr(parameter)30 b Fu(is)23 b(`)p Ft(@)p +Fu(',)i(the)e(result)g(is)g Fr(length)h Fu(p)s(ositional)f(parameters)h +(b)s(eginning)e(at)i Fr(o\013set)p Fu(.)630 3842 y(A)36 +b(negativ)m(e)j Fr(o\013set)g Fu(is)e(tak)m(en)g(relativ)m(e)i(to)e (one)g(greater)g(than)f(the)h(greatest)h(p)s(ositional)630 3952 y(parameter,)29 b(so)f(an)g(o\013set)h(of)f(-1)g(ev)-5 b(aluates)30 b(to)e(the)g(last)h(p)s(ositional)g(parameter.)40 b(It)28 b(is)g(an)630 4061 y(expansion)i(error)g(if)h -Fq(length)f Ft(ev)-5 b(aluates)32 b(to)f(a)g(n)m(um)m(b)s(er)e(less)i +Fr(length)f Fu(ev)-5 b(aluates)32 b(to)f(a)g(n)m(um)m(b)s(er)e(less)i (than)f(zero.)630 4208 y(The)i(follo)m(wing)i(examples)f(illustrate)h (substring)d(expansion)i(using)f(p)s(ositional)h(param-)630 -4317 y(eters:)630 4463 y Fs($)47 b(set)g(--)h(1)f(2)g(3)h(4)f(5)h(6)f +4317 y(eters:)630 4463 y Ft($)47 b(set)g(--)h(1)f(2)g(3)h(4)f(5)h(6)f (7)h(8)f(9)h(0)f(a)h(b)f(c)g(d)h(e)f(f)h(g)f(h)630 4573 y($)g(echo)g(${@:7})630 4682 y(7)g(8)h(9)f(0)h(a)f(b)h(c)f(d)h(e)f(f)h (g)f(h)630 4792 y($)g(echo)g(${@:7:0})630 5011 y($)g(echo)g(${@:7:2}) @@ -9283,25 +9834,25 @@ y($)g(echo)g(${@:7})630 4682 y(7)g(8)h(9)f(0)h(a)f(b)h(c)f(d)h(e)f(f)h 5340 y(bash:)f(-2:)h(substring)f(expression)f(<)i(0)p eop end %%Page: 26 32 -TeXDict begin 26 31 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 26 31 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(26)630 299 -y Fs($)47 b(echo)g(${@:)g(-7:2})630 408 y(b)g(c)630 518 +y Ft($)47 b(echo)g(${@:)g(-7:2})630 408 y(b)g(c)630 518 y($)g(echo)g(${@:0})630 628 y(./bash)f(1)i(2)f(3)g(4)h(5)f(6)h(7)f(8)h (9)f(0)h(a)f(b)h(c)f(d)g(e)h(f)f(g)h(h)630 737 y($)f(echo)g(${@:0:2}) 630 847 y(./bash)f(1)630 956 y($)h(echo)g(${@:)g(-7:0})630 -1200 y Ft(If)36 b Fq(parameter)43 b Ft(is)36 b(an)g(indexed)g(arra)m(y) -g(name)g(subscripted)f(b)m(y)h(`)p Fs(@)p Ft(')g(or)h(`)p -Fs(*)p Ft(',)h(the)e(result)g(is)630 1310 y(the)h Fq(length)g -Ft(mem)m(b)s(ers)f(of)h(the)g(arra)m(y)g(b)s(eginning)f(with)h -Fs(${)p Fi(parameter)11 b Fs([)p Fi(offset)g Fs(])o(})p -Ft(.)54 b(A)630 1419 y(negativ)m(e)33 b Fq(o\013set)g -Ft(is)e(tak)m(en)h(relativ)m(e)g(to)g(one)f(greater)g(than)g(the)f -(maxim)m(um)h(index)f(of)h(the)630 1529 y(sp)s(eci\014ed)38 -b(arra)m(y)-8 b(.)65 b(It)38 b(is)g(an)h(expansion)f(error)f(if)i -Fq(length)f Ft(ev)-5 b(aluates)40 b(to)f(a)g(n)m(um)m(b)s(er)e(less)630 +1200 y Fu(If)36 b Fr(parameter)43 b Fu(is)36 b(an)g(indexed)g(arra)m(y) +g(name)g(subscripted)f(b)m(y)h(`)p Ft(@)p Fu(')g(or)h(`)p +Ft(*)p Fu(',)h(the)e(result)g(is)630 1310 y(the)j Fr(length)g +Fu(mem)m(b)s(ers)f(of)h(the)f(arra)m(y)i(b)s(eginning)d(with)i +Ft(${)p Fj(parameter)p Ft([)p Fj(offset)p Ft(]})p Fu(.)60 +b(A)630 1419 y(negativ)m(e)33 b Fr(o\013set)g Fu(is)e(tak)m(en)h +(relativ)m(e)g(to)g(one)f(greater)g(than)g(the)f(maxim)m(um)h(index)f +(of)h(the)630 1529 y(sp)s(eci\014ed)38 b(arra)m(y)-8 +b(.)65 b(It)38 b(is)g(an)h(expansion)f(error)f(if)i Fr(length)f +Fu(ev)-5 b(aluates)40 b(to)f(a)g(n)m(um)m(b)s(er)e(less)630 1638 y(than)30 b(zero.)630 1772 y(These)23 b(examples)i(sho)m(w)e(ho)m (w)h(y)m(ou)g(can)g(use)f(substring)f(expansion)i(with)f(indexed)g -(arra)m(ys:)630 1906 y Fs($)47 b(array=\(0)f(1)h(2)h(3)f(4)h(5)f(6)h(7) +(arra)m(ys:)630 1906 y Ft($)47 b(array=\(0)f(1)h(2)h(3)f(4)h(5)f(6)h(7) f(8)h(9)f(0)h(a)f(b)g(c)h(d)f(e)h(f)f(g)h(h\))630 2016 y($)f(echo)g(${array[@]:7})630 2125 y(7)g(8)h(9)f(0)h(a)f(b)h(c)f(d)h (e)f(f)h(g)f(h)630 2235 y($)g(echo)g(${array[@]:7:2})630 @@ -9311,212 +9862,211 @@ y($)f(echo)g(${array[@]:7})630 2125 y(7)g(8)h(9)f(0)h(a)f(b)h(c)f(d)h 2892 y($)g(echo)g(${array[@]:0})630 3002 y(0)g(1)h(2)f(3)h(4)f(5)h(6)f (7)h(8)f(9)h(0)f(a)g(b)h(c)f(d)h(e)f(f)h(g)f(h)630 3112 y($)g(echo)g(${array[@]:0:2})630 3221 y(0)g(1)630 3331 -y($)g(echo)g(${array[@]:)e(-7:0})630 3574 y Ft(Substring)25 +y($)g(echo)g(${array[@]:)e(-7:0})630 3574 y Fu(Substring)25 b(expansion)g(applied)h(to)h(an)f(asso)s(ciativ)m(e)j(arra)m(y)d(pro)s (duces)f(unde\014ned)f(results.)630 3708 y(Substring)32 b(indexing)i(is)f(zero-based)i(unless)e(the)h(p)s(ositional)g (parameters)g(are)g(used,)g(in)630 3818 y(whic)m(h)29 b(case)i(the)f(indexing)g(starts)g(at)g(1)g(b)m(y)g(default.)41 -b(If)29 b Fq(o\013set)k Ft(is)d(0,)g(and)f(the)h(p)s(ositional)630 -3927 y(parameters)h(are)f(used,)g Fs($@)g Ft(is)g(pre\014xed)g(to)h -(the)f(list.)150 4086 y Fs(${!)p Fi(prefix)11 b Fs(*})150 -4195 y(${!)p Fi(prefix)g Fs(@})630 4305 y Ft(Expands)23 -b(to)i(the)g(names)f(of)h(v)-5 b(ariables)25 b(whose)f(names)g(b)s -(egin)g(with)g Fq(pre\014x)6 b Ft(,)25 b(separated)g(b)m(y)630 -4415 y(the)k(\014rst)f(c)m(haracter)j(of)e(the)g Fs(IFS)f -Ft(sp)s(ecial)i(v)-5 b(ariable.)41 b(When)29 b(`)p Fs(@)p -Ft(')g(is)g(used)f(and)h(the)g(expan-)630 4524 y(sion)35 +b(If)29 b Fr(o\013set)k Fu(is)d(0,)g(and)f(the)h(p)s(ositional)630 +3927 y(parameters)h(are)f(used,)g Ft($@)g Fu(is)g(pre\014xed)g(to)h +(the)f(list.)150 4086 y Ft(${!)p Fj(prefix)p Ft(*})150 +4195 y(${!)p Fj(prefix)p Ft(@})630 4305 y Fu(Expands)24 +b(to)h(the)g(names)g(of)g(v)-5 b(ariables)26 b(whose)f(names)f(b)s +(egin)h(with)f Fr(pre\014x)p Fu(,)i(separated)f(b)m(y)630 +4415 y(the)k(\014rst)f(c)m(haracter)j(of)e(the)g Ft(IFS)f +Fu(sp)s(ecial)i(v)-5 b(ariable.)41 b(When)29 b(`)p Ft(@)p +Fu(')g(is)g(used)f(and)h(the)g(expan-)630 4524 y(sion)35 b(app)s(ears)g(within)f(double)h(quotes,)i(eac)m(h)f(v)-5 b(ariable)36 b(name)f(expands)g(to)g(a)h(separate)630 -4634 y(w)m(ord.)150 4792 y Fs(${!)p Fi(name)11 b Fs([@]})150 -4902 y(${!)p Fi(name)g Fs([*]})630 5011 y Ft(If)26 b -Fq(name)32 b Ft(is)27 b(an)f(arra)m(y)h(v)-5 b(ariable,)29 +4634 y(w)m(ord.)150 4792 y Ft(${!)p Fj(name)p Ft([@]})150 +4902 y(${!)p Fj(name)p Ft([*]})630 5011 y Fu(If)26 b +Fr(name)32 b Fu(is)27 b(an)f(arra)m(y)h(v)-5 b(ariable,)29 b(expands)d(to)h(the)g(list)g(of)g(arra)m(y)g(indices)g(\(k)m(eys\))h -(assigned)630 5121 y(in)c Fq(name)5 b Ft(.)39 b(If)23 -b Fq(name)30 b Ft(is)24 b(not)g(an)g(arra)m(y)-8 b(,)27 -b(expands)c(to)i(0)f(if)h Fq(name)k Ft(is)24 b(set)h(and)e(n)m(ull)h -(otherwise.)630 5230 y(When)39 b(`)p Fs(@)p Ft(')h(is)f(used)g(and)f +(assigned)630 5121 y(in)c Fr(name)p Fu(.)39 b(If)24 b +Fr(name)30 b Fu(is)24 b(not)h(an)f(arra)m(y)-8 b(,)27 +b(expands)c(to)j(0)f(if)f Fr(name)30 b Fu(is)24 b(set)h(and)f(n)m(ull)g +(otherwise.)630 5230 y(When)39 b(`)p Ft(@)p Fu(')h(is)f(used)g(and)f (the)i(expansion)f(app)s(ears)g(within)f(double)h(quotes,)k(eac)m(h)d (k)m(ey)630 5340 y(expands)30 b(to)h(a)f(separate)i(w)m(ord.)p eop end %%Page: 27 33 -TeXDict begin 27 32 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 27 32 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(27)150 299 -y Fs(${#)p Fi(parameter)11 b Fs(})630 408 y Ft(The)40 -b(length)g(in)g(c)m(haracters)i(of)e(the)h(expanded)e(v)-5 -b(alue)41 b(of)f Fq(parameter)47 b Ft(is)40 b(substituted.)630 -518 y(If)i Fq(parameter)50 b Ft(is)43 b(`)p Fs(*)p Ft(')g(or)g(`)p -Fs(@)p Ft(',)k(the)c(v)-5 b(alue)43 b(substituted)f(is)h(the)g(n)m(um)m +y Ft(${#)p Fj(parameter)p Ft(})630 408 y Fu(The)40 b(length)g(in)g(c)m +(haracters)i(of)e(the)h(expanded)e(v)-5 b(alue)41 b(of)f +Fr(parameter)47 b Fu(is)40 b(substituted.)630 518 y(If)i +Fr(parameter)50 b Fu(is)43 b(`)p Ft(*)p Fu(')g(or)g(`)p +Ft(@)p Fu(',)k(the)c(v)-5 b(alue)43 b(substituted)f(is)h(the)g(n)m(um)m (b)s(er)f(of)h(p)s(ositional)630 628 y(parameters.)i(If)32 -b Fq(parameter)38 b Ft(is)32 b(an)g(arra)m(y)g(name)g(subscripted)f(b)m -(y)g(`)p Fs(*)p Ft(')h(or)g(`)p Fs(@)p Ft(',)g(the)g(v)-5 +b Fr(parameter)38 b Fu(is)32 b(an)g(arra)m(y)g(name)g(subscripted)f(b)m +(y)g(`)p Ft(*)p Fu(')h(or)g(`)p Ft(@)p Fu(',)g(the)g(v)-5 b(alue)630 737 y(substituted)30 b(is)h(the)g(n)m(um)m(b)s(er)e(of)i (elemen)m(ts)i(in)d(the)h(arra)m(y)-8 b(.)43 b(If)30 -b Fq(parameter)38 b Ft(is)31 b(an)f(indexed)630 847 y(arra)m(y)37 +b Fr(parameter)38 b Fu(is)31 b(an)f(indexed)630 847 y(arra)m(y)37 b(name)g(subscripted)f(b)m(y)h(a)g(negativ)m(e)i(n)m(um)m(b)s(er,)f (that)f(n)m(um)m(b)s(er)f(is)g(in)m(terpreted)i(as)630 -956 y(relativ)m(e)47 b(to)e(one)h(greater)g(than)e(the)h(maxim)m(um)g -(index)f(of)h Fq(parameter)7 b Ft(,)49 b(so)c(negativ)m(e)630 +956 y(relativ)m(e)47 b(to)g(one)e(greater)i(than)e(the)h(maxim)m(um)f +(index)g(of)g Fr(parameter)p Fu(,)50 b(so)c(negativ)m(e)630 1066 y(indices)30 b(coun)m(t)h(bac)m(k)g(from)f(the)h(end)e(of)i(the)f (arra)m(y)-8 b(,)32 b(and)e(an)g(index)g(of)g(-1)h(references)g(the)630 -1176 y(last)g(elemen)m(t.)150 1395 y Fs(${)p Fi(parameter)11 -b Fs(#)p Fi(word)g Fs(})150 1504 y(${)p Fi(parameter)g -Fs(##)p Fi(word)g Fs(})630 1614 y Ft(The)31 b Fq(w)m(ord)k -Ft(is)d(expanded)f(to)i(pro)s(duce)e(a)h(pattern)g(just)f(as)i(in)e +1176 y(last)g(elemen)m(t.)150 1395 y Ft(${)p Fj(parameter)p +Ft(#)p Fj(word)p Ft(})150 1504 y(${)p Fj(parameter)p +Ft(##)p Fj(word)p Ft(})630 1614 y Fu(The)g Fr(w)m(ord)k +Fu(is)d(expanded)f(to)i(pro)s(duce)e(a)h(pattern)g(just)f(as)i(in)e (\014lename)h(expansion)g(\(see)630 1724 y(Section)k(3.5.8)h([Filename) g(Expansion],)g(page)f(29\).)56 b(If)35 b(the)h(pattern)f(matc)m(hes)i -(the)e(b)s(e-)630 1833 y(ginning)g(of)g(the)g(expanded)f(v)-5 -b(alue)36 b(of)f Fq(parameter)7 b Ft(,)36 b(then)f(the)g(result)g(of)g -(the)g(expansion)630 1943 y(is)28 b(the)g(expanded)e(v)-5 -b(alue)28 b(of)g Fq(parameter)35 b Ft(with)27 b(the)h(shortest)g(matc)m -(hing)h(pattern)f(\(the)g(`)p Fs(#)p Ft(')630 2052 y(case\))e(or)f(the) -g(longest)g(matc)m(hing)h(pattern)f(\(the)g(`)p Fs(##)p -Ft(')g(case\))h(deleted.)39 b(If)24 b Fq(parameter)32 -b Ft(is)25 b(`)p Fs(@)p Ft(')630 2162 y(or)j(`)p Fs(*)p -Ft(',)i(the)e(pattern)h(remo)m(v)-5 b(al)29 b(op)s(eration)g(is)f +(the)e(b)s(e-)630 1833 y(ginning)28 b(of)g(the)h(expanded)e(v)-5 +b(alue)29 b(of)f Fr(parameter)p Fu(,)h(then)f(the)g(result)g(of)h(the)f +(expansion)g(is)630 1943 y(the)36 b(expanded)f(v)-5 b(alue)36 +b(of)g Fr(parameter)43 b Fu(with)35 b(the)h(shortest)g(matc)m(hing)h +(pattern)f(\(the)g(`)p Ft(#)p Fu(')630 2052 y(case\))26 +b(or)f(the)g(longest)g(matc)m(hing)h(pattern)f(\(the)g(`)p +Ft(##)p Fu(')g(case\))h(deleted.)39 b(If)24 b Fr(parameter)32 +b Fu(is)25 b(`)p Ft(@)p Fu(')630 2162 y(or)j(`)p Ft(*)p +Fu(',)i(the)e(pattern)h(remo)m(v)-5 b(al)29 b(op)s(eration)g(is)f (applied)h(to)g(eac)m(h)g(p)s(ositional)g(parameter)g(in)630 2271 y(turn,)i(and)g(the)h(expansion)g(is)g(the)g(resultan)m(t)g(list.) -45 b(If)32 b Fq(parameter)38 b Ft(is)32 b(an)g(arra)m(y)g(v)-5 -b(ariable)630 2381 y(subscripted)39 b(with)g(`)p Fs(@)p -Ft(')h(or)g(`)p Fs(*)p Ft(',)j(the)d(pattern)h(remo)m(v)-5 +45 b(If)32 b Fr(parameter)38 b Fu(is)32 b(an)g(arra)m(y)g(v)-5 +b(ariable)630 2381 y(subscripted)39 b(with)g(`)p Ft(@)p +Fu(')h(or)g(`)p Ft(*)p Fu(',)j(the)d(pattern)h(remo)m(v)-5 b(al)41 b(op)s(eration)f(is)g(applied)g(to)h(eac)m(h)630 2491 y(mem)m(b)s(er)30 b(of)g(the)h(arra)m(y)g(in)f(turn,)f(and)h(the)h (expansion)f(is)g(the)h(resultan)m(t)g(list.)150 2710 -y Fs(${)p Fi(parameter)11 b Fs(\045)p Fi(word)g Fs(})150 -2819 y(${)p Fi(parameter)g Fs(\045\045)p Fi(word)g Fs(})630 -2929 y Ft(The)35 b Fq(w)m(ord)k Ft(is)c(expanded)g(to)h(pro)s(duce)e(a) -i(pattern)f(just)g(as)h(in)f(\014lename)h(expansion.)55 -b(If)630 3039 y(the)43 b(pattern)f(matc)m(hes)i(a)e(trailing)i(p)s -(ortion)e(of)g(the)h(expanded)e(v)-5 b(alue)43 b(of)g -Fq(parameter)7 b Ft(,)630 3148 y(then)39 b(the)g(result)g(of)h(the)f -(expansion)g(is)h(the)f(v)-5 b(alue)40 b(of)f Fq(parameter)46 -b Ft(with)39 b(the)h(shortest)630 3258 y(matc)m(hing)31 -b(pattern)e(\(the)h(`)p Fs(\045)p Ft(')g(case\))h(or)e(the)h(longest)h -(matc)m(hing)f(pattern)g(\(the)g(`)p Fs(\045\045)p Ft(')g(case\))630 -3367 y(deleted.)49 b(If)32 b Fq(parameter)40 b Ft(is)33 -b(`)p Fs(@)p Ft(')g(or)g(`)p Fs(*)p Ft(',)h(the)f(pattern)g(remo)m(v)-5 +y Ft(${)p Fj(parameter)p Ft(\045)p Fj(word)p Ft(})150 +2819 y(${)p Fj(parameter)p Ft(\045\045)p Fj(word)p Ft(})630 +2929 y Fu(The)k Fr(w)m(ord)k Fu(is)c(expanded)g(to)h(pro)s(duce)e(a)i +(pattern)f(just)g(as)h(in)f(\014lename)h(expansion.)55 +b(If)630 3039 y(the)43 b(pattern)g(matc)m(hes)h(a)g(trailing)g(p)s +(ortion)e(of)h(the)g(expanded)g(v)-5 b(alue)43 b(of)g +Fr(parameter)p Fu(,)630 3148 y(then)c(the)g(result)g(of)h(the)f +(expansion)g(is)h(the)f(v)-5 b(alue)40 b(of)f Fr(parameter)46 +b Fu(with)39 b(the)h(shortest)630 3258 y(matc)m(hing)31 +b(pattern)e(\(the)h(`)p Ft(\045)p Fu(')g(case\))h(or)e(the)h(longest)h +(matc)m(hing)f(pattern)g(\(the)g(`)p Ft(\045\045)p Fu(')g(case\))630 +3367 y(deleted.)49 b(If)32 b Fr(parameter)40 b Fu(is)33 +b(`)p Ft(@)p Fu(')g(or)g(`)p Ft(*)p Fu(',)h(the)f(pattern)g(remo)m(v)-5 b(al)34 b(op)s(eration)g(is)f(applied)f(to)630 3477 y(eac)m(h)38 b(p)s(ositional)g(parameter)g(in)f(turn,)h(and)e(the)h(expansion)g(is)h -(the)f(resultan)m(t)h(list.)61 b(If)630 3587 y Fq(parameter)38 -b Ft(is)32 b(an)f(arra)m(y)h(v)-5 b(ariable)32 b(subscripted)e(with)h -(`)p Fs(@)p Ft(')g(or)h(`)p Fs(*)p Ft(',)g(the)f(pattern)h(remo)m(v)-5 +(the)f(resultan)m(t)h(list.)61 b(If)630 3587 y Fr(parameter)38 +b Fu(is)32 b(an)f(arra)m(y)h(v)-5 b(ariable)32 b(subscripted)e(with)h +(`)p Ft(@)p Fu(')g(or)h(`)p Ft(*)p Fu(',)g(the)f(pattern)h(remo)m(v)-5 b(al)630 3696 y(op)s(eration)30 b(is)g(applied)f(to)i(eac)m(h)g(mem)m (b)s(er)e(of)h(the)g(arra)m(y)g(in)f(turn,)g(and)g(the)h(expansion)g (is)630 3806 y(the)h(resultan)m(t)g(list.)150 4025 y -Fs(${)p Fi(parameter)11 b Fs(/)p Fi(pattern)g Fs(/)p -Fi(s)o(tri)o(ng)f Fs(})630 4134 y Ft(The)37 b Fq(pattern)g -Ft(is)g(expanded)g(to)h(pro)s(duce)e(a)h(pattern)g(just)g(as)h(in)e -(\014lename)i(expansion.)630 4244 y Fq(P)m(arameter)46 -b Ft(is)38 b(expanded)f(and)g(the)i(longest)g(matc)m(h)g(of)f -Fq(pattern)g Ft(against)h(its)f(v)-5 b(alue)39 b(is)630 -4354 y(replaced)33 b(with)f Fq(string)8 b Ft(.)47 b(If)33 -b Fq(pattern)f Ft(b)s(egins)g(with)h(`)p Fs(/)p Ft(',)g(all)h(matc)m -(hes)f(of)g Fq(pattern)g Ft(are)g(re-)630 4463 y(placed)27 -b(with)f Fq(string)8 b Ft(.)40 b(Normally)27 b(only)g(the)g(\014rst)f -(matc)m(h)h(is)g(replaced.)40 b(If)26 b Fq(pattern)g -Ft(b)s(egins)630 4573 y(with)33 b(`)p Fs(#)p Ft(',)i(it)f(m)m(ust)f -(matc)m(h)i(at)f(the)g(b)s(eginning)f(of)g(the)h(expanded)f(v)-5 -b(alue)34 b(of)g Fq(parameter)7 b Ft(.)630 4682 y(If)34 -b Fq(pattern)g Ft(b)s(egins)g(with)g(`)p Fs(\045)p Ft(',)h(it)g(m)m -(ust)f(matc)m(h)h(at)g(the)f(end)g(of)g(the)h(expanded)e(v)-5 -b(alue)35 b(of)630 4792 y Fq(parameter)7 b Ft(.)40 b(If)29 -b Fq(string)36 b Ft(is)29 b(n)m(ull,)h(matc)m(hes)g(of)f -Fq(pattern)g Ft(are)g(deleted)h(and)e(the)h Fs(/)f Ft(follo)m(wing)630 -4902 y Fq(pattern)34 b Ft(ma)m(y)g(b)s(e)f(omitted.)51 -b(If)33 b Fq(parameter)41 b Ft(is)33 b(`)p Fs(@)p Ft(')h(or)g(`)p -Fs(*)p Ft(',)g(the)g(substitution)f(op)s(eration)630 -5011 y(is)38 b(applied)g(to)g(eac)m(h)h(p)s(ositional)g(parameter)f(in) -g(turn,)h(and)e(the)h(expansion)g(is)g(the)g(re-)630 -5121 y(sultan)m(t)f(list.)59 b(If)36 b Fq(parameter)43 -b Ft(is)36 b(an)g(arra)m(y)h(v)-5 b(ariable)37 b(subscripted)e(with)h -(`)p Fs(@)p Ft(')g(or)h(`)p Fs(*)p Ft(',)h(the)630 5230 +Ft(${)p Fj(parameter)p Ft(/)p Fj(pattern)p Ft(/)p Fj(stri)o(ng)p +Ft(})630 4134 y Fu(The)37 b Fr(pattern)g Fu(is)g(expanded)g(to)h(pro)s +(duce)e(a)h(pattern)g(just)g(as)h(in)e(\014lename)i(expansion.)630 +4244 y Fr(P)m(arameter)46 b Fu(is)38 b(expanded)f(and)g(the)i(longest)g +(matc)m(h)g(of)f Fr(pattern)g Fu(against)h(its)f(v)-5 +b(alue)39 b(is)630 4354 y(replaced)34 b(with)e Fr(string)p +Fu(.)49 b(If)33 b Fr(pattern)g Fu(b)s(egins)g(with)f(`)p +Ft(/)p Fu(',)j(all)f(matc)m(hes)g(of)f Fr(pattern)g Fu(are)h(re-)630 +4463 y(placed)28 b(with)f Fr(string)p Fu(.)40 b(Normally)28 +b(only)f(the)h(\014rst)e(matc)m(h)j(is)e(replaced.)40 +b(If)27 b Fr(pattern)g Fu(b)s(egins)630 4573 y(with)34 +b(`)p Ft(#)p Fu(',)h(it)g(m)m(ust)f(matc)m(h)h(at)f(the)h(b)s(eginning) +e(of)h(the)g(expanded)f(v)-5 b(alue)35 b(of)f Fr(parameter)p +Fu(.)630 4682 y(If)g Fr(pattern)g Fu(b)s(egins)g(with)g(`)p +Ft(\045)p Fu(',)h(it)g(m)m(ust)f(matc)m(h)h(at)g(the)f(end)g(of)g(the)h +(expanded)e(v)-5 b(alue)35 b(of)630 4792 y Fr(parameter)p +Fu(.)41 b(If)29 b Fr(string)37 b Fu(is)29 b(n)m(ull,)h(matc)m(hes)h(of) +e Fr(pattern)h Fu(are)g(deleted)g(and)f(the)g Ft(/)g +Fu(follo)m(wing)630 4902 y Fr(pattern)34 b Fu(ma)m(y)g(b)s(e)f +(omitted.)51 b(If)33 b Fr(parameter)41 b Fu(is)33 b(`)p +Ft(@)p Fu(')h(or)g(`)p Ft(*)p Fu(',)g(the)g(substitution)f(op)s +(eration)630 5011 y(is)38 b(applied)g(to)g(eac)m(h)h(p)s(ositional)g +(parameter)f(in)g(turn,)h(and)e(the)h(expansion)g(is)g(the)g(re-)630 +5121 y(sultan)m(t)f(list.)59 b(If)36 b Fr(parameter)43 +b Fu(is)36 b(an)g(arra)m(y)h(v)-5 b(ariable)37 b(subscripted)e(with)h +(`)p Ft(@)p Fu(')g(or)h(`)p Ft(*)p Fu(',)h(the)630 5230 y(substitution)30 b(op)s(eration)h(is)f(applied)g(to)h(eac)m(h)g(mem)m (b)s(er)f(of)g(the)h(arra)m(y)g(in)f(turn,)f(and)h(the)630 5340 y(expansion)g(is)h(the)f(resultan)m(t)h(list.)p eop end %%Page: 28 34 -TeXDict begin 28 33 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 28 33 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(28)150 299 -y Fs(${)p Fi(parameter)11 b Fs(^)p Fi(pattern)g Fs(})150 -408 y(${)p Fi(parameter)g Fs(^^)p Fi(pattern)g Fs(})150 -518 y(${)p Fi(parameter)g Fs(,)p Fi(pattern)g Fs(})150 -628 y(${)p Fi(parameter)g Fs(,,)p Fi(pattern)g Fs(})630 -737 y Ft(This)35 b(expansion)h(mo)s(di\014es)f(the)h(case)h(of)f -(alphab)s(etic)h(c)m(haracters)g(in)f Fq(parameter)7 -b Ft(.)57 b(The)630 847 y Fq(pattern)33 b Ft(is)g(expanded)e(to)j(pro)s +y Ft(${)p Fj(parameter)p Ft(^)p Fj(pattern)p Ft(})150 +408 y(${)p Fj(parameter)p Ft(^^)p Fj(pattern)p Ft(})150 +518 y(${)p Fj(parameter)p Ft(,)p Fj(pattern)p Ft(})150 +628 y(${)p Fj(parameter)p Ft(,,)p Fj(pattern)p Ft(})630 +737 y Fu(This)36 b(expansion)g(mo)s(di\014es)g(the)g(case)i(of)f +(alphab)s(etic)g(c)m(haracters)h(in)e Fr(parameter)p +Fu(.)59 b(The)630 847 y Fr(pattern)33 b Fu(is)g(expanded)e(to)j(pro)s (duce)d(a)j(pattern)e(just)g(as)h(in)g(\014lename)g(expansion.)47 b(Eac)m(h)630 956 y(c)m(haracter)32 b(in)e(the)g(expanded)f(v)-5 -b(alue)31 b(of)f Fq(parameter)37 b Ft(is)30 b(tested)h(against)h -Fq(pattern)p Ft(,)e(and,)g(if)630 1066 y(it)j(matc)m(hes)h(the)g +b(alue)31 b(of)f Fr(parameter)37 b Fu(is)30 b(tested)h(against)h +Fr(pattern)p Fu(,)e(and,)g(if)630 1066 y(it)j(matc)m(hes)h(the)g (pattern,)f(its)h(case)g(is)f(con)m(v)m(erted.)49 b(The)33 b(pattern)g(should)f(not)h(attempt)630 1176 y(to)f(matc)m(h)g(more)f -(than)g(one)g(c)m(haracter.)44 b(The)30 b(`)p Fs(^)p -Ft(')i(op)s(erator)f(con)m(v)m(erts)h(lo)m(w)m(ercase)i(letters)630 -1285 y(matc)m(hing)i Fq(pattern)f Ft(to)h(upp)s(ercase;)h(the)e(`)p -Fs(,)p Ft(')g(op)s(erator)g(con)m(v)m(erts)i(matc)m(hing)f(upp)s +(than)g(one)g(c)m(haracter.)44 b(The)30 b(`)p Ft(^)p +Fu(')i(op)s(erator)f(con)m(v)m(erts)h(lo)m(w)m(ercase)i(letters)630 +1285 y(matc)m(hing)i Fr(pattern)f Fu(to)h(upp)s(ercase;)h(the)e(`)p +Ft(,)p Fu(')g(op)s(erator)g(con)m(v)m(erts)i(matc)m(hing)f(upp)s (ercase)630 1395 y(letters)e(to)f(lo)m(w)m(ercase.)50 -b(The)32 b(`)p Fs(^^)p Ft(')h(and)f(`)p Fs(,,)p Ft(')g(expansions)h +b(The)32 b(`)p Ft(^^)p Fu(')h(and)f(`)p Ft(,,)p Fu(')g(expansions)h (con)m(v)m(ert)h(eac)m(h)g(matc)m(hed)f(c)m(har-)630 1504 y(acter)c(in)f(the)h(expanded)e(v)-5 b(alue;)30 -b(the)e(`)p Fs(^)p Ft(')g(and)g(`)p Fs(,)p Ft(')g(expansions)g(matc)m +b(the)e(`)p Ft(^)p Fu(')g(and)g(`)p Ft(,)p Fu(')g(expansions)g(matc)m (h)h(and)f(con)m(v)m(ert)i(only)630 1614 y(the)37 b(\014rst)g(c)m (haracter)i(in)e(the)g(expanded)g(v)-5 b(alue.)61 b(If)37 -b Fq(pattern)g Ft(is)h(omitted,)i(it)e(is)f(treated)630 -1724 y(lik)m(e)h(a)f(`)p Fs(?)p Ft(',)i(whic)m(h)d(matc)m(hes)i(ev)m -(ery)f(c)m(haracter.)61 b(If)37 b Fq(parameter)43 b Ft(is)37 -b(`)p Fs(@)p Ft(')g(or)f(`)p Fs(*)p Ft(',)j(the)e(case)630 +b Fr(pattern)g Fu(is)h(omitted,)i(it)e(is)f(treated)630 +1724 y(lik)m(e)h(a)f(`)p Ft(?)p Fu(',)i(whic)m(h)d(matc)m(hes)i(ev)m +(ery)f(c)m(haracter.)61 b(If)37 b Fr(parameter)43 b Fu(is)37 +b(`)p Ft(@)p Fu(')g(or)f(`)p Ft(*)p Fu(',)j(the)e(case)630 1833 y(mo)s(di\014cation)29 b(op)s(eration)f(is)g(applied)g(to)h(eac)m (h)h(p)s(ositional)f(parameter)f(in)g(turn,)g(and)g(the)630 1943 y(expansion)38 b(is)g(the)g(resultan)m(t)h(list.)65 -b(If)37 b Fq(parameter)46 b Ft(is)38 b(an)g(arra)m(y)g(v)-5 -b(ariable)39 b(subscripted)630 2052 y(with)26 b(`)p Fs(@)p -Ft(')f(or)h(`)p Fs(*)p Ft(',)h(the)f(case)h(mo)s(di\014cation)f(op)s +b(If)37 b Fr(parameter)46 b Fu(is)38 b(an)g(arra)m(y)g(v)-5 +b(ariable)39 b(subscripted)630 2052 y(with)26 b(`)p Ft(@)p +Fu(')f(or)h(`)p Ft(*)p Fu(',)h(the)f(case)h(mo)s(di\014cation)f(op)s (eration)h(is)e(applied)h(to)h(eac)m(h)g(mem)m(b)s(er)e(of)h(the)630 2162 y(arra)m(y)31 b(in)f(turn,)f(and)h(the)h(expansion)f(is)g(the)h -(resultan)m(t)g(list.)150 2367 y Fj(3.5.4)63 b(Command)41 -b(Substitution)150 2514 y Ft(Command)f(substitution)h(allo)m(ws)i(the)e +(resultan)m(t)g(list.)150 2367 y Fk(3.5.4)63 b(Command)41 +b(Substitution)150 2514 y Fu(Command)f(substitution)h(allo)m(ws)i(the)e (output)g(of)h(a)f(command)g(to)h(replace)g(the)g(command)f(itself.)150 2624 y(Command)29 b(substitution)h(o)s(ccurs)h(when)e(a)i(command)f(is) -g(enclosed)h(as)g(follo)m(ws:)390 2765 y Fs($\()p Fi(command)11 -b Fs(\))150 2906 y Ft(or)390 3047 y Fs(`)p Fi(command)g -Fs(`)150 3187 y Ft(Bash)45 b(p)s(erforms)f(the)h(expansion)f(b)m(y)h -(executing)i Fq(command)h Ft(and)c(replacing)i(the)f(command)g(sub-)150 +g(enclosed)h(as)g(follo)m(ws:)390 2765 y Ft($\()p Fj(command)p +Ft(\))150 2906 y Fu(or)390 3047 y Ft(`)p Fj(command)p +Ft(`)150 3187 y Fu(Bash)45 b(p)s(erforms)f(the)h(expansion)f(b)m(y)h +(executing)i Fr(command)h Fu(and)c(replacing)i(the)f(command)g(sub-)150 3297 y(stitution)c(with)f(the)g(standard)g(output)g(of)g(the)g (command,)j(with)d(an)m(y)h(trailing)g(newlines)f(deleted.)150 3407 y(Em)m(b)s(edded)30 b(newlines)h(are)h(not)f(deleted,)i(but)e (they)g(ma)m(y)h(b)s(e)f(remo)m(v)m(ed)i(during)d(w)m(ord)h(splitting.) -44 b(The)150 3516 y(command)21 b(substitution)g Fs($\(cat)29 -b Fi(file)11 b Fs(\))20 b Ft(can)i(b)s(e)f(replaced)g(b)m(y)h(the)g -(equiv)-5 b(alen)m(t)22 b(but)f(faster)h Fs($\(<)30 b -Fi(file)11 b Fs(\))p Ft(.)275 3657 y(When)33 b(the)i(old-st)m(yle)h -(bac)m(kquote)f(form)f(of)g(substitution)g(is)g(used,)h(bac)m(kslash)f -(retains)h(its)f(literal)150 3767 y(meaning)k(except)h(when)e(follo)m -(w)m(ed)j(b)m(y)e(`)p Fs($)p Ft(',)j(`)p Fs(`)p Ft(',)f(or)e(`)p -Fs(\\)p Ft('.)64 b(The)38 b(\014rst)f(bac)m(kquote)j(not)e(preceded)g -(b)m(y)g(a)150 3876 y(bac)m(kslash)j(terminates)g(the)f(command)g -(substitution.)69 b(When)40 b(using)g(the)g Fs($\()p -Fi(command)11 b Fs(\))37 b Ft(form,)42 b(all)150 3986 -y(c)m(haracters)32 b(b)s(et)m(w)m(een)f(the)f(paren)m(theses)h(mak)m(e) -g(up)f(the)g(command;)h(none)f(are)h(treated)g(sp)s(ecially)-8 -b(.)275 4127 y(Command)22 b(substitutions)g(ma)m(y)i(b)s(e)e(nested.)39 +44 b(The)150 3516 y(command)23 b(substitution)g Ft($\(cat)29 +b Fj(file)p Ft(\))22 b Fu(can)i(b)s(e)f(replaced)g(b)m(y)h(the)f(equiv) +-5 b(alen)m(t)25 b(but)e(faster)h Ft($\(<)29 b Fj(file)p +Ft(\))p Fu(.)275 3657 y(When)k(the)i(old-st)m(yle)h(bac)m(kquote)f +(form)f(of)g(substitution)g(is)g(used,)h(bac)m(kslash)f(retains)h(its)f +(literal)150 3767 y(meaning)k(except)h(when)e(follo)m(w)m(ed)j(b)m(y)e +(`)p Ft($)p Fu(',)j(`)p Ft(`)p Fu(',)f(or)e(`)p Ft(\\)p +Fu('.)64 b(The)38 b(\014rst)f(bac)m(kquote)j(not)e(preceded)g(b)m(y)g +(a)150 3876 y(bac)m(kslash)k(terminates)f(the)h(command)e +(substitution.)72 b(When)41 b(using)f(the)i Ft($\()p +Fj(command)p Ft(\))c Fu(form,)43 b(all)150 3986 y(c)m(haracters)32 +b(b)s(et)m(w)m(een)f(the)f(paren)m(theses)h(mak)m(e)g(up)f(the)g +(command;)h(none)f(are)h(treated)g(sp)s(ecially)-8 b(.)275 +4127 y(Command)22 b(substitutions)g(ma)m(y)i(b)s(e)e(nested.)39 b(T)-8 b(o)23 b(nest)g(when)f(using)h(the)g(bac)m(kquoted)h(form,)g (escap)s(e)150 4236 y(the)31 b(inner)e(bac)m(kquotes)j(with)e(bac)m (kslashes.)275 4377 y(If)e(the)i(substitution)e(app)s(ears)h(within)g (double)f(quotes,)i(w)m(ord)f(splitting)h(and)f(\014lename)g(expansion) 150 4487 y(are)i(not)f(p)s(erformed)f(on)h(the)h(results.)150 -4692 y Fj(3.5.5)63 b(Arithmetic)40 b(Expansion)150 4839 -y Ft(Arithmetic)25 b(expansion)g(allo)m(ws)g(the)g(ev)-5 +4692 y Fk(3.5.5)63 b(Arithmetic)40 b(Expansion)150 4839 +y Fu(Arithmetic)25 b(expansion)g(allo)m(ws)g(the)g(ev)-5 b(aluation)26 b(of)f(an)f(arithmetic)i(expression)e(and)g(the)g (substitution)150 4949 y(of)31 b(the)f(result.)41 b(The)30 b(format)g(for)g(arithmetic)i(expansion)e(is:)390 5090 -y Fs($\(\()47 b Fi(expression)55 b Fs(\)\))275 5230 y -Ft(The)33 b(expression)g(is)h(treated)g(as)g(if)g(it)g(w)m(ere)g -(within)f(double)h(quotes,)h(but)e(a)h(double)f(quote)h(inside)150 -5340 y(the)k(paren)m(theses)g(is)g(not)g(treated)h(sp)s(ecially)-8 +y Ft($\(\()47 b Fj(expression)e Ft(\)\))275 5230 y Fu(The)33 +b(expression)g(is)h(treated)g(as)g(if)g(it)g(w)m(ere)g(within)f(double) +h(quotes,)h(but)e(a)h(double)f(quote)h(inside)150 5340 +y(the)k(paren)m(theses)g(is)g(not)g(treated)h(sp)s(ecially)-8 b(.)65 b(All)38 b(tok)m(ens)h(in)f(the)g(expression)f(undergo)g (parameter)p eop end %%Page: 29 35 -TeXDict begin 29 34 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 29 34 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(29)150 299 y(and)26 b(v)-5 b(ariable)28 b(expansion,)g(command)e(substitution,)i (and)e(quote)i(remo)m(v)-5 b(al.)41 b(The)26 b(result)h(is)g(treated)h @@ -9527,132 +10077,132 @@ i(to)g(the)g(rules)f(listed)h(b)s(elo)m(w)g(\(see)g(Section)g(6.5)h ([Shell)150 657 y(Arithmetic],)32 b(page)f(87\).)42 b(If)30 b(the)h(expression)f(is)g(in)m(v)-5 b(alid,)32 b(Bash)e(prin)m(ts)g(a)h (message)g(indicating)h(failure)150 767 y(to)f(the)g(standard)e(error)h -(and)g(no)g(substitution)g(o)s(ccurs.)150 970 y Fj(3.5.6)63 -b(Pro)s(cess)42 b(Substitution)150 1117 y Ft(Pro)s(cess)i(substitution) +(and)g(no)g(substitution)g(o)s(ccurs.)150 970 y Fk(3.5.6)63 +b(Pro)s(cess)42 b(Substitution)150 1117 y Fu(Pro)s(cess)i(substitution) g(is)g(supp)s(orted)f(on)h(systems)g(that)h(supp)s(ort)d(named)i(pip)s -(es)f(\()p Fl(fif)n(o)p Ft(s\))i(or)f(the)150 1227 y(`)p -Fs(/dev/fd)p Ft(')29 b(metho)s(d)h(of)g(naming)g(op)s(en)g(\014les.)41 -b(It)30 b(tak)m(es)i(the)f(form)f(of)390 1366 y Fs(<\()p -Fi(list)11 b Fs(\))150 1504 y Ft(or)390 1643 y Fs(>\()p -Fi(list)g Fs(\))150 1782 y Ft(The)23 b(pro)s(cess)g Fq(list)j -Ft(is)d(run)f(with)h(its)h(input)f(or)g(output)g(connected)h(to)h(a)e -Fl(fif)n(o)g Ft(or)h(some)g(\014le)f(in)g(`)p Fs(/dev/fd)p -Ft('.)150 1892 y(The)28 b(name)h(of)g(this)f(\014le)h(is)g(passed)f(as) -h(an)f(argumen)m(t)h(to)h(the)f(curren)m(t)f(command)h(as)f(the)h -(result)g(of)g(the)150 2001 y(expansion.)40 b(If)28 b(the)h -Fs(>\()p Fi(list)11 b Fs(\))26 b Ft(form)h(is)i(used,)f(writing)h(to)g -(the)f(\014le)h(will)g(pro)m(vide)f(input)g(for)g Fq(list)r -Ft(.)41 b(If)28 b(the)150 2111 y Fs(<\()p Fi(list)11 -b Fs(\))23 b Ft(form)h(is)i(used,)f(the)h(\014le)f(passed)g(as)g(an)g -(argumen)m(t)h(should)e(b)s(e)h(read)g(to)h(obtain)g(the)f(output)g(of) -150 2220 y Fq(list)r Ft(.)41 b(Note)31 b(that)f(no)f(space)h(ma)m(y)g -(app)s(ear)f(b)s(et)m(w)m(een)h(the)g Fs(<)f Ft(or)h -Fs(>)f Ft(and)g(the)g(left)h(paren)m(thesis,)h(otherwise)150 +(es)f(\()p Fm(fif)n(o)p Fu(s\))i(or)f(the)150 1227 y +Ft(/dev/fd)28 b Fu(metho)s(d)i(of)h(naming)f(op)s(en)g(\014les.)40 +b(It)31 b(tak)m(es)h(the)e(form)g(of)390 1366 y Ft(<\()p +Fj(list)p Ft(\))150 1504 y Fu(or)390 1643 y Ft(>\()p +Fj(list)p Ft(\))150 1782 y Fu(The)c(pro)s(cess)f Fr(list)k +Fu(is)e(run)d(with)i(its)h(input)e(or)h(output)g(connected)h(to)g(a)g +Fm(fif)n(o)f Fu(or)g(some)g(\014le)h(in)f Ft(/dev/fd)p +Fu(.)150 1892 y(The)i(name)h(of)g(this)f(\014le)h(is)g(passed)f(as)h +(an)f(argumen)m(t)h(to)h(the)f(curren)m(t)f(command)h(as)f(the)h +(result)g(of)g(the)150 2001 y(expansion.)40 b(If)29 b(the)g +Ft(>\()p Fj(list)p Ft(\))f Fu(form)g(is)i(used,)f(writing)g(to)h(the)f +(\014le)h(will)f(pro)m(vide)h(input)e(for)h Fr(list)p +Fu(.)41 b(If)29 b(the)150 2111 y Ft(<\()p Fj(list)p Ft(\))24 +b Fu(form)h(is)h(used,)g(the)g(\014le)g(passed)g(as)g(an)f(argumen)m(t) +i(should)e(b)s(e)g(read)g(to)i(obtain)f(the)g(output)g(of)150 +2220 y Fr(list)p Fu(.)41 b(Note)31 b(that)f(no)g(space)g(ma)m(y)g(app)s +(ear)f(b)s(et)m(w)m(een)h(the)g Ft(<)f Fu(or)h Ft(>)f +Fu(and)g(the)h(left)g(paren)m(thesis,)h(otherwise)150 2330 y(the)g(construct)f(w)m(ould)g(b)s(e)g(in)m(terpreted)h(as)f(a)h (redirection.)275 2469 y(When)36 b(a)m(v)-5 b(ailable,)40 b(pro)s(cess)c(substitution)h(is)f(p)s(erformed)f(sim)m(ultaneously)i (with)g(parameter)g(and)150 2578 y(v)-5 b(ariable)31 b(expansion,)g(command)f(substitution,)g(and)g(arithmetic)i(expansion.) -150 2782 y Fj(3.5.7)63 b(W)-10 b(ord)41 b(Splitting)150 -2929 y Ft(The)30 b(shell)h(scans)g(the)g(results)f(of)h(parameter)g +150 2782 y Fk(3.5.7)63 b(W)-10 b(ord)41 b(Splitting)150 +2929 y Fu(The)30 b(shell)h(scans)g(the)g(results)f(of)h(parameter)g (expansion,)g(command)g(substitution,)g(and)f(arithmetic)150 3039 y(expansion)g(that)h(did)f(not)g(o)s(ccur)h(within)e(double)h (quotes)h(for)f(w)m(ord)g(splitting.)275 3177 y(The)e(shell)g(treats)i -(eac)m(h)g(c)m(haracter)g(of)f Fs($IFS)e Ft(as)i(a)g(delimiter,)h(and)e +(eac)m(h)g(c)m(haracter)g(of)f Ft($IFS)e Fu(as)i(a)g(delimiter,)h(and)e (splits)g(the)h(results)f(of)h(the)g(other)150 3287 y(expansions)22 b(in)m(to)i(w)m(ords)e(using)h(these)g(c)m(haracters)h(as)f(\014eld)f -(terminators.)39 b(If)22 b Fs(IFS)g Ft(is)h(unset,)h(or)e(its)h(v)-5 -b(alue)150 3397 y(is)36 b(exactly)j Fs()p -Ft(,)32 b(the)37 b(default,)h(then)e(sequences)h(of)67 -b Fs()p Ft(,)36 b Fs()p Ft(,)h(and)150 3506 -y Fs()28 b Ft(at)k(the)f(b)s(eginning)f(and)h(end)f(of)h(the)g +(terminators.)39 b(If)22 b Ft(IFS)g Fu(is)h(unset,)h(or)e(its)h(v)-5 +b(alue)150 3397 y(is)36 b(exactly)j Ft()p +Fu(,)32 b(the)37 b(default,)h(then)e(sequences)h(of)67 +b Ft()p Fu(,)36 b Ft()p Fu(,)h(and)150 3506 +y Ft()28 b Fu(at)k(the)f(b)s(eginning)f(and)h(end)f(of)h(the)g (results)g(of)g(the)g(previous)g(expansions)f(are)i(ignored,)150 -3616 y(and)k(an)m(y)h(sequence)h(of)f Fs(IFS)f Ft(c)m(haracters)i(not)f +3616 y(and)k(an)m(y)h(sequence)h(of)f Ft(IFS)f Fu(c)m(haracters)i(not)f (at)h(the)f(b)s(eginning)f(or)h(end)f(serv)m(es)h(to)h(delimit)f(w)m -(ords.)150 3725 y(If)43 b Fs(IFS)f Ft(has)h(a)h(v)-5 +(ords.)150 3725 y(If)43 b Ft(IFS)f Fu(has)h(a)h(v)-5 b(alue)43 b(other)h(than)f(the)g(default,)k(then)c(sequences)h(of)f -(the)h(whitespace)f(c)m(haracters)150 3835 y Fs(space)26 -b Ft(and)h Fs(tab)g Ft(are)h(ignored)g(at)h(the)f(b)s(eginning)f(and)g +(the)h(whitespace)f(c)m(haracters)150 3835 y Ft(space)26 +b Fu(and)h Ft(tab)g Fu(are)h(ignored)g(at)h(the)f(b)s(eginning)f(and)g (end)g(of)h(the)g(w)m(ord,)g(as)g(long)g(as)g(the)g(whitespace)150 3945 y(c)m(haracter)34 b(is)f(in)f(the)h(v)-5 b(alue)33 -b(of)f Fs(IFS)g Ft(\(an)h Fs(IFS)e Ft(whitespace)j(c)m(haracter\).)49 -b(An)m(y)32 b(c)m(haracter)i(in)f Fs(IFS)e Ft(that)150 -4054 y(is)f(not)h Fs(IFS)f Ft(whitespace,)h(along)g(with)f(an)m(y)h -(adjacen)m(t)h Fs(IFS)d Ft(whitespace)i(c)m(haracters,)h(delimits)f(a)g -(\014eld.)150 4164 y(A)h(sequence)h(of)f Fs(IFS)f Ft(whitespace)i(c)m +b(of)f Ft(IFS)g Fu(\(an)h Ft(IFS)e Fu(whitespace)j(c)m(haracter\).)49 +b(An)m(y)32 b(c)m(haracter)i(in)f Ft(IFS)e Fu(that)150 +4054 y(is)f(not)h Ft(IFS)f Fu(whitespace,)h(along)g(with)f(an)m(y)h +(adjacen)m(t)h Ft(IFS)d Fu(whitespace)i(c)m(haracters,)h(delimits)f(a)g +(\014eld.)150 4164 y(A)h(sequence)h(of)f Ft(IFS)f Fu(whitespace)i(c)m (haracters)h(is)e(also)h(treated)g(as)g(a)f(delimiter.)47 -b(If)32 b(the)g(v)-5 b(alue)33 b(of)f Fs(IFS)150 4273 -y Ft(is)e(n)m(ull,)h(no)f(w)m(ord)g(splitting)h(o)s(ccurs.)275 -4412 y(Explicit)44 b(n)m(ull)f(argumen)m(ts)g(\()p Fs("")g -Ft(or)h Fs('')p Ft(\))f(are)g(retained.)80 b(Unquoted)43 +b(If)32 b(the)g(v)-5 b(alue)33 b(of)f Ft(IFS)150 4273 +y Fu(is)e(n)m(ull,)h(no)f(w)m(ord)g(splitting)h(o)s(ccurs.)275 +4412 y(Explicit)44 b(n)m(ull)f(argumen)m(ts)g(\()p Ft("")g +Fu(or)h Ft('')p Fu(\))f(are)g(retained.)80 b(Unquoted)43 b(implicit)h(n)m(ull)f(argumen)m(ts,)150 4522 y(resulting)24 b(from)f(the)g(expansion)g(of)h(parameters)g(that)g(ha)m(v)m(e)h(no)e (v)-5 b(alues,)25 b(are)f(remo)m(v)m(ed.)40 b(If)23 b(a)g(parameter)150 4631 y(with)30 b(no)g(v)-5 b(alue)31 b(is)g(expanded)e(within)h(double) g(quotes,)h(a)g(n)m(ull)f(argumen)m(t)h(results)f(and)g(is)g(retained.) 275 4770 y(Note)h(that)g(if)g(no)f(expansion)g(o)s(ccurs,)g(no)h -(splitting)g(is)f(p)s(erformed.)150 4974 y Fj(3.5.8)63 -b(Filename)41 b(Expansion)150 5121 y Ft(After)26 b(w)m(ord)g -(splitting,)i(unless)d(the)i(`)p Fs(-f)p Ft(')f(option)g(has)g(b)s(een) -f(set)i(\(see)g(Section)g(4.3.1)h([The)e(Set)g(Builtin],)150 -5230 y(page)h(59\),)i(Bash)d(scans)h(eac)m(h)h(w)m(ord)e(for)g(the)h(c) -m(haracters)g(`)p Fs(*)p Ft(',)h(`)p Fs(?)p Ft(',)g(and)e(`)p -Fs([)p Ft('.)39 b(If)26 b(one)h(of)g(these)f(c)m(haracters)150 +(splitting)g(is)f(p)s(erformed.)150 4974 y Fk(3.5.8)63 +b(Filename)41 b(Expansion)150 5121 y Fu(After)30 b(w)m(ord)f +(splitting,)i(unless)d(the)i Ft(-f)f Fu(option)h(has)f(b)s(een)g(set)h +(\(see)g(Section)h(4.3.1)g([The)e(Set)h(Builtin],)150 +5230 y(page)d(58\),)i(Bash)d(scans)h(eac)m(h)h(w)m(ord)e(for)g(the)h(c) +m(haracters)g(`)p Ft(*)p Fu(',)h(`)p Ft(?)p Fu(',)g(and)e(`)p +Ft([)p Fu('.)39 b(If)26 b(one)h(of)g(these)f(c)m(haracters)150 5340 y(app)s(ears,)h(then)f(the)h(w)m(ord)f(is)h(regarded)g(as)g(a)g -Fq(pattern)p Ft(,)g(and)g(replaced)g(with)f(an)h(alphab)s(etically)h +Fr(pattern)p Fu(,)g(and)g(replaced)g(with)f(an)h(alphab)s(etically)h (sorted)p eop end %%Page: 30 36 -TeXDict begin 30 35 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 30 35 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(30)150 299 y(list)32 b(of)f(\014lenames)g(matc)m(hing)h(the)f(pattern)g(\(see)h (Section)f(3.5.8.1)j([P)m(attern)e(Matc)m(hing],)h(page)f(30\).)43 b(If)150 408 y(no)26 b(matc)m(hing)i(\014lenames)e(are)h(found,)f(and)g -(the)h(shell)f(option)h Fs(nullglob)d Ft(is)j(disabled,)g(the)g(w)m +(the)h(shell)f(option)h Ft(nullglob)d Fu(is)j(disabled,)g(the)g(w)m (ord)f(is)g(left)150 518 y(unc)m(hanged.)40 b(If)30 b(the)g -Fs(nullglob)e Ft(option)i(is)h(set,)f(and)g(no)g(matc)m(hes)h(are)g +Ft(nullglob)e Fu(option)i(is)h(set,)f(and)g(no)g(matc)m(hes)h(are)g (found,)e(the)h(w)m(ord)g(is)g(remo)m(v)m(ed.)150 628 -y(If)i(the)g Fs(failglob)e Ft(shell)i(option)h(is)f(set,)h(and)f(no)g +y(If)i(the)g Ft(failglob)e Fu(shell)i(option)h(is)f(set,)h(and)f(no)g (matc)m(hes)h(are)g(found,)e(an)h(error)g(message)h(is)f(prin)m(ted)150 737 y(and)e(the)g(command)g(is)h(not)f(executed.)42 b(If)30 -b(the)g(shell)h(option)g Fs(nocaseglob)c Ft(is)k(enabled,)f(the)h(matc) +b(the)g(shell)h(option)g Ft(nocaseglob)c Fu(is)k(enabled,)f(the)h(matc) m(h)g(is)150 847 y(p)s(erformed)e(without)h(regard)h(to)g(the)f(case)i (of)e(alphab)s(etic)h(c)m(haracters.)275 985 y(When)23 b(a)h(pattern)f(is)h(used)f(for)g(\014lename)h(expansion,)h(the)e(c)m -(haracter)i(`)p Fs(.)p Ft(')f(at)g(the)g(start)g(of)g(a)g(\014lename) +(haracter)i(`)p Ft(.)p Fu(')f(at)g(the)g(start)g(of)g(a)g(\014lename) 150 1095 y(or)f(immediately)i(follo)m(wing)g(a)f(slash)f(m)m(ust)h(b)s (e)f(matc)m(hed)h(explicitly)-8 b(,)27 b(unless)c(the)g(shell)h(option) -g Fs(dotglob)150 1205 y Ft(is)33 b(set.)51 b(When)33 +g Ft(dotglob)150 1205 y Fu(is)33 b(set.)51 b(When)33 b(matc)m(hing)h(a)g(\014lename,)h(the)e(slash)h(c)m(haracter)h(m)m(ust) e(alw)m(a)m(ys)i(b)s(e)e(matc)m(hed)h(explicitly)-8 b(.)150 -1314 y(In)30 b(other)g(cases,)i(the)e(`)p Fs(.)p Ft(')h(c)m(haracter)h +1314 y(In)30 b(other)g(cases,)i(the)e(`)p Ft(.)p Fu(')h(c)m(haracter)h (is)e(not)h(treated)g(sp)s(ecially)-8 b(.)275 1453 y(See)28 -b(the)g(description)g(of)g Fs(shopt)e Ft(in)i(Section)g(4.3.2)i([The)e -(Shopt)f(Builtin],)i(page)g(63,)g(for)f(a)g(descrip-)150 -1562 y(tion)j(of)f(the)h Fs(nocaseglob)p Ft(,)d Fs(nullglob)p -Ft(,)g Fs(failglob)p Ft(,)h(and)g Fs(dotglob)g Ft(options.)275 -1701 y(The)j Fs(GLOBIGNORE)f Ft(shell)i(v)-5 b(ariable)34 +b(the)g(description)g(of)g Ft(shopt)e Fu(in)i(Section)g(4.3.2)i([The)e +(Shopt)f(Builtin],)i(page)g(62,)g(for)f(a)g(descrip-)150 +1562 y(tion)j(of)f(the)h Ft(nocaseglob)p Fu(,)d Ft(nullglob)p +Fu(,)g Ft(failglob)p Fu(,)h(and)g Ft(dotglob)g Fu(options.)275 +1701 y(The)j Ft(GLOBIGNORE)f Fu(shell)i(v)-5 b(ariable)34 b(ma)m(y)g(b)s(e)f(used)f(to)i(restrict)g(the)g(set)f(of)h(\014lenames) -f(matc)m(hing)i(a)150 1811 y(pattern.)k(If)25 b Fs(GLOBIGNORE)e -Ft(is)j(set,)h(eac)m(h)g(matc)m(hing)g(\014lename)f(that)g(also)h(matc) -m(hes)f(one)g(of)g(the)g(patterns)150 1920 y(in)33 b -Fs(GLOBIGNORE)d Ft(is)j(remo)m(v)m(ed)h(from)e(the)i(list)f(of)g(matc)m -(hes.)50 b(The)33 b(\014lenames)g(`)p Fs(.)p Ft(')g(and)f(`)p -Fs(..)p Ft(')h(are)g(alw)m(a)m(ys)150 2030 y(ignored)g(when)e -Fs(GLOBIGNORE)f Ft(is)j(set)g(and)f(not)h(n)m(ull.)48 -b(Ho)m(w)m(ev)m(er,)35 b(setting)f Fs(GLOBIGNORE)c Ft(to)j(a)g(non-n)m +f(matc)m(hing)i(a)150 1811 y(pattern.)k(If)25 b Ft(GLOBIGNORE)e +Fu(is)j(set,)h(eac)m(h)g(matc)m(hing)g(\014lename)f(that)g(also)h(matc) +m(hes)f(one)g(of)g(the)g(patterns)150 1920 y(in)39 b +Ft(GLOBIGNORE)d Fu(is)j(remo)m(v)m(ed)h(from)e(the)h(list)h(of)f(matc)m +(hes.)67 b(The)39 b(\014lenames)g Ft(.)f Fu(and)h Ft(..)f +Fu(are)h(alw)m(a)m(ys)150 2030 y(ignored)33 b(when)e +Ft(GLOBIGNORE)f Fu(is)j(set)g(and)f(not)h(n)m(ull.)48 +b(Ho)m(w)m(ev)m(er,)35 b(setting)f Ft(GLOBIGNORE)c Fu(to)j(a)g(non-n)m (ull)150 2139 y(v)-5 b(alue)34 b(has)f(the)h(e\013ect)h(of)f(enabling)g -(the)g Fs(dotglob)e Ft(shell)h(option,)j(so)e(all)g(other)g +(the)g Ft(dotglob)e Fu(shell)h(option,)j(so)e(all)g(other)g (\014lenames)g(b)s(eginning)150 2249 y(with)43 b(a)h(`)p -Fs(.)p Ft(')f(will)h(matc)m(h.)80 b(T)-8 b(o)44 b(get)h(the)e(old)h(b)s +Ft(.)p Fu(')f(will)h(matc)m(h.)80 b(T)-8 b(o)44 b(get)h(the)e(old)h(b)s (eha)m(vior)f(of)h(ignoring)f(\014lenames)h(b)s(eginning)f(with)g(a)150 -2359 y(`)p Fs(.)p Ft(',)c(mak)m(e)g(`)p Fs(.*)p Ft(')e(one)g(of)g(the)h -(patterns)f(in)g Fs(GLOBIGNORE)p Ft(.)58 b(The)37 b Fs(dotglob)e -Ft(option)j(is)f(disabled)g(when)150 2468 y Fs(GLOBIGNORE)28 -b Ft(is)i(unset.)150 2672 y Fj(3.5.8.1)63 b(P)m(attern)40 -b(Matc)m(hing)150 2819 y Ft(An)m(y)24 b(c)m(haracter)h(that)f(app)s +2359 y(`)p Ft(.)p Fu(',)c(mak)m(e)g(`)p Ft(.*)p Fu(')e(one)g(of)g(the)h +(patterns)f(in)g Ft(GLOBIGNORE)p Fu(.)58 b(The)37 b Ft(dotglob)e +Fu(option)j(is)f(disabled)g(when)150 2468 y Ft(GLOBIGNORE)28 +b Fu(is)i(unset.)150 2672 y Fk(3.5.8.1)63 b(P)m(attern)40 +b(Matc)m(hing)150 2819 y Fu(An)m(y)24 b(c)m(haracter)h(that)f(app)s (ears)f(in)g(a)h(pattern,)i(other)e(than)f(the)h(sp)s(ecial)g(pattern)g (c)m(haracters)h(describ)s(ed)150 2928 y(b)s(elo)m(w,)31 -b(matc)m(hes)g(itself.)42 b(The)29 b Fl(nul)h Ft(c)m(haracter)i(ma)m(y) +b(matc)m(hes)g(itself.)42 b(The)29 b Fm(nul)h Fu(c)m(haracter)i(ma)m(y) e(not)h(o)s(ccur)f(in)g(a)h(pattern.)40 b(A)31 b(bac)m(kslash)g(escap)s (es)150 3038 y(the)38 b(follo)m(wing)g(c)m(haracter;)43 b(the)37 b(escaping)i(bac)m(kslash)e(is)h(discarded)f(when)f(matc)m @@ -9660,105 +10210,104 @@ b(the)37 b(escaping)i(bac)m(kslash)e(is)h(discarded)f(when)f(matc)m b(c)m(haracters)i(m)m(ust)f(b)s(e)e(quoted)i(if)f(they)h(are)f(to)i(b)s (e)d(matc)m(hed)i(literally)-8 b(.)275 3286 y(The)29 b(sp)s(ecial)i(pattern)g(c)m(haracters)h(ha)m(v)m(e)f(the)g(follo)m -(wing)h(meanings:)150 3452 y Fs(*)432 b Ft(Matc)m(hes)31 +(wing)h(meanings:)150 3452 y Ft(*)432 b Fu(Matc)m(hes)31 b(an)m(y)e(string,)h(including)f(the)g(n)m(ull)g(string.)41 -b(When)29 b(the)g Fs(globstar)e Ft(shell)i(option)630 -3561 y(is)37 b(enabled,)h(and)e(`)p Fs(*)p Ft(')h(is)g(used)f(in)g(a)h +b(When)29 b(the)g Ft(globstar)e Fu(shell)i(option)630 +3561 y(is)37 b(enabled,)h(and)e(`)p Ft(*)p Fu(')h(is)g(used)f(in)g(a)h (\014lename)g(expansion)g(con)m(text,)j(t)m(w)m(o)e(adjacen)m(t)g(`)p -Fs(*)p Ft('s)630 3671 y(used)f(as)g(a)h(single)g(pattern)g(will)f(matc) +Ft(*)p Fu('s)630 3671 y(used)f(as)g(a)h(single)g(pattern)g(will)f(matc) m(h)i(all)f(\014les)f(and)g(zero)h(or)g(more)f(directories)i(and)630 3780 y(sub)s(directories.)g(If)25 b(follo)m(w)m(ed)j(b)m(y)e(a)g(`)p -Fs(/)p Ft(',)h(t)m(w)m(o)g(adjacen)m(t)h(`)p Fs(*)p Ft('s)e(will)g +Ft(/)p Fu(',)h(t)m(w)m(o)g(adjacen)m(t)h(`)p Ft(*)p Fu('s)e(will)g (matc)m(h)h(only)f(directories)630 3890 y(and)k(sub)s(directories.)150 -4054 y Fs(?)432 b Ft(Matc)m(hes)32 b(an)m(y)f(single)g(c)m(haracter.) -150 4217 y Fs([...)o(])241 b Ft(Matc)m(hes)27 b(an)m(y)e(one)g(of)g +4054 y Ft(?)432 b Fu(Matc)m(hes)32 b(an)m(y)f(single)g(c)m(haracter.) +150 4217 y Ft([...)o(])241 b Fu(Matc)m(hes)27 b(an)m(y)e(one)g(of)g (the)g(enclosed)g(c)m(haracters.)41 b(A)25 b(pair)f(of)h(c)m(haracters) i(separated)e(b)m(y)g(a)630 4327 y(h)m(yphen)k(denotes)i(a)g -Fq(range)g(expression)p Ft(;)f(an)m(y)h(c)m(haracter)h(that)f(falls)g +Fr(range)g(expression)p Fu(;)f(an)m(y)h(c)m(haracter)h(that)f(falls)g (b)s(et)m(w)m(een)g(those)g(t)m(w)m(o)630 4436 y(c)m(haracters,)d (inclusiv)m(e,)f(using)d(the)h(curren)m(t)f(lo)s(cale's)j(collating)g (sequence)e(and)f(c)m(haracter)630 4546 y(set,)31 b(is)f(matc)m(hed.)42 b(If)30 b(the)g(\014rst)g(c)m(haracter)i(follo)m(wing)g(the)e(`)p -Fs([)p Ft(')h(is)f(a)h(`)p Fs(!)p Ft(')f(or)g(a)h(`)p -Fs(^)p Ft(')g(then)f(an)m(y)630 4655 y(c)m(haracter)c(not)f(enclosed)g -(is)g(matc)m(hed.)40 b(A)25 b(`)p Fp(\000)p Ft(')f(ma)m(y)i(b)s(e)e +Ft([)p Fu(')h(is)f(a)h(`)p Ft(!)p Fu(')f(or)g(a)h(`)p +Ft(^)p Fu(')g(then)f(an)m(y)630 4655 y(c)m(haracter)c(not)f(enclosed)g +(is)g(matc)m(hed.)40 b(A)25 b(`)p Fq(\000)p Fu(')f(ma)m(y)i(b)s(e)e (matc)m(hed)h(b)m(y)f(including)h(it)g(as)g(the)630 4765 y(\014rst)32 b(or)h(last)h(c)m(haracter)h(in)e(the)g(set.)50 -b(A)33 b(`)p Fs(])p Ft(')g(ma)m(y)h(b)s(e)e(matc)m(hed)i(b)m(y)f +b(A)33 b(`)p Ft(])p Fu(')g(ma)m(y)h(b)s(e)e(matc)m(hed)i(b)m(y)f (including)g(it)g(as)h(the)630 4875 y(\014rst)25 b(c)m(haracter)i(in)e (the)h(set.)40 b(The)25 b(sorting)h(order)f(of)h(c)m(haracters)h(in)f (range)g(expressions)f(is)630 4984 y(determined)h(b)m(y)h(the)g(curren) m(t)f(lo)s(cale)j(and)d(the)h(v)-5 b(alues)27 b(of)g(the)g -Fs(LC_COLLATE)d Ft(and)i Fs(LC_ALL)630 5094 y Ft(shell)31 +Ft(LC_COLLATE)d Fu(and)i Ft(LC_ALL)630 5094 y Fu(shell)31 b(v)-5 b(ariables,)31 b(if)f(set.)630 5230 y(F)-8 b(or)34 b(example,)g(in)f(the)g(default)g(C)f(lo)s(cale,)k(`)p -Fs([a-dx-z])p Ft(')31 b(is)i(equiv)-5 b(alen)m(t)34 b(to)g(`)p -Fs([abcdxyz])p Ft('.)630 5340 y(Man)m(y)68 b(lo)s(cales)h(sort)f(c)m +Ft([a-dx-z])p Fu(')31 b(is)i(equiv)-5 b(alen)m(t)34 b(to)g(`)p +Ft([abcdxyz])p Fu('.)630 5340 y(Man)m(y)68 b(lo)s(cales)h(sort)f(c)m (haracters)h(in)e(dictionary)i(order,)76 b(and)67 b(in)g(these)h(lo)s (cales)p eop end %%Page: 31 37 -TeXDict begin 31 36 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 31 36 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(31)630 299 -y(`)p Fs([a-dx-z])p Ft(')36 b(is)i(t)m(ypically)i(not)e(equiv)-5 -b(alen)m(t)39 b(to)g(`)p Fs([abcdxyz])p Ft(';)g(it)g(migh)m(t)f(b)s(e)f -(equiv)-5 b(alen)m(t)630 408 y(to)34 b(`)p Fs([aBbCcDdxXyYz])p -Ft(',)c(for)j(example.)49 b(T)-8 b(o)33 b(obtain)h(the)f(traditional)h +y(`)p Ft([a-dx-z])p Fu(')36 b(is)i(t)m(ypically)i(not)e(equiv)-5 +b(alen)m(t)39 b(to)g(`)p Ft([abcdxyz])p Fu(';)g(it)g(migh)m(t)f(b)s(e)f +(equiv)-5 b(alen)m(t)630 408 y(to)34 b(`)p Ft([aBbCcDdxXyYz])p +Fu(',)c(for)j(example.)49 b(T)-8 b(o)33 b(obtain)h(the)f(traditional)h (in)m(terpretation)h(of)630 518 y(ranges)e(in)f(brac)m(k)m(et)i (expressions,)g(y)m(ou)f(can)g(force)g(the)g(use)f(of)h(the)g(C)f(lo)s -(cale)i(b)m(y)f(setting)630 628 y(the)c Fs(LC_COLLATE)e -Ft(or)i Fs(LC_ALL)f Ft(en)m(vironmen)m(t)i(v)-5 b(ariable)30 -b(to)g(the)f(v)-5 b(alue)30 b(`)p Fs(C)p Ft(',)g(or)f(enable)h(the)630 -737 y Fs(globasciiranges)c Ft(shell)31 b(option.)630 -874 y(Within)23 b(`)p Fs([)p Ft(')h(and)e(`)p Fs(])p -Ft(',)j Fq(c)m(haracter)g(classes)j Ft(can)c(b)s(e)e(sp)s(eci\014ed)h -(using)f(the)i(syn)m(tax)f Fs([:)p Fq(class)t Fs(:])p -Ft(,)630 983 y(where)30 b Fq(class)35 b Ft(is)30 b(one)h(of)f(the)h -(follo)m(wing)h(classes)f(de\014ned)e(in)h(the)h Fl(posix)f -Ft(standard:)870 1119 y Fs(alnum)142 b(alpha)g(ascii)f(blank)h(cntrl)g +(cale)i(b)m(y)f(setting)630 628 y(the)c Ft(LC_COLLATE)e +Fu(or)i Ft(LC_ALL)f Fu(en)m(vironmen)m(t)i(v)-5 b(ariable)30 +b(to)g(the)f(v)-5 b(alue)30 b(`)p Ft(C)p Fu(',)g(or)f(enable)h(the)630 +737 y Ft(globasciiranges)c Fu(shell)31 b(option.)630 +874 y(Within)23 b(`)p Ft([)p Fu(')h(and)e(`)p Ft(])p +Fu(',)j Fr(c)m(haracter)g(classes)j Fu(can)c(b)s(e)e(sp)s(eci\014ed)h +(using)f(the)i(syn)m(tax)f Ft([:)p Fr(class)t Ft(:])p +Fu(,)630 983 y(where)30 b Fr(class)35 b Fu(is)30 b(one)h(of)f(the)h +(follo)m(wing)h(classes)f(de\014ned)e(in)h(the)h Fm(posix)f +Fu(standard:)870 1119 y Ft(alnum)142 b(alpha)g(ascii)f(blank)h(cntrl)g (digit)g(graph)g(lower)870 1229 y(print)g(punct)g(space)f(upper)h(word) -190 b(xdigit)630 1365 y Ft(A)42 b(c)m(haracter)h(class)f(matc)m(hes)h +190 b(xdigit)630 1365 y Fu(A)42 b(c)m(haracter)h(class)f(matc)m(hes)h (an)m(y)f(c)m(haracter)h(b)s(elonging)f(to)g(that)g(class.)75 -b(The)41 b Fs(word)630 1475 y Ft(c)m(haracter)32 b(class)f(matc)m(hes)h +b(The)41 b Ft(word)630 1475 y Fu(c)m(haracter)32 b(class)f(matc)m(hes)h (letters,)f(digits,)h(and)d(the)i(c)m(haracter)h(`)p -Fs(_)p Ft('.)630 1611 y(Within)25 b(`)p Fs([)p Ft(')f(and)g(`)p -Fs(])p Ft(',)i(an)e Fq(equiv)-5 b(alence)26 b(class)j -Ft(can)24 b(b)s(e)g(sp)s(eci\014ed)g(using)g(the)g(syn)m(tax)h -Fs([=)p Fq(c)6 b Fs(=])p Ft(,)630 1721 y(whic)m(h)29 +Ft(_)p Fu('.)630 1611 y(Within)25 b(`)p Ft([)p Fu(')f(and)g(`)p +Ft(])p Fu(',)i(an)e Fr(equiv)-5 b(alence)26 b(class)j +Fu(can)24 b(b)s(e)g(sp)s(eci\014ed)g(using)g(the)g(syn)m(tax)h +Ft([=)p Fr(c)6 b Ft(=])p Fu(,)630 1721 y(whic)m(h)29 b(matc)m(hes)i(all)f(c)m(haracters)h(with)e(the)h(same)g(collation)h(w) m(eigh)m(t)g(\(as)f(de\014ned)e(b)m(y)i(the)630 1830 y(curren)m(t)g(lo)s(cale\))j(as)d(the)h(c)m(haracter)h -Fq(c)6 b Ft(.)630 1967 y(Within)21 b(`)p Fs([)p Ft(')h(and)e(`)p -Fs(])p Ft(',)j(the)f(syn)m(tax)f Fs([.)p Fq(sym)m(b)s(ol)t -Fs(.])f Ft(matc)m(hes)i(the)f(collating)j(sym)m(b)s(ol)c -Fq(sym)m(b)s(ol)t Ft(.)275 2132 y(If)29 b(the)g Fs(extglob)f -Ft(shell)h(option)h(is)g(enabled)f(using)g(the)h Fs(shopt)e -Ft(builtin,)h(sev)m(eral)i(extended)f(pattern)150 2241 +Fr(c)p Fu(.)630 1967 y(Within)22 b(`)p Ft([)p Fu(')f(and)g(`)p +Ft(])p Fu(',)j(the)d(syn)m(tax)h Ft([.)p Fr(sym)m(b)s(ol)t +Ft(.])e Fu(matc)m(hes)i(the)g(collating)i(sym)m(b)s(ol)d +Fr(sym)m(b)s(ol)p Fu(.)275 2132 y(If)29 b(the)g Ft(extglob)f +Fu(shell)h(option)h(is)g(enabled)f(using)g(the)h Ft(shopt)e +Fu(builtin,)h(sev)m(eral)i(extended)f(pattern)150 2241 y(matc)m(hing)37 b(op)s(erators)e(are)h(recognized.)58 -b(In)35 b(the)g(follo)m(wing)i(description,)g(a)f Fq(pattern-list)j -Ft(is)d(a)g(list)g(of)150 2351 y(one)d(or)f(more)h(patterns)f -(separated)h(b)m(y)f(a)h(`)p Fs(|)p Ft('.)47 b(Comp)s(osite)33 +b(In)35 b(the)g(follo)m(wing)i(description,)g(a)f Fr(pattern-list)j +Fu(is)d(a)g(list)g(of)150 2351 y(one)d(or)f(more)h(patterns)f +(separated)h(b)m(y)f(a)h(`)p Ft(|)p Fu('.)47 b(Comp)s(osite)33 b(patterns)f(ma)m(y)i(b)s(e)d(formed)h(using)g(one)h(or)150 2460 y(more)e(of)f(the)h(follo)m(wing)g(sub-patterns:)150 -2625 y Fs(?\()p Fi(pattern-list)11 b Fs(\))630 2735 y -Ft(Matc)m(hes)32 b(zero)f(or)g(one)f(o)s(ccurrence)h(of)f(the)h(giv)m -(en)g(patterns.)150 2898 y Fs(*\()p Fi(pattern-list)11 -b Fs(\))630 3008 y Ft(Matc)m(hes)32 b(zero)f(or)g(more)f(o)s -(ccurrences)h(of)f(the)h(giv)m(en)g(patterns.)150 3171 -y Fs(+\()p Fi(pattern-list)11 b Fs(\))630 3280 y Ft(Matc)m(hes)32 -b(one)f(or)f(more)h(o)s(ccurrences)f(of)h(the)f(giv)m(en)i(patterns.) -150 3443 y Fs(@\()p Fi(pattern-list)11 b Fs(\))630 3553 -y Ft(Matc)m(hes)32 b(one)f(of)f(the)h(giv)m(en)g(patterns.)150 -3716 y Fs(!\()p Fi(pattern-list)11 b Fs(\))630 3826 y -Ft(Matc)m(hes)32 b(an)m(ything)f(except)g(one)g(of)f(the)h(giv)m(en)g -(patterns.)150 4029 y Fj(3.5.9)63 b(Quote)41 b(Remo)m(v)-7 -b(al)150 4175 y Ft(After)32 b(the)g(preceding)g(expansions,)h(all)f +2625 y Ft(?\()p Fj(pattern-list)p Ft(\))630 2735 y Fu(Matc)m(hes)h +(zero)f(or)g(one)f(o)s(ccurrence)h(of)f(the)h(giv)m(en)g(patterns.)150 +2898 y Ft(*\()p Fj(pattern-list)p Ft(\))630 3008 y Fu(Matc)m(hes)h +(zero)f(or)g(more)f(o)s(ccurrences)h(of)f(the)h(giv)m(en)g(patterns.) +150 3171 y Ft(+\()p Fj(pattern-list)p Ft(\))630 3280 +y Fu(Matc)m(hes)h(one)f(or)f(more)h(o)s(ccurrences)f(of)h(the)f(giv)m +(en)i(patterns.)150 3443 y Ft(@\()p Fj(pattern-list)p +Ft(\))630 3553 y Fu(Matc)m(hes)g(one)f(of)f(the)h(giv)m(en)g(patterns.) +150 3716 y Ft(!\()p Fj(pattern-list)p Ft(\))630 3826 +y Fu(Matc)m(hes)h(an)m(ything)f(except)g(one)g(of)f(the)h(giv)m(en)g +(patterns.)150 4029 y Fk(3.5.9)63 b(Quote)41 b(Remo)m(v)-7 +b(al)150 4175 y Fu(After)32 b(the)g(preceding)g(expansions,)h(all)f (unquoted)f(o)s(ccurrences)h(of)g(the)h(c)m(haracters)g(`)p -Fs(\\)p Ft(',)g(`)p Fs(')p Ft(',)f(and)g(`)p Fs(")p Ft(')150 +Ft(\\)p Fu(',)g(`)p Ft(')p Fu(',)f(and)g(`)p Ft(")p Fu(')150 4285 y(that)f(did)f(not)g(result)g(from)g(one)h(of)g(the)f(ab)s(o)m(v)m -(e)i(expansions)e(are)h(remo)m(v)m(ed.)150 4523 y Fr(3.6)68 -b(Redirections)150 4682 y Ft(Before)32 b(a)f(command)f(is)h(executed,)h -(its)f(input)e(and)h(output)h(ma)m(y)g(b)s(e)f Fq(redirected)k -Ft(using)c(a)i(sp)s(ecial)f(no-)150 4792 y(tation)d(in)m(terpreted)f(b) +(e)i(expansions)e(are)h(remo)m(v)m(ed.)150 4523 y Fs(3.6)68 +b(Redirections)150 4682 y Fu(Before)32 b(a)f(command)f(is)h(executed,)h +(its)f(input)e(and)h(output)h(ma)m(y)g(b)s(e)f Fr(redirected)k +Fu(using)c(a)i(sp)s(ecial)f(no-)150 4792 y(tation)d(in)m(terpreted)f(b) m(y)f(the)h(shell.)40 b(Redirection)27 b(allo)m(ws)h(commands')f (\014le)f(handles)g(to)i(b)s(e)e(duplicated,)150 4902 y(op)s(ened,)i(closed,)i(made)e(to)h(refer)f(to)h(di\013eren)m(t)f @@ -9773,27 +10322,27 @@ b(Redirections)30 b(are)g(pro)s(cessed)150 5340 y(in)g(the)h(order)f (they)g(app)s(ear,)g(from)g(left)h(to)g(righ)m(t.)p eop end %%Page: 32 38 -TeXDict begin 32 37 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 32 37 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(32)275 299 y(Eac)m(h)45 b(redirection)h(that)f(ma)m(y)h(b)s(e)e(preceded)g(b)m(y)h (a)h(\014le)f(descriptor)f(n)m(um)m(b)s(er)g(ma)m(y)h(instead)h(b)s(e) -150 408 y(preceded)41 b(b)m(y)g(a)g(w)m(ord)g(of)g(the)g(form)g -Fs({)p Fq(v)-5 b(arname)5 b Fs(})p Ft(.)72 b(In)40 b(this)h(case,)k -(for)c(eac)m(h)h(redirection)g(op)s(erator)150 518 y(except)30 -b Fs(>)p Ft(&-)f(and)f Fs(<)p Ft(&-,)h(the)g(shell)g(will)h(allo)s +150 408 y(preceded)41 b(b)m(y)g(a)h(w)m(ord)f(of)g(the)h(form)f +Fi({)p Fr(v)-5 b(arname)5 b Fi(})p Fu(.)74 b(In)41 b(this)g(case,)k +(for)c(eac)m(h)i(redirection)f(op)s(erator)150 518 y(except)30 +b Ft(>)p Fu(&-)f(and)f Ft(<)p Fu(&-,)h(the)g(shell)g(will)h(allo)s (cate)h(a)e(\014le)h(descriptor)e(greater)j(than)d(10)i(and)e(assign)i -(it)f(to)150 628 y Fs({)p Fq(v)-5 b(arname)5 b Fs(})p -Ft(.)42 b(If)31 b Fs(>)p Ft(&-)f(or)h Fs(<)p Ft(&-)g(is)g(preceded)g(b) -m(y)g Fs({)p Fq(v)-5 b(arname)5 b Fs(})p Ft(,)31 b(the)g(v)-5 -b(alue)31 b(of)g Fq(v)-5 b(arname)37 b Ft(de\014nes)30 -b(the)h(\014le)150 737 y(descriptor)f(to)h(close.)275 +(it)f(to)150 628 y Fi({)p Fr(v)-5 b(arname)5 b Fi(})p +Fu(.)45 b(If)31 b Ft(>)p Fu(&-)g(or)h Ft(<)p Fu(&-)f(is)h(preceded)f(b) +m(y)g Fi({)p Fr(v)-5 b(arname)5 b Fi(})p Fu(,)33 b(the)f(v)-5 +b(alue)32 b(of)g Fr(v)-5 b(arname)36 b Fu(de\014nes)31 +b(the)h(\014le)150 737 y(descriptor)e(to)h(close.)275 890 y(In)c(the)i(follo)m(wing)h(descriptions,)g(if)e(the)h(\014le)g (descriptor)f(n)m(um)m(b)s(er)g(is)g(omitted,)i(and)f(the)f(\014rst)g (c)m(har-)150 999 y(acter)42 b(of)f(the)g(redirection)g(op)s(erator)g -(is)g(`)p Fs(<)p Ft(',)i(the)e(redirection)g(refers)g(to)g(the)g +(is)g(`)p Ft(<)p Fu(',)i(the)e(redirection)g(refers)g(to)g(the)g (standard)f(input)f(\(\014le)150 1109 y(descriptor)33 b(0\).)49 b(If)33 b(the)g(\014rst)f(c)m(haracter)i(of)g(the)f -(redirection)g(op)s(erator)h(is)f(`)p Fs(>)p Ft(',)h(the)f(redirection) +(redirection)g(op)s(erator)h(is)f(`)p Ft(>)p Fu(',)h(the)f(redirection) g(refers)150 1218 y(to)e(the)g(standard)e(output)h(\(\014le)h (descriptor)f(1\).)275 1371 y(The)h(w)m(ord)h(follo)m(wing)i(the)f (redirection)g(op)s(erator)f(in)g(the)h(follo)m(wing)h(descriptions,)f @@ -9805,214 +10354,212 @@ e(expansion,)i(command)150 1590 y(substitution,)31 b(arithmetic)h (than)f(one)h(w)m(ord,)f(Bash)h(rep)s(orts)e(an)h(error.)275 1852 y(Note)h(that)g(the)g(order)f(of)g(redirections)h(is)g (signi\014can)m(t.)41 b(F)-8 b(or)31 b(example,)h(the)e(command)390 -2004 y Fs(ls)47 b(>)h Fi(dirlist)56 b Fs(2>&1)150 2157 -y Ft(directs)28 b(b)s(oth)f(standard)g(output)g(\(\014le)h(descriptor)f +2004 y Ft(ls)47 b(>)h Fj(dirlist)d Ft(2>&1)150 2157 y +Fu(directs)28 b(b)s(oth)f(standard)g(output)g(\(\014le)h(descriptor)f (1\))i(and)e(standard)f(error)i(\(\014le)g(descriptor)f(2\))h(to)h(the) -150 2266 y(\014le)h Fq(dirlist)r Ft(,)h(while)f(the)h(command)390 -2419 y Fs(ls)47 b(2>&1)g(>)g Fi(dirlist)150 2571 y Ft(directs)28 -b(only)f(the)g(standard)g(output)g(to)h(\014le)f Fq(dirlist)r -Ft(,)h(b)s(ecause)g(the)f(standard)g(error)g(w)m(as)g(made)h(a)f(cop)m -(y)150 2681 y(of)k(the)f(standard)g(output)g(b)s(efore)g(the)g -(standard)g(output)g(w)m(as)g(redirected)h(to)g Fq(dirlist)r -Ft(.)275 2833 y(Bash)26 b(handles)f(sev)m(eral)j(\014lenames)e(sp)s +150 2266 y(\014le)h Fr(dirlist)p Fu(,)h(while)f(the)h(command)390 +2419 y Ft(ls)47 b(2>&1)g(>)g Fj(dirlist)150 2571 y Fu(directs)28 +b(only)f(the)h(standard)e(output)i(to)g(\014le)f Fr(dirlist)p +Fu(,)h(b)s(ecause)g(the)f(standard)g(error)g(w)m(as)h(made)f(a)h(cop)m +(y)150 2681 y(of)j(the)f(standard)g(output)g(b)s(efore)g(the)g +(standard)g(output)g(w)m(as)g(redirected)h(to)g Fr(dirlist)p +Fu(.)275 2833 y(Bash)26 b(handles)f(sev)m(eral)j(\014lenames)e(sp)s (ecially)h(when)f(they)g(are)g(used)g(in)g(redirections,)i(as)e (describ)s(ed)150 2942 y(in)k(the)h(follo)m(wing)g(table:)150 -3129 y Fs(/dev/fd/)p Fi(fd)630 3238 y Ft(If)f Fq(fd)j -Ft(is)d(a)h(v)-5 b(alid)31 b(in)m(teger,)h(\014le)e(descriptor)h -Fq(fd)i Ft(is)d(duplicated.)150 3416 y Fs(/dev/stdin)630 -3525 y Ft(File)i(descriptor)e(0)h(is)f(duplicated.)150 -3702 y Fs(/dev/stdout)630 3812 y Ft(File)i(descriptor)e(1)h(is)f -(duplicated.)150 3989 y Fs(/dev/stderr)630 4099 y Ft(File)i(descriptor) -e(2)h(is)f(duplicated.)150 4276 y Fs(/dev/tcp/)p Fi(host)11 -b Fs(/)p Fi(port)630 4386 y Ft(If)41 b Fq(host)i Ft(is)f(a)g(v)-5 +3129 y Ft(/dev/fd/)p Fj(fd)630 3238 y Fu(If)f Fr(fd)j +Fu(is)d(a)h(v)-5 b(alid)31 b(in)m(teger,)h(\014le)e(descriptor)h +Fr(fd)i Fu(is)d(duplicated.)150 3416 y Ft(/dev/stdin)630 +3525 y Fu(File)i(descriptor)e(0)h(is)f(duplicated.)150 +3702 y Ft(/dev/stdout)630 3812 y Fu(File)i(descriptor)e(1)h(is)f +(duplicated.)150 3989 y Ft(/dev/stderr)630 4099 y Fu(File)i(descriptor) +e(2)h(is)f(duplicated.)150 4276 y Ft(/dev/tcp/)p Fj(host)p +Ft(/)p Fj(port)630 4386 y Fu(If)41 b Fr(host)i Fu(is)f(a)g(v)-5 b(alid)41 b(hostname)h(or)f(In)m(ternet)h(address,)i(and)c -Fq(p)s(ort)j Ft(is)f(an)f(in)m(teger)i(p)s(ort)630 4495 +Fr(p)s(ort)j Fu(is)f(an)f(in)m(teger)i(p)s(ort)630 4495 y(n)m(um)m(b)s(er)23 b(or)i(service)h(name,)g(Bash)f(attempts)h(to)f (op)s(en)f(the)h(corresp)s(onding)f(TCP)g(so)s(c)m(k)m(et.)150 -4673 y Fs(/dev/udp/)p Fi(host)11 b Fs(/)p Fi(port)630 -4782 y Ft(If)41 b Fq(host)i Ft(is)f(a)g(v)-5 b(alid)41 -b(hostname)h(or)f(In)m(ternet)h(address,)i(and)c Fq(p)s(ort)j -Ft(is)f(an)f(in)m(teger)i(p)s(ort)630 4892 y(n)m(um)m(b)s(er)23 -b(or)h(service)h(name,)h(Bash)e(attempts)h(to)g(op)s(en)f(the)g -(corresp)s(onding)f(UDP)i(so)s(c)m(k)m(et.)275 5078 y(A)30 -b(failure)h(to)g(op)s(en)e(or)i(create)h(a)e(\014le)h(causes)g(the)f -(redirection)h(to)g(fail.)275 5230 y(Redirections)f(using)e(\014le)i -(descriptors)f(greater)h(than)f(9)h(should)e(b)s(e)h(used)f(with)h -(care,)h(as)g(they)f(ma)m(y)150 5340 y(con\015ict)i(with)f(\014le)h -(descriptors)f(the)g(shell)h(uses)f(in)m(ternally)-8 -b(.)p eop end +4673 y Ft(/dev/udp/)p Fj(host)p Ft(/)p Fj(port)630 4782 +y Fu(If)41 b Fr(host)i Fu(is)f(a)g(v)-5 b(alid)41 b(hostname)h(or)f(In) +m(ternet)h(address,)i(and)c Fr(p)s(ort)j Fu(is)f(an)f(in)m(teger)i(p)s +(ort)630 4892 y(n)m(um)m(b)s(er)23 b(or)h(service)h(name,)h(Bash)e +(attempts)h(to)g(op)s(en)f(the)g(corresp)s(onding)f(UDP)i(so)s(c)m(k)m +(et.)275 5078 y(A)30 b(failure)h(to)g(op)s(en)e(or)i(create)h(a)e +(\014le)h(causes)g(the)f(redirection)h(to)g(fail.)275 +5230 y(Redirections)f(using)e(\014le)i(descriptors)f(greater)h(than)f +(9)h(should)e(b)s(e)h(used)f(with)h(care,)h(as)g(they)f(ma)m(y)150 +5340 y(con\015ict)i(with)f(\014le)h(descriptors)f(the)g(shell)h(uses)f +(in)m(ternally)-8 b(.)p eop end %%Page: 33 39 -TeXDict begin 33 38 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 33 38 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(33)150 299 -y Fj(3.6.1)63 b(Redirecting)40 b(Input)150 446 y Ft(Redirection)35 +y Fk(3.6.1)63 b(Redirecting)40 b(Input)150 446 y Fu(Redirection)35 b(of)f(input)f(causes)i(the)f(\014le)g(whose)g(name)g(results)g(from)g -(the)g(expansion)g(of)g Fq(w)m(ord)k Ft(to)d(b)s(e)150 +(the)g(expansion)g(of)g Fr(w)m(ord)k Fu(to)d(b)s(e)150 555 y(op)s(ened)d(for)g(reading)g(on)g(\014le)h(descriptor)f -Fs(n)p Ft(,)h(or)f(the)g(standard)g(input)f(\(\014le)i(descriptor)f -(0\))h(if)f Fs(n)g Ft(is)h(not)150 665 y(sp)s(eci\014ed.)275 +Ft(n)p Fu(,)h(or)f(the)g(standard)g(input)f(\(\014le)i(descriptor)f +(0\))h(if)f Ft(n)g Fu(is)h(not)150 665 y(sp)s(eci\014ed.)275 798 y(The)c(general)j(format)e(for)h(redirecting)g(input)e(is:)390 -930 y Fs([)p Fi(n)11 b Fs(]<)p Fi(word)150 1126 y Fj(3.6.2)63 -b(Redirecting)40 b(Output)150 1273 y Ft(Redirection)31 +930 y Ft([)p Fj(n)p Ft(]<)p Fj(word)150 1126 y Fk(3.6.2)63 +b(Redirecting)40 b(Output)150 1273 y Fu(Redirection)31 b(of)g(output)f(causes)h(the)f(\014le)h(whose)f(name)g(results)h(from)e -(the)i(expansion)f(of)h Fq(w)m(ord)i Ft(to)f(b)s(e)150 +(the)i(expansion)f(of)h Fr(w)m(ord)i Fu(to)f(b)s(e)150 1382 y(op)s(ened)d(for)g(writing)g(on)g(\014le)h(descriptor)f -Fq(n)p Ft(,)g(or)g(the)h(standard)e(output)h(\(\014le)h(descriptor)f -(1\))h(if)g Fq(n)e Ft(is)i(not)150 1492 y(sp)s(eci\014ed.)40 +Fr(n)p Fu(,)g(or)g(the)h(standard)e(output)h(\(\014le)h(descriptor)f +(1\))h(if)g Fr(n)e Fu(is)i(not)150 1492 y(sp)s(eci\014ed.)40 b(If)30 b(the)g(\014le)h(do)s(es)f(not)h(exist)g(it)g(is)f(created;)i (if)e(it)h(do)s(es)f(exist)h(it)g(is)g(truncated)f(to)h(zero)g(size.) 275 1625 y(The)e(general)j(format)e(for)h(redirecting)g(output)f(is:) -390 1757 y Fs([)p Fi(n)11 b Fs(]>[|])p Fi(word)275 1890 -y Ft(If)30 b(the)h(redirection)g(op)s(erator)g(is)g(`)p -Fs(>)p Ft(',)g(and)f(the)h Fs(noclobber)d Ft(option)j(to)g(the)g -Fs(set)f Ft(builtin)g(has)h(b)s(een)150 2000 y(enabled,)i(the)f -(redirection)h(will)f(fail)h(if)f(the)g(\014le)g(whose)g(name)g -(results)g(from)g(the)g(expansion)g(of)g Fq(w)m(ord)150 -2109 y Ft(exists)f(and)f(is)g(a)h(regular)g(\014le.)41 +390 1757 y Ft([)p Fj(n)p Ft(]>[|])p Fj(word)275 1890 +y Fu(If)g(the)h(redirection)g(op)s(erator)g(is)g(`)p +Ft(>)p Fu(',)g(and)f(the)h Ft(noclobber)d Fu(option)j(to)g(the)g +Ft(set)f Fu(builtin)g(has)h(b)s(een)150 2000 y(enabled,)h(the)g +(redirection)h(will)f(fail)h(if)e(the)i(\014le)e(whose)h(name)g +(results)g(from)f(the)h(expansion)g(of)g Fr(w)m(ord)150 +2109 y Fu(exists)f(and)f(is)g(a)h(regular)g(\014le.)41 b(If)30 b(the)h(redirection)g(op)s(erator)g(is)f(`)p -Fs(>|)p Ft(',)h(or)f(the)h(redirection)g(op)s(erator)g(is)150 -2219 y(`)p Fs(>)p Ft(')36 b(and)f(the)g Fs(noclobber)e -Ft(option)j(is)g(not)g(enabled,)h(the)e(redirection)h(is)g(attempted)g +Ft(>|)p Fu(',)h(or)f(the)h(redirection)g(op)s(erator)g(is)150 +2219 y(`)p Ft(>)p Fu(')36 b(and)f(the)g Ft(noclobber)e +Fu(option)j(is)g(not)g(enabled,)h(the)e(redirection)h(is)g(attempted)g (ev)m(en)h(if)e(the)h(\014le)150 2328 y(named)30 b(b)m(y)g -Fq(w)m(ord)k Ft(exists.)150 2524 y Fj(3.6.3)63 b(App)s(ending)42 -b(Redirected)e(Output)150 2671 y Ft(Redirection)23 b(of)e(output)h(in)f +Fr(w)m(ord)k Fu(exists.)150 2524 y Fk(3.6.3)63 b(App)s(ending)42 +b(Redirected)e(Output)150 2671 y Fu(Redirection)23 b(of)e(output)h(in)f (this)h(fashion)f(causes)h(the)g(\014le)g(whose)f(name)h(results)f -(from)g(the)h(expansion)g(of)150 2780 y Fq(w)m(ord)28 -b Ft(to)e(b)s(e)e(op)s(ened)g(for)h(app)s(ending)e(on)i(\014le)g -(descriptor)g Fq(n)p Ft(,)g(or)g(the)g(standard)f(output)h(\(\014le)g -(descriptor)150 2890 y(1\))31 b(if)f Fq(n)g Ft(is)h(not)f(sp)s +(from)g(the)h(expansion)g(of)150 2780 y Fr(w)m(ord)28 +b Fu(to)e(b)s(e)e(op)s(ened)g(for)h(app)s(ending)e(on)i(\014le)g +(descriptor)g Fr(n)p Fu(,)g(or)g(the)g(standard)f(output)h(\(\014le)g +(descriptor)150 2890 y(1\))31 b(if)f Fr(n)g Fu(is)h(not)f(sp)s (eci\014ed.)40 b(If)30 b(the)h(\014le)f(do)s(es)g(not)h(exist)g(it)g (is)f(created.)275 3023 y(The)f(general)j(format)e(for)h(app)s(ending)e -(output)h(is:)390 3155 y Fs([)p Fi(n)11 b Fs(]>>)p Fi(word)150 -3351 y Fj(3.6.4)63 b(Redirecting)40 b(Standard)h(Output)g(and)g -(Standard)g(Error)150 3498 y Ft(This)33 b(construct)i(allo)m(ws)g(b)s +(output)h(is:)390 3155 y Ft([)p Fj(n)p Ft(]>>)p Fj(word)150 +3351 y Fk(3.6.4)63 b(Redirecting)40 b(Standard)h(Output)g(and)g +(Standard)g(Error)150 3498 y Fu(This)33 b(construct)i(allo)m(ws)g(b)s (oth)f(the)g(standard)g(output)f(\(\014le)i(descriptor)f(1\))h(and)f (the)g(standard)f(error)150 3607 y(output)d(\(\014le)h(descriptor)f (2\))h(to)g(b)s(e)f(redirected)h(to)g(the)f(\014le)h(whose)f(name)h(is) -f(the)g(expansion)h(of)f Fq(w)m(ord)t Ft(.)275 3740 y(There)f(are)i(t)m +f(the)g(expansion)h(of)f Fr(w)m(ord)p Fu(.)275 3740 y(There)f(are)i(t)m (w)m(o)h(formats)e(for)h(redirecting)g(standard)e(output)h(and)g -(standard)f(error:)390 3873 y Fs(&>)p Fi(word)150 4005 -y Ft(and)390 4138 y Fs(>&)p Fi(word)150 4271 y Ft(Of)h(the)g(t)m(w)m(o) +(standard)f(error:)390 3873 y Ft(&>)p Fj(word)150 4005 +y Fu(and)390 4138 y Ft(>&)p Fj(word)150 4271 y Fu(Of)h(the)g(t)m(w)m(o) i(forms,)e(the)h(\014rst)e(is)i(preferred.)39 b(This)30 b(is)g(seman)m(tically)j(equiv)-5 b(alen)m(t)32 b(to)390 -4403 y Fs(>)p Fi(word)57 b Fs(2>&1)275 4536 y Ft(When)41 -b(using)g(the)h(second)f(form,)k Fq(w)m(ord)f Ft(ma)m(y)e(not)g(expand) -f(to)h(a)g(n)m(um)m(b)s(er)f(or)g(`)p Fs(-)p Ft('.)75 +4403 y Ft(>)p Fj(word)46 b Ft(2>&1)275 4536 y Fu(When)41 +b(using)g(the)h(second)f(form,)k Fr(w)m(ord)f Fu(ma)m(y)e(not)g(expand) +f(to)h(a)g(n)m(um)m(b)s(er)f(or)g(`)p Ft(-)p Fu('.)75 b(If)41 b(it)h(do)s(es,)150 4646 y(other)27 b(redirection)g(op)s (erators)f(apply)h(\(see)g(Duplicating)h(File)f(Descriptors)h(b)s(elo)m (w\))f(for)f(compatibilit)m(y)150 4755 y(reasons.)150 -4951 y Fj(3.6.5)63 b(App)s(ending)42 b(Standard)f(Output)g(and)g -(Standard)g(Error)150 5098 y Ft(This)33 b(construct)i(allo)m(ws)g(b)s +4951 y Fk(3.6.5)63 b(App)s(ending)42 b(Standard)f(Output)g(and)g +(Standard)g(Error)150 5098 y Fu(This)33 b(construct)i(allo)m(ws)g(b)s (oth)f(the)g(standard)g(output)f(\(\014le)i(descriptor)f(1\))h(and)f (the)g(standard)f(error)150 5207 y(output)d(\(\014le)h(descriptor)f (2\))h(to)g(b)s(e)f(app)s(ended)f(to)i(the)f(\014le)h(whose)f(name)g -(is)h(the)f(expansion)h(of)f Fq(w)m(ord)t Ft(.)275 5340 +(is)h(the)f(expansion)h(of)f Fr(w)m(ord)p Fu(.)275 5340 y(The)f(format)i(for)f(app)s(ending)f(standard)h(output)g(and)f (standard)h(error)g(is:)p eop end %%Page: 34 40 -TeXDict begin 34 39 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 34 39 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(34)390 299 -y Fs(&>>)p Fi(word)150 436 y Ft(This)30 b(is)g(seman)m(tically)j(equiv) --5 b(alen)m(t)32 b(to)390 572 y Fs(>>)p Fi(word)57 b -Fs(2>&1)275 709 y Ft(\(see)31 b(Duplicating)h(File)f(Descriptors)g(b)s -(elo)m(w\).)150 910 y Fj(3.6.6)63 b(Here)41 b(Do)s(cumen)m(ts)150 -1057 y Ft(This)c(t)m(yp)s(e)h(of)f(redirection)i(instructs)e(the)h +y Ft(&>>)p Fj(word)150 436 y Fu(This)30 b(is)g(seman)m(tically)j(equiv) +-5 b(alen)m(t)32 b(to)390 572 y Ft(>>)p Fj(word)46 b +Ft(2>&1)275 709 y Fu(\(see)31 b(Duplicating)h(File)f(Descriptors)g(b)s +(elo)m(w\).)150 910 y Fk(3.6.6)63 b(Here)41 b(Do)s(cumen)m(ts)150 +1057 y Fu(This)c(t)m(yp)s(e)h(of)f(redirection)i(instructs)e(the)h (shell)f(to)i(read)e(input)g(from)g(the)h(curren)m(t)f(source)h(un)m (til)g(a)150 1167 y(line)31 b(con)m(taining)g(only)g -Fq(w)m(ord)i Ft(\(with)d(no)h(trailing)g(blanks\))f(is)g(seen.)41 +Fr(w)m(ord)i Fu(\(with)d(no)h(trailing)g(blanks\))f(is)g(seen.)41 b(All)31 b(of)f(the)h(lines)f(read)g(up)f(to)i(that)150 1277 y(p)s(oin)m(t)f(are)h(then)f(used)g(as)g(the)h(standard)f(input)f (for)h(a)h(command.)275 1413 y(The)e(format)i(of)g(here-do)s(cumen)m -(ts)f(is:)390 1550 y Fs(<<[)p Fp(\000)p Fs(])p Fi(word)772 +(ts)f(is:)390 1550 y Ft(<<[)p Fq(\000)p Ft(])p Fj(word)772 1660 y(here-document)390 1769 y(delimiter)275 1906 y -Ft(No)i(parameter)h(and)f(v)-5 b(ariable)32 b(expansion,)h(command)f +Fu(No)i(parameter)h(and)f(v)-5 b(ariable)32 b(expansion,)h(command)f (substitution,)h(arithmetic)g(expansion,)g(or)150 2015 -y(\014lename)38 b(expansion)f(is)h(p)s(erformed)e(on)h -Fq(w)m(ord)t Ft(.)62 b(If)37 b(an)m(y)h(c)m(haracters)h(in)e -Fq(w)m(ord)k Ft(are)d(quoted,)i(the)e Fq(de-)150 2125 -y(limiter)h Ft(is)32 b(the)g(result)g(of)g(quote)g(remo)m(v)-5 -b(al)33 b(on)f Fq(w)m(ord)t Ft(,)g(and)f(the)h(lines)g(in)g(the)g -(here-do)s(cumen)m(t)f(are)i(not)150 2235 y(expanded.)71 -b(If)40 b Fq(w)m(ord)k Ft(is)d(unquoted,)h(all)g(lines)f(of)g(the)f +y(\014lename)38 b(expansion)g(is)g(p)s(erformed)e(on)i +Fr(w)m(ord)p Fu(.)62 b(If)38 b(an)m(y)g(c)m(haracters)h(in)e +Fr(w)m(ord)42 b Fu(are)c(quoted,)i(the)e Fr(de-)150 2125 +y(limiter)h Fu(is)32 b(the)h(result)f(of)g(quote)h(remo)m(v)-5 +b(al)33 b(on)f Fr(w)m(ord)p Fu(,)g(and)g(the)g(lines)g(in)g(the)g +(here-do)s(cumen)m(t)g(are)h(not)150 2235 y(expanded.)71 +b(If)40 b Fr(w)m(ord)k Fu(is)d(unquoted,)h(all)g(lines)f(of)g(the)f (here-do)s(cumen)m(t)h(are)g(sub)5 b(jected)41 b(to)g(param-)150 2344 y(eter)c(expansion,)i(command)d(substitution,)i(and)e(arithmetic)i (expansion,)g(the)f(c)m(haracter)i(sequence)150 2454 -y Fs(\\newline)28 b Ft(is)j(ignored,)f(and)g(`)p Fs(\\)p -Ft(')h(m)m(ust)f(b)s(e)g(used)f(to)i(quote)g(the)g(c)m(haracters)h(`)p -Fs(\\)p Ft(',)e(`)p Fs($)p Ft(',)h(and)f(`)p Fs(`)p Ft('.)275 +y Ft(\\newline)28 b Fu(is)j(ignored,)f(and)g(`)p Ft(\\)p +Fu(')h(m)m(ust)f(b)s(e)g(used)f(to)i(quote)g(the)g(c)m(haracters)h(`)p +Ft(\\)p Fu(',)e(`)p Ft($)p Fu(',)h(and)f(`)p Ft(`)p Fu('.)275 2590 y(If)21 b(the)i(redirection)g(op)s(erator)g(is)f(`)p -Fs(<<-)p Ft(',)i(then)e(all)h(leading)g(tab)g(c)m(haracters)h(are)e -(stripp)s(ed)f(from)h(input)150 2700 y(lines)33 b(and)e(the)i(line)g -(con)m(taining)h Fq(delimiter)7 b Ft(.)47 b(This)31 b(allo)m(ws)j -(here-do)s(cumen)m(ts)f(within)e(shell)i(scripts)f(to)150 +Ft(<<-)p Fu(',)i(then)e(all)h(leading)g(tab)g(c)m(haracters)h(are)e +(stripp)s(ed)f(from)h(input)150 2700 y(lines)33 b(and)f(the)h(line)h +(con)m(taining)g Fr(delimiter)p Fu(.)49 b(This)32 b(allo)m(ws)i +(here-do)s(cumen)m(ts)f(within)f(shell)i(scripts)e(to)150 2810 y(b)s(e)e(inden)m(ted)g(in)g(a)h(natural)f(fashion.)150 -3011 y Fj(3.6.7)63 b(Here)41 b(Strings)150 3158 y Ft(A)30 +3011 y Fk(3.6.7)63 b(Here)41 b(Strings)150 3158 y Fu(A)30 b(v)-5 b(arian)m(t)32 b(of)e(here)h(do)s(cumen)m(ts,)f(the)g(format)h -(is:)390 3295 y Fs(<<<)47 b Fi(word)275 3431 y Ft(The)21 -b Fq(w)m(ord)k Ft(undergo)s(es)c(brace)h(expansion,)i(tilde)e +(is:)390 3295 y Ft(<<<)47 b Fj(word)275 3431 y Fu(The)21 +b Fr(w)m(ord)k Fu(undergo)s(es)c(brace)h(expansion,)i(tilde)e (expansion,)i(parameter)e(and)f(v)-5 b(ariable)23 b(expansion,)150 3541 y(command)j(substitution,)g(arithmetic)i(expansion,)f(and)e(quote) i(remo)m(v)-5 b(al.)40 b(P)m(athname)27 b(expansion)f(and)150 3651 y(w)m(ord)j(splitting)i(are)f(not)g(p)s(erformed.)39 b(The)29 b(result)h(is)g(supplied)e(as)i(a)h(single)f(string)g(to)g (the)g(command)150 3760 y(on)g(its)h(standard)f(input.)150 -3962 y Fj(3.6.8)63 b(Duplicating)41 b(File)g(Descriptors)150 -4109 y Ft(The)30 b(redirection)h(op)s(erator)390 4245 -y Fs([)p Fi(n)11 b Fs(]<&)p Fi(word)150 4382 y Ft(is)35 -b(used)e(to)j(duplicate)f(input)f(\014le)g(descriptors.)53 -b(If)34 b Fq(w)m(ord)k Ft(expands)c(to)h(one)g(or)g(more)g(digits,)h -(the)f(\014le)150 4492 y(descriptor)e(denoted)h(b)m(y)g -Fq(n)f Ft(is)g(made)h(to)g(b)s(e)f(a)h(cop)m(y)g(of)g(that)g(\014le)g -(descriptor.)50 b(If)33 b(the)h(digits)g(in)f Fq(w)m(ord)150 -4601 y Ft(do)c(not)h(sp)s(ecify)f(a)h(\014le)f(descriptor)g(op)s(en)g +3962 y Fk(3.6.8)63 b(Duplicating)41 b(File)g(Descriptors)150 +4109 y Fu(The)30 b(redirection)h(op)s(erator)390 4245 +y Ft([)p Fj(n)p Ft(]<&)p Fj(word)150 4382 y Fu(is)k(used)e(to)j +(duplicate)f(input)f(\014le)g(descriptors.)53 b(If)34 +b Fr(w)m(ord)k Fu(expands)c(to)h(one)g(or)g(more)g(digits,)h(the)f +(\014le)150 4492 y(descriptor)e(denoted)h(b)m(y)f Fr(n)g +Fu(is)g(made)h(to)g(b)s(e)f(a)g(cop)m(y)h(of)g(that)g(\014le)f +(descriptor.)50 b(If)33 b(the)h(digits)g(in)f Fr(w)m(ord)150 +4601 y Fu(do)c(not)h(sp)s(ecify)f(a)h(\014le)f(descriptor)g(op)s(en)g (for)g(input,)g(a)h(redirection)g(error)f(o)s(ccurs.)40 -b(If)29 b Fq(w)m(ord)j Ft(ev)-5 b(aluates)150 4711 y(to)31 -b(`)p Fs(-)p Ft(',)g(\014le)g(descriptor)g Fq(n)f Ft(is)g(closed.)43 -b(If)30 b Fq(n)g Ft(is)g(not)h(sp)s(eci\014ed,)f(the)h(standard)f +b(If)29 b Fr(w)m(ord)j Fu(ev)-5 b(aluates)150 4711 y(to)31 +b(`)p Ft(-)p Fu(',)g(\014le)g(descriptor)g Fr(n)f Fu(is)g(closed.)43 +b(If)30 b Fr(n)g Fu(is)g(not)h(sp)s(eci\014ed,)f(the)h(standard)f (input)g(\(\014le)h(descriptor)f(0\))150 4820 y(is)g(used.)275 -4957 y(The)f(op)s(erator)390 5094 y Fs([)p Fi(n)11 b -Fs(]>&)p Fi(word)150 5230 y Ft(is)40 b(used)g(similarly)h(to)g -(duplicate)f(output)g(\014le)h(descriptors.)70 b(If)40 -b Fq(n)f Ft(is)i(not)f(sp)s(eci\014ed,)i(the)f(standard)150 -5340 y(output)30 b(\(\014le)g(descriptor)g(1\))h(is)f(used.)39 -b(If)30 b(the)g(digits)h(in)e Fq(w)m(ord)34 b Ft(do)29 -b(not)i(sp)s(ecify)e(a)i(\014le)f(descriptor)g(op)s(en)p -eop end +4957 y(The)f(op)s(erator)390 5094 y Ft([)p Fj(n)p Ft(]>&)p +Fj(word)150 5230 y Fu(is)40 b(used)g(similarly)h(to)g(duplicate)f +(output)g(\014le)h(descriptors.)70 b(If)40 b Fr(n)f Fu(is)i(not)f(sp)s +(eci\014ed,)i(the)f(standard)150 5340 y(output)30 b(\(\014le)g +(descriptor)g(1\))h(is)f(used.)39 b(If)30 b(the)g(digits)h(in)e +Fr(w)m(ord)34 b Fu(do)29 b(not)i(sp)s(ecify)e(a)i(\014le)f(descriptor)g +(op)s(en)p eop end %%Page: 35 41 -TeXDict begin 35 40 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 35 40 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(35)150 299 y(for)35 b(output,)h(a)g(redirection)g(error)e(o)s(ccurs.)55 -b(If)35 b Fq(w)m(ord)j Ft(ev)-5 b(aluates)37 b(to)f(`)p -Fs(-)p Ft(',)h(\014le)e(descriptor)g Fq(n)g Ft(is)g(closed.)150 -408 y(As)f(a)g(sp)s(ecial)h(case,)h(if)e Fq(n)f Ft(is)h(omitted,)i(and) -e Fq(w)m(ord)j Ft(do)s(es)d(not)g(expand)f(to)i(one)f(or)g(more)g -(digits)h(or)f(`)p Fs(-)p Ft(',)150 518 y(the)d(standard)e(output)h +b(If)35 b Fr(w)m(ord)j Fu(ev)-5 b(aluates)37 b(to)f(`)p +Ft(-)p Fu(',)h(\014le)e(descriptor)g Fr(n)g Fu(is)g(closed.)150 +408 y(As)f(a)g(sp)s(ecial)h(case,)h(if)e Fr(n)f Fu(is)h(omitted,)i(and) +e Fr(w)m(ord)j Fu(do)s(es)d(not)g(expand)f(to)i(one)f(or)g(more)g +(digits)h(or)f(`)p Ft(-)p Fu(',)150 518 y(the)d(standard)e(output)h (and)g(standard)f(error)h(are)h(redirected)g(as)g(describ)s(ed)e -(previously)-8 b(.)150 717 y Fj(3.6.9)63 b(Mo)m(ving)41 -b(File)h(Descriptors)150 864 y Ft(The)30 b(redirection)h(op)s(erator) -390 999 y Fs([)p Fi(n)11 b Fs(]<&)p Fi(digit)g Fs(-)150 -1133 y Ft(mo)m(v)m(es)33 b(the)f(\014le)g(descriptor)f -Fq(digit)k Ft(to)d(\014le)g(descriptor)g Fq(n)p Ft(,)f(or)h(the)g -(standard)f(input)f(\(\014le)j(descriptor)e(0\))150 1243 -y(if)f Fq(n)g Ft(is)h(not)f(sp)s(eci\014ed.)40 b Fq(digit)33 -b Ft(is)e(closed)g(after)g(b)s(eing)f(duplicated)g(to)h -Fq(n)p Ft(.)275 1377 y(Similarly)-8 b(,)31 b(the)f(redirection)h(op)s -(erator)390 1512 y Fs([)p Fi(n)11 b Fs(]>&)p Fi(digit)g -Fs(-)150 1646 y Ft(mo)m(v)m(es)29 b(the)g(\014le)f(descriptor)f -Fq(digit)k Ft(to)e(\014le)f(descriptor)g Fq(n)p Ft(,)g(or)g(the)g +(previously)-8 b(.)150 717 y Fk(3.6.9)63 b(Mo)m(ving)41 +b(File)h(Descriptors)150 864 y Fu(The)30 b(redirection)h(op)s(erator) +390 999 y Ft([)p Fj(n)p Ft(]<&)p Fj(digit)p Ft(-)150 +1133 y Fu(mo)m(v)m(es)i(the)f(\014le)g(descriptor)f Fr(digit)k +Fu(to)d(\014le)g(descriptor)g Fr(n)p Fu(,)f(or)h(the)g(standard)f +(input)f(\(\014le)j(descriptor)e(0\))150 1243 y(if)f +Fr(n)g Fu(is)h(not)f(sp)s(eci\014ed.)40 b Fr(digit)33 +b Fu(is)e(closed)g(after)g(b)s(eing)f(duplicated)g(to)h +Fr(n)p Fu(.)275 1377 y(Similarly)-8 b(,)31 b(the)f(redirection)h(op)s +(erator)390 1512 y Ft([)p Fj(n)p Ft(]>&)p Fj(digit)p +Ft(-)150 1646 y Fu(mo)m(v)m(es)e(the)g(\014le)f(descriptor)f +Fr(digit)k Fu(to)e(\014le)f(descriptor)g Fr(n)p Fu(,)g(or)g(the)g (standard)f(output)h(\(\014le)g(descriptor)g(1\))150 -1756 y(if)i Fq(n)g Ft(is)h(not)f(sp)s(eci\014ed.)150 -1955 y Fj(3.6.10)63 b(Op)s(ening)42 b(File)g(Descriptors)g(for)g -(Reading)e(and)h(W)-10 b(riting)150 2102 y Ft(The)30 -b(redirection)h(op)s(erator)390 2236 y Fs([)p Fi(n)11 -b Fs(]<>)p Fi(word)150 2371 y Ft(causes)39 b(the)g(\014le)g(whose)g -(name)g(is)g(the)g(expansion)g(of)g Fq(w)m(ord)j Ft(to)d(b)s(e)g(op)s -(ened)f(for)g(b)s(oth)h(reading)g(and)150 2480 y(writing)33 -b(on)f(\014le)h(descriptor)f Fq(n)p Ft(,)h(or)g(on)f(\014le)h -(descriptor)g(0)g(if)f Fq(n)g Ft(is)h(not)g(sp)s(eci\014ed.)47 +1756 y(if)i Fr(n)g Fu(is)h(not)f(sp)s(eci\014ed.)150 +1955 y Fk(3.6.10)63 b(Op)s(ening)42 b(File)g(Descriptors)g(for)g +(Reading)e(and)h(W)-10 b(riting)150 2102 y Fu(The)30 +b(redirection)h(op)s(erator)390 2236 y Ft([)p Fj(n)p +Ft(]<>)p Fj(word)150 2371 y Fu(causes)39 b(the)g(\014le)g(whose)g(name) +g(is)g(the)g(expansion)g(of)g Fr(w)m(ord)j Fu(to)d(b)s(e)g(op)s(ened)f +(for)g(b)s(oth)h(reading)g(and)150 2480 y(writing)33 +b(on)f(\014le)h(descriptor)f Fr(n)p Fu(,)h(or)g(on)f(\014le)h +(descriptor)g(0)g(if)f Fr(n)g Fu(is)h(not)g(sp)s(eci\014ed.)47 b(If)32 b(the)h(\014le)f(do)s(es)h(not)150 2590 y(exist,)e(it)g(is)g -(created.)150 2822 y Fr(3.7)68 b(Executing)46 b(Commands)150 -3046 y Fj(3.7.1)63 b(Simple)41 b(Command)h(Expansion)150 -3193 y Ft(When)33 b(a)g(simple)g(command)g(is)g(executed,)h(the)g +(created.)150 2822 y Fs(3.7)68 b(Executing)46 b(Commands)150 +3046 y Fk(3.7.1)63 b(Simple)41 b(Command)h(Expansion)150 +3193 y Fu(When)33 b(a)g(simple)g(command)g(is)g(executed,)h(the)g (shell)f(p)s(erforms)e(the)i(follo)m(wing)i(expansions,)e(assign-)150 3303 y(men)m(ts,)e(and)f(redirections,)h(from)f(left)h(to)g(righ)m(t.) 199 3437 y(1.)61 b(The)38 b(w)m(ords)f(that)i(the)g(parser)e(has)h @@ -10028,8 +10575,8 @@ b(ariable)40 b(assignmen)m(ts)h(or)e(redirections)i(are)f(expanded)f (are)g(the)h(argu-)330 4010 y(men)m(ts.)199 4145 y(3.)61 b(Redirections)25 b(are)f(p)s(erformed)f(as)h(describ)s(ed)f(ab)s(o)m (v)m(e)i(\(see)g(Section)g(3.6)g([Redirections],)i(page)d(31\).)199 -4279 y(4.)61 b(The)25 b(text)h(after)f(the)g(`)p Fs(=)p -Ft(')h(in)e(eac)m(h)j(v)-5 b(ariable)25 b(assignmen)m(t)h(undergo)s(es) +4279 y(4.)61 b(The)25 b(text)h(after)f(the)g(`)p Ft(=)p +Fu(')h(in)e(eac)m(h)j(v)-5 b(ariable)25 b(assignmen)m(t)h(undergo)s(es) e(tilde)i(expansion,)g(parameter)330 4389 y(expansion,)49 b(command)d(substitution,)j(arithmetic)d(expansion,)k(and)45 b(quote)h(remo)m(v)-5 b(al)46 b(b)s(efore)330 4498 y(b)s(eing)30 @@ -10049,7 +10596,7 @@ b(to)g(a)g(readonly)f(v)-5 b(ariable,)42 b(an)c(error)g(o)s(ccurs,)j b(A)30 b(redirection)h(error)f(causes)h(the)g(command)f(to)h(exit)g (with)f(a)h(non-zero)g(status.)p eop end %%Page: 36 42 -TeXDict begin 36 41 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 36 41 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(36)275 299 y(If)26 b(there)i(is)f(a)h(command)f(name)h(left)g(after)g(expansion,)g (execution)h(pro)s(ceeds)e(as)g(describ)s(ed)f(b)s(elo)m(w.)150 @@ -10059,8 +10606,8 @@ b(one)g(of)g(the)h(expansions)f(con)m(tained)h(a)g(command)f(substitu-) (exit)h(status)g(of)f(the)h(last)g(command)f(substitution)150 628 y(p)s(erformed.)55 b(If)35 b(there)g(w)m(ere)h(no)g(command)f (substitutions,)i(the)e(command)h(exits)g(with)f(a)h(status)g(of)150 -737 y(zero.)150 925 y Fj(3.7.2)63 b(Command)41 b(Searc)m(h)f(and)h -(Execution)150 1071 y Ft(After)i(a)h(command)f(has)g(b)s(een)f(split)h +737 y(zero.)150 925 y Fk(3.7.2)63 b(Command)41 b(Searc)m(h)f(and)h +(Execution)150 1071 y Fu(After)i(a)h(command)f(has)g(b)s(een)f(split)h (in)m(to)h(w)m(ords,)j(if)c(it)g(results)g(in)g(a)h(simple)f(command)g (and)f(an)150 1181 y(optional)32 b(list)f(of)f(argumen)m(ts,)h(the)g (follo)m(wing)g(actions)h(are)f(tak)m(en.)199 1310 y(1.)61 @@ -10075,19 +10622,19 @@ b(If)24 b(the)g(command)g(name)g(con)m(tains)i(no)e(slashes,)i(the)e (that)h(builtin)f(is)g(in)m(v)m(ok)m(ed.)199 1895 y(3.)61 b(If)40 b(the)g(name)h(is)f(neither)h(a)f(shell)h(function)f(nor)g(a)g (builtin,)j(and)d(con)m(tains)h(no)g(slashes,)i(Bash)330 -2005 y(searc)m(hes)c(eac)m(h)g(elemen)m(t)g(of)g Fs($PATH)d -Ft(for)i(a)g(directory)h(con)m(taining)g(an)f(executable)h(\014le)f(b)m +2005 y(searc)m(hes)c(eac)m(h)g(elemen)m(t)g(of)g Ft($PATH)d +Fu(for)i(a)g(directory)h(con)m(taining)g(an)f(executable)h(\014le)f(b)m (y)g(that)330 2115 y(name.)56 b(Bash)36 b(uses)f(a)h(hash)e(table)j(to) f(remem)m(b)s(er)f(the)h(full)f(pathnames)g(of)h(executable)h(\014les)e -(to)330 2224 y(a)m(v)m(oid)e(m)m(ultiple)f Fs(PATH)f -Ft(searc)m(hes)i(\(see)f(the)g(description)g(of)f Fs(hash)g -Ft(in)g(Section)i(4.1)f([Bourne)g(Shell)330 2334 y(Builtins],)37 +(to)330 2224 y(a)m(v)m(oid)e(m)m(ultiple)f Ft(PATH)f +Fu(searc)m(hes)i(\(see)f(the)g(description)g(of)f Ft(hash)g +Fu(in)g(Section)i(4.1)f([Bourne)g(Shell)330 2334 y(Builtins],)37 b(page)f(41\).)55 b(A)35 b(full)g(searc)m(h)g(of)g(the)g(directories)h -(in)f Fs($PATH)e Ft(is)i(p)s(erformed)f(only)h(if)g(the)330 +(in)f Ft($PATH)e Fu(is)i(p)s(erformed)f(only)h(if)g(the)330 2443 y(command)24 b(is)h(not)g(found)e(in)i(the)g(hash)f(table.)39 b(If)25 b(the)f(searc)m(h)i(is)e(unsuccessful,)h(the)g(shell)g(searc)m (hes)330 2553 y(for)e(a)h(de\014ned)e(shell)h(function)h(named)e -Fs(command_not_found_handle)p Ft(.)32 b(If)23 b(that)h(function)f +Ft(command_not_found_handle)p Fu(.)32 b(If)23 b(that)h(function)f (exists,)330 2663 y(it)32 b(is)f(in)m(v)m(ok)m(ed)i(with)e(the)h (original)g(command)f(and)g(the)h(original)g(command's)f(argumen)m(ts)h (as)g(its)330 2772 y(argumen)m(ts,)h(and)e(the)i(function's)e(exit)i @@ -10105,63 +10652,63 @@ y(shell)g(executes)h(the)f(named)f(program)g(in)h(a)g(separate)h b(.)199 3577 y(5.)61 b(If)35 b(this)h(execution)h(fails)f(b)s(ecause)g (the)f(\014le)h(is)g(not)g(in)f(executable)j(format,)f(and)e(the)h (\014le)g(is)g(not)330 3687 y(a)d(directory)-8 b(,)34 -b(it)f(is)g(assumed)e(to)j(b)s(e)d(a)i Fq(shell)g(script)h -Ft(and)e(the)h(shell)f(executes)i(it)f(as)g(describ)s(ed)e(in)330 +b(it)f(is)g(assumed)e(to)j(b)s(e)d(a)i Fr(shell)g(script)h +Fu(and)e(the)h(shell)f(executes)i(it)f(as)g(describ)s(ed)e(in)330 3796 y(Section)g(3.8)h([Shell)e(Scripts],)g(page)i(39.)199 3925 y(6.)61 b(If)38 b(the)h(command)f(w)m(as)h(not)g(b)s(egun)e(async) m(hronously)-8 b(,)42 b(the)c(shell)h(w)m(aits)h(for)e(the)h(command)f (to)330 4034 y(complete)32 b(and)e(collects)i(its)f(exit)g(status.)150 -4222 y Fj(3.7.3)63 b(Command)41 b(Execution)f(En)m(vironmen)m(t)150 -4369 y Ft(The)30 b(shell)g(has)h(an)f Fq(execution)h(en)m(vironmen)m(t) -r Ft(,)h(whic)m(h)e(consists)h(of)f(the)h(follo)m(wing:)225 -4497 y Fp(\017)60 b Ft(op)s(en)32 b(\014les)g(inherited)g(b)m(y)h(the)f +4222 y Fk(3.7.3)63 b(Command)41 b(Execution)f(En)m(vironmen)m(t)150 +4369 y Fu(The)30 b(shell)g(has)h(an)f Fr(execution)h(en)m(vironmen)m(t) +p Fu(,)h(whic)m(h)e(consists)h(of)f(the)h(follo)m(wing:)225 +4497 y Fq(\017)60 b Fu(op)s(en)32 b(\014les)g(inherited)g(b)m(y)h(the)f (shell)h(at)g(in)m(v)m(o)s(cation,)j(as)c(mo)s(di\014ed)g(b)m(y)g -(redirections)h(supplied)e(to)330 4607 y(the)g Fs(exec)e -Ft(builtin)225 4735 y Fp(\017)60 b Ft(the)28 b(curren)m(t)g(w)m(orking) -h(directory)g(as)f(set)h(b)m(y)f Fs(cd)p Ft(,)g Fs(pushd)p -Ft(,)g(or)g Fs(popd)p Ft(,)g(or)g(inherited)g(b)m(y)g(the)h(shell)f(at) -330 4845 y(in)m(v)m(o)s(cation)225 4973 y Fp(\017)60 -b Ft(the)31 b(\014le)f(creation)i(mo)s(de)e(mask)g(as)h(set)g(b)m(y)f -Fs(umask)f Ft(or)h(inherited)g(from)g(the)h(shell's)f(paren)m(t)225 -5102 y Fp(\017)60 b Ft(curren)m(t)30 b(traps)g(set)h(b)m(y)f -Fs(trap)225 5230 y Fp(\017)60 b Ft(shell)30 b(parameters)f(that)h(are)g +(redirections)h(supplied)e(to)330 4607 y(the)g Ft(exec)e +Fu(builtin)225 4735 y Fq(\017)60 b Fu(the)28 b(curren)m(t)g(w)m(orking) +h(directory)g(as)f(set)h(b)m(y)f Ft(cd)p Fu(,)g Ft(pushd)p +Fu(,)g(or)g Ft(popd)p Fu(,)g(or)g(inherited)g(b)m(y)g(the)h(shell)f(at) +330 4845 y(in)m(v)m(o)s(cation)225 4973 y Fq(\017)60 +b Fu(the)31 b(\014le)f(creation)i(mo)s(de)e(mask)g(as)h(set)g(b)m(y)f +Ft(umask)f Fu(or)h(inherited)g(from)g(the)h(shell's)f(paren)m(t)225 +5102 y Fq(\017)60 b Fu(curren)m(t)30 b(traps)g(set)h(b)m(y)f +Ft(trap)225 5230 y Fq(\017)60 b Fu(shell)30 b(parameters)f(that)h(are)g (set)g(b)m(y)g(v)-5 b(ariable)30 b(assignmen)m(t)g(or)g(with)f -Fs(set)f Ft(or)i(inherited)f(from)g(the)330 5340 y(shell's)i(paren)m(t) +Ft(set)f Fu(or)i(inherited)f(from)g(the)330 5340 y(shell's)i(paren)m(t) f(in)g(the)h(en)m(vironmen)m(t)p eop end %%Page: 37 43 -TeXDict begin 37 42 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 37 42 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(37)225 299 -y Fp(\017)60 b Ft(shell)44 b(functions)f(de\014ned)f(during)h +y Fq(\017)60 b Fu(shell)44 b(functions)f(de\014ned)f(during)h (execution)i(or)e(inherited)h(from)f(the)h(shell's)g(paren)m(t)f(in)h -(the)330 408 y(en)m(vironmen)m(t)225 543 y Fp(\017)60 -b Ft(options)33 b(enabled)g(at)h(in)m(v)m(o)s(cation)h(\(either)f(b)m +(the)330 408 y(en)m(vironmen)m(t)225 543 y Fq(\017)60 +b Fu(options)33 b(enabled)g(at)h(in)m(v)m(o)s(cation)h(\(either)f(b)m (y)f(default)g(or)g(with)g(command-line)g(argumen)m(ts\))h(or)330 -652 y(b)m(y)c Fs(set)225 787 y Fp(\017)60 b Ft(options)31 -b(enabled)f(b)m(y)g Fs(shopt)f Ft(\(see)j(Section)f(4.3.2)h([The)e -(Shopt)g(Builtin],)h(page)g(63\))225 921 y Fp(\017)60 -b Ft(shell)31 b(aliases)g(de\014ned)f(with)g Fs(alias)f -Ft(\(see)i(Section)g(6.6)h([Aliases],)g(page)f(88\))225 -1056 y Fp(\017)60 b Ft(v)-5 b(arious)50 b(pro)s(cess)f -Fl(id)p Ft(s,)55 b(including)49 b(those)i(of)e(bac)m(kground)h(jobs)f +652 y(b)m(y)c Ft(set)225 787 y Fq(\017)60 b Fu(options)31 +b(enabled)f(b)m(y)g Ft(shopt)f Fu(\(see)j(Section)f(4.3.2)h([The)e +(Shopt)g(Builtin],)h(page)g(62\))225 921 y Fq(\017)60 +b Fu(shell)31 b(aliases)g(de\014ned)f(with)g Ft(alias)f +Fu(\(see)i(Section)g(6.6)h([Aliases],)g(page)f(88\))225 +1056 y Fq(\017)60 b Fu(v)-5 b(arious)50 b(pro)s(cess)f +Fm(id)p Fu(s,)55 b(including)49 b(those)i(of)e(bac)m(kground)h(jobs)f (\(see)i(Section)g(3.2.3)g([Lists],)330 1165 y(page)31 -b(9\),)g(the)g(v)-5 b(alue)31 b(of)f Fs($$)p Ft(,)g(and)g(the)h(v)-5 -b(alue)31 b(of)f Fs($PPID)275 1324 y Ft(When)k(a)g(simple)h(command)f +b(9\),)g(the)g(v)-5 b(alue)31 b(of)f Ft($$)p Fu(,)g(and)g(the)h(v)-5 +b(alue)31 b(of)f Ft($PPID)275 1324 y Fu(When)k(a)g(simple)h(command)f (other)g(than)g(a)h(builtin)f(or)g(shell)h(function)f(is)g(to)h(b)s(e)f (executed,)i(it)f(is)150 1434 y(in)m(v)m(ok)m(ed)25 b(in)f(a)g (separate)h(execution)g(en)m(vironmen)m(t)g(that)f(consists)g(of)h(the) f(follo)m(wing.)40 b(Unless)24 b(otherwise)150 1543 y(noted,)31 b(the)f(v)-5 b(alues)31 b(are)g(inherited)f(from)g(the)g(shell.)225 -1678 y Fp(\017)60 b Ft(the)31 b(shell's)h(op)s(en)e(\014les,)i(plus)e +1678 y Fq(\017)60 b Fu(the)31 b(shell's)h(op)s(en)e(\014les,)i(plus)e (an)m(y)h(mo)s(di\014cations)h(and)e(additions)h(sp)s(eci\014ed)g(b)m (y)g(redirections)g(to)330 1787 y(the)g(command)225 1922 -y Fp(\017)60 b Ft(the)31 b(curren)m(t)f(w)m(orking)g(directory)225 -2056 y Fp(\017)60 b Ft(the)31 b(\014le)f(creation)i(mo)s(de)e(mask)225 -2190 y Fp(\017)60 b Ft(shell)32 b(v)-5 b(ariables)33 +y Fq(\017)60 b Fu(the)31 b(curren)m(t)f(w)m(orking)g(directory)225 +2056 y Fq(\017)60 b Fu(the)31 b(\014le)f(creation)i(mo)s(de)e(mask)225 +2190 y Fq(\017)60 b Fu(shell)32 b(v)-5 b(ariables)33 b(and)e(functions)h(mark)m(ed)g(for)g(exp)s(ort,)g(along)h(with)f(v)-5 b(ariables)32 b(exp)s(orted)g(for)g(the)330 2300 y(command,)e(passed)g (in)g(the)h(en)m(vironmen)m(t)g(\(see)g(Section)g(3.7.4)i([En)m -(vironmen)m(t],)e(page)g(37\))225 2434 y Fp(\017)60 b -Ft(traps)31 b(caugh)m(t)h(b)m(y)f(the)g(shell)h(are)f(reset)h(to)g(the) +(vironmen)m(t],)e(page)g(37\))225 2434 y Fq(\017)60 b +Fu(traps)31 b(caugh)m(t)h(b)m(y)f(the)g(shell)h(are)f(reset)h(to)g(the) f(v)-5 b(alues)32 b(inherited)e(from)h(the)g(shell's)h(paren)m(t,)g (and)330 2544 y(traps)e(ignored)h(b)m(y)f(the)g(shell)h(are)g(ignored) 275 2703 y(A)41 b(command)g(in)m(v)m(ok)m(ed)i(in)e(this)h(separate)g @@ -10179,31 +10726,31 @@ b(Builtin)32 b(commands)g(that)h(are)g(in)m(v)m(ok)m(ed)h(as)e(part)g b(in)f(a)h(subshell)e(en)m(vironmen)m(t.)72 b(Changes)40 b(made)g(to)h(the)g(subshell)e(en)m(vironmen)m(t)i(cannot)150 3495 y(a\013ect)32 b(the)f(shell's)f(execution)i(en)m(vironmen)m(t.)275 -3629 y(Subshells)24 b(spa)m(wned)h(to)i(execute)g(command)f -(substitutions)g(inherit)g(the)g(v)-5 b(alue)26 b(of)g(the)h(`)p -Fs(-e)p Ft(')e(option)150 3739 y(from)20 b(the)h(paren)m(t)g(shell.)37 -b(When)21 b(not)f(in)h Fl(posix)f Ft(mo)s(de,)i(Bash)f(clears)g(the)g -(`)p Fs(-e)p Ft(')f(option)h(in)g(suc)m(h)f(subshells.)275 -3873 y(If)38 b(a)h(command)f(is)g(follo)m(w)m(ed)j(b)m(y)d(a)h(`)p -Fs(&)p Ft(')g(and)f(job)g(con)m(trol)i(is)e(not)h(activ)m(e,)k(the)c -(default)g(standard)150 3983 y(input)e(for)g(the)h(command)f(is)h(the)g -(empt)m(y)g(\014le)f(`)p Fs(/dev/null)p Ft('.)61 b(Otherwise,)39 -b(the)f(in)m(v)m(ok)m(ed)h(command)150 4093 y(inherits)30 -b(the)h(\014le)f(descriptors)g(of)h(the)f(calling)i(shell)f(as)f(mo)s -(di\014ed)g(b)m(y)g(redirections.)150 4292 y Fj(3.7.4)63 -b(En)m(vironmen)m(t)150 4438 y Ft(When)28 b(a)i(program)e(is)h(in)m(v)m -(ok)m(ed)h(it)f(is)g(giv)m(en)g(an)g(arra)m(y)g(of)g(strings)f(called)i -(the)f Fq(en)m(vironmen)m(t)r Ft(.)41 b(This)28 b(is)h(a)150 +3629 y(Subshells)c(spa)m(wned)i(to)h(execute)g(command)f(substitutions) +g(inherit)g(the)g(v)-5 b(alue)31 b(of)f(the)h Ft(-e)e +Fu(option)150 3739 y(from)23 b(the)i(paren)m(t)f(shell.)38 +b(When)24 b(not)g(in)g Fm(posix)f Fu(mo)s(de,)i(Bash)f(clears)h(the)f +Ft(-e)f Fu(option)i(in)e(suc)m(h)h(subshells.)275 3873 +y(If)f(a)h(command)g(is)g(follo)m(w)m(ed)h(b)m(y)f(a)g(`)p +Ft(&)p Fu(')g(and)f(job)h(con)m(trol)h(is)f(not)g(activ)m(e,)k(the)c +(default)g(standard)f(input)150 3983 y(for)35 b(the)g(command)g(is)g +(the)g(empt)m(y)h(\014le)f Ft(/dev/null)p Fu(.)52 b(Otherwise,)37 +b(the)e(in)m(v)m(ok)m(ed)h(command)f(inherits)150 4093 +y(the)c(\014le)f(descriptors)g(of)h(the)f(calling)i(shell)f(as)f(mo)s +(di\014ed)g(b)m(y)g(redirections.)150 4292 y Fk(3.7.4)63 +b(En)m(vironmen)m(t)150 4438 y Fu(When)29 b(a)g(program)f(is)h(in)m(v)m +(ok)m(ed)h(it)g(is)f(giv)m(en)g(an)g(arra)m(y)g(of)g(strings)g(called)h +(the)f Fr(en)m(vironmen)m(t)p Fu(.)41 b(This)28 b(is)h(a)150 4548 y(list)i(of)g(name-v)-5 b(alue)31 b(pairs,)f(of)h(the)f(form)g -Fs(name=value)p Ft(.)275 4682 y(Bash)39 b(pro)m(vides)g(sev)m(eral)i(w) +Ft(name=value)p Fu(.)275 4682 y(Bash)39 b(pro)m(vides)g(sev)m(eral)i(w) m(a)m(ys)g(to)f(manipulate)f(the)h(en)m(vironmen)m(t.)69 b(On)38 b(in)m(v)m(o)s(cation,)44 b(the)c(shell)150 4792 y(scans)g(its)h(o)m(wn)f(en)m(vironmen)m(t)h(and)f(creates)i(a)f (parameter)f(for)g(eac)m(h)i(name)e(found,)i(automatically)150 -4902 y(marking)26 b(it)g(for)g Fq(exp)s(ort)h Ft(to)g(c)m(hild)f(pro)s +4902 y(marking)26 b(it)g(for)g Fr(exp)s(ort)h Fu(to)g(c)m(hild)f(pro)s (cesses.)39 b(Executed)26 b(commands)g(inherit)g(the)g(en)m(vironmen)m -(t.)39 b(The)150 5011 y Fs(export)c Ft(and)i(`)p Fs(declare)29 -b(-x)p Ft(')36 b(commands)h(allo)m(w)i(parameters)e(and)g(functions)g +(t.)39 b(The)150 5011 y Ft(export)c Fu(and)i(`)p Ft(declare)29 +b(-x)p Fu(')36 b(commands)h(allo)m(w)i(parameters)e(and)g(functions)g (to)h(b)s(e)e(added)h(to)h(and)150 5121 y(deleted)21 b(from)f(the)h(en)m(vironmen)m(t.)38 b(If)20 b(the)h(v)-5 b(alue)21 b(of)g(a)g(parameter)g(in)f(the)g(en)m(vironmen)m(t)i(is)e @@ -10214,30 +10761,30 @@ b(b)s(ecomes)f(part)h(of)f(the)h(en)m(vironmen)m(t,)g(replacing)h(the)e (shell's)h(initial)g(en)m(vironmen)m(t,)g(whose)f(v)-5 b(alues)31 b(ma)m(y)h(b)s(e)p eop end %%Page: 38 44 -TeXDict begin 38 43 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 38 43 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(38)150 299 y(mo)s(di\014ed)26 b(in)g(the)h(shell,)h(less)f(an)m(y)g(pairs)f(remo)m -(v)m(ed)i(b)m(y)f(the)g Fs(unset)e Ft(and)h(`)p Fs(export)j(-n)p -Ft(')e(commands,)g(plus)150 408 y(an)m(y)k(additions)f(via)h(the)g -Fs(export)d Ft(and)i(`)p Fs(declare)f(-x)p Ft(')h(commands.)275 +(v)m(ed)i(b)m(y)f(the)g Ft(unset)e Fu(and)h(`)p Ft(export)j(-n)p +Fu(')e(commands,)g(plus)150 408 y(an)m(y)k(additions)f(via)h(the)g +Ft(export)d Fu(and)i(`)p Ft(declare)f(-x)p Fu(')h(commands.)275 549 y(The)j(en)m(vironmen)m(t)i(for)f(an)m(y)g(simple)h(command)f(or)g (function)g(ma)m(y)g(b)s(e)g(augmen)m(ted)h(temp)s(orarily)150 659 y(b)m(y)c(pre\014xing)e(it)i(with)g(parameter)g(assignmen)m(ts,)h (as)e(describ)s(ed)g(in)g(Section)i(3.4)g([Shell)e(P)m(arameters],)150 768 y(page)g(18.)41 b(These)29 b(assignmen)m(t)i(statemen)m(ts)g (a\013ect)f(only)g(the)f(en)m(vironmen)m(t)h(seen)g(b)m(y)f(that)h -(command.)275 909 y(If)d(the)h(`)p Fs(-k)p Ft(')g(option)g(is)g(set)g -(\(see)h(Section)f(4.3.1)i([The)e(Set)g(Builtin],)h(page)f(59\),)i -(then)e(all)g(parameter)150 1019 y(assignmen)m(ts)i(are)g(placed)h(in)e -(the)h(en)m(vironmen)m(t)g(for)g(a)g(command,)f(not)h(just)f(those)i -(that)f(precede)g(the)150 1128 y(command)g(name.)275 -1269 y(When)h(Bash)h(in)m(v)m(ok)m(es)i(an)e(external)h(command,)f(the) -g(v)-5 b(ariable)33 b(`)p Fs($_)p Ft(')f(is)g(set)h(to)f(the)g(full)g +(command.)275 909 y(If)g(the)h Ft(-k)g Fu(option)g(is)g(set)h(\(see)g +(Section)g(4.3.1)g([The)f(Set)g(Builtin],)h(page)g(58\),)h(then)e(all)g +(parameter)150 1019 y(assignmen)m(ts)f(are)g(placed)h(in)e(the)h(en)m +(vironmen)m(t)g(for)g(a)g(command,)f(not)h(just)f(those)i(that)f +(precede)g(the)150 1128 y(command)g(name.)275 1269 y(When)h(Bash)h(in)m +(v)m(ok)m(es)i(an)e(external)h(command,)f(the)g(v)-5 +b(ariable)33 b(`)p Ft($_)p Fu(')f(is)g(set)h(to)f(the)g(full)g (pathname)150 1379 y(of)f(the)f(command)g(and)g(passed)g(to)h(that)g -(command)f(in)g(its)h(en)m(vironmen)m(t.)150 1585 y Fj(3.7.5)63 -b(Exit)40 b(Status)150 1731 y Ft(The)26 b(exit)h(status)f(of)g(an)g +(command)f(in)g(its)h(en)m(vironmen)m(t.)150 1585 y Fk(3.7.5)63 +b(Exit)40 b(Status)150 1731 y Fu(The)26 b(exit)h(status)f(of)g(an)g (executed)h(command)f(is)g(the)h(v)-5 b(alue)26 b(returned)f(b)m(y)h -(the)g Fq(w)m(aitpid)k Ft(system)d(call)g(or)150 1841 +(the)g Fr(w)m(aitpid)k Fu(system)d(call)g(or)150 1841 y(equiv)-5 b(alen)m(t)33 b(function.)45 b(Exit)32 b(statuses)g(fall)g (b)s(et)m(w)m(een)h(0)f(and)f(255,)i(though,)f(as)g(explained)g(b)s (elo)m(w,)h(the)150 1951 y(shell)i(ma)m(y)g(use)f(v)-5 @@ -10253,10 +10800,10 @@ f(failure)h(mo)s(des.)275 2311 y(F)-8 b(or)32 b(the)g(shell's)g(purp)s (tuitiv)m(e)i(sc)m(heme)e(is)f(used)g(so)150 2530 y(there)34 b(is)g(one)g(w)m(ell-de\014ned)g(w)m(a)m(y)g(to)h(indicate)g(success)f (and)f(a)h(v)-5 b(ariet)m(y)35 b(of)f(w)m(a)m(ys)h(to)f(indicate)h(v)-5 -b(arious)150 2639 y(failure)37 b(mo)s(des.)61 b(When)37 -b(a)g(command)g(terminates)h(on)f(a)g(fatal)i(signal)f(whose)f(n)m(um)m -(b)s(er)e(is)i Fq(N)10 b Ft(,)38 b(Bash)150 2749 y(uses)30 -b(the)g(v)-5 b(alue)31 b(128)p Fs(+)p Fq(N)42 b Ft(as)30 +b(arious)150 2639 y(failure)38 b(mo)s(des.)62 b(When)37 +b(a)h(command)f(terminates)i(on)e(a)h(fatal)h(signal)g(whose)e(n)m(um)m +(b)s(er)f(is)i Fr(N)p Fu(,)i(Bash)150 2749 y(uses)30 +b(the)g(v)-5 b(alue)31 b(128)p Ft(+)p Fr(N)42 b Fu(as)30 b(the)h(exit)g(status.)275 2890 y(If)k(a)h(command)g(is)g(not)g(found,) g(the)g(c)m(hild)h(pro)s(cess)e(created)i(to)g(execute)g(it)g(returns)d (a)j(status)f(of)150 2999 y(127.)42 b(If)30 b(a)h(command)f(is)g(found) @@ -10274,103 +10821,103 @@ g(constructs)g(\(see)h(Section)f(3.2.3)i([Lists],)150 (y)g(b)s(e)f(used)g(b)m(y)g(the)h(conditional)h(and)e(list)h (constructs.)50 b(All)35 b(builtins)150 3970 y(return)29 b(an)i(exit)g(status)g(of)f(2)h(to)g(indicate)g(incorrect)h(usage.)150 -4175 y Fj(3.7.6)63 b(Signals)150 4322 y Ft(When)36 b(Bash)g(is)h(in)m +4175 y Fk(3.7.6)63 b(Signals)150 4322 y Fu(When)36 b(Bash)g(is)h(in)m (teractiv)m(e,)j(in)c(the)h(absence)f(of)h(an)m(y)f(traps,)i(it)e -(ignores)h Fs(SIGTERM)d Ft(\(so)j(that)g(`)p Fs(kill)150 -4432 y(0)p Ft(')c(do)s(es)g(not)g(kill)g(an)g(in)m(teractiv)m(e)j -(shell\),)f(and)d Fs(SIGINT)f Ft(is)i(caugh)m(t)h(and)f(handled)f(\(so) -h(that)h(the)f Fs(wait)150 4542 y Ft(builtin)24 b(is)h(in)m +(ignores)h Ft(SIGTERM)d Fu(\(so)j(that)g(`)p Ft(kill)150 +4432 y(0)p Fu(')c(do)s(es)g(not)g(kill)g(an)g(in)m(teractiv)m(e)j +(shell\),)f(and)d Ft(SIGINT)f Fu(is)i(caugh)m(t)h(and)f(handled)f(\(so) +h(that)h(the)f Ft(wait)150 4542 y Fu(builtin)24 b(is)h(in)m (terruptible\).)39 b(When)24 b(Bash)g(receiv)m(es)j(a)d -Fs(SIGINT)p Ft(,)h(it)g(breaks)f(out)h(of)f(an)m(y)h(executing)h(lo)s +Ft(SIGINT)p Fu(,)h(it)g(breaks)f(out)h(of)f(an)m(y)h(executing)h(lo)s (ops.)150 4651 y(In)31 b(all)h(cases,)h(Bash)f(ignores)g -Fs(SIGQUIT)p Ft(.)42 b(If)32 b(job)f(con)m(trol)i(is)e(in)h(e\013ect)h -(\(see)f(Chapter)f(7)h([Job)g(Con)m(trol],)150 4761 y(page)f(98\),)h -(Bash)e(ignores)h Fs(SIGTTIN)p Ft(,)e Fs(SIGTTOU)p Ft(,)g(and)g -Fs(SIGTSTP)p Ft(.)275 4902 y(Non-builtin)i(commands)g(started)g(b)m(y)g +Ft(SIGQUIT)p Fu(.)42 b(If)32 b(job)f(con)m(trol)i(is)e(in)h(e\013ect)h +(\(see)f(Chapter)f(7)h([Job)g(Con)m(trol],)150 4761 y(page)f(97\),)h +(Bash)e(ignores)h Ft(SIGTTIN)p Fu(,)e Ft(SIGTTOU)p Fu(,)g(and)g +Ft(SIGTSTP)p Fu(.)275 4902 y(Non-builtin)i(commands)g(started)g(b)m(y)g (Bash)h(ha)m(v)m(e)g(signal)g(handlers)e(set)i(to)g(the)g(v)-5 b(alues)31 b(inherited)150 5011 y(b)m(y)37 b(the)h(shell)g(from)f(its)h (paren)m(t.)62 b(When)38 b(job)f(con)m(trol)i(is)e(not)h(in)f (e\013ect,)k(async)m(hronous)c(commands)150 5121 y(ignore)f -Fs(SIGINT)e Ft(and)h Fs(SIGQUIT)e Ft(in)j(addition)f(to)i(these)f +Ft(SIGINT)e Fu(and)h Ft(SIGQUIT)e Fu(in)j(addition)f(to)i(these)f (inherited)f(handlers.)55 b(Commands)35 b(run)f(as)i(a)150 5230 y(result)27 b(of)h(command)f(substitution)h(ignore)g(the)g(k)m (eyb)s(oard-generated)g(job)g(con)m(trol)h(signals)f -Fs(SIGTTIN)p Ft(,)150 5340 y Fs(SIGTTOU)p Ft(,)h(and)g -Fs(SIGTSTP)p Ft(.)p eop end +Ft(SIGTTIN)p Fu(,)150 5340 y Ft(SIGTTOU)p Fu(,)h(and)g +Ft(SIGTSTP)p Fu(.)p eop end %%Page: 39 45 -TeXDict begin 39 44 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 39 44 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(39)275 299 y(The)30 b(shell)i(exits)g(b)m(y)f(default)g(up)s(on)f(receipt)i(of)f -(a)h Fs(SIGHUP)p Ft(.)42 b(Before)32 b(exiting,)h(an)e(in)m(teractiv)m -(e)j(shell)150 408 y(resends)41 b(the)i Fs(SIGHUP)e Ft(to)i(all)g +(a)h Ft(SIGHUP)p Fu(.)42 b(Before)32 b(exiting,)h(an)e(in)m(teractiv)m +(e)j(shell)150 408 y(resends)41 b(the)i Ft(SIGHUP)e Fu(to)i(all)g (jobs,)i(running)c(or)h(stopp)s(ed.)76 b(Stopp)s(ed)41 -b(jobs)h(are)h(sen)m(t)g Fs(SIGCONT)d Ft(to)150 518 y(ensure)32 -b(that)h(they)g(receiv)m(e)i(the)e Fs(SIGHUP)p Ft(.)47 +b(jobs)h(are)h(sen)m(t)g Ft(SIGCONT)d Fu(to)150 518 y(ensure)32 +b(that)h(they)g(receiv)m(e)i(the)e Ft(SIGHUP)p Fu(.)47 b(T)-8 b(o)33 b(prev)m(en)m(t)g(the)g(shell)g(from)g(sending)f(the)h -Fs(SIGHUP)e Ft(signal)150 628 y(to)i(a)g(particular)g(job,)g(it)g +Ft(SIGHUP)e Fu(signal)150 628 y(to)i(a)g(particular)g(job,)g(it)g (should)f(b)s(e)g(remo)m(v)m(ed)h(from)g(the)f(jobs)g(table)i(with)e -(the)h Fs(disown)e Ft(builtin)h(\(see)150 737 y(Section)f(7.2)g([Job)f -(Con)m(trol)h(Builtins],)g(page)g(99\))h(or)e(mark)m(ed)g(to)h(not)f -(receiv)m(e)i Fs(SIGHUP)d Ft(using)h Fs(disown)150 847 -y(-h)p Ft(.)275 992 y(If)38 b(the)h Fs(huponexit)e Ft(shell)i(option)g -(has)g(b)s(een)f(set)i(with)f Fs(shopt)e Ft(\(see)j(Section)g(4.3.2)h -([The)e(Shopt)150 1102 y(Builtin],)31 b(page)g(63\),)h(Bash)f(sends)e -(a)i Fs(SIGHUP)e Ft(to)i(all)g(jobs)f(when)f(an)i(in)m(teractiv)m(e)i +(the)h Ft(disown)e Fu(builtin)h(\(see)150 737 y(Section)f(7.2)g([Job)f +(Con)m(trol)h(Builtins],)g(page)g(98\))h(or)e(mark)m(ed)g(to)h(not)f +(receiv)m(e)i Ft(SIGHUP)d Fu(using)h Ft(disown)150 847 +y(-h)p Fu(.)275 992 y(If)38 b(the)h Ft(huponexit)e Fu(shell)i(option)g +(has)g(b)s(een)f(set)i(with)f Ft(shopt)e Fu(\(see)j(Section)g(4.3.2)h +([The)e(Shopt)150 1102 y(Builtin],)31 b(page)g(62\),)h(Bash)f(sends)e +(a)i Ft(SIGHUP)e Fu(to)i(all)g(jobs)f(when)f(an)i(in)m(teractiv)m(e)i (login)e(shell)g(exits.)275 1247 y(If)38 b(Bash)h(is)g(w)m(aiting)h (for)f(a)g(command)f(to)i(complete)g(and)e(receiv)m(es)j(a)e(signal)h (for)e(whic)m(h)h(a)g(trap)150 1357 y(has)c(b)s(een)f(set,)i(the)f (trap)g(will)g(not)g(b)s(e)f(executed)i(un)m(til)f(the)g(command)f (completes.)55 b(When)35 b(Bash)g(is)150 1467 y(w)m(aiting)j(for)f(an)g -(async)m(hronous)g(command)g(via)h(the)f Fs(wait)f Ft(builtin,)i(the)g +(async)m(hronous)g(command)g(via)h(the)f Ft(wait)f Fu(builtin,)i(the)g (reception)g(of)f(a)g(signal)h(for)150 1576 y(whic)m(h)d(a)g(trap)g -(has)g(b)s(een)f(set)h(will)h(cause)f(the)g Fs(wait)f -Ft(builtin)h(to)g(return)f(immediately)i(with)f(an)g(exit)150 +(has)g(b)s(een)f(set)h(will)h(cause)f(the)g Ft(wait)f +Fu(builtin)h(to)g(return)f(immediately)i(with)f(an)g(exit)150 1686 y(status)c(greater)g(than)f(128,)i(immediately)g(after)f(whic)m(h) -f(the)h(trap)f(is)g(executed.)150 1935 y Fr(3.8)68 b(Shell)45 -b(Scripts)150 2094 y Ft(A)30 b(shell)f(script)h(is)f(a)h(text)h(\014le) +f(the)h(trap)f(is)g(executed.)150 1935 y Fs(3.8)68 b(Shell)45 +b(Scripts)150 2094 y Fu(A)30 b(shell)f(script)h(is)f(a)h(text)h(\014le) f(con)m(taining)h(shell)f(commands.)40 b(When)29 b(suc)m(h)g(a)h -(\014le)g(is)f(used)g(as)h(the)g(\014rst)150 2204 y(non-option)i -(argumen)m(t)h(when)e(in)m(v)m(oking)i(Bash,)g(and)e(neither)h(the)g(`) -p Fs(-c)p Ft(')g(nor)g(`)p Fs(-s)p Ft(')g(option)g(is)g(supplied)150 -2313 y(\(see)25 b(Section)h(6.1)f([In)m(v)m(oking)h(Bash],)g(page)f -(80\),)i(Bash)e(reads)f(and)g(executes)i(commands)e(from)g(the)h -(\014le,)150 2423 y(then)32 b(exits.)46 b(This)32 b(mo)s(de)f(of)i(op)s -(eration)f(creates)i(a)e(non-in)m(teractiv)m(e)j(shell.)46 -b(The)31 b(shell)i(\014rst)e(searc)m(hes)150 2532 y(for)d(the)g(\014le) -g(in)g(the)g(curren)m(t)f(directory)-8 b(,)30 b(and)d(lo)s(oks)i(in)e -(the)i(directories)g(in)e Fs($PATH)g Ft(if)h(not)g(found)e(there.)275 +(\014le)g(is)f(used)g(as)h(the)g(\014rst)150 2204 y(non-option)c +(argumen)m(t)h(when)e(in)m(v)m(oking)i(Bash,)g(and)f(neither)g(the)g +Ft(-c)g Fu(nor)f Ft(-s)h Fu(option)g(is)g(supplied)f(\(see)150 +2313 y(Section)39 b(6.1)g([In)m(v)m(oking)g(Bash],)h(page)f(80\),)i +(Bash)d(reads)g(and)f(executes)i(commands)f(from)f(the)i(\014le,)150 +2423 y(then)32 b(exits.)46 b(This)32 b(mo)s(de)f(of)i(op)s(eration)f +(creates)i(a)e(non-in)m(teractiv)m(e)j(shell.)46 b(The)31 +b(shell)i(\014rst)e(searc)m(hes)150 2532 y(for)d(the)g(\014le)g(in)g +(the)g(curren)m(t)f(directory)-8 b(,)30 b(and)d(lo)s(oks)i(in)e(the)i +(directories)g(in)e Ft($PATH)g Fu(if)h(not)g(found)e(there.)275 2678 y(When)34 b(Bash)h(runs)e(a)i(shell)g(script,)g(it)h(sets)f(the)f -(sp)s(ecial)i(parameter)f Fs(0)f Ft(to)h(the)g(name)g(of)g(the)g +(sp)s(ecial)i(parameter)f Ft(0)f Fu(to)h(the)g(name)g(of)g(the)g (\014le,)150 2787 y(rather)k(than)g(the)h(name)f(of)h(the)f(shell,)j (and)d(the)h(p)s(ositional)g(parameters)f(are)h(set)g(to)g(the)g (remain-)150 2897 y(ing)f(argumen)m(ts,)j(if)d(an)m(y)g(are)g(giv)m (en.)67 b(If)39 b(no)g(additional)g(argumen)m(ts)h(are)f(supplied,)h (the)f(p)s(ositional)150 3007 y(parameters)31 b(are)f(unset.)275 3152 y(A)39 b(shell)h(script)f(ma)m(y)h(b)s(e)f(made)h(executable)h(b)m -(y)e(using)g(the)h Fs(chmod)e Ft(command)h(to)h(turn)e(on)i(the)150 +(y)e(using)g(the)h Ft(chmod)e Fu(command)h(to)h(turn)e(on)i(the)150 3262 y(execute)j(bit.)73 b(When)41 b(Bash)g(\014nds)e(suc)m(h)i(a)h -(\014le)f(while)g(searc)m(hing)h(the)f Fs($PATH)f Ft(for)h(a)h +(\014le)f(while)g(searc)m(hing)h(the)f Ft($PATH)f Fu(for)h(a)h (command,)h(it)150 3371 y(spa)m(wns)30 b(a)g(subshell)g(to)h(execute)h (it.)41 b(In)30 b(other)g(w)m(ords,)g(executing)390 3517 -y Fs(filename)46 b Fi(arguments)150 3662 y Ft(is)30 b(equiv)-5 -b(alen)m(t)32 b(to)f(executing)390 3808 y Fs(bash)47 -b(filename)e Fi(arguments)150 3953 y Ft(if)30 b Fs(filename)d -Ft(is)j(an)f(executable)j(shell)e(script.)40 b(This)29 +y Ft(filename)46 b Fj(arguments)150 3662 y Fu(is)30 b(equiv)-5 +b(alen)m(t)32 b(to)f(executing)390 3808 y Ft(bash)47 +b(filename)e Fj(arguments)150 3953 y Fu(if)30 b Ft(filename)d +Fu(is)j(an)f(executable)j(shell)e(script.)40 b(This)29 b(subshell)g(reinitializes)i(itself,)g(so)f(that)h(the)e(e\013ect)150 4063 y(is)36 b(as)h(if)g(a)f(new)g(shell)h(had)f(b)s(een)g(in)m(v)m(ok) m(ed)h(to)h(in)m(terpret)e(the)h(script,)h(with)e(the)h(exception)h (that)f(the)150 4172 y(lo)s(cations)25 b(of)g(commands)e(remem)m(b)s (ered)h(b)m(y)g(the)g(paren)m(t)g(\(see)h(the)f(description)g(of)g -Fs(hash)f Ft(in)h(Section)h(4.1)150 4282 y([Bourne)30 +Ft(hash)f Fu(in)h(Section)h(4.1)150 4282 y([Bourne)30 b(Shell)h(Builtins],)g(page)g(41\))h(are)e(retained)h(b)m(y)f(the)h(c)m (hild.)275 4427 y(Most)36 b(v)m(ersions)g(of)g(Unix)f(mak)m(e)h(this)g (a)g(part)f(of)h(the)g(op)s(erating)g(system's)f(command)h(execution) 150 4537 y(mec)m(hanism.)50 b(If)33 b(the)g(\014rst)g(line)h(of)f(a)h (script)f(b)s(egins)g(with)g(the)g(t)m(w)m(o)i(c)m(haracters)g(`)p -Fs(#!)p Ft(',)f(the)g(remainder)150 4647 y(of)d(the)g(line)h(sp)s +Ft(#!)p Fu(',)f(the)g(remainder)150 4647 y(of)d(the)g(line)h(sp)s (eci\014es)e(an)h(in)m(terpreter)g(for)g(the)g(program.)43 -b(Th)m(us,)30 b(y)m(ou)h(can)h(sp)s(ecify)e(Bash,)i Fs(awk)p -Ft(,)e(P)m(erl,)150 4756 y(or)g(some)h(other)g(in)m(terpreter)g(and)e +b(Th)m(us,)30 b(y)m(ou)h(can)h(sp)s(ecify)e(Bash,)i Ft(awk)p +Fu(,)e(P)m(erl,)150 4756 y(or)g(some)h(other)g(in)m(terpreter)g(and)e (write)i(the)f(rest)h(of)g(the)f(script)g(\014le)h(in)f(that)h (language.)275 4902 y(The)40 b(argumen)m(ts)h(to)g(the)g(in)m (terpreter)g(consist)g(of)g(a)g(single)h(optional)f(argumen)m(t)h @@ -10384,18 +10931,18 @@ b(Note)25 b(that)f(some)g(older)g(v)m(ersions)f(of)h(Unix)f(limit)i (the)f(in)m(terpreter)150 5340 y(name)30 b(and)g(argumen)m(t)h(to)g(a)g (maxim)m(um)f(of)h(32)g(c)m(haracters.)p eop end %%Page: 40 46 -TeXDict begin 40 45 bop 150 -116 a Ft(Chapter)30 b(3:)41 +TeXDict begin 40 45 bop 150 -116 a Fu(Chapter)30 b(3:)41 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(40)275 299 -y(Bash)32 b(scripts)g(often)g(b)s(egin)g(with)g Fs(#!)e(/bin/bash)g -Ft(\(assuming)i(that)h(Bash)f(has)g(b)s(een)f(installed)i(in)150 -408 y(`)p Fs(/bin)p Ft('\),)25 b(since)e(this)g(ensures)f(that)i(Bash)f -(will)h(b)s(e)e(used)h(to)h(in)m(terpret)f(the)g(script,)i(ev)m(en)f -(if)f(it)h(is)f(executed)150 518 y(under)29 b(another)h(shell.)p +y(Bash)32 b(scripts)g(often)g(b)s(egin)g(with)g Ft(#!)e(/bin/bash)g +Fu(\(assuming)i(that)h(Bash)f(has)g(b)s(een)f(installed)i(in)150 +408 y Ft(/bin)p Fu(\),)26 b(since)h(this)f(ensures)f(that)i(Bash)f +(will)h(b)s(e)f(used)f(to)i(in)m(terpret)f(the)h(script,)g(ev)m(en)g +(if)f(it)h(is)f(executed)150 518 y(under)j(another)h(shell.)p eop end %%Page: 41 47 -TeXDict begin 41 46 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(41)150 299 y Fo(4)80 -b(Shell)53 b(Builtin)f(Commands)150 541 y Ft(Builtin)34 +TeXDict begin 41 46 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(41)150 299 y Fp(4)80 +b(Shell)53 b(Builtin)f(Commands)150 541 y Fu(Builtin)34 b(commands)f(are)h(con)m(tained)g(within)f(the)h(shell)g(itself.)50 b(When)34 b(the)f(name)h(of)f(a)h(builtin)f(com-)150 651 y(mand)26 b(is)i(used)e(as)i(the)g(\014rst)e(w)m(ord)h(of)h(a)f @@ -10413,411 +10960,404 @@ b(Builtin)150 870 y(commands)f(are)h(necessary)g(to)g(implemen)m(t)g (other)g(c)m(hapters:)69 b(builtin)43 b(commands)h(whic)m(h)150 1473 y(pro)m(vide)23 b(the)h(Bash)f(in)m(terface)i(to)f(the)g(job)f (con)m(trol)i(facilities)g(\(see)f(Section)h(7.2)f([Job)f(Con)m(trol)h -(Builtins],)150 1583 y(page)40 b(99\),)j(the)c(directory)h(stac)m(k)g +(Builtins],)150 1583 y(page)40 b(98\),)j(the)c(directory)h(stac)m(k)g (\(see)g(Section)g(6.8.1)h([Directory)g(Stac)m(k)f(Builtins],)i(page)e -(91\),)j(the)150 1692 y(command)23 b(history)h(\(see)g(Section)g(9.2)h -([Bash)f(History)g(Builtins],)h(page)g(134\),)h(and)d(the)h +(90\),)j(the)150 1692 y(command)23 b(history)h(\(see)g(Section)g(9.2)h +([Bash)f(History)g(Builtins],)h(page)g(133\),)h(and)d(the)h (programmable)150 1802 y(completion)32 b(facilities)g(\(see)g(Section)f -(8.7)g([Programmable)g(Completion)g(Builtins],)g(page)h(127\).)275 +(8.7)g([Programmable)g(Completion)g(Builtins],)g(page)h(126\).)275 1939 y(Man)m(y)f(of)f(the)h(builtins)e(ha)m(v)m(e)j(b)s(een)e(extended) -g(b)m(y)g Fl(posix)g Ft(or)g(Bash.)275 2076 y(Unless)39 +g(b)m(y)g Fm(posix)g Fu(or)g(Bash.)275 2076 y(Unless)39 b(otherwise)h(noted,)i(eac)m(h)f(builtin)e(command)g(do)s(cumen)m(ted)g (as)h(accepting)h(options)f(pre-)150 2186 y(ceded)33 -b(b)m(y)h(`)p Fs(-)p Ft(')f(accepts)i(`)p Fs(--)p Ft(')e(to)h(signify)f -(the)h(end)e(of)i(the)f(options.)50 b(The)33 b Fs(:)p -Ft(,)h Fs(true)p Ft(,)f Fs(false)p Ft(,)f(and)h Fs(test)150 -2295 y Ft(builtins)i(do)g(not)h(accept)g(options)g(and)f(do)g(not)h -(treat)g(`)p Fs(--)p Ft(')f(sp)s(ecially)-8 b(.)57 b(The)35 -b Fs(exit)p Ft(,)h Fs(logout)p Ft(,)f Fs(break)p Ft(,)150 -2405 y Fs(continue)p Ft(,)29 b Fs(let)p Ft(,)i(and)g -Fs(shift)f Ft(builtins)g(accept)j(and)e(pro)s(cess)g(argumen)m(ts)g(b)s -(eginning)g(with)g(`)p Fs(-)p Ft(')g(with-)150 2515 y(out)f(requiring)f -(`)p Fs(--)p Ft('.)41 b(Other)29 b(builtins)h(that)g(accept)h(argumen)m +b(b)m(y)h(`)p Ft(-)p Fu(')f(accepts)i(`)p Ft(--)p Fu(')e(to)h(signify)f +(the)h(end)e(of)i(the)f(options.)50 b(The)33 b Ft(:)p +Fu(,)h Ft(true)p Fu(,)f Ft(false)p Fu(,)f(and)h Ft(test)150 +2295 y Fu(builtins)i(do)g(not)h(accept)g(options)g(and)f(do)g(not)h +(treat)g(`)p Ft(--)p Fu(')f(sp)s(ecially)-8 b(.)57 b(The)35 +b Ft(exit)p Fu(,)h Ft(logout)p Fu(,)f Ft(break)p Fu(,)150 +2405 y Ft(continue)p Fu(,)29 b Ft(let)p Fu(,)i(and)g +Ft(shift)f Fu(builtins)g(accept)j(and)e(pro)s(cess)g(argumen)m(ts)g(b)s +(eginning)g(with)g(`)p Ft(-)p Fu(')g(with-)150 2515 y(out)f(requiring)f +(`)p Ft(--)p Fu('.)41 b(Other)29 b(builtins)h(that)g(accept)h(argumen)m (ts)f(but)g(are)g(not)g(sp)s(eci\014ed)f(as)h(accepting)150 2624 y(options)25 b(in)m(terpret)f(argumen)m(ts)h(b)s(eginning)e(with)h -(`)p Fs(-)p Ft(')h(as)f(in)m(v)-5 b(alid)25 b(options)g(and)e(require)h -(`)p Fs(--)p Ft(')g(to)h(prev)m(en)m(t)150 2734 y(this)30 -b(in)m(terpretation.)150 2970 y Fr(4.1)68 b(Bourne)45 -b(Shell)g(Builtins)150 3130 y Ft(The)22 b(follo)m(wing)j(shell)d +(`)p Ft(-)p Fu(')h(as)f(in)m(v)-5 b(alid)25 b(options)g(and)e(require)h +(`)p Ft(--)p Fu(')g(to)h(prev)m(en)m(t)150 2734 y(this)30 +b(in)m(terpretation.)150 2970 y Fs(4.1)68 b(Bourne)45 +b(Shell)g(Builtins)150 3130 y Fu(The)22 b(follo)m(wing)j(shell)d (builtin)h(commands)f(are)h(inherited)g(from)f(the)h(Bourne)g(Shell.)38 b(These)22 b(commands)150 3239 y(are)31 b(implemen)m(ted)g(as)f(sp)s -(eci\014ed)g(b)m(y)g(the)h Fl(posix)e Ft(standard.)150 -3403 y Fs(:)h Ft(\(a)h(colon\))870 3512 y Fs(:)47 b([)p -Fi(arguments)11 b Fs(])630 3648 y Ft(Do)43 b(nothing)f(b)s(ey)m(ond)g -(expanding)f Fq(argumen)m(ts)46 b Ft(and)c(p)s(erforming)f +(eci\014ed)g(b)m(y)g(the)h Fm(posix)e Fu(standard.)150 +3403 y Ft(:)h Fu(\(a)h(colon\))870 3512 y Ft(:)47 b([)p +Fj(arguments)p Ft(])630 3648 y Fu(Do)c(nothing)f(b)s(ey)m(ond)g +(expanding)f Fr(argumen)m(ts)46 b Fu(and)c(p)s(erforming)f (redirections.)76 b(The)630 3758 y(return)29 b(status)i(is)f(zero.)150 -3920 y Fs(.)g Ft(\(a)h(p)s(erio)s(d\))870 4029 y Fs(.)47 -b Fi(filename)57 b Fs([)p Fi(arguments)11 b Fs(])630 -4165 y Ft(Read)34 b(and)f(execute)i(commands)e(from)g(the)h -Fq(\014lename)39 b Ft(argumen)m(t)34 b(in)f(the)h(curren)m(t)g(shell) -630 4275 y(con)m(text.)45 b(If)31 b Fq(\014lename)37 -b Ft(do)s(es)31 b(not)g(con)m(tain)i(a)e(slash,)h(the)g -Fs(PATH)e Ft(v)-5 b(ariable)32 b(is)f(used)f(to)i(\014nd)630 -4384 y Fq(\014lename)5 b Ft(.)51 b(When)34 b(Bash)g(is)g(not)g(in)f -Fl(posix)g Ft(mo)s(de,)i(the)f(curren)m(t)f(directory)i(is)e(searc)m -(hed)630 4494 y(if)e Fq(\014lename)36 b Ft(is)31 b(not)h(found)d(in)i -Fs($PATH)p Ft(.)41 b(If)31 b(an)m(y)g Fq(argumen)m(ts)k -Ft(are)c(supplied,)f(they)i(b)s(ecome)630 4604 y(the)e(p)s(ositional)h -(parameters)g(when)e Fq(\014lename)35 b Ft(is)30 b(executed.)42 +3920 y Ft(.)g Fu(\(a)h(p)s(erio)s(d\))870 4029 y Ft(.)47 +b Fj(filename)f Ft([)p Fj(arguments)p Ft(])630 4165 y +Fu(Read)34 b(and)f(execute)i(commands)e(from)g(the)h +Fr(\014lename)39 b Fu(argumen)m(t)34 b(in)f(the)h(curren)m(t)g(shell) +630 4275 y(con)m(text.)45 b(If)31 b Fr(\014lename)37 +b Fu(do)s(es)31 b(not)g(con)m(tain)i(a)e(slash,)h(the)g +Ft(PATH)e Fu(v)-5 b(ariable)32 b(is)f(used)f(to)i(\014nd)630 +4384 y Fr(\014lename)p Fu(.)52 b(When)34 b(Bash)g(is)h(not)f(in)g +Fm(posix)f Fu(mo)s(de,)i(the)g(curren)m(t)f(directory)g(is)g(searc)m +(hed)630 4494 y(if)d Fr(\014lename)36 b Fu(is)31 b(not)h(found)d(in)i +Ft($PATH)p Fu(.)41 b(If)31 b(an)m(y)g Fr(argumen)m(ts)k +Fu(are)c(supplied,)f(they)i(b)s(ecome)630 4604 y(the)e(p)s(ositional)h +(parameters)g(when)e Fr(\014lename)35 b Fu(is)30 b(executed.)42 b(Otherwise)30 b(the)g(p)s(ositional)630 4713 y(parameters)43 b(are)h(unc)m(hanged.)79 b(The)42 b(return)g(status)i(is)f(the)g(exit)h (status)g(of)f(the)g(last)630 4823 y(command)37 b(executed,)k(or)c (zero)h(if)g(no)f(commands)g(are)h(executed.)63 b(If)36 -b Fq(\014lename)43 b Ft(is)38 b(not)630 4932 y(found,)22 +b Fr(\014lename)43 b Fu(is)38 b(not)630 4932 y(found,)22 b(or)f(cannot)g(b)s(e)f(read,)j(the)e(return)f(status)h(is)g(non-zero.) 38 b(This)20 b(builtin)h(is)f(equiv)-5 b(alen)m(t)630 -5042 y(to)31 b Fs(source)p Ft(.)150 5204 y Fs(break)870 -5340 y(break)46 b([)p Fi(n)11 b Fs(])p eop end +5042 y(to)31 b Ft(source)p Fu(.)150 5204 y Ft(break)870 +5340 y(break)46 b([)p Fj(n)p Ft(])p eop end %%Page: 42 48 -TeXDict begin 42 47 bop 150 -116 a Ft(Chapter)30 b(4:)41 +TeXDict begin 42 47 bop 150 -116 a Fu(Chapter)30 b(4:)41 b(Shell)30 b(Builtin)h(Commands)2069 b(42)630 299 y(Exit)45 -b(from)f(a)g Fs(for)p Ft(,)k Fs(while)p Ft(,)e Fs(until)p -Ft(,)h(or)d Fs(select)f Ft(lo)s(op.)83 b(If)44 b Fq(n)g -Ft(is)g(supplied,)j(the)e Fq(n)p Ft(th)630 408 y(enclosing)c(lo)s(op)f -(is)h(exited.)70 b Fq(n)40 b Ft(m)m(ust)g(b)s(e)f(greater)j(than)d(or)i +b(from)f(a)g Ft(for)p Fu(,)k Ft(while)p Fu(,)e Ft(until)p +Fu(,)h(or)d Ft(select)f Fu(lo)s(op.)83 b(If)44 b Fr(n)g +Fu(is)g(supplied,)j(the)e Fr(n)p Fu(th)630 408 y(enclosing)c(lo)s(op)f +(is)h(exited.)70 b Fr(n)40 b Fu(m)m(ust)g(b)s(e)f(greater)j(than)d(or)i (equal)f(to)h(1.)70 b(The)40 b(return)630 518 y(status)31 -b(is)f(zero)h(unless)f Fq(n)g Ft(is)g(not)h(greater)g(than)g(or)f -(equal)h(to)g(1.)150 677 y Fs(cd)870 812 y(cd)47 b([-L|[-P)f([-e]])g -([-@])h([)p Fi(directory)11 b Fs(])630 946 y Ft(Change)26 -b(the)g(curren)m(t)g(w)m(orking)g(directory)h(to)f Fq(directory)8 -b Ft(.)40 b(If)25 b Fq(directory)35 b Ft(is)26 b(not)g(supplied,)630 -1056 y(the)g(v)-5 b(alue)26 b(of)f(the)h Fs(HOME)e Ft(shell)i(v)-5 +b(is)f(zero)h(unless)f Fr(n)g Fu(is)g(not)h(greater)g(than)g(or)f +(equal)h(to)g(1.)150 677 y Ft(cd)870 812 y(cd)47 b([-L|[-P)f([-e]])g +([-@])h([)p Fj(directory)p Ft(])630 946 y Fu(Change)27 +b(the)g(curren)m(t)f(w)m(orking)h(directory)g(to)h Fr(directory)p +Fu(.)40 b(If)26 b Fr(directory)35 b Fu(is)27 b(not)g(supplied,)630 +1056 y(the)f(v)-5 b(alue)26 b(of)f(the)h Ft(HOME)e Fu(shell)i(v)-5 b(ariable)26 b(is)g(used.)38 b(An)m(y)25 b(additional)i(argumen)m(ts)e -(follo)m(wing)630 1166 y Fq(directory)39 b Ft(are)31 +(follo)m(wing)630 1166 y Fr(directory)39 b Fu(are)31 b(ignored.)41 b(If)30 b(the)h(shell)g(v)-5 b(ariable)31 -b Fs(CDPATH)e Ft(exists,)i(it)g(is)g(used)f(as)g(a)h(searc)m(h)630 -1275 y(path:)39 b(eac)m(h)28 b(directory)g(name)f(in)g -Fs(CDPATH)e Ft(is)j(searc)m(hed)f(for)g Fq(directory)8 -b Ft(,)29 b(with)e(alternativ)m(e)630 1385 y(directory)k(names)g(in)f -Fs(CDPATH)f Ft(separated)j(b)m(y)e(a)h(colon)h(\(`)p -Fs(:)p Ft('\).)43 b(If)30 b Fq(directory)39 b Ft(b)s(egins)30 -b(with)630 1494 y(a)h(slash,)f Fs(CDPATH)f Ft(is)h(not)h(used.)630 -1629 y(The)c(`)p Fs(-P)p Ft(')h(option)g(means)g(to)h(not)f(follo)m(w)h -(sym)m(b)s(olic)f(links:)39 b(sym)m(b)s(olic)28 b(links)g(are)g(resolv) -m(ed)630 1738 y(while)41 b Fs(cd)f Ft(is)h(tra)m(v)m(ersing)h -Fq(directory)49 b Ft(and)40 b(b)s(efore)g(pro)s(cessing)h(an)f -(instance)i(of)f(`)p Fs(..)p Ft(')f(in)630 1848 y Fq(directory)8 -b Ft(.)630 1983 y(By)30 b(default,)g(or)g(when)f(the)h(`)p -Fs(-L)p Ft(')f(option)i(is)f(supplied,)e(sym)m(b)s(olic)j(links)e(in)g -Fq(directory)39 b Ft(are)630 2092 y(resolv)m(ed)31 b(after)g -Fs(cd)f Ft(pro)s(cesses)g(an)g(instance)h(of)g(`)p Fs(..)p -Ft(')f(in)g Fq(directory)8 b Ft(.)630 2227 y(If)34 b(`)p -Fs(..)p Ft(')g(app)s(ears)g(in)g Fq(directory)8 b Ft(,)36 -b(it)e(is)h(pro)s(cessed)f(b)m(y)g(remo)m(ving)h(the)g(immediately)g -(pre-)630 2336 y(ceding)c(pathname)f(comp)s(onen)m(t,)h(bac)m(k)g(to)g -(a)g(slash)f(or)h(the)f(b)s(eginning)g(of)g Fq(directory)8 -b Ft(.)630 2471 y(If)25 b(the)g(`)p Fs(-e)p Ft(')g(option)h(is)f -(supplied)f(with)g(`)p Fs(-P)p Ft(')h(and)g(the)g(curren)m(t)g(w)m -(orking)h(directory)f(cannot)630 2580 y(b)s(e)37 b(successfully)g -(determined)g(after)i(a)e(successful)h(directory)g(c)m(hange,)i -Fs(cd)d Ft(will)h(return)630 2690 y(an)30 b(unsuccessful)f(status.)630 -2824 y(On)37 b(systems)g(that)h(supp)s(ort)e(it,)k(the)e(`)p -Fs(-@)p Ft(')g(option)g(presen)m(ts)f(the)h(extended)f(attributes)630 +b Ft(CDPATH)e Fu(exists,)i(it)g(is)g(used)f(as)g(a)h(searc)m(h)630 +1275 y(path:)39 b(eac)m(h)29 b(directory)g(name)f(in)f +Ft(CDPATH)g Fu(is)h(searc)m(hed)g(for)g Fr(directory)p +Fu(,)h(with)f(alternativ)m(e)630 1385 y(directory)j(names)g(in)f +Ft(CDPATH)f Fu(separated)j(b)m(y)e(a)h(colon)h(\(`)p +Ft(:)p Fu('\).)43 b(If)30 b Fr(directory)39 b Fu(b)s(egins)30 +b(with)630 1494 y(a)h(slash,)f Ft(CDPATH)f Fu(is)h(not)h(used.)630 +1629 y(The)g Ft(-P)h Fu(option)g(means)g(to)h(not)f(follo)m(w)h(sym)m +(b)s(olic)g(links:)44 b(sym)m(b)s(olic)32 b(links)g(are)g(resolv)m(ed) +630 1738 y(while)41 b Ft(cd)f Fu(is)h(tra)m(v)m(ersing)h +Fr(directory)49 b Fu(and)40 b(b)s(efore)g(pro)s(cessing)h(an)f +(instance)i(of)f(`)p Ft(..)p Fu(')f(in)630 1848 y Fr(directory)p +Fu(.)630 1983 y(By)34 b(default,)h(or)e(when)g(the)g +Ft(-L)g Fu(option)h(is)g(supplied,)f(sym)m(b)s(olic)h(links)f(in)h +Fr(directory)42 b Fu(are)630 2092 y(resolv)m(ed)31 b(after)g +Ft(cd)f Fu(pro)s(cesses)g(an)g(instance)h(of)g(`)p Ft(..)p +Fu(')f(in)g Fr(directory)p Fu(.)630 2227 y(If)35 b(`)p +Ft(..)p Fu(')f(app)s(ears)h(in)f Fr(directory)p Fu(,)j(it)f(is)f(pro)s +(cessed)f(b)m(y)h(remo)m(ving)h(the)f(immediately)h(pre-)630 +2336 y(ceding)31 b(pathname)f(comp)s(onen)m(t,)h(bac)m(k)g(to)g(a)g +(slash)f(or)h(the)f(b)s(eginning)g(of)g Fr(directory)p +Fu(.)630 2471 y(If)i(the)i Ft(-e)e Fu(option)h(is)g(supplied)f(with)g +Ft(-P)h Fu(and)f(the)h(curren)m(t)g(w)m(orking)g(directory)g(cannot)630 +2580 y(b)s(e)k(successfully)g(determined)g(after)i(a)e(successful)h +(directory)g(c)m(hange,)i Ft(cd)d Fu(will)h(return)630 +2690 y(an)30 b(unsuccessful)f(status.)630 2824 y(On)41 +b(systems)h(that)h(supp)s(ort)d(it,)46 b(the)c Ft(-@)g +Fu(option)g(presen)m(ts)g(the)g(extended)g(attributes)630 2934 y(asso)s(ciated)32 b(with)e(a)h(\014le)f(as)h(a)f(directory)-8 -b(.)630 3068 y(If)41 b Fq(directory)49 b Ft(is)41 b(`)p -Fs(-)p Ft(',)j(it)e(is)f(con)m(v)m(erted)h(to)g Fs($OLDPWD)d -Ft(b)s(efore)i(the)g(directory)h(c)m(hange)g(is)630 3178 +b(.)630 3068 y(If)41 b Fr(directory)49 b Fu(is)41 b(`)p +Ft(-)p Fu(',)j(it)e(is)f(con)m(v)m(erted)h(to)g Ft($OLDPWD)d +Fu(b)s(efore)i(the)g(directory)h(c)m(hange)g(is)630 3178 y(attempted.)630 3313 y(If)33 b(a)h(non-empt)m(y)g(directory)g(name)f -(from)g Fs(CDPATH)f Ft(is)h(used,)h(or)g(if)f(`)p Fs(-)p -Ft(')h(is)f(the)h(\014rst)f(argu-)630 3422 y(men)m(t,)28 +(from)g Ft(CDPATH)f Fu(is)h(used,)h(or)g(if)f(`)p Ft(-)p +Fu(')h(is)f(the)h(\014rst)f(argu-)630 3422 y(men)m(t,)28 b(and)e(the)h(directory)g(c)m(hange)h(is)f(successful,)h(the)f (absolute)g(pathname)g(of)f(the)h(new)630 3532 y(w)m(orking)k (directory)g(is)f(written)g(to)i(the)e(standard)g(output.)630 3666 y(The)f(return)g(status)h(is)f(zero)i(if)e(the)h(directory)g(is)g (successfully)g(c)m(hanged,)g(non-zero)g(oth-)630 3776 -y(erwise.)150 3935 y Fs(continue)870 4070 y(continue)46 -b([)p Fi(n)11 b Fs(])630 4204 y Ft(Resume)32 b(the)g(next)g(iteration)i -(of)e(an)g(enclosing)h Fs(for)p Ft(,)f Fs(while)p Ft(,)f -Fs(until)p Ft(,)g(or)h Fs(select)f Ft(lo)s(op.)630 4314 -y(If)f Fq(n)h Ft(is)g(supplied,)e(the)j(execution)g(of)f(the)g -Fq(n)p Ft(th)f(enclosing)i(lo)s(op)f(is)f(resumed.)42 -b Fq(n)30 b Ft(m)m(ust)h(b)s(e)630 4423 y(greater)39 +y(erwise.)150 3935 y Ft(continue)870 4070 y(continue)46 +b([)p Fj(n)p Ft(])630 4204 y Fu(Resume)32 b(the)g(next)g(iteration)i +(of)e(an)g(enclosing)h Ft(for)p Fu(,)f Ft(while)p Fu(,)f +Ft(until)p Fu(,)g(or)h Ft(select)f Fu(lo)s(op.)630 4314 +y(If)f Fr(n)h Fu(is)g(supplied,)e(the)j(execution)g(of)f(the)g +Fr(n)p Fu(th)f(enclosing)i(lo)s(op)f(is)f(resumed.)42 +b Fr(n)30 b Fu(m)m(ust)h(b)s(e)630 4423 y(greater)39 b(than)f(or)g(equal)g(to)h(1.)63 b(The)38 b(return)e(status)j(is)e -(zero)i(unless)e Fq(n)h Ft(is)g(not)g(greater)630 4533 -y(than)30 b(or)g(equal)h(to)g(1.)150 4692 y Fs(eval)870 -4827 y(eval)47 b([)p Fi(arguments)11 b Fs(])630 4961 -y Ft(The)25 b(argumen)m(ts)h(are)g(concatenated)i(together)f(in)m(to)f -(a)g(single)h(command,)f(whic)m(h)g(is)f(then)630 5071 -y(read)35 b(and)g(executed,)j(and)d(its)h(exit)g(status)g(returned)e -(as)h(the)h(exit)g(status)g(of)g Fs(eval)p Ft(.)54 b(If)630 -5181 y(there)31 b(are)f(no)h(argumen)m(ts)f(or)h(only)f(empt)m(y)h -(argumen)m(ts,)g(the)f(return)g(status)g(is)h(zero.)150 -5340 y Fs(exec)p eop end +(zero)i(unless)e Fr(n)h Fu(is)g(not)g(greater)630 4533 +y(than)30 b(or)g(equal)h(to)g(1.)150 4692 y Ft(eval)870 +4827 y(eval)47 b([)p Fj(arguments)p Ft(])630 4961 y Fu(The)25 +b(argumen)m(ts)h(are)g(concatenated)i(together)f(in)m(to)f(a)g(single)h +(command,)f(whic)m(h)g(is)f(then)630 5071 y(read)35 b(and)g(executed,)j +(and)d(its)h(exit)g(status)g(returned)e(as)h(the)h(exit)g(status)g(of)g +Ft(eval)p Fu(.)54 b(If)630 5181 y(there)31 b(are)f(no)h(argumen)m(ts)f +(or)h(only)f(empt)m(y)h(argumen)m(ts,)g(the)f(return)g(status)g(is)h +(zero.)150 5340 y Ft(exec)p eop end %%Page: 43 49 -TeXDict begin 43 48 bop 150 -116 a Ft(Chapter)30 b(4:)h(Shell)f -(Builtin)h(Commands)2079 b(43)870 299 y Fs(exec)47 b([-cl])f([-a)h -Fi(name)11 b Fs(])46 b([)p Fi(command)56 b Fs([)p Fi(arguments)11 -b Fs(]])630 440 y Ft(If)36 b Fq(command)k Ft(is)c(supplied,)h(it)g +TeXDict begin 43 48 bop 150 -116 a Fu(Chapter)30 b(4:)h(Shell)f +(Builtin)h(Commands)2079 b(43)870 299 y Ft(exec)47 b([-cl])f([-a)h +Fj(name)p Ft(])f([)p Fj(command)g Ft([)p Fj(arguments)p +Ft(]])630 440 y Fu(If)36 b Fr(command)k Fu(is)c(supplied,)h(it)g (replaces)h(the)e(shell)h(without)f(creating)i(a)f(new)f(pro)s(cess.) -630 549 y(If)h(the)g(`)p Fs(-l)p Ft(')g(option)h(is)f(supplied,)g(the)h -(shell)f(places)h(a)g(dash)e(at)i(the)f(b)s(eginning)f(of)i(the)630 -659 y(zeroth)e(argumen)m(t)g(passed)f(to)h Fq(command)t -Ft(.)56 b(This)34 b(is)i(what)f(the)h Fs(login)e Ft(program)h(do)s(es.) -630 769 y(The)e(`)p Fs(-c)p Ft(')h(option)g(causes)g -Fq(command)j Ft(to)e(b)s(e)e(executed)i(with)e(an)h(empt)m(y)g(en)m -(vironmen)m(t.)630 878 y(If)d(`)p Fs(-a)p Ft(')g(is)h(supplied,)f(the)g -(shell)h(passes)f Fq(name)37 b Ft(as)31 b(the)h(zeroth)g(argumen)m(t)g -(to)g Fq(command)t Ft(.)630 988 y(If)g Fq(command)j Ft(cannot)e(b)s(e)f +630 549 y(If)k(the)h Ft(-l)e Fu(option)i(is)g(supplied,)h(the)e(shell)h +(places)g(a)g(dash)f(at)h(the)f(b)s(eginning)g(of)h(the)630 +659 y(zeroth)36 b(argumen)m(t)h(passed)e(to)h Fr(command)p +Fu(.)57 b(This)35 b(is)h(what)f(the)h Ft(login)e Fu(program)i(do)s(es.) +630 769 y(The)i Ft(-c)g Fu(option)g(causes)h Fr(command)j +Fu(to)d(b)s(e)f(executed)h(with)f(an)g(empt)m(y)h(en)m(vironmen)m(t.) +630 878 y(If)c Ft(-a)g Fu(is)h(supplied,)f(the)h(shell)g(passes)f +Fr(name)41 b Fu(as)36 b(the)f(zeroth)i(argumen)m(t)f(to)g +Fr(command)p Fu(.)630 988 y(If)c Fr(command)j Fu(cannot)e(b)s(e)f (executed)h(for)f(some)g(reason,)h(a)g(non-in)m(teractiv)m(e)i(shell)d -(exits,)630 1097 y(unless)27 b(the)g Fs(execfail)e Ft(shell)i(option)h +(exits,)630 1097 y(unless)27 b(the)g Ft(execfail)e Fu(shell)i(option)h (is)f(enabled.)40 b(In)27 b(that)g(case,)j(it)d(returns)f(failure.)40 -b(An)630 1207 y(in)m(teractiv)m(e)d(shell)d(returns)f(failure)h(if)g -(the)g(\014le)g(cannot)g(b)s(e)g(executed.)52 b(If)33 -b(no)h Fq(command)630 1316 y Ft(is)27 b(sp)s(eci\014ed,)g(redirections) +b(An)630 1207 y(in)m(teractiv)m(e)d(shell)c(returns)g(failure)h(if)f +(the)h(\014le)g(cannot)g(b)s(e)f(executed.)52 b(If)33 +b(no)h Fr(command)630 1316 y Fu(is)27 b(sp)s(eci\014ed,)g(redirections) h(ma)m(y)f(b)s(e)g(used)f(to)i(a\013ect)g(the)f(curren)m(t)g(shell)g (en)m(vironmen)m(t.)40 b(If)630 1426 y(there)34 b(are)h(no)f (redirection)h(errors,)g(the)f(return)f(status)i(is)f(zero;)j (otherwise)e(the)f(return)630 1536 y(status)d(is)f(non-zero.)150 -1708 y Fs(exit)870 1849 y(exit)47 b([)p Fi(n)11 b Fs(])630 -1990 y Ft(Exit)30 b(the)g(shell,)h(returning)d(a)j(status)f(of)g -Fq(n)f Ft(to)h(the)g(shell's)g(paren)m(t.)41 b(If)30 -b Fq(n)f Ft(is)h(omitted,)h(the)630 2099 y(exit)c(status)g(is)g(that)g +1708 y Ft(exit)870 1849 y(exit)47 b([)p Fj(n)p Ft(])630 +1990 y Fu(Exit)30 b(the)g(shell,)h(returning)d(a)j(status)f(of)g +Fr(n)f Fu(to)h(the)g(shell's)g(paren)m(t.)41 b(If)30 +b Fr(n)f Fu(is)h(omitted,)h(the)630 2099 y(exit)c(status)g(is)g(that)g (of)g(the)g(last)g(command)f(executed.)41 b(An)m(y)26 -b(trap)h(on)f Fs(EXIT)f Ft(is)i(executed)630 2209 y(b)s(efore)j(the)h -(shell)f(terminates.)150 2381 y Fs(export)870 2522 y(export)46 -b([-fn])g([-p])h([)p Fi(name)11 b Fs([=)p Fi(value)g -Fs(]])630 2663 y Ft(Mark)40 b(eac)m(h)h Fq(name)k Ft(to)40 -b(b)s(e)f(passed)g(to)i(c)m(hild)f(pro)s(cesses)f(in)g(the)h(en)m -(vironmen)m(t.)70 b(If)39 b(the)630 2772 y(`)p Fs(-f)p -Ft(')29 b(option)h(is)g(supplied,)f(the)g Fq(name)5 b -Ft(s)30 b(refer)f(to)h(shell)g(functions;)f(otherwise)h(the)g(names)630 -2882 y(refer)36 b(to)i(shell)e(v)-5 b(ariables.)60 b(The)36 -b(`)p Fs(-n)p Ft(')h(option)g(means)f(to)h(no)g(longer)g(mark)f(eac)m -(h)i Fq(name)630 2992 y Ft(for)h(exp)s(ort.)65 b(If)39 -b(no)g Fq(names)j Ft(are)d(supplied,)h(or)f(if)g(the)g(`)p -Fs(-p)p Ft(')g(option)g(is)g(giv)m(en,)j(a)d(list)h(of)630 -3101 y(names)27 b(of)h(all)h(exp)s(orted)e(v)-5 b(ariables)28 -b(is)g(displa)m(y)m(ed.)40 b(The)27 b(`)p Fs(-p)p Ft(')g(option)h -(displa)m(ys)g(output)f(in)630 3211 y(a)32 b(form)e(that)i(ma)m(y)g(b)s -(e)e(reused)h(as)g(input.)43 b(If)30 b(a)i(v)-5 b(ariable)32 -b(name)f(is)g(follo)m(w)m(ed)i(b)m(y)e(=)p Fq(v)-5 b(alue)5 -b Ft(,)630 3320 y(the)31 b(v)-5 b(alue)30 b(of)h(the)g(v)-5 -b(ariable)31 b(is)f(set)h(to)g Fq(v)-5 b(alue)5 b Ft(.)630 -3461 y(The)29 b(return)e(status)j(is)f(zero)h(unless)e(an)h(in)m(v)-5 -b(alid)29 b(option)h(is)f(supplied,)f(one)i(of)f(the)g(names)630 -3571 y(is)h(not)h(a)f(v)-5 b(alid)31 b(shell)f(v)-5 b(ariable)31 -b(name,)f(or)h(`)p Fs(-f)p Ft(')f(is)g(supplied)f(with)g(a)i(name)f -(that)h(is)f(not)h(a)630 3680 y(shell)g(function.)150 -3853 y Fs(getopts)870 3994 y(getopts)46 b Fi(optstring)56 -b(name)h Fs([)p Fi(args)11 b Fs(])630 4134 y(getopts)28 -b Ft(is)i(used)g(b)m(y)g(shell)g(scripts)g(to)g(parse)g(p)s(ositional)h -(parameters.)41 b Fq(optstring)d Ft(con-)630 4244 y(tains)k(the)g -(option)f(c)m(haracters)i(to)g(b)s(e)d(recognized;)49 -b(if)42 b(a)f(c)m(haracter)j(is)d(follo)m(w)m(ed)i(b)m(y)f(a)630 -4354 y(colon,)33 b(the)f(option)g(is)g(exp)s(ected)g(to)h(ha)m(v)m(e)g -(an)e(argumen)m(t,)i(whic)m(h)f(should)e(b)s(e)h(separated)630 -4463 y(from)40 b(it)g(b)m(y)g(whitespace.)70 b(The)40 -b(colon)h(\(`)p Fs(:)p Ft('\))g(and)e(question)h(mark)g(\(`)p -Fs(?)p Ft('\))h(ma)m(y)f(not)h(b)s(e)630 4573 y(used)d(as)g(option)h(c) -m(haracters.)67 b(Eac)m(h)39 b(time)g(it)g(is)f(in)m(v)m(ok)m(ed,)k -Fs(getopts)37 b Ft(places)i(the)g(next)630 4682 y(option)29 -b(in)f(the)g(shell)h(v)-5 b(ariable)29 b Fq(name)5 b -Ft(,)29 b(initializing)h Fq(name)k Ft(if)28 b(it)h(do)s(es)f(not)g -(exist,)i(and)e(the)630 4792 y(index)33 b(of)g(the)h(next)f(argumen)m -(t)h(to)g(b)s(e)e(pro)s(cessed)h(in)m(to)h(the)g(v)-5 -b(ariable)34 b Fs(OPTIND)p Ft(.)48 b Fs(OPTIND)630 4902 -y Ft(is)41 b(initialized)i(to)f(1)f(eac)m(h)h(time)g(the)f(shell)g(or)g -(a)g(shell)g(script)g(is)g(in)m(v)m(ok)m(ed.)74 b(When)41 -b(an)630 5011 y(option)36 b(requires)e(an)h(argumen)m(t,)i -Fs(getopts)c Ft(places)j(that)g(argumen)m(t)g(in)m(to)g(the)f(v)-5 -b(ariable)630 5121 y Fs(OPTARG)p Ft(.)55 b(The)35 b(shell)g(do)s(es)h -(not)g(reset)g Fs(OPTIND)e Ft(automatically;)41 b(it)36 -b(m)m(ust)f(b)s(e)g(man)m(ually)630 5230 y(reset)i(b)s(et)m(w)m(een)g -(m)m(ultiple)h(calls)f(to)g Fs(getopts)e Ft(within)h(the)h(same)g +b(trap)h(on)f Ft(EXIT)f Fu(is)i(executed)630 2209 y(b)s(efore)j(the)h +(shell)f(terminates.)150 2381 y Ft(export)870 2522 y(export)46 +b([-fn])g([-p])h([)p Fj(name)p Ft([=)p Fj(value)p Ft(]])630 +2663 y Fu(Mark)40 b(eac)m(h)h Fr(name)k Fu(to)40 b(b)s(e)f(passed)g(to) +i(c)m(hild)f(pro)s(cesses)f(in)g(the)h(en)m(vironmen)m(t.)70 +b(If)39 b(the)630 2772 y Ft(-f)33 b Fu(option)h(is)g(supplied,)f(the)h +Fr(name)5 b Fu(s)33 b(refer)g(to)i(shell)e(functions;)i(otherwise)f +(the)g(names)630 2882 y(refer)c(to)h(shell)g(v)-5 b(ariables.)41 +b(The)30 b Ft(-n)f Fu(option)i(means)f(to)h(no)f(longer)h(mark)f(eac)m +(h)i Fr(name)j Fu(for)630 2992 y(exp)s(ort.)52 b(If)33 +b(no)h Fr(names)k Fu(are)c(supplied,)g(or)g(if)g(the)g +Ft(-p)g Fu(option)g(is)g(giv)m(en,)j(a)d(list)h(of)f(names)630 +3101 y(of)d(all)h(exp)s(orted)e(v)-5 b(ariables)31 b(is)g(displa)m(y)m +(ed.)43 b(The)30 b Ft(-p)g Fu(option)i(displa)m(ys)e(output)h(in)f(a)h +(form)630 3211 y(that)25 b(ma)m(y)g(b)s(e)f(reused)g(as)h(input.)38 +b(If)24 b(a)h(v)-5 b(ariable)25 b(name)g(is)g(follo)m(w)m(ed)h(b)m(y)e +(=)p Fr(v)-5 b(alue)p Fu(,)27 b(the)d(v)-5 b(alue)630 +3320 y(of)31 b(the)f(v)-5 b(ariable)31 b(is)g(set)g(to)g +Fr(v)-5 b(alue)p Fu(.)630 3461 y(The)29 b(return)e(status)j(is)f(zero)h +(unless)e(an)h(in)m(v)-5 b(alid)29 b(option)h(is)f(supplied,)f(one)i +(of)f(the)g(names)630 3571 y(is)k(not)g(a)h(v)-5 b(alid)33 +b(shell)h(v)-5 b(ariable)33 b(name,)i(or)e Ft(-f)f Fu(is)h(supplied)f +(with)h(a)g(name)g(that)h(is)f(not)h(a)630 3680 y(shell)d(function.)150 +3853 y Ft(getopts)870 3994 y(getopts)46 b Fj(optstring)f(name)i +Ft([)p Fj(args)p Ft(])630 4134 y(getopts)28 b Fu(is)i(used)g(b)m(y)g +(shell)g(scripts)g(to)g(parse)g(p)s(ositional)h(parameters.)41 +b Fr(optstring)d Fu(con-)630 4244 y(tains)k(the)g(option)f(c)m +(haracters)i(to)g(b)s(e)d(recognized;)49 b(if)42 b(a)f(c)m(haracter)j +(is)d(follo)m(w)m(ed)i(b)m(y)f(a)630 4354 y(colon,)33 +b(the)f(option)g(is)g(exp)s(ected)g(to)h(ha)m(v)m(e)g(an)e(argumen)m +(t,)i(whic)m(h)f(should)e(b)s(e)h(separated)630 4463 +y(from)40 b(it)g(b)m(y)g(whitespace.)70 b(The)40 b(colon)h(\(`)p +Ft(:)p Fu('\))g(and)e(question)h(mark)g(\(`)p Ft(?)p +Fu('\))h(ma)m(y)f(not)h(b)s(e)630 4573 y(used)d(as)g(option)h(c)m +(haracters.)67 b(Eac)m(h)39 b(time)g(it)g(is)f(in)m(v)m(ok)m(ed,)k +Ft(getopts)37 b Fu(places)i(the)g(next)630 4682 y(option)29 +b(in)f(the)h(shell)g(v)-5 b(ariable)30 b Fr(name)p Fu(,)f(initializing) +i Fr(name)j Fu(if)28 b(it)h(do)s(es)g(not)g(exist,)h(and)e(the)630 +4792 y(index)33 b(of)g(the)h(next)f(argumen)m(t)h(to)g(b)s(e)e(pro)s +(cessed)h(in)m(to)h(the)g(v)-5 b(ariable)34 b Ft(OPTIND)p +Fu(.)48 b Ft(OPTIND)630 4902 y Fu(is)41 b(initialized)i(to)f(1)f(eac)m +(h)h(time)g(the)f(shell)g(or)g(a)g(shell)g(script)g(is)g(in)m(v)m(ok)m +(ed.)74 b(When)41 b(an)630 5011 y(option)36 b(requires)e(an)h(argumen)m +(t,)i Ft(getopts)c Fu(places)j(that)g(argumen)m(t)g(in)m(to)g(the)f(v) +-5 b(ariable)630 5121 y Ft(OPTARG)p Fu(.)55 b(The)35 +b(shell)g(do)s(es)h(not)g(reset)g Ft(OPTIND)e Fu(automatically;)41 +b(it)36 b(m)m(ust)f(b)s(e)g(man)m(ually)630 5230 y(reset)i(b)s(et)m(w)m +(een)g(m)m(ultiple)h(calls)f(to)g Ft(getopts)e Fu(within)h(the)h(same)g (shell)f(in)m(v)m(o)s(cation)j(if)e(a)630 5340 y(new)30 b(set)h(of)f(parameters)h(is)f(to)i(b)s(e)d(used.)p eop end %%Page: 44 50 -TeXDict begin 44 49 bop 150 -116 a Ft(Chapter)30 b(4:)41 +TeXDict begin 44 49 bop 150 -116 a Fu(Chapter)30 b(4:)41 b(Shell)30 b(Builtin)h(Commands)2069 b(44)630 299 y(When)41 -b(the)h(end)e(of)i(options)g(is)f(encoun)m(tered,)k Fs(getopts)39 -b Ft(exits)j(with)f(a)h(return)e(v)-5 b(alue)630 408 -y(greater)32 b(than)e(zero.)41 b Fs(OPTIND)29 b Ft(is)h(set)h(to)g(the) +b(the)h(end)e(of)i(options)g(is)f(encoun)m(tered,)k Ft(getopts)39 +b Fu(exits)j(with)f(a)h(return)e(v)-5 b(alue)630 408 +y(greater)32 b(than)e(zero.)41 b Ft(OPTIND)29 b Fu(is)h(set)h(to)g(the) g(index)f(of)g(the)h(\014rst)f(non-option)g(argumen)m(t,)630 -518 y(and)g Fq(name)35 b Ft(is)c(set)g(to)g(`)p Fs(?)p -Ft('.)630 655 y Fs(getopts)c Ft(normally)j(parses)e(the)i(p)s +518 y(and)g Fr(name)35 b Fu(is)c(set)g(to)g(`)p Ft(?)p +Fu('.)630 655 y Ft(getopts)c Fu(normally)j(parses)e(the)i(p)s (ositional)g(parameters,)g(but)e(if)i(more)f(argumen)m(ts)h(are)630 -765 y(giv)m(en)h(in)f Fq(args)t Ft(,)h Fs(getopts)e Ft(parses)g(those)i -(instead.)630 902 y Fs(getopts)h Ft(can)h(rep)s(ort)g(errors)g(in)h(t)m +765 y(giv)m(en)h(in)f Fr(args)p Fu(,)h Ft(getopts)e Fu(parses)h(those)h +(instead.)630 902 y Ft(getopts)h Fu(can)h(rep)s(ort)g(errors)g(in)h(t)m (w)m(o)h(w)m(a)m(ys.)51 b(If)33 b(the)h(\014rst)e(c)m(haracter)k(of)d -Fq(optstring)42 b Ft(is)34 b(a)630 1011 y(colon,)g Fq(silen)m(t)h -Ft(error)d(rep)s(orting)f(is)i(used.)45 b(In)31 b(normal)h(op)s +Fr(optstring)42 b Fu(is)34 b(a)630 1011 y(colon,)g Fr(silen)m(t)h +Fu(error)d(rep)s(orting)f(is)i(used.)45 b(In)31 b(normal)h(op)s (eration,)h(diagnostic)h(messages)630 1121 y(are)c(prin)m(ted)e(when)g (in)m(v)-5 b(alid)30 b(options)g(or)f(missing)g(option)g(argumen)m(ts)h (are)f(encoun)m(tered.)630 1230 y(If)34 b(the)g(v)-5 -b(ariable)35 b Fs(OPTERR)d Ft(is)i(set)h(to)f(0,)i(no)e(error)g +b(ariable)35 b Ft(OPTERR)d Fu(is)i(set)h(to)f(0,)i(no)e(error)g (messages)h(will)f(b)s(e)f(displa)m(y)m(ed,)j(ev)m(en)f(if)630 -1340 y(the)c(\014rst)e(c)m(haracter)j(of)f Fs(optstring)d -Ft(is)i(not)h(a)f(colon.)630 1477 y(If)39 b(an)h(in)m(v)-5 -b(alid)41 b(option)f(is)g(seen,)i Fs(getopts)c Ft(places)j(`)p -Fs(?)p Ft(')f(in)m(to)h Fq(name)k Ft(and,)d(if)e(not)g(silen)m(t,)630 +1340 y(the)c(\014rst)e(c)m(haracter)j(of)f Ft(optstring)d +Fu(is)i(not)h(a)f(colon.)630 1477 y(If)39 b(an)h(in)m(v)-5 +b(alid)41 b(option)f(is)g(seen,)i Ft(getopts)c Fu(places)j(`)p +Ft(?)p Fu(')f(in)m(to)h Fr(name)k Fu(and,)d(if)e(not)g(silen)m(t,)630 1587 y(prin)m(ts)f(an)h(error)f(message)h(and)f(unsets)g -Fs(OPTARG)p Ft(.)67 b(If)39 b Fs(getopts)f Ft(is)i(silen)m(t,)j(the)c +Ft(OPTARG)p Fu(.)67 b(If)39 b Ft(getopts)f Fu(is)i(silen)m(t,)j(the)c (option)630 1696 y(c)m(haracter)32 b(found)d(is)h(placed)h(in)f -Fs(OPTARG)f Ft(and)h(no)g(diagnostic)i(message)f(is)g(prin)m(ted.)630 +Ft(OPTARG)f Fu(and)h(no)g(diagnostic)i(message)f(is)g(prin)m(ted.)630 1833 y(If)c(a)g(required)f(argumen)m(t)i(is)f(not)g(found,)g(and)f -Fs(getopts)f Ft(is)i(not)h(silen)m(t,)h(a)e(question)g(mark)630 -1943 y(\(`)p Fs(?)p Ft('\))35 b(is)g(placed)g(in)g Fq(name)5 -b Ft(,)36 b Fs(OPTARG)d Ft(is)h(unset,)i(and)e(a)h(diagnostic)h -(message)f(is)g(prin)m(ted.)630 2052 y(If)e Fs(getopts)f -Ft(is)h(silen)m(t,)j(then)d(a)i(colon)f(\(`)p Fs(:)p -Ft('\))h(is)e(placed)h(in)g Fq(name)k Ft(and)33 b Fs(OPTARG)f -Ft(is)i(set)g(to)630 2162 y(the)d(option)f(c)m(haracter)i(found.)150 -2326 y Fs(hash)870 2463 y(hash)47 b([-r])f([-p)h Fi(filename)11 -b Fs(])45 b([-dt])h([)p Fi(name)11 b Fs(])630 2600 y -Ft(Eac)m(h)32 b(time)g Fs(hash)e Ft(is)h(in)m(v)m(ok)m(ed,)j(it)d +Ft(getopts)f Fu(is)i(not)h(silen)m(t,)h(a)e(question)g(mark)630 +1943 y(\(`)p Ft(?)p Fu('\))h(is)g(placed)g(in)f Fr(name)p +Fu(,)h Ft(OPTARG)e Fu(is)h(unset,)h(and)f(a)g(diagnostic)i(message)g +(is)e(prin)m(ted.)39 b(If)630 2052 y Ft(getopts)28 b +Fu(is)h(silen)m(t,)i(then)e(a)h(colon)h(\(`)p Ft(:)p +Fu('\))f(is)g(placed)g(in)f Fr(name)35 b Fu(and)29 b +Ft(OPTARG)f Fu(is)h(set)h(to)h(the)630 2162 y(option)g(c)m(haracter)h +(found.)150 2326 y Ft(hash)870 2463 y(hash)47 b([-r])f([-p)h +Fj(filename)p Ft(])e([-dt])i([)p Fj(name)p Ft(])630 2600 +y Fu(Eac)m(h)32 b(time)g Ft(hash)e Fu(is)h(in)m(v)m(ok)m(ed,)j(it)d (remem)m(b)s(ers)g(the)g(full)g(pathnames)g(of)h(the)f(commands)630 -2710 y(sp)s(eci\014ed)i(as)i Fq(name)k Ft(argumen)m(ts,)c(so)g(they)f +2710 y(sp)s(eci\014ed)i(as)i Fr(name)k Fu(argumen)m(ts,)c(so)g(they)f (need)g(not)g(b)s(e)f(searc)m(hed)i(for)f(on)g(subsequen)m(t)630 2819 y(in)m(v)m(o)s(cations.)79 b(The)41 b(commands)h(are)h(found)e(b)m (y)h(searc)m(hing)i(through)d(the)i(directories)630 2929 -y(listed)33 b(in)g Fs($PATH)p Ft(.)47 b(An)m(y)33 b(previously-remem)m -(b)s(ered)f(pathname)h(is)g(discarded.)48 b(The)32 b(`)p -Fs(-p)p Ft(')630 3039 y(option)i(inhibits)e(the)i(path)f(searc)m(h,)i -(and)e Fq(\014lename)38 b Ft(is)c(used)e(as)i(the)f(lo)s(cation)i(of)f -Fq(name)5 b Ft(.)630 3148 y(The)35 b(`)p Fs(-r)p Ft(')g(option)g -(causes)h(the)g(shell)f(to)h(forget)g(all)g(remem)m(b)s(ered)f(lo)s -(cations.)56 b(The)35 b(`)p Fs(-d)p Ft(')630 3258 y(option)c(causes)f -(the)g(shell)h(to)f(forget)i(the)e(remem)m(b)s(ered)f(lo)s(cation)j(of) -e(eac)m(h)h Fq(name)5 b Ft(.)41 b(If)30 b(the)630 3367 -y(`)p Fs(-t)p Ft(')35 b(option)h(is)g(supplied,)f(the)h(full)f -(pathname)g(to)i(whic)m(h)e(eac)m(h)h Fq(name)41 b Ft(corresp)s(onds)34 -b(is)630 3477 y(prin)m(ted.)39 b(If)26 b(m)m(ultiple)h -Fq(name)32 b Ft(argumen)m(ts)27 b(are)g(supplied)e(with)h(`)p -Fs(-t)p Ft(')g(the)h Fq(name)32 b Ft(is)26 b(prin)m(ted)630 -3587 y(b)s(efore)f(the)h(hashed)e(full)h(pathname.)39 -b(The)25 b(`)p Fs(-l)p Ft(')h(option)f(causes)h(output)f(to)i(b)s(e)d -(displa)m(y)m(ed)630 3696 y(in)31 b(a)g(format)h(that)f(ma)m(y)h(b)s(e) -f(reused)f(as)h(input.)42 b(If)31 b(no)g(argumen)m(ts)h(are)f(giv)m -(en,)i(or)e(if)g(only)630 3806 y(`)p Fs(-l)p Ft(')44 -b(is)f(supplied,)j(information)e(ab)s(out)g(remem)m(b)s(ered)f -(commands)g(is)h(prin)m(ted.)80 b(The)630 3915 y(return)25 -b(status)h(is)f(zero)i(unless)e(a)h Fq(name)31 b Ft(is)26 -b(not)g(found)e(or)i(an)g(in)m(v)-5 b(alid)26 b(option)g(is)g -(supplied.)150 4080 y Fs(pwd)870 4217 y(pwd)47 b([-LP])630 -4354 y Ft(Prin)m(t)24 b(the)h(absolute)g(pathname)g(of)f(the)h(curren)m -(t)f(w)m(orking)h(directory)-8 b(.)40 b(If)23 b(the)i(`)p -Fs(-P)p Ft(')f(option)630 4463 y(is)36 b(supplied,)f(the)h(pathname)f -(prin)m(ted)g(will)h(not)g(con)m(tain)h(sym)m(b)s(olic)f(links.)55 -b(If)35 b(the)h(`)p Fs(-L)p Ft(')630 4573 y(option)44 -b(is)g(supplied,)i(the)e(pathname)f(prin)m(ted)h(ma)m(y)g(con)m(tain)h -(sym)m(b)s(olic)f(links.)80 b(The)630 4682 y(return)26 -b(status)h(is)h(zero)g(unless)e(an)h(error)g(is)g(encoun)m(tered)g -(while)h(determining)f(the)g(name)630 4792 y(of)k(the)f(curren)m(t)g -(directory)h(or)f(an)h(in)m(v)-5 b(alid)31 b(option)g(is)f(supplied.) -150 4956 y Fs(readonly)870 5093 y(readonly)46 b([-aAf])g([-p])g([)p -Fi(name)11 b Fs([=)p Fi(value)g Fs(]])43 b(...)630 5230 -y Ft(Mark)24 b(eac)m(h)h Fq(name)k Ft(as)24 b(readonly)-8 -b(.)39 b(The)24 b(v)-5 b(alues)24 b(of)g(these)g(names)g(ma)m(y)g(not)g -(b)s(e)g(c)m(hanged)g(b)m(y)630 5340 y(subsequen)m(t)e(assignmen)m(t.) -39 b(If)22 b(the)h(`)p Fs(-f)p Ft(')f(option)i(is)e(supplied,)h(eac)m -(h)h Fq(name)k Ft(refers)22 b(to)i(a)f(shell)p eop end +y(listed)37 b(in)g Ft($PATH)p Fu(.)58 b(An)m(y)37 b(previously-remem)m +(b)s(ered)f(pathname)h(is)g(discarded.)59 b(The)37 b +Ft(-p)630 3039 y Fu(option)d(inhibits)f(the)h(path)g(searc)m(h,)h(and)e +Fr(\014lename)39 b Fu(is)34 b(used)f(as)h(the)f(lo)s(cation)j(of)e +Fr(name)p Fu(.)630 3148 y(The)42 b Ft(-r)g Fu(option)h(causes)f(the)h +(shell)g(to)g(forget)g(all)h(remem)m(b)s(ered)d(lo)s(cations.)79 +b(The)42 b Ft(-d)630 3258 y Fu(option)31 b(causes)g(the)f(shell)h(to)g +(forget)h(the)f(remem)m(b)s(ered)e(lo)s(cation)j(of)f(eac)m(h)h +Fr(name)p Fu(.)41 b(If)30 b(the)630 3367 y Ft(-t)39 b +Fu(option)h(is)g(supplied,)g(the)g(full)f(pathname)h(to)g(whic)m(h)f +(eac)m(h)i Fr(name)k Fu(corresp)s(onds)38 b(is)630 3477 +y(prin)m(ted.)k(If)30 b(m)m(ultiple)i Fr(name)k Fu(argumen)m(ts)31 +b(are)g(supplied)f(with)g Ft(-t)g Fu(the)h Fr(name)36 +b Fu(is)31 b(prin)m(ted)630 3587 y(b)s(efore)e(the)i(hashed)e(full)g +(pathname.)41 b(The)29 b Ft(-l)g Fu(option)i(causes)f(output)f(to)i(b)s +(e)e(displa)m(y)m(ed)630 3696 y(in)23 b(a)h(format)g(that)g(ma)m(y)g(b) +s(e)f(reused)f(as)i(input.)37 b(If)23 b(no)h(argumen)m(ts)f(are)h(giv)m +(en,)i(or)e(if)f(only)h Ft(-l)630 3806 y Fu(is)35 b(supplied,)f +(information)h(ab)s(out)g(remem)m(b)s(ered)f(commands)g(is)h(prin)m +(ted.)53 b(The)34 b(return)630 3915 y(status)d(is)f(zero)h(unless)f(a)h +Fr(name)k Fu(is)c(not)f(found)f(or)i(an)f(in)m(v)-5 b(alid)31 +b(option)g(is)f(supplied.)150 4080 y Ft(pwd)870 4217 +y(pwd)47 b([-LP])630 4354 y Fu(Prin)m(t)29 b(the)g(absolute)h(pathname) +e(of)h(the)h(curren)m(t)e(w)m(orking)h(directory)-8 b(.)42 +b(If)28 b(the)h Ft(-P)f Fu(option)630 4463 y(is)39 b(supplied,)h(the)f +(pathname)g(prin)m(ted)g(will)g(not)h(con)m(tain)g(sym)m(b)s(olic)f +(links.)67 b(If)38 b(the)i Ft(-L)630 4573 y Fu(option)k(is)g(supplied,) +i(the)e(pathname)f(prin)m(ted)h(ma)m(y)g(con)m(tain)h(sym)m(b)s(olic)f +(links.)80 b(The)630 4682 y(return)26 b(status)h(is)h(zero)g(unless)e +(an)h(error)g(is)g(encoun)m(tered)g(while)h(determining)f(the)g(name) +630 4792 y(of)k(the)f(curren)m(t)g(directory)h(or)f(an)h(in)m(v)-5 +b(alid)31 b(option)g(is)f(supplied.)150 4956 y Ft(readonly)870 +5093 y(readonly)46 b([-aAf])g([-p])g([)p Fj(name)p Ft([=)p +Fj(value)p Ft(]])e(...)630 5230 y Fu(Mark)33 b(eac)m(h)h +Fr(name)39 b Fu(as)33 b(readonly)-8 b(.)49 b(The)32 b(v)-5 +b(alues)34 b(of)f(these)g(names)g(ma)m(y)h(not)f(b)s(e)f(c)m(hanged)630 +5340 y(b)m(y)38 b(subsequen)m(t)g(assignmen)m(t.)65 b(If)38 +b(the)h Ft(-f)f Fu(option)g(is)h(supplied,)g(eac)m(h)h +Fr(name)j Fu(refers)38 b(to)p eop end %%Page: 45 51 -TeXDict begin 45 50 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(45)630 299 y(function.)39 -b(The)26 b(`)p Fs(-a)p Ft(')h(option)g(means)g(eac)m(h)h -Fq(name)k Ft(refers)26 b(to)i(an)e(indexed)h(arra)m(y)g(v)-5 -b(ariable;)630 408 y(the)26 b(`)p Fs(-A)p Ft(')g(option)h(means)f(eac)m -(h)h Fq(name)32 b Ft(refers)25 b(to)i(an)f(asso)s(ciativ)m(e)j(arra)m -(y)e(v)-5 b(ariable.)40 b(If)26 b(b)s(oth)630 518 y(options)h(are)g -(supplied,)f(`)p Fs(-A)p Ft(')g(tak)m(es)i(precedence.)40 -b(If)26 b(no)h Fq(name)32 b Ft(argumen)m(ts)26 b(are)h(giv)m(en,)i(or) -630 628 y(if)h(the)h(`)p Fs(-p)p Ft(')f(option)h(is)g(supplied,)e(a)i -(list)g(of)g(all)g(readonly)f(names)h(is)f(prin)m(ted.)41 -b(The)30 b(other)630 737 y(options)36 b(ma)m(y)g(b)s(e)g(used)f(to)h -(restrict)h(the)f(output)f(to)h(a)h(subset)e(of)h(the)g(set)g(of)g -(readonly)630 847 y(names.)63 b(The)37 b(`)p Fs(-p)p -Ft(')h(option)g(causes)g(output)f(to)i(b)s(e)e(displa)m(y)m(ed)h(in)g -(a)g(format)g(that)g(ma)m(y)630 956 y(b)s(e)32 b(reused)h(as)g(input.) -48 b(If)33 b(a)g(v)-5 b(ariable)34 b(name)f(is)h(follo)m(w)m(ed)g(b)m -(y)f(=)p Fq(v)-5 b(alue)5 b Ft(,)35 b(the)e(v)-5 b(alue)33 -b(of)h(the)630 1066 y(v)-5 b(ariable)38 b(is)f(set)h(to)g -Fq(v)-5 b(alue)5 b Ft(.)62 b(The)37 b(return)f(status)h(is)h(zero)g -(unless)e(an)h(in)m(v)-5 b(alid)38 b(option)g(is)630 -1176 y(supplied,)f(one)g(of)g(the)g Fq(name)42 b Ft(argumen)m(ts)37 -b(is)g(not)g(a)g(v)-5 b(alid)37 b(shell)g(v)-5 b(ariable)38 -b(or)e(function)630 1285 y(name,)31 b(or)f(the)h(`)p -Fs(-f)p Ft(')f(option)h(is)f(supplied)f(with)h(a)h(name)f(that)h(is)g -(not)f(a)h(shell)g(function.)150 1450 y Fs(return)870 -1587 y(return)46 b([)p Fi(n)11 b Fs(])630 1724 y Ft(Cause)37 -b(a)g(shell)h(function)f(to)g(stop)h(executing)g(and)e(return)h(the)g -(v)-5 b(alue)37 b Fq(n)g Ft(to)h(its)f(caller.)630 1833 -y(If)h Fq(n)h Ft(is)g(not)g(supplied,)h(the)f(return)e(v)-5 -b(alue)40 b(is)f(the)g(exit)g(status)g(of)g(the)g(last)h(command)630 -1943 y(executed)35 b(in)f(the)h(function.)53 b Fs(return)33 -b Ft(ma)m(y)i(also)g(b)s(e)f(used)f(to)j(terminate)f(execution)h(of)630 +TeXDict begin 45 50 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(45)630 299 y(a)37 +b(shell)g(function.)59 b(The)36 b Ft(-a)g Fu(option)h(means)f(eac)m(h)i +Fr(name)k Fu(refers)36 b(to)h(an)f(indexed)g(arra)m(y)630 +408 y(v)-5 b(ariable;)28 b(the)f Ft(-A)e Fu(option)h(means)g(eac)m(h)h +Fr(name)k Fu(refers)26 b(to)g(an)g(asso)s(ciativ)m(e)i(arra)m(y)f(v)-5 +b(ariable.)630 518 y(If)35 b(b)s(oth)g(options)h(are)h(supplied,)f +Ft(-A)f Fu(tak)m(es)i(precedence.)58 b(If)35 b(no)h Fr(name)k +Fu(argumen)m(ts)d(are)630 628 y(giv)m(en,)k(or)c(if)h(the)g +Ft(-p)f Fu(option)h(is)f(supplied,)i(a)f(list)g(of)g(all)g(readonly)g +(names)f(is)h(prin)m(ted.)630 737 y(The)32 b(other)g(options)g(ma)m(y)h +(b)s(e)f(used)f(to)i(restrict)g(the)f(output)g(to)h(a)f(subset)g(of)g +(the)g(set)h(of)630 847 y(readonly)c(names.)41 b(The)28 +b Ft(-p)h Fu(option)h(causes)g(output)e(to)j(b)s(e)d(displa)m(y)m(ed)i +(in)f(a)h(format)f(that)630 956 y(ma)m(y)j(b)s(e)e(reused)g(as)i +(input.)42 b(If)30 b(a)i(v)-5 b(ariable)31 b(name)h(is)f(follo)m(w)m +(ed)h(b)m(y)f(=)p Fr(v)-5 b(alue)p Fu(,)32 b(the)f(v)-5 +b(alue)32 b(of)630 1066 y(the)i(v)-5 b(ariable)34 b(is)f(set)i(to)f +Fr(v)-5 b(alue)p Fu(.)50 b(The)33 b(return)g(status)g(is)h(zero)g +(unless)f(an)g(in)m(v)-5 b(alid)34 b(option)630 1176 +y(is)c(supplied,)f(one)h(of)g(the)g Fr(name)35 b Fu(argumen)m(ts)30 +b(is)g(not)g(a)g(v)-5 b(alid)31 b(shell)f(v)-5 b(ariable)30 +b(or)g(function)630 1285 y(name,)h(or)f(the)h Ft(-f)e +Fu(option)i(is)g(supplied)e(with)h(a)h(name)f(that)h(is)f(not)h(a)g +(shell)f(function.)150 1450 y Ft(return)870 1587 y(return)46 +b([)p Fj(n)p Ft(])630 1724 y Fu(Cause)37 b(a)g(shell)h(function)f(to)g +(stop)h(executing)g(and)e(return)h(the)g(v)-5 b(alue)37 +b Fr(n)g Fu(to)h(its)f(caller.)630 1833 y(If)h Fr(n)h +Fu(is)g(not)g(supplied,)h(the)f(return)e(v)-5 b(alue)40 +b(is)f(the)g(exit)g(status)g(of)g(the)g(last)h(command)630 +1943 y(executed)35 b(in)f(the)h(function.)53 b Ft(return)33 +b Fu(ma)m(y)i(also)g(b)s(e)f(used)f(to)j(terminate)f(execution)h(of)630 2052 y(a)e(script)g(b)s(eing)g(executed)g(with)g(the)g -Fs(.)g Ft(\()p Fs(source)p Ft(\))f(builtin,)h(returning)f(either)i -Fq(n)e Ft(or)h(the)630 2162 y(exit)j(status)f(of)g(the)g(last)h +Ft(.)g Fu(\()p Ft(source)p Fu(\))f(builtin,)h(returning)f(either)i +Fr(n)e Fu(or)h(the)630 2162 y(exit)j(status)f(of)g(the)g(last)h (command)e(executed)i(within)e(the)h(script)g(as)g(the)g(exit)h(status) -630 2271 y(of)i(the)g(script.)65 b(If)38 b Fq(n)g Ft(is)h(supplied,)h +630 2271 y(of)i(the)g(script.)65 b(If)38 b Fr(n)g Fu(is)h(supplied,)h (the)f(return)e(v)-5 b(alue)39 b(is)g(its)g(least)h(signi\014can)m(t)g (8)f(bits.)630 2381 y(An)m(y)g(command)f(asso)s(ciated)j(with)d(the)h -Fs(RETURN)e Ft(trap)i(is)g(executed)g(b)s(efore)g(execution)630 +Ft(RETURN)e Fu(trap)i(is)g(executed)g(b)s(efore)g(execution)630 2491 y(resumes)29 b(after)h(the)g(function)g(or)g(script.)40 -b(The)29 b(return)g(status)h(is)g(non-zero)g(if)g Fs(return)e -Ft(is)630 2600 y(supplied)h(a)i(non-n)m(umeric)g(argumen)m(t)g(or)f(is) +b(The)29 b(return)g(status)h(is)g(non-zero)g(if)g Ft(return)e +Fu(is)630 2600 y(supplied)h(a)i(non-n)m(umeric)g(argumen)m(t)g(or)f(is) h(used)f(outside)h(a)g(function)f(and)g(not)h(during)630 -2710 y(the)g(execution)g(of)g(a)f(script)h(b)m(y)f Fs(.)g -Ft(or)g Fs(source)p Ft(.)150 2874 y Fs(shift)870 3011 -y(shift)46 b([)p Fi(n)11 b Fs(])630 3148 y Ft(Shift)41 -b(the)g(p)s(ositional)h(parameters)g(to)g(the)f(left)h(b)m(y)g -Fq(n)p Ft(.)73 b(The)40 b(p)s(ositional)j(parameters)630 -3258 y(from)34 b Fq(n)p Fs(+)p Ft(1)39 b(.)22 b(.)h(.)45 -b Fs($#)34 b Ft(are)g(renamed)g(to)h Fs($1)k Ft(.)22 -b(.)g(.)46 b Fs($#)p Ft(-)p Fq(n)p Ft(.)51 b(P)m(arameters)36 -b(represen)m(ted)e(b)m(y)g(the)630 3367 y(n)m(um)m(b)s(ers)25 -b Fs($#)i Ft(to)g Fs($#)p Ft(-)p Fq(n)p Fs(+)p Ft(1)g(are)g(unset.)39 -b Fq(n)26 b Ft(m)m(ust)h(b)s(e)f(a)i(non-negativ)m(e)h(n)m(um)m(b)s(er) -c(less)i(than)g(or)630 3477 y(equal)33 b(to)h Fs($#)p -Ft(.)47 b(If)33 b Fq(n)f Ft(is)h(zero)g(or)g(greater)h(than)f -Fs($#)p Ft(,)g(the)g(p)s(ositional)g(parameters)g(are)h(not)630 -3587 y(c)m(hanged.)48 b(If)32 b Fq(n)g Ft(is)h(not)f(supplied,)h(it)g +2710 y(the)g(execution)g(of)g(a)f(script)h(b)m(y)f Ft(.)g +Fu(or)g Ft(source)p Fu(.)150 2874 y Ft(shift)870 3011 +y(shift)46 b([)p Fj(n)p Ft(])630 3148 y Fu(Shift)41 b(the)g(p)s +(ositional)h(parameters)g(to)g(the)f(left)h(b)m(y)g Fr(n)p +Fu(.)73 b(The)40 b(p)s(ositional)j(parameters)630 3258 +y(from)34 b Fr(n)p Ft(+)p Fu(1)39 b(.)22 b(.)h(.)45 b +Ft($#)34 b Fu(are)g(renamed)g(to)h Ft($1)k Fu(.)22 b(.)g(.)46 +b Ft($#)p Fu(-)p Fr(n)p Fu(.)51 b(P)m(arameters)36 b(represen)m(ted)e +(b)m(y)g(the)630 3367 y(n)m(um)m(b)s(ers)25 b Ft($#)i +Fu(to)g Ft($#)p Fu(-)p Fr(n)p Ft(+)p Fu(1)g(are)g(unset.)39 +b Fr(n)26 b Fu(m)m(ust)h(b)s(e)f(a)i(non-negativ)m(e)h(n)m(um)m(b)s(er) +c(less)i(than)g(or)630 3477 y(equal)33 b(to)h Ft($#)p +Fu(.)47 b(If)33 b Fr(n)f Fu(is)h(zero)g(or)g(greater)h(than)f +Ft($#)p Fu(,)g(the)g(p)s(ositional)g(parameters)g(are)h(not)630 +3587 y(c)m(hanged.)48 b(If)32 b Fr(n)g Fu(is)h(not)f(supplied,)h(it)g (is)f(assumed)g(to)h(b)s(e)f(1.)48 b(The)32 b(return)g(status)h(is)f -(zero)630 3696 y(unless)e Fq(n)f Ft(is)i(greater)g(than)g -Fs($#)e Ft(or)i(less)f(than)h(zero,)g(non-zero)g(otherwise.)150 -3861 y Fs(test)150 3970 y([)870 4107 y(test)47 b Fi(expr)630 -4244 y Ft(Ev)-5 b(aluate)40 b(a)f(conditional)h(express)f(ion)g -Fq(expr)45 b Ft(and)38 b(return)g(a)h(status)g(of)g(0)g(\(true\))h(or)f +(zero)630 3696 y(unless)e Fr(n)f Fu(is)i(greater)g(than)g +Ft($#)e Fu(or)i(less)f(than)h(zero,)g(non-zero)g(otherwise.)150 +3861 y Ft(test)150 3970 y([)870 4107 y(test)47 b Fj(expr)630 +4244 y Fu(Ev)-5 b(aluate)40 b(a)f(conditional)h(express)f(ion)g +Fr(expr)45 b Fu(and)38 b(return)g(a)h(status)g(of)g(0)g(\(true\))h(or)f (1)630 4354 y(\(false\).)j(Eac)m(h)31 b(op)s(erator)f(and)f(op)s(erand) g(m)m(ust)h(b)s(e)f(a)i(separate)g(argumen)m(t.)41 b(Expressions)630 4463 y(are)26 b(comp)s(osed)f(of)g(the)h(primaries)f(describ)s(ed)f(b)s (elo)m(w)h(in)g(Section)h(6.4)h([Bash)e(Conditional)630 -4573 y(Expressions],)39 b(page)g(85.)64 b Fs(test)37 -b Ft(do)s(es)g(not)h(accept)i(an)m(y)e(options,)i(nor)e(do)s(es)f(it)h -(accept)630 4682 y(and)30 b(ignore)h(an)f(argumen)m(t)h(of)f(`)p -Fs(--)p Ft(')h(as)f(signifying)h(the)f(end)g(of)h(options.)630 -4819 y(When)f(the)h Fs([)f Ft(form)g(is)g(used,)g(the)g(last)i(argumen) -m(t)e(to)i(the)e(command)g(m)m(ust)h(b)s(e)e(a)i Fs(])p -Ft(.)630 4956 y(Expressions)23 b(ma)m(y)h(b)s(e)e(com)m(bined)i(using)f +4573 y(Expressions],)39 b(page)g(85.)64 b Ft(test)37 +b Fu(do)s(es)g(not)h(accept)i(an)m(y)e(options,)i(nor)e(do)s(es)f(it)h +(accept)630 4682 y(and)30 b(ignore)h(an)f(argumen)m(t)h(of)f +Ft(--)g Fu(as)h(signifying)f(the)h(end)f(of)g(options.)630 +4819 y(When)g(the)h Ft([)f Fu(form)g(is)g(used,)g(the)g(last)i(argumen) +m(t)e(to)i(the)e(command)g(m)m(ust)h(b)s(e)e(a)i Ft(])p +Fu(.)630 4956 y(Expressions)23 b(ma)m(y)h(b)s(e)e(com)m(bined)i(using)f (the)h(follo)m(wing)h(op)s(erators,)g(listed)f(in)f(decreasing)630 5066 y(order)30 b(of)h(precedence.)43 b(The)30 b(ev)-5 b(aluation)33 b(dep)s(ends)28 b(on)j(the)g(n)m(um)m(b)s(er)f(of)h (argumen)m(ts;)g(see)630 5176 y(b)s(elo)m(w.)41 b(Op)s(erator)30 b(precedence)h(is)f(used)g(when)f(there)i(are)f(\014v)m(e)h(or)f(more)h -(argumen)m(ts.)630 5340 y Fs(!)f Fi(expr)210 b Ft(T)-8 -b(rue)30 b(if)g Fq(expr)37 b Ft(is)30 b(false.)p eop +(argumen)m(ts.)630 5340 y Ft(!)f Fj(expr)210 b Fu(T)-8 +b(rue)30 b(if)g Fr(expr)37 b Fu(is)30 b(false.)p eop end %%Page: 46 52 -TeXDict begin 46 51 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(46)630 299 y Fs(\()30 -b Fi(expr)40 b Fs(\))122 b Ft(Returns)23 b(the)h(v)-5 -b(alue)24 b(of)g Fq(expr)7 b Ft(.)37 b(This)23 b(ma)m(y)i(b)s(e)e(used) -g(to)h(o)m(v)m(erride)h(the)f(normal)1110 408 y(precedence)31 -b(of)f(op)s(erators.)630 568 y Fi(expr1)39 b Fs(-a)30 -b Fi(expr2)1110 677 y Ft(T)-8 b(rue)30 b(if)g(b)s(oth)g -Fq(expr1)37 b Ft(and)30 b Fq(expr2)38 b Ft(are)30 b(true.)630 -837 y Fi(expr1)39 b Fs(-o)30 b Fi(expr2)1110 946 y Ft(T)-8 -b(rue)30 b(if)g(either)h Fq(expr1)38 b Ft(or)30 b Fq(expr2)37 -b Ft(is)31 b(true.)630 1106 y(The)37 b Fs(test)f Ft(and)g -Fs([)h Ft(builtins)g(ev)-5 b(aluate)39 b(conditional)f(expressions)f +TeXDict begin 46 51 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(46)630 299 y Ft(\()30 +b Fj(expr)f Ft(\))133 b Fu(Returns)23 b(the)i(v)-5 b(alue)25 +b(of)f Fr(expr)p Fu(.)38 b(This)24 b(ma)m(y)h(b)s(e)e(used)h(to)h(o)m +(v)m(erride)g(the)g(normal)1110 408 y(precedence)31 b(of)f(op)s +(erators.)630 568 y Fj(expr1)f Ft(-a)h Fj(expr2)1110 +677 y Fu(T)-8 b(rue)30 b(if)g(b)s(oth)g Fr(expr1)37 b +Fu(and)30 b Fr(expr2)38 b Fu(are)30 b(true.)630 837 y +Fj(expr1)f Ft(-o)h Fj(expr2)1110 946 y Fu(T)-8 b(rue)30 +b(if)g(either)h Fr(expr1)38 b Fu(or)30 b Fr(expr2)37 +b Fu(is)31 b(true.)630 1106 y(The)37 b Ft(test)f Fu(and)g +Ft([)h Fu(builtins)g(ev)-5 b(aluate)39 b(conditional)f(expressions)f (using)g(a)g(set)h(of)f(rules)630 1215 y(based)30 b(on)g(the)h(n)m(um)m (b)s(er)e(of)h(argumen)m(ts.)630 1375 y(0)h(argumen)m(ts)1110 1484 y(The)f(expression)g(is)g(false.)630 1644 y(1)h(argumen)m(t)1110 1753 y(The)f(expression)g(is)g(true)h(if)f(and)g(only)g(if)h(the)f (argumen)m(t)h(is)f(not)h(n)m(ull.)630 1913 y(2)g(argumen)m(ts)1110 -2022 y(If)f(the)h(\014rst)f(argumen)m(t)h(is)g(`)p Fs(!)p -Ft(',)g(the)g(expression)g(is)g(true)f(if)h(and)f(only)h(if)g(the)1110 +2022 y(If)f(the)h(\014rst)f(argumen)m(t)h(is)g(`)p Ft(!)p +Fu(',)g(the)g(expression)g(is)g(true)f(if)h(and)f(only)h(if)g(the)1110 2132 y(second)j(argumen)m(t)f(is)h(n)m(ull.)50 b(If)33 b(the)h(\014rst)e(argumen)m(t)i(is)g(one)g(of)f(the)h(unary)1110 2242 y(conditional)42 b(op)s(erators)f(\(see)g(Section)h(6.4)f([Bash)g @@ -10833,19 +11373,19 @@ b(follo)m(wing)i(conditions)f(are)g(applied)f(in)g(the)g(order)g (85\),)k(the)43 b(result)1110 3168 y(of)h(the)h(expression)f(is)g(the)g (result)g(of)h(the)f(binary)g(test)h(using)e(the)i(\014rst)1110 3278 y(and)31 b(third)g(argumen)m(ts)i(as)f(op)s(erands.)44 -b(The)31 b(`)p Fs(-a)p Ft(')h(and)g(`)p Fs(-o)p Ft(')f(op)s(erators)i +b(The)31 b(`)p Ft(-a)p Fu(')h(and)g(`)p Ft(-o)p Fu(')f(op)s(erators)i (are)1110 3387 y(considered)25 b(binary)g(op)s(erators)g(when)f(there)i (are)f(three)h(argumen)m(ts.)39 b(If)25 b(the)1110 3497 -y(\014rst)j(argumen)m(t)h(is)g(`)p Fs(!)p Ft(',)h(the)f(v)-5 +y(\014rst)j(argumen)m(t)h(is)g(`)p Ft(!)p Fu(',)h(the)f(v)-5 b(alue)29 b(is)g(the)g(negation)i(of)e(the)g(t)m(w)m(o-argumen)m(t)1110 3606 y(test)38 b(using)f(the)g(second)g(and)g(third)f(argumen)m(ts.)61 b(If)37 b(the)g(\014rst)f(argumen)m(t)1110 3716 y(is)j(exactly)i(`)p -Fs(\()p Ft(')f(and)f(the)g(third)g(argumen)m(t)h(is)f(exactly)i(`)p -Fs(\))p Ft(',)h(the)e(result)f(is)1110 3826 y(the)46 +Ft(\()p Fu(')f(and)f(the)g(third)g(argumen)m(t)h(is)f(exactly)i(`)p +Ft(\))p Fu(',)h(the)e(result)f(is)1110 3826 y(the)46 b(one-argumen)m(t)g(test)h(of)f(the)f(second)h(argumen)m(t.)86 b(Otherwise,)50 b(the)1110 3935 y(expression)30 b(is)h(false.)630 4095 y(4)g(argumen)m(ts)1110 4204 y(If)h(the)i(\014rst)e(argumen)m(t)h -(is)g(`)p Fs(!)p Ft(',)h(the)f(result)g(is)g(the)g(negation)h(of)f(the) +(is)g(`)p Ft(!)p Fu(',)h(the)f(result)g(is)g(the)g(negation)h(of)f(the) g(three-)1110 4314 y(argumen)m(t)h(expression)f(comp)s(osed)h(of)f(the) h(remaining)g(argumen)m(ts.)50 b(Oth-)1110 4423 y(erwise,)34 b(the)f(expression)g(is)g(parsed)g(and)f(ev)-5 b(aluated)34 @@ -10854,1675 +11394,1653 @@ b(according)h(to)e(prece-)1110 4533 y(dence)e(using)e(the)i(rules)f 4802 y(The)43 b(expression)f(is)i(parsed)e(and)g(ev)-5 b(aluated)45 b(according)f(to)f(precedence)1110 4912 y(using)30 b(the)g(rules)g(listed)h(ab)s(o)m(v)m(e.)630 -5071 y(When)40 b(used)f(with)g Fs(test)g Ft(or)h(`)p -Fs([)p Ft(',)j(the)d(`)p Fs(<)p Ft(')g(and)f(`)p Fs(>)p -Ft(')h(op)s(erators)g(sort)g(lexicographically)630 5181 -y(using)30 b(ASCI)s(I)f(ordering.)150 5340 y Fs(times)p +5071 y(When)40 b(used)f(with)g Ft(test)g Fu(or)h(`)p +Ft([)p Fu(',)j(the)d(`)p Ft(<)p Fu(')g(and)f(`)p Ft(>)p +Fu(')h(op)s(erators)g(sort)g(lexicographically)630 5181 +y(using)30 b(ASCI)s(I)f(ordering.)150 5340 y Ft(times)p eop end %%Page: 47 53 -TeXDict begin 47 52 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(47)870 299 y Fs(times)630 -434 y Ft(Prin)m(t)37 b(out)h(the)g(user)e(and)h(system)g(times)h(used)f +TeXDict begin 47 52 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(47)870 299 y Ft(times)630 +434 y Fu(Prin)m(t)37 b(out)h(the)g(user)e(and)h(system)g(times)h(used)f (b)m(y)g(the)h(shell)f(and)g(its)h(c)m(hildren.)61 b(The)630 -543 y(return)29 b(status)i(is)f(zero.)150 704 y Fs(trap)870 -838 y(trap)47 b([-lp])f([)p Fi(arg)11 b Fs(])46 b([)p -Fi(sigspec)56 b Fs(...)o(])630 973 y Ft(The)43 b(commands)f(in)h -Fq(arg)51 b Ft(are)44 b(to)g(b)s(e)e(read)h(and)g(executed)h(when)e -(the)h(shell)g(receiv)m(es)630 1083 y(signal)36 b Fq(sigsp)s(ec)6 -b Ft(.)55 b(If)35 b Fq(arg)44 b Ft(is)35 b(absen)m(t)h(\(and)f(there)g -(is)g(a)h(single)g Fq(sigsp)s(ec)6 b Ft(\))35 b(or)h(equal)f(to)i(`)p -Fs(-)p Ft(',)630 1192 y(eac)m(h)28 b(sp)s(eci\014ed)e(signal's)h(disp)s -(osition)f(is)h(reset)g(to)g(the)g(v)-5 b(alue)27 b(it)g(had)f(when)f -(the)i(shell)g(w)m(as)630 1302 y(started.)63 b(If)37 -b Fq(arg)46 b Ft(is)37 b(the)h(n)m(ull)g(string,)h(then)e(the)h(signal) -h(sp)s(eci\014ed)d(b)m(y)i(eac)m(h)h Fq(sigsp)s(ec)k -Ft(is)630 1412 y(ignored)36 b(b)m(y)g(the)g(shell)g(and)g(commands)f -(it)i(in)m(v)m(ok)m(es.)59 b(If)35 b Fq(arg)45 b Ft(is)36 -b(not)g(presen)m(t)g(and)f(`)p Fs(-p)p Ft(')630 1521 -y(has)e(b)s(een)g(supplied,)f(the)i(shell)f(displa)m(ys)h(the)f(trap)g -(commands)g(asso)s(ciated)i(with)e(eac)m(h)630 1631 y -Fq(sigsp)s(ec)6 b Ft(.)40 b(If)28 b(no)g(argumen)m(ts)h(are)g -(supplied,)f(or)g(only)h(`)p Fs(-p)p Ft(')f(is)g(giv)m(en,)i -Fs(trap)e Ft(prin)m(ts)g(the)g(list)630 1740 y(of)g(commands)f(asso)s -(ciated)i(with)f(eac)m(h)h(signal)f(n)m(um)m(b)s(er)e(in)i(a)g(form)f -(that)h(ma)m(y)h(b)s(e)e(reused)630 1850 y(as)34 b(shell)g(input.)51 -b(The)33 b(`)p Fs(-l)p Ft(')h(option)g(causes)h(the)f(shell)g(to)h -(prin)m(t)e(a)i(list)f(of)g(signal)h(names)630 1960 y(and)j(their)h -(corresp)s(onding)f(n)m(um)m(b)s(ers.)65 b(Eac)m(h)39 -b Fq(sigsp)s(ec)45 b Ft(is)39 b(either)g(a)g(signal)h(name)f(or)g(a)630 -2069 y(signal)27 b(n)m(um)m(b)s(er.)39 b(Signal)27 b(names)f(are)h -(case)h(insensitiv)m(e)g(and)e(the)g Fs(SIG)g Ft(pre\014x)g(is)h -(optional.)630 2204 y(If)35 b(a)g Fq(sigsp)s(ec)41 b -Ft(is)35 b Fs(0)g Ft(or)g Fs(EXIT)p Ft(,)g Fq(arg)43 -b Ft(is)35 b(executed)h(when)e(the)h(shell)h(exits.)55 -b(If)35 b(a)g Fq(sigsp)s(ec)41 b Ft(is)630 2314 y Fs(DEBUG)p -Ft(,)32 b(the)g(command)g Fq(arg)40 b Ft(is)33 b(executed)g(b)s(efore)f -(ev)m(ery)h(simple)f(command,)h Fs(for)e Ft(com-)630 -2423 y(mand,)d Fs(case)g Ft(command,)h Fs(select)e Ft(command,)i(ev)m -(ery)h(arithmetic)g Fs(for)d Ft(command,)j(and)630 2533 +543 y(return)29 b(status)i(is)f(zero.)150 704 y Ft(trap)870 +838 y(trap)47 b([-lp])f([)p Fj(arg)p Ft(])g([)p Fj(sigspec)g +Ft(...)o(])630 973 y Fu(The)d(commands)f(in)h Fr(arg)51 +b Fu(are)44 b(to)g(b)s(e)e(read)h(and)g(executed)h(when)e(the)h(shell)g +(receiv)m(es)630 1083 y(signal)36 b Fr(sigsp)s(ec)p Fu(.)57 +b(If)35 b Fr(arg)44 b Fu(is)36 b(absen)m(t)g(\(and)f(there)h(is)g(a)f +(single)i Fr(sigsp)s(ec)6 b Fu(\))35 b(or)h(equal)g(to)h(`)p +Ft(-)p Fu(',)630 1192 y(eac)m(h)k(sp)s(eci\014ed)e(signal's)h(disp)s +(osition)g(is)f(reset)i(to)f(the)g(v)-5 b(alue)40 b(it)g(had)f(when)g +(the)h(shell)630 1302 y(w)m(as)33 b(started.)47 b(If)32 +b Fr(arg)41 b Fu(is)32 b(the)h(n)m(ull)f(string,)i(then)e(the)g(signal) +i(sp)s(eci\014ed)d(b)m(y)i(eac)m(h)g Fr(sigsp)s(ec)630 +1412 y Fu(is)g(ignored)h(b)m(y)f(the)g(shell)h(and)e(commands)h(it)h +(in)m(v)m(ok)m(es.)51 b(If)33 b Fr(arg)41 b Fu(is)33 +b(not)h(presen)m(t)f(and)g Ft(-p)630 1521 y Fu(has)g(b)s(een)g +(supplied,)f(the)i(shell)f(displa)m(ys)h(the)f(trap)g(commands)g(asso)s +(ciated)i(with)e(eac)m(h)630 1631 y Fr(sigsp)s(ec)p Fu(.)47 +b(If)31 b(no)i(argumen)m(ts)f(are)h(supplied,)e(or)i(only)f +Ft(-p)g Fu(is)g(giv)m(en,)i Ft(trap)d Fu(prin)m(ts)h(the)g(list)630 +1740 y(of)c(commands)f(asso)s(ciated)i(with)f(eac)m(h)h(signal)f(n)m +(um)m(b)s(er)e(in)i(a)g(form)f(that)h(ma)m(y)h(b)s(e)e(reused)630 +1850 y(as)f(shell)h(input.)38 b(The)26 b Ft(-l)f Fu(option)i(causes)f +(the)g(shell)h(to)g(prin)m(t)e(a)i(list)f(of)h(signal)g(names)f(and)630 +1960 y(their)33 b(corresp)s(onding)f(n)m(um)m(b)s(ers.)47 +b(Eac)m(h)34 b Fr(sigsp)s(ec)39 b Fu(is)33 b(either)g(a)h(signal)g +(name)f(or)g(a)g(signal)630 2069 y(n)m(um)m(b)s(er.)39 +b(Signal)31 b(names)f(are)h(case)h(insensitiv)m(e)f(and)f(the)g +Ft(SIG)g Fu(pre\014x)f(is)i(optional.)630 2204 y(If)k(a)g +Fr(sigsp)s(ec)41 b Fu(is)35 b Ft(0)g Fu(or)g Ft(EXIT)p +Fu(,)g Fr(arg)43 b Fu(is)35 b(executed)h(when)e(the)h(shell)h(exits.)55 +b(If)35 b(a)g Fr(sigsp)s(ec)41 b Fu(is)630 2314 y Ft(DEBUG)p +Fu(,)32 b(the)g(command)g Fr(arg)40 b Fu(is)33 b(executed)g(b)s(efore)f +(ev)m(ery)h(simple)f(command,)h Ft(for)e Fu(com-)630 +2423 y(mand,)d Ft(case)g Fu(command,)h Ft(select)e Fu(command,)i(ev)m +(ery)h(arithmetic)g Ft(for)d Fu(command,)j(and)630 2533 y(b)s(efore)22 b(the)g(\014rst)f(command)h(executes)i(in)e(a)g(shell)h (function.)37 b(Refer)22 b(to)h(the)g(description)f(of)630 -2642 y(the)i Fs(extdebug)d Ft(option)j(to)h(the)f Fs(shopt)e -Ft(builtin)h(\(see)i(Section)f(4.3.2)i([The)d(Shopt)g(Builtin],)630 -2752 y(page)33 b(63\))g(for)f(details)h(of)f(its)h(e\013ect)g(on)f(the) -g Fs(DEBUG)f Ft(trap.)46 b(If)31 b(a)i Fq(sigsp)s(ec)38 -b Ft(is)32 b Fs(RETURN)p Ft(,)f(the)630 2862 y(command)h -Fq(arg)41 b Ft(is)33 b(executed)g(eac)m(h)h(time)f(a)g(shell)g +2642 y(the)i Ft(extdebug)d Fu(option)j(to)h(the)f Ft(shopt)e +Fu(builtin)h(\(see)i(Section)f(4.3.2)i([The)d(Shopt)g(Builtin],)630 +2752 y(page)33 b(62\))g(for)f(details)h(of)f(its)h(e\013ect)g(on)f(the) +g Ft(DEBUG)f Fu(trap.)46 b(If)31 b(a)i Fr(sigsp)s(ec)38 +b Fu(is)32 b Ft(RETURN)p Fu(,)f(the)630 2862 y(command)h +Fr(arg)41 b Fu(is)33 b(executed)g(eac)m(h)h(time)f(a)g(shell)g (function)g(or)f(a)h(script)g(executed)g(with)630 2971 -y(the)e Fs(.)f Ft(or)g Fs(source)f Ft(builtins)g(\014nishes)h -(executing.)630 3106 y(If)20 b(a)i Fq(sigsp)s(ec)27 b -Ft(is)21 b Fs(ERR)p Ft(,)h(the)f(command)g Fq(arg)29 -b Ft(is)21 b(executed)h(whenev)m(er)e(a)i(pip)s(eline)e(\(whic)m(h)h +y(the)e Ft(.)f Fu(or)g Ft(source)f Fu(builtins)g(\014nishes)h +(executing.)630 3106 y(If)20 b(a)i Fr(sigsp)s(ec)27 b +Fu(is)21 b Ft(ERR)p Fu(,)h(the)f(command)g Fr(arg)29 +b Fu(is)21 b(executed)h(whenev)m(er)e(a)i(pip)s(eline)e(\(whic)m(h)h (ma)m(y)630 3216 y(consist)35 b(of)g(a)f(single)h(simple)g(command\),)h (a)e(list,)j(or)d(a)h(comp)s(ound)e(command)h(returns)630 3325 y(a)41 b(non-zero)g(exit)h(status,)h(sub)5 b(ject)41 b(to)g(the)g(follo)m(wing)h(conditions.)72 b(The)40 b -Fs(ERR)f Ft(trap)i(is)630 3435 y(not)c(executed)h(if)f(the)h(failed)f +Ft(ERR)f Fu(trap)i(is)630 3435 y(not)c(executed)h(if)f(the)h(failed)f (command)g(is)g(part)g(of)h(the)f(command)g(list)h(immediately)630 -3544 y(follo)m(wing)30 b(an)e Fs(until)f Ft(or)i Fs(while)e -Ft(k)m(eyw)m(ord,)i(part)g(of)f(the)h(test)g(follo)m(wing)h(the)f -Fs(if)f Ft(or)g Fs(elif)630 3654 y Ft(reserv)m(ed)45 +3544 y(follo)m(wing)30 b(an)e Ft(until)f Fu(or)i Ft(while)e +Fu(k)m(eyw)m(ord,)i(part)g(of)f(the)h(test)g(follo)m(wing)h(the)f +Ft(if)f Fu(or)g Ft(elif)630 3654 y Fu(reserv)m(ed)45 b(w)m(ords,)j(part)c(of)h(a)g(command)g(executed)g(in)g(a)g -Fs(&&)f Ft(or)h Fs(||)f Ft(list)h(except)h(the)630 3764 -y(command)28 b(follo)m(wing)j(the)d(\014nal)h Fs(&&)f -Ft(or)g Fs(||)p Ft(,)h(an)m(y)g(command)f(in)h(a)g(pip)s(eline)f(but)g +Ft(&&)f Fu(or)h Ft(||)f Fu(list)h(except)h(the)630 3764 +y(command)28 b(follo)m(wing)j(the)d(\014nal)h Ft(&&)f +Fu(or)g Ft(||)p Fu(,)h(an)m(y)g(command)f(in)h(a)g(pip)s(eline)f(but)g (the)h(last,)630 3873 y(or)d(if)g(the)f(command's)h(return)f(status)h -(is)g(b)s(eing)f(in)m(v)m(erted)i(using)e Fs(!)p Ft(.)39 +(is)g(b)s(eing)f(in)m(v)m(erted)i(using)e Ft(!)p Fu(.)39 b(These)25 b(are)i(the)f(same)630 3983 y(conditions)31 -b(ob)s(ey)m(ed)f(b)m(y)h(the)f Fs(errexit)f Ft(\(`)p -Fs(-e)p Ft('\))i(option.)630 4118 y(Signals)37 b(ignored)f(up)s(on)f -(en)m(try)i(to)g(the)f(shell)h(cannot)g(b)s(e)f(trapp)s(ed)f(or)h -(reset.)59 b(T)-8 b(rapp)s(ed)630 4227 y(signals)28 b(that)f(are)h(not) -f(b)s(eing)g(ignored)g(are)g(reset)h(to)g(their)f(original)h(v)-5 +b(ob)s(ey)m(ed)f(b)m(y)h(the)f Ft(errexit)f Fu(\()p Ft(-e)p +Fu(\))h(option.)630 4118 y(Signals)37 b(ignored)f(up)s(on)f(en)m(try)i +(to)g(the)f(shell)h(cannot)g(b)s(e)f(trapp)s(ed)f(or)h(reset.)59 +b(T)-8 b(rapp)s(ed)630 4227 y(signals)28 b(that)f(are)h(not)f(b)s(eing) +g(ignored)g(are)g(reset)h(to)g(their)f(original)h(v)-5 b(alues)28 b(in)e(a)i(subshell)630 4337 y(or)i(subshell)g(en)m (vironmen)m(t)h(when)e(one)i(is)f(created.)630 4472 y(The)g(return)f -(status)i(is)f(zero)h(unless)f(a)h Fq(sigsp)s(ec)36 b -Ft(do)s(es)30 b(not)h(sp)s(ecify)f(a)g(v)-5 b(alid)31 -b(signal.)150 4632 y Fs(umask)870 4767 y(umask)46 b([-p])h([-S])g([)p -Fi(mode)11 b Fs(])630 4902 y Ft(Set)29 b(the)h(shell)f(pro)s(cess's)g -(\014le)g(creation)h(mask)f(to)h Fq(mo)s(de)5 b Ft(.)40 -b(If)28 b Fq(mo)s(de)34 b Ft(b)s(egins)29 b(with)f(a)i(digit,)630 +(status)i(is)f(zero)h(unless)f(a)h Fr(sigsp)s(ec)36 b +Fu(do)s(es)30 b(not)h(sp)s(ecify)f(a)g(v)-5 b(alid)31 +b(signal.)150 4632 y Ft(umask)870 4767 y(umask)46 b([-p])h([-S])g([)p +Fj(mode)p Ft(])630 4902 y Fu(Set)30 b(the)f(shell)h(pro)s(cess's)f +(\014le)h(creation)g(mask)g(to)g Fr(mo)s(de)p Fu(.)40 +b(If)29 b Fr(mo)s(de)34 b Fu(b)s(egins)29 b(with)g(a)h(digit,)630 5011 y(it)e(is)f(in)m(terpreted)g(as)g(an)g(o)s(ctal)i(n)m(um)m(b)s (er;)e(if)g(not,)h(it)g(is)f(in)m(terpreted)g(as)g(a)h(sym)m(b)s(olic)f (mo)s(de)630 5121 y(mask)i(similar)g(to)g(that)h(accepted)g(b)m(y)f -(the)g Fs(chmod)e Ft(command.)40 b(If)28 b Fq(mo)s(de)34 -b Ft(is)28 b(omitted,)j(the)630 5230 y(curren)m(t)36 -b(v)-5 b(alue)36 b(of)g(the)h(mask)f(is)g(prin)m(ted.)57 -b(If)35 b(the)h(`)p Fs(-S)p Ft(')g(option)h(is)f(supplied)f(without)h -(a)630 5340 y Fq(mo)s(de)k Ft(argumen)m(t,)d(the)e(mask)g(is)g(prin)m -(ted)g(in)g(a)h(sym)m(b)s(olic)f(format.)55 b(If)35 b(the)g(`)p -Fs(-p)p Ft(')g(option)p eop end +(the)g Ft(chmod)e Fu(command.)40 b(If)28 b Fr(mo)s(de)34 +b Fu(is)28 b(omitted,)j(the)630 5230 y(curren)m(t)39 +b(v)-5 b(alue)40 b(of)f(the)g(mask)g(is)h(prin)m(ted.)66 +b(If)39 b(the)g Ft(-S)g Fu(option)g(is)h(supplied)d(without)j(a)630 +5340 y Fr(mo)s(de)d Fu(argumen)m(t,)d(the)e(mask)g(is)h(prin)m(ted)f +(in)g(a)g(sym)m(b)s(olic)h(format.)47 b(If)32 b(the)g +Ft(-p)g Fu(option)h(is)p eop end %%Page: 48 54 -TeXDict begin 48 53 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(48)630 299 y(is)34 -b(supplied,)f(and)g Fq(mo)s(de)38 b Ft(is)33 b(omitted,)j(the)e(output) -f(is)g(in)h(a)g(form)f(that)h(ma)m(y)g(b)s(e)f(reused)630 -408 y(as)e(input.)41 b(The)31 b(return)f(status)h(is)g(zero)h(if)e(the) -h(mo)s(de)g(is)g(successfully)g(c)m(hanged)g(or)g(if)g(no)630 -518 y Fq(mo)s(de)k Ft(argumen)m(t)c(is)f(supplied,)g(and)f(non-zero)i +TeXDict begin 48 53 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(48)630 299 y(supplied,)32 +b(and)f Fr(mo)s(de)37 b Fu(is)32 b(omitted,)i(the)f(output)f(is)g(in)g +(a)g(form)g(that)h(ma)m(y)g(b)s(e)e(reused)h(as)630 408 +y(input.)62 b(The)38 b(return)f(status)h(is)g(zero)g(if)g(the)g(mo)s +(de)g(is)g(successfully)g(c)m(hanged)g(or)g(if)g(no)630 +518 y Fr(mo)s(de)d Fu(argumen)m(t)c(is)f(supplied,)g(and)f(non-zero)i (otherwise.)630 660 y(Note)38 b(that)e(when)g(the)g(mo)s(de)g(is)g(in)m (terpreted)h(as)f(an)g(o)s(ctal)i(n)m(um)m(b)s(er,)e(eac)m(h)i(n)m(um)m (b)s(er)d(of)630 770 y(the)f(umask)g(is)h(subtracted)f(from)f -Fs(7)p Ft(.)53 b(Th)m(us,)34 b(a)h(umask)e(of)i Fs(022)e -Ft(results)h(in)g(p)s(ermissions)630 879 y(of)d Fs(755)p -Ft(.)150 1054 y Fs(unset)870 1196 y(unset)46 b([-fnv])g([)p -Fi(name)11 b Fs(])630 1338 y Ft(Remo)m(v)m(e)32 b(eac)m(h)g(v)-5 -b(ariable)32 b(or)e(function)h Fq(name)5 b Ft(.)42 b(If)30 -b(the)h(`)p Fs(-v)p Ft(')f(option)h(is)g(giv)m(en,)h(eac)m(h)g -Fq(name)630 1448 y Ft(refers)20 b(to)i(a)f(shell)g(v)-5 -b(ariable)21 b(and)g(that)g(v)-5 b(ariable)22 b(is)e(rem)m(v)m(o)m(v)m -(ed.)40 b(If)20 b(the)h(`)p Fs(-f)p Ft(')g(option)g(is)g(giv)m(en,)630 -1557 y(the)37 b Fq(name)5 b Ft(s)37 b(refer)f(to)i(shell)f(functions,)h +Ft(7)p Fu(.)53 b(Th)m(us,)34 b(a)h(umask)e(of)i Ft(022)e +Fu(results)h(in)g(p)s(ermissions)630 879 y(of)d Ft(755)p +Fu(.)150 1054 y Ft(unset)870 1196 y(unset)46 b([-fnv])g([)p +Fj(name)p Ft(])630 1338 y Fu(Remo)m(v)m(e)36 b(eac)m(h)f(v)-5 +b(ariable)35 b(or)f(function)f Fr(name)p Fu(.)52 b(If)33 +b(the)i Ft(-v)e Fu(option)h(is)g(giv)m(en,)j(eac)m(h)e +Fr(name)630 1448 y Fu(refers)24 b(to)h(a)g(shell)f(v)-5 +b(ariable)25 b(and)f(that)h(v)-5 b(ariable)25 b(is)f(rem)m(v)m(o)m(v)m +(ed.)41 b(If)23 b(the)i Ft(-f)f Fu(option)g(is)h(giv)m(en,)630 +1557 y(the)37 b Fr(name)5 b Fu(s)37 b(refer)f(to)i(shell)f(functions,)h (and)e(the)h(function)g(de\014nition)f(is)h(remo)m(v)m(ed.)61 -b(If)630 1667 y(the)30 b(`)p Fs(-n)p Ft(')f(option)h(is)g(supplied,)e -(and)h Fq(name)35 b Ft(is)30 b(a)g(v)-5 b(ariable)30 -b(with)f(the)h Fq(nameref)47 b Ft(attribute,)630 1776 -y Fq(name)39 b Ft(will)33 b(b)s(e)g(unset)g(rather)h(than)f(the)g(v)-5 -b(ariable)35 b(it)f(references.)50 b(`)p Fs(-n)p Ft(')33 -b(has)h(no)f(e\013ect)i(if)630 1886 y(the)h(`)p Fs(-f)p -Ft(')g(option)h(is)f(supplied.)56 b(If)36 b(no)g(options)g(are)g -(supplied,)h(eac)m(h)g Fq(name)k Ft(refers)36 b(to)h(a)630 -1995 y(v)-5 b(ariable;)37 b(if)d(there)g(is)g(no)g(v)-5 -b(ariable)34 b(b)m(y)g(that)h(name,)g(an)m(y)f(function)g(with)f(that)i -(name)f(is)630 2105 y(unset.)46 b(Readonly)33 b(v)-5 -b(ariables)33 b(and)e(functions)h(ma)m(y)h(not)g(b)s(e)e(unset.)47 -b(The)31 b(return)h(status)630 2215 y(is)e(zero)i(unless)d(a)i -Fq(name)36 b Ft(is)30 b(readonly)-8 b(.)150 2470 y Fr(4.2)68 -b(Bash)45 b(Builtin)g(Commands)150 2629 y Ft(This)c(section)h(describ)s -(es)f(builtin)f(commands)h(whic)m(h)g(are)h(unique)e(to)j(or)e(ha)m(v)m -(e)h(b)s(een)f(extended)g(in)150 2739 y(Bash.)g(Some)30 -b(of)h(these)g(commands)f(are)g(sp)s(eci\014ed)g(in)g(the)h -Fl(posix)e Ft(standard.)150 2921 y Fs(alias)870 3063 -y(alias)46 b([-p])h([)p Fi(name)11 b Fs([=)p Fi(value)g -Fs(])43 b(...)o(])630 3205 y Ft(Without)h(argumen)m(ts)f(or)g(with)g -(the)h(`)p Fs(-p)p Ft(')f(option,)k Fs(alias)41 b Ft(prin)m(ts)i(the)g -(list)h(of)f(aliases)630 3315 y(on)36 b(the)g(standard)f(output)h(in)f -(a)i(form)e(that)i(allo)m(ws)g(them)f(to)g(b)s(e)g(reused)f(as)h -(input.)56 b(If)630 3424 y(argumen)m(ts)29 b(are)g(supplied,)f(an)h -(alias)h(is)f(de\014ned)e(for)i(eac)m(h)h Fq(name)k Ft(whose)28 -b Fq(v)-5 b(alue)35 b Ft(is)29 b(giv)m(en.)630 3534 y(If)39 -b(no)h Fq(v)-5 b(alue)45 b Ft(is)40 b(giv)m(en,)j(the)d(name)f(and)g(v) --5 b(alue)40 b(of)g(the)g(alias)h(is)f(prin)m(ted.)68 -b(Aliases)41 b(are)630 3643 y(describ)s(ed)29 b(in)h(Section)i(6.6)f -([Aliases],)h(page)f(88.)150 3818 y Fs(bind)870 3960 -y(bind)47 b([-m)g Fi(keymap)11 b Fs(])45 b([-lpsvPSVX])870 -4070 y(bind)i([-m)g Fi(keymap)11 b Fs(])45 b([-q)i Fi(function)11 -b Fs(])45 b([-u)h Fi(function)11 b Fs(])45 b([-r)i Fi(keyseq)11 -b Fs(])870 4179 y(bind)47 b([-m)g Fi(keymap)11 b Fs(])45 -b(-f)i Fi(filename)870 4289 y Fs(bind)g([-m)g Fi(keymap)11 -b Fs(])45 b(-x)i Fi(keyseq:shell-command)870 4398 y Fs(bind)g([-m)g -Fi(keymap)11 b Fs(])45 b Fi(keyseq:function-name)870 -4508 y Fs(bind)i Fi(readline-command)630 4650 y Ft(Displa)m(y)22 +b(If)630 1667 y(the)34 b Ft(-n)e Fu(option)i(is)g(supplied,)f(and)g +Fr(name)38 b Fu(is)c(a)f(v)-5 b(ariable)34 b(with)g(the)f +Fr(nameref)51 b Fu(attribute,)630 1776 y Fr(name)42 b +Fu(will)37 b(b)s(e)f(unset)g(rather)g(than)h(the)g(v)-5 +b(ariable)37 b(it)g(references.)60 b Ft(-n)36 b Fu(has)g(no)h(e\013ect) +h(if)630 1886 y(the)h Ft(-f)g Fu(option)g(is)h(supplied.)65 +b(If)39 b(no)g(options)h(are)f(supplied,)h(eac)m(h)h +Fr(name)j Fu(refers)39 b(to)h(a)630 1995 y(v)-5 b(ariable;)37 +b(if)d(there)g(is)g(no)g(v)-5 b(ariable)34 b(b)m(y)g(that)h(name,)g(an) +m(y)f(function)g(with)f(that)i(name)f(is)630 2105 y(unset.)46 +b(Readonly)33 b(v)-5 b(ariables)33 b(and)e(functions)h(ma)m(y)h(not)g +(b)s(e)e(unset.)47 b(The)31 b(return)h(status)630 2215 +y(is)e(zero)i(unless)d(a)i Fr(name)36 b Fu(is)30 b(readonly)-8 +b(.)150 2470 y Fs(4.2)68 b(Bash)45 b(Builtin)g(Commands)150 +2629 y Fu(This)c(section)h(describ)s(es)f(builtin)f(commands)h(whic)m +(h)g(are)h(unique)e(to)j(or)e(ha)m(v)m(e)h(b)s(een)f(extended)g(in)150 +2739 y(Bash.)g(Some)30 b(of)h(these)g(commands)f(are)g(sp)s(eci\014ed)g +(in)g(the)h Fm(posix)e Fu(standard.)150 2921 y Ft(alias)870 +3063 y(alias)46 b([-p])h([)p Fj(name)p Ft([=)p Fj(value)p +Ft(])d(...)o(])630 3205 y Fu(Without)26 b(argumen)m(ts)f(or)g(with)f +(the)h Ft(-p)g Fu(option,)h Ft(alias)e Fu(prin)m(ts)g(the)h(list)h(of)f +(aliases)h(on)f(the)630 3315 y(standard)g(output)g(in)g(a)h(form)f +(that)h(allo)m(ws)h(them)e(to)h(b)s(e)f(reused)g(as)g(input.)39 +b(If)25 b(argumen)m(ts)630 3424 y(are)j(supplied,)e(an)i(alias)g(is)f +(de\014ned)f(for)h(eac)m(h)h Fr(name)33 b Fu(whose)27 +b Fr(v)-5 b(alue)33 b Fu(is)27 b(giv)m(en.)41 b(If)26 +b(no)h Fr(v)-5 b(alue)630 3534 y Fu(is)37 b(giv)m(en,)j(the)d(name)g +(and)g(v)-5 b(alue)37 b(of)h(the)f(alias)h(is)f(prin)m(ted.)61 +b(Aliases)38 b(are)f(describ)s(ed)f(in)630 3643 y(Section)31 +b(6.6)h([Aliases],)g(page)f(88.)150 3818 y Ft(bind)870 +3960 y(bind)47 b([-m)g Fj(keymap)p Ft(])e([-lpsvPSVX])870 +4070 y(bind)i([-m)g Fj(keymap)p Ft(])e([-q)i Fj(function)p +Ft(])f([-u)g Fj(function)p Ft(])g([-r)h Fj(keyseq)p Ft(])870 +4179 y(bind)g([-m)g Fj(keymap)p Ft(])e(-f)j Fj(filename)870 +4289 y Ft(bind)f([-m)g Fj(keymap)p Ft(])e(-x)j Fj(keyseq:shell-command) +870 4398 y Ft(bind)f([-m)g Fj(keymap)p Ft(])e Fj(keyseq:function-name) +870 4508 y Ft(bind)i Fj(readline-command)630 4650 y Fu(Displa)m(y)22 b(curren)m(t)f(Readline)h(\(see)f(Chapter)g(8)g([Command)f(Line)h -(Editing],)j(page)e(102\))g(k)m(ey)630 4760 y(and)36 +(Editing],)j(page)e(101\))g(k)m(ey)630 4760 y(and)36 b(function)g(bindings,)i(bind)d(a)i(k)m(ey)g(sequence)g(to)h(a)f (Readline)g(function)f(or)h(macro,)630 4869 y(or)44 b(set)h(a)g (Readline)f(v)-5 b(ariable.)83 b(Eac)m(h)45 b(non-option)g(argumen)m(t) f(is)g(a)h(command)f(as)g(it)630 4979 y(w)m(ould)e(app)s(ear)f(in)h(a)h (Readline)g(initialization)i(\014le)d(\(see)h(Section)g(8.3)g -([Readline)g(Init)630 5088 y(File],)c(page)d(105\),)j(but)c(eac)m(h)h +([Readline)g(Init)630 5088 y(File],)c(page)d(104\),)j(but)c(eac)m(h)h (binding)f(or)g(command)h(m)m(ust)f(b)s(e)g(passed)g(as)h(a)g(separate) -630 5198 y(argumen)m(t;)31 b(e.g.,)h(`)p Fs -("\\C-x\\C-r":re-read-init-f)o(ile)p Ft('.)630 5340 y(Options,)e(if)h +630 5198 y(argumen)m(t;)31 b(e.g.,)h(`)p Ft +("\\C-x\\C-r":re-read-init-f)o(ile)p Fu('.)630 5340 y(Options,)e(if)h (supplied,)e(ha)m(v)m(e)i(the)g(follo)m(wing)h(meanings:)p eop end %%Page: 49 55 -TeXDict begin 49 54 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(49)630 299 y Fs(-m)30 -b Fi(keymap)1110 408 y Ft(Use)54 b Fq(k)m(eymap)j Ft(as)d(the)g(k)m -(eymap)g(to)h(b)s(e)e(a\013ected)i(b)m(y)f(the)g(subsequen)m(t)1110 -518 y(bindings.)46 b(Acceptable)34 b Fq(k)m(eymap)i Ft(names)c(are)h -Fs(emacs)p Ft(,)f Fs(emacs-standard)p Ft(,)1110 628 y -Fs(emacs-meta)p Ft(,)99 b Fs(emacs-ctlx)p Ft(,)f Fs(vi)p -Ft(,)j Fs(vi-move)p Ft(,)f Fs(vi-command)p Ft(,)f(and)1110 -737 y Fs(vi-insert)p Ft(.)64 b Fs(vi)38 b Ft(is)h(equiv)-5 -b(alen)m(t)41 b(to)e Fs(vi-command)p Ft(;)i Fs(emacs)c -Ft(is)i(equiv)-5 b(alen)m(t)1110 847 y(to)31 b Fs(emacs-standard)p -Ft(.)630 1013 y Fs(-l)384 b Ft(List)31 b(the)f(names)g(of)h(all)g -(Readline)g(functions.)630 1179 y Fs(-p)384 b Ft(Displa)m(y)34 +TeXDict begin 49 54 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(49)630 299 y Ft(-m)30 +b Fj(keymap)66 b Fu(Use)54 b Fr(k)m(eymap)j Fu(as)d(the)g(k)m(eymap)g +(to)h(b)s(e)e(a\013ected)i(b)m(y)f(the)g(subsequen)m(t)1110 +408 y(bindings.)46 b(Acceptable)34 b Fr(k)m(eymap)i Fu(names)c(are)h +Ft(emacs)p Fu(,)f Ft(emacs-standard)p Fu(,)1110 518 y +Ft(emacs-meta)p Fu(,)99 b Ft(emacs-ctlx)p Fu(,)f Ft(vi)p +Fu(,)j Ft(vi-move)p Fu(,)f Ft(vi-command)p Fu(,)f(and)1110 +628 y Ft(vi-insert)p Fu(.)64 b Ft(vi)38 b Fu(is)h(equiv)-5 +b(alen)m(t)41 b(to)e Ft(vi-command)p Fu(;)i Ft(emacs)c +Fu(is)i(equiv)-5 b(alen)m(t)1110 737 y(to)31 b Ft(emacs-standard)p +Fu(.)630 888 y Ft(-l)384 b Fu(List)31 b(the)f(names)g(of)h(all)g +(Readline)g(functions.)630 1039 y Ft(-p)384 b Fu(Displa)m(y)34 b(Readline)f(function)g(names)g(and)f(bindings)f(in)i(suc)m(h)f(a)i(w)m -(a)m(y)f(that)1110 1289 y(they)e(can)f(b)s(e)g(used)g(as)g(input)g(or)g -(in)g(a)h(Readline)g(initialization)i(\014le.)630 1455 -y Fs(-P)384 b Ft(List)31 b(curren)m(t)f(Readline)h(function)f(names)g -(and)g(bindings.)630 1621 y Fs(-v)384 b Ft(Displa)m(y)25 +(a)m(y)f(that)1110 1148 y(they)e(can)f(b)s(e)g(used)g(as)g(input)g(or)g +(in)g(a)h(Readline)g(initialization)i(\014le.)630 1299 +y Ft(-P)384 b Fu(List)31 b(curren)m(t)f(Readline)h(function)f(names)g +(and)g(bindings.)630 1450 y Ft(-v)384 b Fu(Displa)m(y)25 b(Readline)f(v)-5 b(ariable)25 b(names)f(and)f(v)-5 b(alues)24 -b(in)g(suc)m(h)f(a)i(w)m(a)m(y)f(that)h(they)1110 1731 +b(in)g(suc)m(h)f(a)i(w)m(a)m(y)f(that)h(they)1110 1559 y(can)31 b(b)s(e)e(used)h(as)h(input)e(or)h(in)g(a)h(Readline)g -(initialization)j(\014le.)630 1897 y Fs(-V)384 b Ft(List)31 +(initialization)j(\014le.)630 1710 y Ft(-V)384 b Fu(List)31 b(curren)m(t)f(Readline)h(v)-5 b(ariable)31 b(names)f(and)g(v)-5 -b(alues.)630 2063 y Fs(-s)384 b Ft(Displa)m(y)39 b(Readline)f(k)m(ey)g +b(alues.)630 1861 y Ft(-s)384 b Fu(Displa)m(y)39 b(Readline)f(k)m(ey)g (sequences)f(b)s(ound)f(to)i(macros)g(and)f(the)g(strings)1110 -2172 y(they)d(output)f(in)h(suc)m(h)f(a)h(w)m(a)m(y)h(that)f(they)g -(can)g(b)s(e)f(used)g(as)h(input)e(or)i(in)g(a)1110 2282 -y(Readline)d(initialization)i(\014le.)630 2448 y Fs(-S)384 -b Ft(Displa)m(y)39 b(Readline)f(k)m(ey)g(sequences)f(b)s(ound)f(to)i -(macros)g(and)f(the)g(strings)1110 2558 y(they)31 b(output.)630 -2724 y Fs(-f)f Fi(filename)1110 2834 y Ft(Read)h(k)m(ey)g(bindings)e -(from)h Fq(\014lename)5 b Ft(.)630 3000 y Fs(-q)30 b -Fi(function)1110 3109 y Ft(Query)g(ab)s(out)g(whic)m(h)g(k)m(eys)h(in)m -(v)m(ok)m(e)h(the)f(named)f Fq(function)p Ft(.)630 3275 -y Fs(-u)g Fi(function)1110 3385 y Ft(Un)m(bind)f(all)i(k)m(eys)g(b)s -(ound)e(to)i(the)f(named)g Fq(function)p Ft(.)630 3551 -y Fs(-r)g Fi(keyseq)1110 3661 y Ft(Remo)m(v)m(e)i(an)m(y)f(curren)m(t)f -(binding)f(for)h Fq(k)m(eyseq)r Ft(.)630 3827 y Fs(-x)g -Fi(keyseq:shell-command)1110 3937 y Ft(Cause)35 b Fq(shell-command)k -Ft(to)d(b)s(e)f(executed)h(whenev)m(er)f Fq(k)m(eyseq)j -Ft(is)d(en)m(tered.)1110 4046 y(When)46 b Fq(shell-command)k -Ft(is)c(executed,)51 b(the)46 b(shell)g(sets)g(the)g -Fs(READLINE_)1110 4156 y(LINE)37 b Ft(v)-5 b(ariable)38 -b(to)g(the)g(con)m(ten)m(ts)i(of)e(the)g(Readline)g(line)g(bu\013er)f -(and)g(the)1110 4265 y Fs(READLINE_POINT)e Ft(v)-5 b(ariable)39 -b(to)h(the)e(curren)m(t)h(lo)s(cation)h(of)f(the)g(insertion)1110 -4375 y(p)s(oin)m(t.)59 b(If)37 b(the)f(executed)i(command)e(c)m(hanges) -i(the)f(v)-5 b(alue)37 b(of)f Fs(READLINE_)1110 4484 -y(LINE)29 b Ft(or)h Fs(READLINE_POINT)p Ft(,)c(those)31 -b(new)e(v)-5 b(alues)31 b(will)f(b)s(e)f(re\015ected)i(in)f(the)1110 -4594 y(editing)h(state.)630 4760 y Fs(-X)384 b Ft(List)27 -b(all)i(k)m(ey)f(sequences)f(b)s(ound)e(to)j(shell)g(commands)e(and)h -(the)g(asso)s(ciated)1110 4870 y(commands)j(in)g(a)h(format)g(that)f -(can)h(b)s(e)f(reused)f(as)i(input.)630 5036 y(The)26 -b(return)f(status)i(is)f(zero)i(unless)d(an)i(in)m(v)-5 -b(alid)27 b(option)g(is)f(supplied)f(or)i(an)f(error)g(o)s(ccurs.)150 -5202 y Fs(builtin)870 5340 y(builtin)46 b([)p Fi(shell-builtin)54 -b Fs([)p Fi(args)11 b Fs(]])p eop end -%%Page: 50 56 -TeXDict begin 50 55 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(50)630 299 y(Run)35 -b(a)h(shell)h(builtin,)g(passing)f(it)g Fq(args)t Ft(,)i(and)e(return)f -(its)h(exit)h(status.)58 b(This)36 b(is)g(useful)630 -408 y(when)29 b(de\014ning)h(a)g(shell)h(function)f(with)g(the)g(same)h -(name)f(as)h(a)g(shell)f(builtin,)g(retaining)630 518 -y(the)k(functionalit)m(y)h(of)f(the)f(builtin)g(within)g(the)h +1970 y(they)d(output)f(in)h(suc)m(h)f(a)h(w)m(a)m(y)h(that)f(they)g +(can)g(b)s(e)f(used)g(as)h(input)e(or)i(in)g(a)1110 2080 +y(Readline)d(initialization)i(\014le.)630 2230 y Ft(-S)384 +b Fu(Displa)m(y)39 b(Readline)f(k)m(ey)g(sequences)f(b)s(ound)f(to)i +(macros)g(and)f(the)g(strings)1110 2340 y(they)31 b(output.)630 +2491 y Ft(-f)f Fj(filename)1110 2600 y Fu(Read)h(k)m(ey)g(bindings)e +(from)h Fr(\014lename)p Fu(.)630 2751 y Ft(-q)g Fj(function)1110 +2861 y Fu(Query)g(ab)s(out)g(whic)m(h)g(k)m(eys)h(in)m(v)m(ok)m(e)h +(the)f(named)f Fr(function)p Fu(.)630 3011 y Ft(-u)g +Fj(function)1110 3121 y Fu(Un)m(bind)f(all)i(k)m(eys)g(b)s(ound)e(to)i +(the)f(named)g Fr(function)p Fu(.)630 3271 y Ft(-r)g +Fj(keyseq)66 b Fu(Remo)m(v)m(e)32 b(an)m(y)f(curren)m(t)f(binding)f +(for)h Fr(k)m(eyseq)p Fu(.)630 3422 y Ft(-x)g Fj(keyseq:shell-command) +1110 3532 y Fu(Cause)35 b Fr(shell-command)k Fu(to)d(b)s(e)f(executed)h +(whenev)m(er)f Fr(k)m(eyseq)j Fu(is)d(en)m(tered.)1110 +3641 y(When)46 b Fr(shell-command)k Fu(is)c(executed,)51 +b(the)46 b(shell)g(sets)g(the)g Ft(READLINE_)1110 3751 +y(LINE)37 b Fu(v)-5 b(ariable)38 b(to)g(the)g(con)m(ten)m(ts)i(of)e +(the)g(Readline)g(line)g(bu\013er)f(and)g(the)1110 3861 +y Ft(READLINE_POINT)e Fu(v)-5 b(ariable)39 b(to)h(the)e(curren)m(t)h +(lo)s(cation)h(of)f(the)g(insertion)1110 3970 y(p)s(oin)m(t.)59 +b(If)37 b(the)f(executed)i(command)e(c)m(hanges)i(the)f(v)-5 +b(alue)37 b(of)f Ft(READLINE_)1110 4080 y(LINE)29 b Fu(or)h +Ft(READLINE_POINT)p Fu(,)c(those)31 b(new)e(v)-5 b(alues)31 +b(will)f(b)s(e)f(re\015ected)i(in)f(the)1110 4189 y(editing)h(state.) +630 4340 y Ft(-X)384 b Fu(List)27 b(all)i(k)m(ey)f(sequences)f(b)s +(ound)e(to)j(shell)g(commands)e(and)h(the)g(asso)s(ciated)1110 +4450 y(commands)j(in)g(a)h(format)g(that)f(can)h(b)s(e)f(reused)f(as)i +(input.)630 4600 y(The)26 b(return)f(status)i(is)f(zero)i(unless)d(an)i +(in)m(v)-5 b(alid)27 b(option)g(is)f(supplied)f(or)i(an)f(error)g(o)s +(ccurs.)150 4751 y Ft(builtin)870 4881 y(builtin)46 b([)p +Fj(shell-builtin)e Ft([)p Fj(args)p Ft(]])630 5011 y +Fu(Run)35 b(a)i(shell)f(builtin,)i(passing)e(it)h Fr(args)p +Fu(,)h(and)e(return)f(its)i(exit)g(status.)59 b(This)35 +b(is)i(useful)630 5121 y(when)29 b(de\014ning)h(a)g(shell)h(function)f +(with)g(the)g(same)h(name)f(as)h(a)g(shell)f(builtin,)g(retaining)630 +5230 y(the)k(functionalit)m(y)h(of)f(the)f(builtin)g(within)g(the)h (function.)50 b(The)33 b(return)g(status)h(is)f(non-)630 -628 y(zero)e(if)g Fq(shell-builtin)f Ft(is)g(not)h(a)g(shell)f(builtin) -g(command.)150 774 y Fs(caller)870 902 y(caller)46 b([)p -Fi(expr)11 b Fs(])630 1029 y Ft(Returns)34 b(the)g(con)m(text)j(of)e -(an)m(y)g(activ)m(e)i(subroutine)c(call)j(\(a)f(shell)g(function)f(or)h -(a)g(script)630 1139 y(executed)c(with)f(the)h Fs(.)f -Ft(or)g Fs(source)f Ft(builtins\).)630 1267 y(Without)45 -b Fq(expr)7 b Ft(,)46 b Fs(caller)d Ft(displa)m(ys)h(the)g(line)g(n)m -(um)m(b)s(er)f(and)g(source)h(\014lename)h(of)f(the)630 -1377 y(curren)m(t)35 b(subroutine)f(call.)56 b(If)35 -b(a)h(non-negativ)m(e)h(in)m(teger)g(is)e(supplied)f(as)h -Fq(expr)7 b Ft(,)36 b Fs(caller)630 1486 y Ft(displa)m(ys)41 -b(the)f(line)h(n)m(um)m(b)s(er,)h(subroutine)d(name,)44 -b(and)c(source)g(\014le)h(corresp)s(onding)e(to)630 1596 -y(that)c(p)s(osition)g(in)f(the)h(curren)m(t)f(execution)i(call)g(stac) -m(k.)54 b(This)34 b(extra)h(information)g(ma)m(y)630 -1705 y(b)s(e)30 b(used,)g(for)g(example,)h(to)g(prin)m(t)f(a)h(stac)m +5340 y(zero)e(if)g Fr(shell-builtin)f Fu(is)g(not)h(a)g(shell)f +(builtin)g(command.)p eop end +%%Page: 50 56 +TeXDict begin 50 55 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(50)150 299 y Ft(caller)870 +443 y(caller)46 b([)p Fj(expr)p Ft(])630 587 y Fu(Returns)34 +b(the)g(con)m(text)j(of)e(an)m(y)g(activ)m(e)i(subroutine)c(call)j(\(a) +f(shell)g(function)f(or)h(a)g(script)630 696 y(executed)c(with)f(the)h +Ft(.)f Fu(or)g Ft(source)f Fu(builtins\).)630 840 y(Without)45 +b Fr(expr)p Fu(,)j Ft(caller)43 b Fu(displa)m(ys)i(the)f(line)h(n)m(um) +m(b)s(er)f(and)g(source)g(\014lename)h(of)g(the)630 950 +y(curren)m(t)35 b(subroutine)g(call.)58 b(If)35 b(a)h(non-negativ)m(e)i +(in)m(teger)f(is)f(supplied)e(as)i Fr(expr)p Fu(,)h Ft(caller)630 +1059 y Fu(displa)m(ys)k(the)f(line)h(n)m(um)m(b)s(er,)h(subroutine)d +(name,)44 b(and)c(source)g(\014le)h(corresp)s(onding)e(to)630 +1169 y(that)c(p)s(osition)g(in)f(the)h(curren)m(t)f(execution)i(call)g +(stac)m(k.)54 b(This)34 b(extra)h(information)g(ma)m(y)630 +1278 y(b)s(e)30 b(used,)g(for)g(example,)h(to)g(prin)m(t)f(a)h(stac)m (k)h(trace.)42 b(The)29 b(curren)m(t)i(frame)f(is)g(frame)h(0.)630 -1833 y(The)e(return)f(v)-5 b(alue)29 b(is)h(0)f(unless)g(the)g(shell)g -(is)h(not)f(executing)h(a)g(subroutine)e(call)i(or)g -Fq(expr)630 1943 y Ft(do)s(es)g(not)h(corresp)s(ond)e(to)i(a)g(v)-5 +1422 y(The)d(return)g(v)-5 b(alue)29 b(is)g(0)g(unless)f(the)h(shell)g +(is)g(not)g(executing)h(a)f(subroutine)e(call)j(or)f +Fr(expr)630 1532 y Fu(do)s(es)h(not)h(corresp)s(ond)e(to)i(a)g(v)-5 b(alid)30 b(p)s(osition)h(in)f(the)g(call)i(stac)m(k.)150 -2089 y Fs(command)870 2217 y(command)46 b([-pVv])g Fi(command)56 -b Fs([)p Fi(arguments)g Fs(...)o(])630 2345 y Ft(Runs)31 -b Fq(command)36 b Ft(with)d Fq(argumen)m(ts)j Ft(ignoring)d(an)m(y)g -(shell)g(function)f(named)g Fq(command)t Ft(.)630 2454 +1710 y Ft(command)870 1854 y(command)46 b([-pVv])g Fj(command)g +Ft([)p Fj(arguments)f Ft(...)o(])630 1998 y Fu(Runs)32 +b Fr(command)k Fu(with)d Fr(argumen)m(ts)k Fu(ignoring)c(an)m(y)g +(shell)h(function)e(named)h Fr(command)p Fu(.)630 2107 y(Only)39 b(shell)i(builtin)e(commands)h(or)g(commands)f(found)g(b)m(y) -h(searc)m(hing)h(the)f Fs(PATH)f Ft(are)630 2564 y(executed.)g(If)23 -b(there)h(is)f(a)h(shell)f(function)g(named)g Fs(ls)p -Ft(,)i(running)c(`)p Fs(command)29 b(ls)p Ft(')23 b(within)g(the)630 -2673 y(function)33 b(will)g(execute)i(the)f(external)g(command)f -Fs(ls)f Ft(instead)i(of)f(calling)i(the)e(function)630 -2783 y(recursiv)m(ely)-8 b(.)84 b(The)44 b(`)p Fs(-p)p -Ft(')h(option)g(means)f(to)h(use)g(a)f(default)h(v)-5 -b(alue)45 b(for)f Fs(PATH)g Ft(that)h(is)630 2892 y(guaran)m(teed)35 -b(to)f(\014nd)e(all)j(of)f(the)g(standard)f(utilities.)52 -b(The)33 b(return)g(status)h(in)f(this)h(case)630 3002 -y(is)29 b(127)g(if)g Fq(command)j Ft(cannot)d(b)s(e)e(found)h(or)g(an)g +h(searc)m(hing)h(the)f Ft(PATH)f Fu(are)630 2217 y(executed.)59 +b(If)36 b(there)h(is)f(a)h(shell)f(function)g(named)g +Ft(ls)p Fu(,)h(running)e(`)p Ft(command)29 b(ls)p Fu(')35 +b(within)630 2326 y(the)c(function)f(will)h(execute)g(the)g(external)g +(command)g Ft(ls)f Fu(instead)g(of)h(calling)h(the)f(func-)630 +2436 y(tion)36 b(recursiv)m(ely)-8 b(.)56 b(The)34 b +Ft(-p)h Fu(option)g(means)g(to)h(use)f(a)g(default)h(v)-5 +b(alue)35 b(for)g Ft(PATH)f Fu(that)i(is)630 2545 y(guaran)m(teed)f(to) +f(\014nd)e(all)j(of)f(the)g(standard)f(utilities.)52 +b(The)33 b(return)g(status)h(in)f(this)h(case)630 2655 +y(is)29 b(127)g(if)g Fr(command)j Fu(cannot)d(b)s(e)e(found)h(or)g(an)g (error)h(o)s(ccurred,)f(and)g(the)h(exit)g(status)g(of)630 -3112 y Fq(command)34 b Ft(otherwise.)630 3240 y(If)25 -b(either)g(the)h(`)p Fs(-V)p Ft(')f(or)g(`)p Fs(-v)p -Ft(')g(option)g(is)g(supplied,)h(a)f(description)g(of)h -Fq(command)i Ft(is)d(prin)m(ted.)630 3349 y(The)i(`)p -Fs(-v)p Ft(')h(option)h(causes)f(a)h(single)f(w)m(ord)g(indicating)h -(the)f(command)g(or)g(\014le)g(name)g(used)630 3459 y(to)36 -b(in)m(v)m(ok)m(e)g Fq(command)j Ft(to)c(b)s(e)g(displa)m(y)m(ed;)j -(the)d(`)p Fs(-V)p Ft(')g(option)g(pro)s(duces)e(a)j(more)f(v)m(erb)s -(ose)630 3568 y(description.)61 b(In)36 b(this)h(case,)j(the)e(return)e -(status)h(is)g(zero)h(if)f Fq(command)k Ft(is)c(found,)h(and)630 -3678 y(non-zero)31 b(if)f(not.)150 3824 y Fs(declare)870 -3952 y(declare)46 b([-aAfFgilnrtux])d([-p])k([)p Fi(name)11 -b Fs([=)p Fi(value)g Fs(])43 b(...)o(])630 4080 y Ft(Declare)29 +2765 y Fr(command)34 b Fu(otherwise.)630 2908 y(If)e(either)h(the)f +Ft(-V)g Fu(or)g Ft(-v)g Fu(option)h(is)f(supplied,)g(a)h(description)f +(of)h Fr(command)j Fu(is)c(prin)m(ted.)630 3018 y(The)f +Ft(-v)h Fu(option)g(causes)g(a)g(single)h(w)m(ord)f(indicating)g(the)g +(command)g(or)g(\014le)g(name)g(used)630 3128 y(to)40 +b(in)m(v)m(ok)m(e)h Fr(command)h Fu(to)e(b)s(e)e(displa)m(y)m(ed;)44 +b(the)39 b Ft(-V)f Fu(option)i(pro)s(duces)d(a)j(more)f(v)m(erb)s(ose) +630 3237 y(description.)61 b(In)36 b(this)h(case,)j(the)e(return)e +(status)h(is)g(zero)h(if)f Fr(command)k Fu(is)c(found,)h(and)630 +3347 y(non-zero)31 b(if)f(not.)150 3525 y Ft(declare)870 +3669 y(declare)46 b([-aAfFgilnrtux])d([-p])k([)p Fj(name)p +Ft([=)p Fj(value)p Ft(])d(...)o(])630 3813 y Fu(Declare)29 b(v)-5 b(ariables)28 b(and)e(giv)m(e)j(them)e(attributes.)40 -b(If)27 b(no)g Fq(name)5 b Ft(s)27 b(are)h(giv)m(en,)h(then)e(displa)m -(y)630 4189 y(the)k(v)-5 b(alues)30 b(of)h(v)-5 b(ariables)31 -b(instead.)630 4317 y(The)c(`)p Fs(-p)p Ft(')h(option)g(will)g(displa)m -(y)g(the)g(attributes)g(and)g(v)-5 b(alues)28 b(of)g(eac)m(h)h -Fq(name)5 b Ft(.)40 b(When)27 b(`)p Fs(-p)p Ft(')630 -4427 y(is)j(used)g(with)g Fq(name)35 b Ft(argumen)m(ts,)c(additional)h -(options,)e(other)h(than)f(`)p Fs(-f)p Ft(')g(and)g(`)p -Fs(-F)p Ft(',)h(are)630 4536 y(ignored.)630 4664 y(When)36 -b(`)p Fs(-p)p Ft(')f(is)h(supplied)f(without)h Fq(name)41 -b Ft(argumen)m(ts,)d Fs(declare)c Ft(will)i(displa)m(y)g(the)g(at-)630 -4774 y(tributes)31 b(and)f(v)-5 b(alues)31 b(of)g(all)h(v)-5 +b(If)27 b(no)g Fr(name)5 b Fu(s)27 b(are)h(giv)m(en,)h(then)e(displa)m +(y)630 3922 y(the)k(v)-5 b(alues)30 b(of)h(v)-5 b(ariables)31 +b(instead.)630 4066 y(The)k Ft(-p)f Fu(option)i(will)g(displa)m(y)f +(the)h(attributes)g(and)e(v)-5 b(alues)36 b(of)f(eac)m(h)i +Fr(name)p Fu(.)55 b(When)36 b Ft(-p)630 4176 y Fu(is)i(used)g(with)g +Fr(name)43 b Fu(argumen)m(ts,)e(additional)e(options,)i(other)d(than)g +Ft(-f)g Fu(and)g Ft(-F)p Fu(,)i(are)630 4285 y(ignored.)630 +4429 y(When)g Ft(-p)g Fu(is)g(supplied)f(without)i Fr(name)k +Fu(argumen)m(ts,)f Ft(declare)38 b Fu(will)j(displa)m(y)f(the)h(at-)630 +4539 y(tributes)31 b(and)f(v)-5 b(alues)31 b(of)g(all)h(v)-5 b(ariables)31 b(ha)m(ving)h(the)f(attributes)g(sp)s(eci\014ed)f(b)m(y)h -(the)g(addi-)630 4883 y(tional)h(options.)41 b(If)30 -b(no)g(other)h(options)g(are)g(supplied)e(with)h(`)p -Fs(-p)p Ft(',)g Fs(declare)f Ft(will)i(displa)m(y)630 -4993 y(the)f(attributes)g(and)e(v)-5 b(alues)30 b(of)g(all)g(shell)g(v) --5 b(ariables.)41 b(The)29 b(`)p Fs(-f)p Ft(')g(option)h(will)g -(restrict)g(the)630 5103 y(displa)m(y)h(to)g(shell)f(functions.)630 -5230 y(The)36 b(`)p Fs(-F)p Ft(')h(option)g(inhibits)f(the)h(displa)m -(y)g(of)g(function)g(de\014nitions;)i(only)e(the)g(function)630 -5340 y(name)30 b(and)f(attributes)i(are)f(prin)m(ted.)40 -b(If)30 b(the)g Fs(extdebug)e Ft(shell)i(option)g(is)g(enabled)g(using) -p eop end +(the)g(addi-)630 4648 y(tional)k(options.)52 b(If)34 +b(no)g(other)g(options)g(are)g(supplied)f(with)h Ft(-p)p +Fu(,)g Ft(declare)e Fu(will)j(displa)m(y)630 4758 y(the)e(attributes)h +(and)e(v)-5 b(alues)33 b(of)g(all)h(shell)f(v)-5 b(ariables.)50 +b(The)32 b Ft(-f)g Fu(option)i(will)f(restrict)h(the)630 +4867 y(displa)m(y)d(to)g(shell)f(functions.)630 5011 +y(The)41 b Ft(-F)f Fu(option)i(inhibits)e(the)i(displa)m(y)f(of)g +(function)g(de\014nitions;)47 b(only)41 b(the)g(function)630 +5121 y(name)30 b(and)f(attributes)i(are)f(prin)m(ted.)40 +b(If)30 b(the)g Ft(extdebug)e Fu(shell)i(option)g(is)g(enabled)g(using) +630 5230 y Ft(shopt)24 b Fu(\(see)i(Section)g(4.3.2)i([The)d(Shopt)f +(Builtin],)k(page)e(62\),)i(the)d(source)h(\014le)f(name)h(and)630 +5340 y(line)31 b(n)m(um)m(b)s(er)e(where)h(the)g(function)g(is)h +(de\014ned)e(are)i(displa)m(y)m(ed)g(as)f(w)m(ell.)42 +b Ft(-F)30 b Fu(implies)g Ft(-f)p Fu(.)p eop end %%Page: 51 57 -TeXDict begin 51 56 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(51)630 299 y Fs(shopt)24 -b Ft(\(see)i(Section)g(4.3.2)i([The)d(Shopt)f(Builtin],)k(page)e(63\),) -i(the)d(source)h(\014le)f(name)h(and)630 408 y(line)38 -b(n)m(um)m(b)s(er)e(where)i(the)g(function)f(is)h(de\014ned)e(are)i -(displa)m(y)m(ed)h(as)e(w)m(ell.)64 b(`)p Fs(-F)p Ft(')38 -b(implies)630 518 y(`)p Fs(-f)p Ft('.)630 654 y(The)32 -b(`)p Fs(-g)p Ft(')h(option)g(forces)g(v)-5 b(ariables)33 -b(to)h(b)s(e)e(created)h(or)g(mo)s(di\014ed)e(at)j(the)f(global)h(scop) -s(e,)630 764 y(ev)m(en)k(when)e Fs(declare)f Ft(is)j(executed)g(in)f(a) -g(shell)h(function.)61 b(It)37 b(is)g(ignored)h(in)f(all)h(other)630 -873 y(cases.)630 1009 y(The)27 b(follo)m(wing)h(options)g(can)f(b)s(e)g +TeXDict begin 51 56 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(51)630 299 y(The)36 +b Ft(-g)g Fu(option)h(forces)g(v)-5 b(ariables)37 b(to)g(b)s(e)f +(created)i(or)e(mo)s(di\014ed)g(at)h(the)g(global)h(scop)s(e,)630 +408 y(ev)m(en)g(when)e Ft(declare)f Fu(is)j(executed)g(in)f(a)g(shell)h +(function.)61 b(It)37 b(is)g(ignored)h(in)f(all)h(other)630 +518 y(cases.)630 646 y(The)27 b(follo)m(wing)h(options)g(can)f(b)s(e)g (used)f(to)i(restrict)g(output)e(to)i(v)-5 b(ariables)28 -b(with)f(the)g(sp)s(ec-)630 1119 y(i\014ed)j(attributes)h(or)f(to)h -(giv)m(e)h(v)-5 b(ariables)31 b(attributes:)630 1281 -y Fs(-a)384 b Ft(Eac)m(h)36 b Fq(name)k Ft(is)34 b(an)h(indexed)g(arra) -m(y)g(v)-5 b(ariable)36 b(\(see)f(Section)h(6.7)g([Arra)m(ys],)1110 -1390 y(page)31 b(89\).)630 1553 y Fs(-A)384 b Ft(Eac)m(h)24 -b Fq(name)k Ft(is)23 b(an)g(asso)s(ciativ)m(e)j(arra)m(y)e(v)-5 +b(with)f(the)g(sp)s(ec-)630 756 y(i\014ed)j(attributes)h(or)f(to)h(giv) +m(e)h(v)-5 b(ariables)31 b(attributes:)630 902 y Ft(-a)384 +b Fu(Eac)m(h)36 b Fr(name)k Fu(is)34 b(an)h(indexed)g(arra)m(y)g(v)-5 +b(ariable)36 b(\(see)f(Section)h(6.7)g([Arra)m(ys],)1110 +1011 y(page)31 b(89\).)630 1157 y Ft(-A)384 b Fu(Eac)m(h)24 +b Fr(name)k Fu(is)23 b(an)g(asso)s(ciativ)m(e)j(arra)m(y)e(v)-5 b(ariable)24 b(\(see)g(Section)g(6.7)g([Arra)m(ys],)1110 -1662 y(page)31 b(89\).)630 1824 y Fs(-f)384 b Ft(Use)31 -b(function)f(names)g(only)-8 b(.)630 1987 y Fs(-i)384 -b Ft(The)36 b(v)-5 b(ariable)37 b(is)f(to)h(b)s(e)f(treated)h(as)g(an)f +1267 y(page)31 b(89\).)630 1413 y Ft(-f)384 b Fu(Use)31 +b(function)f(names)g(only)-8 b(.)630 1559 y Ft(-i)384 +b Fu(The)36 b(v)-5 b(ariable)37 b(is)f(to)h(b)s(e)f(treated)h(as)g(an)f (in)m(teger;)41 b(arithmetic)c(ev)-5 b(aluation)1110 -2096 y(\(see)29 b(Section)f(6.5)h([Shell)f(Arithmetic],)i(page)e(87\))h -(is)f(p)s(erformed)e(when)h(the)1110 2206 y(v)-5 b(ariable)31 -b(is)g(assigned)f(a)h(v)-5 b(alue.)630 2368 y Fs(-l)384 -b Ft(When)26 b(the)g(v)-5 b(ariable)27 b(is)f(assigned)g(a)g(v)-5 +1669 y(\(see)29 b(Section)f(6.5)h([Shell)f(Arithmetic],)i(page)e(87\))h +(is)f(p)s(erformed)e(when)h(the)1110 1778 y(v)-5 b(ariable)31 +b(is)g(assigned)f(a)h(v)-5 b(alue.)630 1924 y Ft(-l)384 +b Fu(When)26 b(the)g(v)-5 b(ariable)27 b(is)f(assigned)g(a)g(v)-5 b(alue,)28 b(all)f(upp)s(er-case)e(c)m(haracters)j(are)1110 -2478 y(con)m(v)m(erted)k(to)f(lo)m(w)m(er-case.)43 b(The)30 -b(upp)s(er-case)g(attribute)h(is)g(disabled.)630 2640 -y Fs(-n)384 b Ft(Giv)m(e)28 b(eac)m(h)g Fq(name)k Ft(the)27 -b Fq(nameref)44 b Ft(attribute,)28 b(making)f(it)h(a)f(name)f -(reference)1110 2749 y(to)32 b(another)g(v)-5 b(ariable.)46 +2034 y(con)m(v)m(erted)k(to)f(lo)m(w)m(er-case.)43 b(The)30 +b(upp)s(er-case)g(attribute)h(is)g(disabled.)630 2180 +y Ft(-n)384 b Fu(Giv)m(e)28 b(eac)m(h)g Fr(name)k Fu(the)27 +b Fr(nameref)44 b Fu(attribute,)28 b(making)f(it)h(a)f(name)f +(reference)1110 2290 y(to)32 b(another)g(v)-5 b(ariable.)46 b(That)31 b(other)h(v)-5 b(ariable)33 b(is)f(de\014ned)e(b)m(y)i(the)g -(v)-5 b(alue)32 b(of)1110 2859 y Fq(name)5 b Ft(.)39 -b(All)25 b(references)f(and)g(assignmen)m(ts)h(to)g Fq(name)5 -b Ft(,)26 b(except)f(for)f(c)m(hanging)1110 2968 y(the)38 -b(`)p Fs(-n)p Ft(')f(attribute)h(itself,)i(are)e(p)s(erformed)e(on)h -(the)h(v)-5 b(ariable)38 b(referenced)1110 3078 y(b)m(y)j -Fq(name)5 b Ft('s)41 b(v)-5 b(alue.)74 b(The)41 b(`)p -Fs(-n)p Ft(')g(attribute)g(cannot)h(b)s(e)f(applied)g(to)g(arra)m(y) -1110 3188 y(v)-5 b(ariables.)630 3350 y Fs(-r)384 b Ft(Mak)m(e)25 -b Fq(name)5 b Ft(s)23 b(readonly)-8 b(.)39 b(These)24 -b(names)f(cannot)h(then)f(b)s(e)g(assigned)h(v)-5 b(alues)1110 -3459 y(b)m(y)30 b(subsequen)m(t)g(assignmen)m(t)h(statemen)m(ts)h(or)f -(unset.)630 3622 y Fs(-t)384 b Ft(Giv)m(e)33 b(eac)m(h)h -Fq(name)j Ft(the)32 b Fs(trace)f Ft(attribute.)46 b(T)-8 -b(raced)32 b(functions)g(inherit)g(the)1110 3731 y Fs(DEBUG)26 -b Ft(and)h Fs(RETURN)f Ft(traps)h(from)g(the)h(calling)h(shell.)40 -b(The)27 b(trace)i(attribute)1110 3841 y(has)h(no)g(sp)s(ecial)h -(meaning)g(for)f(v)-5 b(ariables.)630 4003 y Fs(-u)384 -b Ft(When)28 b(the)h(v)-5 b(ariable)29 b(is)f(assigned)h(a)f(v)-5 -b(alue,)30 b(all)f(lo)m(w)m(er-case)i(c)m(haracters)f(are)1110 -4113 y(con)m(v)m(erted)i(to)f(upp)s(er-case.)40 b(The)30 -b(lo)m(w)m(er-case)j(attribute)e(is)g(disabled.)630 4275 -y Fs(-x)384 b Ft(Mark)30 b(eac)m(h)h Fq(name)k Ft(for)29 +(v)-5 b(alue)32 b(of)1110 2399 y Fr(name)p Fu(.)39 b(All)26 +b(references)g(and)f(assignmen)m(ts)h(to)g Fr(name)p +Fu(,)h(except)g(for)e(c)m(hanging)1110 2509 y(the)43 +b Ft(-n)f Fu(attribute)i(itself,)j(are)c(p)s(erformed)f(on)g(the)h(v)-5 +b(ariable)44 b(referenced)1110 2619 y(b)m(y)h Fr(name)5 +b Fu('s)46 b(v)-5 b(alue.)86 b(The)45 b Ft(-n)f Fu(attribute)j(cannot)e +(b)s(e)g(applied)g(to)h(arra)m(y)1110 2728 y(v)-5 b(ariables.)630 +2874 y Ft(-r)384 b Fu(Mak)m(e)25 b Fr(name)5 b Fu(s)23 +b(readonly)-8 b(.)39 b(These)24 b(names)f(cannot)h(then)f(b)s(e)g +(assigned)h(v)-5 b(alues)1110 2984 y(b)m(y)30 b(subsequen)m(t)g +(assignmen)m(t)h(statemen)m(ts)h(or)f(unset.)630 3130 +y Ft(-t)384 b Fu(Giv)m(e)33 b(eac)m(h)h Fr(name)j Fu(the)32 +b Ft(trace)f Fu(attribute.)46 b(T)-8 b(raced)32 b(functions)g(inherit)g +(the)1110 3240 y Ft(DEBUG)26 b Fu(and)h Ft(RETURN)f Fu(traps)h(from)g +(the)h(calling)h(shell.)40 b(The)27 b(trace)i(attribute)1110 +3349 y(has)h(no)g(sp)s(ecial)h(meaning)g(for)f(v)-5 b(ariables.)630 +3495 y Ft(-u)384 b Fu(When)28 b(the)h(v)-5 b(ariable)29 +b(is)f(assigned)h(a)f(v)-5 b(alue,)30 b(all)f(lo)m(w)m(er-case)i(c)m +(haracters)f(are)1110 3605 y(con)m(v)m(erted)i(to)f(upp)s(er-case.)40 +b(The)30 b(lo)m(w)m(er-case)j(attribute)e(is)g(disabled.)630 +3751 y Ft(-x)384 b Fu(Mark)30 b(eac)m(h)h Fr(name)k Fu(for)29 b(exp)s(ort)h(to)g(subsequen)m(t)f(commands)h(via)g(the)g(en)m(vi-)1110 -4384 y(ronmen)m(t.)630 4547 y(Using)e(`)p Fs(+)p Ft(')h(instead)f(of)g -(`)p Fs(-)p Ft(')g(turns)f(o\013)i(the)f(attribute)h(instead,)g(with)f -(the)g(exceptions)h(that)630 4656 y(`)p Fs(+a)p Ft(')h(ma)m(y)h(not)f +3861 y(ronmen)m(t.)630 4007 y(Using)e(`)p Ft(+)p Fu(')h(instead)f(of)g +(`)p Ft(-)p Fu(')g(turns)f(o\013)i(the)f(attribute)h(instead,)g(with)f +(the)g(exceptions)h(that)630 4116 y(`)p Ft(+a)p Fu(')h(ma)m(y)h(not)f (b)s(e)f(used)g(to)i(destro)m(y)g(an)f(arra)m(y)g(v)-5 -b(ariable)31 b(and)f(`)p Fs(+r)p Ft(')g(will)g(not)g(remo)m(v)m(e)i -(the)630 4766 y(readonly)e(attribute.)41 b(When)30 b(used)f(in)g(a)h -(function,)g Fs(declare)e Ft(mak)m(es)j(eac)m(h)f Fq(name)35 -b Ft(lo)s(cal,)630 4875 y(as)30 b(with)g(the)h Fs(local)e -Ft(command,)h(unless)f(the)i(`)p Fs(-g)p Ft(')f(option)g(is)h(used.)40 -b(If)29 b(a)i(v)-5 b(ariable)31 b(name)630 4985 y(is)f(follo)m(w)m(ed)i -(b)m(y)f(=)p Fq(v)-5 b(alue)5 b Ft(,)31 b(the)f(v)-5 -b(alue)31 b(of)g(the)f(v)-5 b(ariable)31 b(is)g(set)g(to)g -Fq(v)-5 b(alue)5 b Ft(.)630 5121 y(The)35 b(return)f(status)i(is)g -(zero)g(unless)f(an)g(in)m(v)-5 b(alid)36 b(option)g(is)g(encoun)m -(tered,)h(an)f(attempt)630 5230 y(is)c(made)g(to)g(de\014ne)f(a)h -(function)g(using)f(`)p Fs(-f)f(foo=bar)p Ft(',)h(an)h(attempt)g(is)g -(made)g(to)h(assign)630 5340 y(a)42 b(v)-5 b(alue)43 -b(to)g(a)f(readonly)g(v)-5 b(ariable,)47 b(an)42 b(attempt)h(is)f(made) -g(to)h(assign)f(a)h(v)-5 b(alue)42 b(to)h(an)p eop end -%%Page: 52 58 -TeXDict begin 52 57 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(52)630 299 y(arra)m(y)30 -b(v)-5 b(ariable)30 b(without)g(using)e(the)i(comp)s(ound)e(assignmen)m -(t)i(syn)m(tax)g(\(see)h(Section)f(6.7)630 408 y([Arra)m(ys],)47 -b(page)c(89\),)48 b(one)43 b(of)g(the)g Fq(names)k Ft(is)c(not)g(a)g(v) --5 b(alid)43 b(shell)g(v)-5 b(ariable)44 b(name,)i(an)630 -518 y(attempt)28 b(is)f(made)h(to)f(turn)f(o\013)i(readonly)f(status)g +b(ariable)31 b(and)f(`)p Ft(+r)p Fu(')g(will)g(not)g(remo)m(v)m(e)i +(the)630 4226 y(readonly)e(attribute.)41 b(When)30 b(used)f(in)g(a)h +(function,)g Ft(declare)e Fu(mak)m(es)j(eac)m(h)f Fr(name)35 +b Fu(lo)s(cal,)630 4335 y(as)f(with)f(the)g Ft(local)f +Fu(command,)i(unless)f(the)g Ft(-g)g Fu(option)h(is)f(used.)49 +b(If)33 b(a)h(v)-5 b(ariable)34 b(name)630 4445 y(is)c(follo)m(w)m(ed)i +(b)m(y)f(=)p Fr(v)-5 b(alue)p Fu(,)30 b(the)h(v)-5 b(alue)31 +b(of)f(the)h(v)-5 b(ariable)31 b(is)g(set)g(to)g Fr(v)-5 +b(alue)p Fu(.)630 4573 y(The)35 b(return)f(status)i(is)g(zero)g(unless) +f(an)g(in)m(v)-5 b(alid)36 b(option)g(is)g(encoun)m(tered,)h(an)f +(attempt)630 4682 y(is)c(made)g(to)g(de\014ne)f(a)h(function)g(using)f +(`)p Ft(-f)f(foo=bar)p Fu(',)h(an)h(attempt)g(is)g(made)g(to)h(assign) +630 4792 y(a)42 b(v)-5 b(alue)43 b(to)g(a)f(readonly)g(v)-5 +b(ariable,)47 b(an)42 b(attempt)h(is)f(made)g(to)h(assign)f(a)h(v)-5 +b(alue)42 b(to)h(an)630 4902 y(arra)m(y)30 b(v)-5 b(ariable)30 +b(without)g(using)e(the)i(comp)s(ound)e(assignmen)m(t)i(syn)m(tax)g +(\(see)h(Section)f(6.7)630 5011 y([Arra)m(ys],)47 b(page)c(89\),)48 +b(one)43 b(of)g(the)g Fr(names)k Fu(is)c(not)g(a)g(v)-5 +b(alid)43 b(shell)g(v)-5 b(ariable)44 b(name,)i(an)630 +5121 y(attempt)28 b(is)f(made)h(to)f(turn)f(o\013)i(readonly)f(status)g (for)g(a)h(readonly)f(v)-5 b(ariable,)29 b(an)e(attempt)630 -628 y(is)h(made)h(to)g(turn)e(o\013)i(arra)m(y)f(status)h(for)f(an)g +5230 y(is)h(made)h(to)g(turn)e(o\013)i(arra)m(y)f(status)h(for)f(an)g (arra)m(y)h(v)-5 b(ariable,)30 b(or)e(an)g(attempt)i(is)e(made)g(to)630 -737 y(displa)m(y)j(a)f(non-existen)m(t)i(function)e(with)g(`)p -Fs(-f)p Ft('.)150 909 y Fs(echo)870 1050 y(echo)47 b([-neE])f([)p -Fi(arg)57 b Fs(...)o(])630 1191 y Ft(Output)31 b(the)i -Fq(arg)8 b Ft(s,)33 b(separated)g(b)m(y)g(spaces,)g(terminated)g(with)f -(a)h(newline.)47 b(The)32 b(return)630 1301 y(status)27 -b(is)g(0)h(unless)e(a)i(write)f(error)f(o)s(ccurs.)40 -b(If)26 b(`)p Fs(-n)p Ft(')h(is)g(sp)s(eci\014ed,)h(the)f(trailing)h -(newline)f(is)630 1410 y(suppressed.)37 b(If)24 b(the)g(`)p -Fs(-e)p Ft(')h(option)g(is)f(giv)m(en,)j(in)m(terpretation)f(of)e(the)h -(follo)m(wing)h(bac)m(kslash-)630 1520 y(escap)s(ed)38 -b(c)m(haracters)i(is)f(enabled.)65 b(The)38 b(`)p Fs(-E)p -Ft(')g(option)h(disables)f(the)h(in)m(terpretation)h(of)630 -1630 y(these)27 b(escap)s(e)g(c)m(haracters,)i(ev)m(en)e(on)g(systems)f +5340 y(displa)m(y)j(a)f(non-existen)m(t)i(function)e(with)g +Ft(-f)p Fu(.)p eop end +%%Page: 52 58 +TeXDict begin 52 57 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(52)150 299 y Ft(echo)870 +434 y(echo)47 b([-neE])f([)p Fj(arg)g Ft(...])630 568 +y Fu(Output)31 b(the)i Fr(arg)8 b Fu(s,)33 b(separated)g(b)m(y)g +(spaces,)g(terminated)g(with)f(a)h(newline.)47 b(The)32 +b(return)630 678 y(status)f(is)f(0)h(unless)f(a)h(write)g(error)f(o)s +(ccurs.)41 b(If)30 b Ft(-n)g Fu(is)h(sp)s(eci\014ed,)f(the)h(trailing)g +(newline)g(is)630 787 y(suppressed.)38 b(If)29 b(the)h +Ft(-e)f Fu(option)h(is)f(giv)m(en,)i(in)m(terpretation)g(of)e(the)h +(follo)m(wing)h(bac)m(kslash-)630 897 y(escap)s(ed)43 +b(c)m(haracters)h(is)e(enabled.)78 b(The)42 b Ft(-E)g +Fu(option)h(disables)g(the)g(in)m(terpretation)h(of)630 +1007 y(these)27 b(escap)s(e)g(c)m(haracters,)i(ev)m(en)e(on)g(systems)f (where)g(they)h(are)g(in)m(terpreted)g(b)m(y)f(default.)630 -1739 y(The)32 b Fs(xpg_echo)f Ft(shell)i(option)g(ma)m(y)h(b)s(e)e +1116 y(The)32 b Ft(xpg_echo)f Fu(shell)i(option)g(ma)m(y)h(b)s(e)e (used)g(to)h(dynamically)h(determine)f(whether)f(or)630 -1849 y(not)h Fs(echo)f Ft(expands)g(these)h(escap)s(e)h(c)m(haracters)g -(b)m(y)f(default.)48 b Fs(echo)32 b Ft(do)s(es)g(not)i(in)m(terpret)630 -1958 y(`)p Fs(--)p Ft(')c(to)h(mean)g(the)f(end)g(of)h(options.)630 -2099 y Fs(echo)e Ft(in)m(terprets)i(the)f(follo)m(wing)i(escap)s(e)f -(sequences:)630 2271 y Fs(\\a)384 b Ft(alert)31 b(\(b)s(ell\))630 -2444 y Fs(\\b)384 b Ft(bac)m(kspace)630 2616 y Fs(\\c)g -Ft(suppress)28 b(further)h(output)630 2788 y Fs(\\e)630 -2898 y(\\E)384 b Ft(escap)s(e)630 3070 y Fs(\\f)g Ft(form)30 -b(feed)630 3242 y Fs(\\n)384 b Ft(new)30 b(line)630 3414 -y Fs(\\r)384 b Ft(carriage)32 b(return)630 3587 y Fs(\\t)384 -b Ft(horizon)m(tal)32 b(tab)630 3759 y Fs(\\v)384 b Ft(v)m(ertical)32 -b(tab)630 3931 y Fs(\\\\)384 b Ft(bac)m(kslash)630 4103 -y Fs(\\0)p Fi(nnn)240 b Ft(the)32 b(eigh)m(t-bit)i(c)m(haracter)g +1226 y(not)h Ft(echo)f Fu(expands)g(these)h(escap)s(e)h(c)m(haracters)g +(b)m(y)f(default.)48 b Ft(echo)32 b Fu(do)s(es)g(not)i(in)m(terpret)630 +1335 y Ft(--)c Fu(to)h(mean)f(the)h(end)f(of)g(options.)630 +1470 y Ft(echo)f Fu(in)m(terprets)i(the)f(follo)m(wing)i(escap)s(e)f +(sequences:)630 1630 y Ft(\\a)384 b Fu(alert)31 b(\(b)s(ell\))630 +1789 y Ft(\\b)384 b Fu(bac)m(kspace)630 1949 y Ft(\\c)g +Fu(suppress)28 b(further)h(output)630 2109 y Ft(\\e)630 +2218 y(\\E)384 b Fu(escap)s(e)630 2378 y Ft(\\f)g Fu(form)30 +b(feed)630 2538 y Ft(\\n)384 b Fu(new)30 b(line)630 2697 +y Ft(\\r)384 b Fu(carriage)32 b(return)630 2857 y Ft(\\t)384 +b Fu(horizon)m(tal)32 b(tab)630 3017 y Ft(\\v)384 b Fu(v)m(ertical)32 +b(tab)630 3176 y Ft(\\\\)384 b Fu(bac)m(kslash)630 3336 +y Ft(\\0)p Fj(nnn)240 b Fu(the)32 b(eigh)m(t-bit)i(c)m(haracter)g (whose)e(v)-5 b(alue)33 b(is)f(the)g(o)s(ctal)i(v)-5 -b(alue)32 b Fq(nnn)f Ft(\(zero)i(to)1110 4213 y(three)e(o)s(ctal)g -(digits\))630 4385 y Fs(\\x)p Fi(HH)288 b Ft(the)40 b(eigh)m(t-bit)h(c) -m(haracter)g(whose)e(v)-5 b(alue)39 b(is)h(the)f(hexadecimal)i(v)-5 -b(alue)40 b Fq(HH)1110 4495 y Ft(\(one)31 b(or)f(t)m(w)m(o)i(hex)e -(digits\))630 4667 y Fs(\\u)p Fi(HHHH)192 b Ft(the)41 +b(alue)32 b Fr(nnn)f Fu(\(zero)i(to)1110 3446 y(three)e(o)s(ctal)g +(digits\))630 3605 y Ft(\\x)p Fj(HH)288 b Fu(the)38 b(eigh)m(t-bit)i(c) +m(haracter)g(whose)e(v)-5 b(alue)39 b(is)f(the)h(hexadecimal)g(v)-5 +b(alue)39 b Fr(HH)1110 3715 y Fu(\(one)31 b(or)f(t)m(w)m(o)i(hex)e +(digits\))630 3875 y Ft(\\u)p Fj(HHHH)192 b Fu(the)41 b(Unico)s(de)g(\(ISO/IEC)f(10646\))j(c)m(haracter)g(whose)e(v)-5 -b(alue)41 b(is)g(the)g(hex-)1110 4776 y(adecimal)32 b(v)-5 -b(alue)31 b Fq(HHHH)41 b Ft(\(one)31 b(to)g(four)e(hex)h(digits\))630 -4949 y Fs(\\U)p Fi(HHHHHHHH)1110 5058 y Ft(the)41 b(Unico)s(de)g +b(alue)41 b(is)g(the)g(hex-)1110 3984 y(adecimal)32 b(v)-5 +b(alue)31 b Fr(HHHH)41 b Fu(\(one)31 b(to)g(four)e(hex)h(digits\))630 +4144 y Ft(\\U)p Fj(HHHHHHHH)1110 4253 y Fu(the)41 b(Unico)s(de)g (\(ISO/IEC)f(10646\))j(c)m(haracter)g(whose)e(v)-5 b(alue)41 -b(is)g(the)g(hex-)1110 5168 y(adecimal)32 b(v)-5 b(alue)31 -b Fq(HHHHHHHH)41 b Ft(\(one)31 b(to)g(eigh)m(t)h(hex)e(digits\))150 -5340 y Fs(enable)p eop end +b(is)g(the)g(hex-)1110 4363 y(adecimal)32 b(v)-5 b(alue)31 +b Fr(HHHHHHHH)41 b Fu(\(one)31 b(to)g(eigh)m(t)h(hex)e(digits\))150 +4523 y Ft(enable)870 4657 y(enable)46 b([-a])h([-dnps])f([-f)g +Fj(filename)p Ft(])g([)p Fj(name)g Ft(...)o(])630 4792 +y Fu(Enable)36 b(and)f(disable)h(builtin)g(shell)g(commands.)56 +b(Disabling)37 b(a)g(builtin)e(allo)m(ws)i(a)f(disk)630 +4902 y(command)e(whic)m(h)g(has)g(the)g(same)h(name)f(as)h(a)f(shell)h +(builtin)e(to)i(b)s(e)f(executed)h(without)630 5011 y(sp)s(ecifying)27 +b(a)g(full)g(pathname,)g(ev)m(en)h(though)f(the)g(shell)g(normally)g +(searc)m(hes)h(for)f(builtins)630 5121 y(b)s(efore)35 +b(disk)g(commands.)55 b(If)35 b Ft(-n)g Fu(is)g(used,)h(the)g +Fr(name)5 b Fu(s)35 b(b)s(ecome)h(disabled.)55 b(Otherwise)630 +5230 y Fr(name)5 b Fu(s)44 b(are)h(enabled.)82 b(F)-8 +b(or)45 b(example,)k(to)c(use)f(the)g Ft(test)f Fu(binary)h(found)f +(via)h Ft($PATH)630 5340 y Fu(instead)31 b(of)f(the)h(shell)f(builtin)g +(v)m(ersion,)h(t)m(yp)s(e)g(`)p Ft(enable)e(-n)h(test)p +Fu('.)p eop end %%Page: 53 59 -TeXDict begin 53 58 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(53)870 299 y Fs(enable)46 -b([-a])h([-dnps])f([-f)g Fi(filename)11 b Fs(])45 b([)p -Fi(name)57 b Fs(...)o(])630 434 y Ft(Enable)36 b(and)f(disable)h -(builtin)g(shell)g(commands.)56 b(Disabling)37 b(a)g(builtin)e(allo)m -(ws)i(a)f(disk)630 543 y(command)e(whic)m(h)g(has)g(the)g(same)h(name)f -(as)h(a)f(shell)h(builtin)e(to)i(b)s(e)f(executed)h(without)630 -653 y(sp)s(ecifying)27 b(a)g(full)g(pathname,)g(ev)m(en)h(though)f(the) -g(shell)g(normally)g(searc)m(hes)h(for)f(builtins)630 -763 y(b)s(efore)32 b(disk)f(commands.)46 b(If)31 b(`)p -Fs(-n)p Ft(')h(is)g(used,)g(the)g Fq(name)5 b Ft(s)32 -b(b)s(ecome)h(disabled.)45 b(Otherwise)630 872 y Fq(name)5 -b Ft(s)44 b(are)h(enabled.)82 b(F)-8 b(or)45 b(example,)k(to)c(use)f -(the)g Fs(test)f Ft(binary)h(found)f(via)h Fs($PATH)630 -982 y Ft(instead)31 b(of)f(the)h(shell)f(builtin)g(v)m(ersion,)h(t)m -(yp)s(e)g(`)p Fs(enable)e(-n)h(test)p Ft('.)630 1117 -y(If)42 b(the)h(`)p Fs(-p)p Ft(')f(option)h(is)f(supplied,)j(or)d(no)h -Fq(name)k Ft(argumen)m(ts)c(app)s(ear,)i(a)e(list)g(of)g(shell)630 -1226 y(builtins)37 b(is)h(prin)m(ted.)63 b(With)38 b(no)f(other)h -(argumen)m(ts,)j(the)d(list)g(consists)g(of)g(all)h(enabled)630 -1336 y(shell)33 b(builtins.)46 b(The)32 b(`)p Fs(-a)p -Ft(')h(option)g(means)f(to)i(list)f(eac)m(h)h(builtin)e(with)g(an)g -(indication)i(of)630 1445 y(whether)c(or)g(not)h(it)g(is)f(enabled.)630 -1580 y(The)40 b(`)p Fs(-f)p Ft(')g(option)g(means)g(to)h(load)g(the)f -(new)f(builtin)h(command)g Fq(name)45 b Ft(from)40 b(shared)630 -1690 y(ob)5 b(ject)26 b Fq(\014lename)5 b Ft(,)28 b(on)d(systems)h -(that)g(supp)s(ort)e(dynamic)h(loading.)40 b(The)25 b(`)p -Fs(-d)p Ft(')h(option)g(will)630 1799 y(delete)32 b(a)e(builtin)g -(loaded)h(with)f(`)p Fs(-f)p Ft('.)630 1934 y(If)h(there)g(are)g(no)g -(options,)h(a)f(list)h(of)f(the)g(shell)g(builtins)g(is)g(displa)m(y)m -(ed.)43 b(The)31 b(`)p Fs(-s)p Ft(')f(option)630 2044 -y(restricts)f Fs(enable)e Ft(to)i(the)f Fl(posix)g Ft(sp)s(ecial)h -(builtins.)40 b(If)27 b(`)p Fs(-s)p Ft(')i(is)f(used)g(with)g(`)p -Fs(-f)p Ft(',)h(the)f(new)630 2153 y(builtin)i(b)s(ecomes)h(a)f(sp)s -(ecial)h(builtin)f(\(see)i(Section)f(4.4)g([Sp)s(ecial)g(Builtins],)g -(page)g(68\).)630 2288 y(The)26 b(return)f(status)h(is)g(zero)h(unless) -e(a)i Fq(name)k Ft(is)26 b(not)g(a)h(shell)f(builtin)g(or)g(there)g(is) -g(an)g(error)630 2398 y(loading)31 b(a)g(new)f(builtin)g(from)g(a)g -(shared)g(ob)5 b(ject.)150 2558 y Fs(help)870 2693 y(help)47 -b([-dms])f([)p Fi(pattern)11 b Fs(])630 2828 y Ft(Displa)m(y)40 -b(helpful)e(information)h(ab)s(out)g(builtin)f(commands.)66 -b(If)38 b Fq(pattern)h Ft(is)g(sp)s(eci\014ed,)630 2937 -y Fs(help)28 b Ft(giv)m(es)i(detailed)g(help)e(on)h(all)h(commands)e -(matc)m(hing)i Fq(pattern)p Ft(,)g(otherwise)f(a)g(list)h(of)630 -3047 y(the)h(builtins)e(is)i(prin)m(ted.)630 3182 y(Options,)f(if)h -(supplied,)e(ha)m(v)m(e)i(the)g(follo)m(wing)h(meanings:)630 -3342 y Fs(-d)384 b Ft(Displa)m(y)32 b(a)e(short)g(description)h(of)f -(eac)m(h)i Fq(pattern)630 3502 y Fs(-m)384 b Ft(Displa)m(y)32 -b(the)e(description)g(of)h(eac)m(h)h Fq(pattern)e Ft(in)g(a)h -(manpage-lik)m(e)h(format)630 3662 y Fs(-s)384 b Ft(Displa)m(y)32 -b(only)e(a)h(short)f(usage)h(synopsis)e(for)i(eac)m(h)g -Fq(pattern)630 3823 y Ft(The)f(return)f(status)i(is)f(zero)h(unless)f -(no)g(command)h(matc)m(hes)g Fq(pattern)p Ft(.)150 3983 -y Fs(let)870 4118 y(let)47 b Fi(expression)55 b Fs([)p -Fi(expression)h Fs(...)o(])630 4253 y Ft(The)41 b Fs(let)g -Ft(builtin)g(allo)m(ws)i(arithmetic)f(to)h(b)s(e)d(p)s(erformed)g(on)i -(shell)g(v)-5 b(ariables.)74 b(Eac)m(h)630 4362 y Fq(expression)31 -b Ft(is)g(ev)-5 b(aluated)32 b(according)f(to)h(the)f(rules)g(giv)m(en) -h(b)s(elo)m(w)f(in)f(Section)i(6.5)g([Shell)630 4472 -y(Arithmetic],)51 b(page)46 b(87.)87 b(If)45 b(the)g(last)h -Fq(expression)g Ft(ev)-5 b(aluates)47 b(to)f(0,)k Fs(let)44 -b Ft(returns)g(1;)630 4581 y(otherwise)31 b(0)g(is)f(returned.)150 -4741 y Fs(local)870 4876 y(local)46 b([)p Fi(option)11 -b Fs(])45 b Fi(name)11 b Fs([=)p Fi(value)g Fs(])44 b(...)630 -5011 y Ft(F)-8 b(or)26 b(eac)m(h)h(argumen)m(t,)g(a)e(lo)s(cal)i(v)-5 -b(ariable)26 b(named)f Fq(name)31 b Ft(is)25 b(created,)j(and)d -(assigned)g Fq(v)-5 b(alue)5 b Ft(.)630 5121 y(The)37 -b Fq(option)h Ft(can)f(b)s(e)g(an)m(y)h(of)f(the)h(options)g(accepted)g -(b)m(y)g Fs(declare)p Ft(.)59 b Fs(local)36 b Ft(can)i(only)630 -5230 y(b)s(e)j(used)h(within)f(a)i(function;)48 b(it)42 -b(mak)m(es)h(the)f(v)-5 b(ariable)43 b Fq(name)48 b Ft(ha)m(v)m(e)43 -b(a)f(visible)h(scop)s(e)630 5340 y(restricted)c(to)g(that)g(function)f -(and)f(its)i(c)m(hildren.)64 b(The)38 b(return)f(status)h(is)h(zero)g -(unless)p eop end +TeXDict begin 53 58 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(53)630 299 y(If)45 +b(the)i Ft(-p)e Fu(option)h(is)g(supplied,)j(or)d(no)g +Fr(name)51 b Fu(argumen)m(ts)46 b(app)s(ear,)k(a)c(list)h(of)f(shell) +630 408 y(builtins)37 b(is)h(prin)m(ted.)63 b(With)38 +b(no)f(other)h(argumen)m(ts,)j(the)d(list)g(consists)g(of)g(all)h +(enabled)630 518 y(shell)d(builtins.)57 b(The)35 b Ft(-a)h +Fu(option)g(means)g(to)g(list)h(eac)m(h)g(builtin)f(with)f(an)h +(indication)h(of)630 628 y(whether)30 b(or)g(not)h(it)g(is)f(enabled.) +630 763 y(The)22 b Ft(-f)f Fu(option)h(means)g(to)h(load)g(the)f(new)g +(builtin)f(command)h Fr(name)27 b Fu(from)22 b(shared)f(ob)5 +b(ject)630 872 y Fr(\014lename)p Fu(,)33 b(on)e(systems)h(that)h(supp)s +(ort)d(dynamic)i(loading.)46 b(The)31 b Ft(-d)g Fu(option)h(will)h +(delete)630 982 y(a)e(builtin)f(loaded)h(with)f Ft(-f)p +Fu(.)630 1117 y(If)j(there)i(are)f(no)g(options,)h(a)f(list)h(of)f(the) +g(shell)g(builtins)g(is)g(displa)m(y)m(ed.)52 b(The)33 +b Ft(-s)g Fu(option)630 1227 y(restricts)j Ft(enable)d +Fu(to)j(the)f Fm(posix)f Fu(sp)s(ecial)i(builtins.)54 +b(If)34 b Ft(-s)h Fu(is)g(used)f(with)g Ft(-f)p Fu(,)i(the)f(new)630 +1336 y(builtin)30 b(b)s(ecomes)h(a)f(sp)s(ecial)h(builtin)f(\(see)i +(Section)f(4.4)g([Sp)s(ecial)g(Builtins],)g(page)g(68\).)630 +1471 y(The)26 b(return)f(status)h(is)g(zero)h(unless)e(a)i +Fr(name)k Fu(is)26 b(not)g(a)h(shell)f(builtin)g(or)g(there)g(is)g(an)g +(error)630 1581 y(loading)31 b(a)g(new)f(builtin)g(from)g(a)g(shared)g +(ob)5 b(ject.)150 1742 y Ft(help)870 1877 y(help)47 b([-dms])f([)p +Fj(pattern)p Ft(])630 2012 y Fu(Displa)m(y)40 b(helpful)e(information)h +(ab)s(out)g(builtin)f(commands.)66 b(If)38 b Fr(pattern)h +Fu(is)g(sp)s(eci\014ed,)630 2122 y Ft(help)28 b Fu(giv)m(es)i(detailed) +g(help)e(on)h(all)h(commands)e(matc)m(hing)i Fr(pattern)p +Fu(,)g(otherwise)f(a)g(list)h(of)630 2231 y(the)h(builtins)e(is)i(prin) +m(ted.)630 2366 y(Options,)f(if)h(supplied,)e(ha)m(v)m(e)i(the)g(follo) +m(wing)h(meanings:)630 2527 y Ft(-d)384 b Fu(Displa)m(y)32 +b(a)e(short)g(description)h(of)f(eac)m(h)i Fr(pattern)630 +2688 y Ft(-m)384 b Fu(Displa)m(y)32 b(the)e(description)g(of)h(eac)m(h) +h Fr(pattern)e Fu(in)g(a)h(manpage-lik)m(e)h(format)630 +2849 y Ft(-s)384 b Fu(Displa)m(y)32 b(only)e(a)h(short)f(usage)h +(synopsis)e(for)i(eac)m(h)g Fr(pattern)630 3009 y Fu(The)f(return)f +(status)i(is)f(zero)h(unless)f(no)g(command)h(matc)m(hes)g +Fr(pattern)p Fu(.)150 3170 y Ft(let)870 3305 y(let)47 +b Fj(expression)e Ft([)p Fj(expression)g Ft(...)o(])630 +3440 y Fu(The)c Ft(let)g Fu(builtin)g(allo)m(ws)i(arithmetic)f(to)h(b)s +(e)d(p)s(erformed)g(on)i(shell)g(v)-5 b(ariables.)74 +b(Eac)m(h)630 3550 y Fr(expression)31 b Fu(is)g(ev)-5 +b(aluated)32 b(according)f(to)h(the)f(rules)g(giv)m(en)h(b)s(elo)m(w)f +(in)f(Section)i(6.5)g([Shell)630 3660 y(Arithmetic],)51 +b(page)46 b(87.)87 b(If)45 b(the)g(last)h Fr(expression)g +Fu(ev)-5 b(aluates)47 b(to)f(0,)k Ft(let)44 b Fu(returns)g(1;)630 +3769 y(otherwise)31 b(0)g(is)f(returned.)150 3930 y Ft(local)870 +4065 y(local)46 b([)p Fj(option)p Ft(])g Fj(name)p Ft([=)p +Fj(value)p Ft(])e(...)630 4200 y Fu(F)-8 b(or)27 b(eac)m(h)g(argumen)m +(t,)g(a)f(lo)s(cal)h(v)-5 b(ariable)27 b(named)e Fr(name)31 +b Fu(is)26 b(created,)i(and)d(assigned)h Fr(v)-5 b(alue)p +Fu(.)630 4310 y(The)37 b Fr(option)h Fu(can)f(b)s(e)g(an)m(y)h(of)f +(the)h(options)g(accepted)g(b)m(y)g Ft(declare)p Fu(.)59 +b Ft(local)36 b Fu(can)i(only)630 4419 y(b)s(e)j(used)h(within)f(a)i +(function;)48 b(it)42 b(mak)m(es)h(the)f(v)-5 b(ariable)43 +b Fr(name)48 b Fu(ha)m(v)m(e)43 b(a)f(visible)h(scop)s(e)630 +4529 y(restricted)c(to)g(that)g(function)f(and)f(its)i(c)m(hildren.)64 +b(The)38 b(return)f(status)h(is)h(zero)g(unless)630 4639 +y Ft(local)g Fu(is)h(used)g(outside)g(a)h(function,)h(an)e(in)m(v)-5 +b(alid)41 b Fr(name)46 b Fu(is)40 b(supplied,)i(or)e +Fr(name)45 b Fu(is)c(a)630 4748 y(readonly)30 b(v)-5 +b(ariable.)150 4909 y Ft(logout)870 5044 y(logout)46 +b([)p Fj(n)p Ft(])630 5179 y Fu(Exit)31 b(a)g(login)g(shell,)g +(returning)e(a)i(status)g(of)f Fr(n)g Fu(to)h(the)g(shell's)f(paren)m +(t.)150 5340 y Ft(mapfile)p eop end %%Page: 54 60 -TeXDict begin 54 59 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(54)630 299 y Fs(local)39 -b Ft(is)h(used)g(outside)g(a)h(function,)h(an)e(in)m(v)-5 -b(alid)41 b Fq(name)46 b Ft(is)40 b(supplied,)i(or)e -Fq(name)45 b Ft(is)c(a)630 408 y(readonly)30 b(v)-5 b(ariable.)150 -565 y Fs(logout)870 697 y(logout)46 b([)p Fi(n)11 b Fs(])630 -830 y Ft(Exit)31 b(a)g(login)g(shell,)g(returning)e(a)i(status)g(of)f -Fq(n)g Ft(to)h(the)g(shell's)f(paren)m(t.)150 986 y Fs(mapfile)870 -1119 y(mapfile)46 b([-n)h Fi(count)11 b Fs(])45 b([-O)i -Fi(origin)11 b Fs(])46 b([-s)g Fi(count)11 b Fs(])46 -b([-t])h([-u)g Fi(fd)11 b Fs(])1061 1229 y([-C)47 b Fi(callback)11 -b Fs(])45 b([-c)i Fi(quantum)11 b Fs(])45 b([)p Fi(array)11 -b Fs(])630 1362 y Ft(Read)37 b(lines)g(from)f(the)h(standard)f(input)g -(in)m(to)h(the)g(indexed)f(arra)m(y)i(v)-5 b(ariable)37 -b Fq(arra)m(y)8 b Ft(,)39 b(or)630 1471 y(from)c(\014le)h(descriptor)g -Fq(fd)j Ft(if)d(the)g(`)p Fs(-u)p Ft(')g(option)g(is)g(supplied.)56 -b(The)35 b(v)-5 b(ariable)37 b Fs(MAPFILE)d Ft(is)630 -1581 y(the)d(default)f Fq(arra)m(y)8 b Ft(.)41 b(Options,)30 -b(if)h(supplied,)e(ha)m(v)m(e)j(the)e(follo)m(wing)i(meanings:)630 -1737 y Fs(-n)384 b Ft(Cop)m(y)30 b(at)h(most)g Fq(coun)m(t)i -Ft(lines.)41 b(If)30 b Fq(coun)m(t)j Ft(is)d(0,)h(all)h(lines)e(are)h -(copied.)630 1893 y Fs(-O)384 b Ft(Begin)31 b(assigning)g(to)g -Fq(arra)m(y)39 b Ft(at)31 b(index)f Fq(origin)p Ft(.)41 -b(The)30 b(default)h(index)f(is)g(0.)630 2049 y Fs(-s)384 -b Ft(Discard)31 b(the)f(\014rst)g Fq(coun)m(t)j Ft(lines)e(read.)630 -2205 y Fs(-t)384 b Ft(Remo)m(v)m(e)32 b(a)f(trailing)g(newline)g(from)f -(eac)m(h)h(line)g(read.)630 2361 y Fs(-u)384 b Ft(Read)31 -b(lines)f(from)g(\014le)h(descriptor)f Fq(fd)j Ft(instead)e(of)f(the)h -(standard)e(input.)630 2517 y Fs(-C)384 b Ft(Ev)-5 b(aluate)43 -b Fq(callbac)m(k)49 b Ft(eac)m(h)42 b(time)g Fq(quan)m(tum)p -Ft(P)f(lines)h(are)f(read.)74 b(The)41 b(`)p Fs(-c)p -Ft(')1110 2627 y(option)31 b(sp)s(eci\014es)f Fq(quan)m(tum)p -Ft(.)630 2783 y Fs(-c)384 b Ft(Sp)s(ecify)30 b(the)g(n)m(um)m(b)s(er)f -(of)i(lines)f(read)h(b)s(et)m(w)m(een)g(eac)m(h)g(call)h(to)f -Fq(callbac)m(k)6 b Ft(.)630 2939 y(If)36 b(`)p Fs(-C)p -Ft(')g(is)h(sp)s(eci\014ed)f(without)g(`)p Fs(-c)p Ft(',)i(the)f -(default)f(quan)m(tum)g(is)h(5000.)61 b(When)36 b Fq(callbac)m(k)630 -3049 y Ft(is)e(ev)-5 b(aluated,)36 b(it)f(is)f(supplied)f(the)h(index)f -(of)h(the)h(next)f(arra)m(y)g(elemen)m(t)i(to)e(b)s(e)g(assigned)630 -3158 y(and)f(the)g(line)h(to)f(b)s(e)g(assigned)g(to)h(that)g(elemen)m -(t)h(as)e(additional)h(argumen)m(ts.)50 b Fq(callbac)m(k)630 -3268 y Ft(is)30 b(ev)-5 b(aluated)32 b(after)f(the)f(line)h(is)g(read)f -(but)g(b)s(efore)f(the)i(arra)m(y)g(elemen)m(t)h(is)e(assigned.)630 -3401 y(If)25 b(not)g(supplied)f(with)h(an)g(explicit)i(origin,)g -Fs(mapfile)c Ft(will)j(clear)g Fq(arra)m(y)34 b Ft(b)s(efore)24 -b(assigning)630 3510 y(to)31 b(it.)630 3643 y Fs(mapfile)41 -b Ft(returns)g(successfully)i(unless)e(an)i(in)m(v)-5 +TeXDict begin 54 59 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(54)870 299 y Ft(mapfile)46 +b([-n)h Fj(count)p Ft(])f([-O)h Fj(origin)p Ft(])f([-s)g +Fj(count)p Ft(])h([-t])f([-u)h Fj(fd)p Ft(])1061 408 +y([-C)g Fj(callback)p Ft(])e([-c)i Fj(quantum)p Ft(])f([)p +Fj(array)p Ft(])630 540 y Fu(Read)38 b(lines)f(from)g(the)h(standard)e +(input)g(in)m(to)j(the)e(indexed)g(arra)m(y)h(v)-5 b(ariable)38 +b Fr(arra)m(y)p Fu(,)i(or)630 650 y(from)28 b(\014le)h(descriptor)f +Fr(fd)k Fu(if)c(the)h Ft(-u)f Fu(option)h(is)g(supplied.)39 +b(The)28 b(v)-5 b(ariable)29 b Ft(MAPFILE)e Fu(is)i(the)630 +759 y(default)i Fr(arra)m(y)p Fu(.)41 b(Options,)30 b(if)g(supplied,)g +(ha)m(v)m(e)h(the)g(follo)m(wing)h(meanings:)630 913 +y Ft(-n)384 b Fu(Cop)m(y)30 b(at)h(most)g Fr(coun)m(t)i +Fu(lines.)41 b(If)30 b Fr(coun)m(t)j Fu(is)d(0,)h(all)h(lines)e(are)h +(copied.)630 1066 y Ft(-O)384 b Fu(Begin)31 b(assigning)g(to)g +Fr(arra)m(y)39 b Fu(at)31 b(index)f Fr(origin)p Fu(.)41 +b(The)30 b(default)h(index)f(is)g(0.)630 1219 y Ft(-s)384 +b Fu(Discard)31 b(the)f(\014rst)g Fr(coun)m(t)j Fu(lines)e(read.)630 +1373 y Ft(-t)384 b Fu(Remo)m(v)m(e)32 b(a)f(trailing)g(newline)g(from)f +(eac)m(h)h(line)g(read.)630 1526 y Ft(-u)384 b Fu(Read)31 +b(lines)f(from)g(\014le)h(descriptor)f Fr(fd)j Fu(instead)e(of)f(the)h +(standard)e(input.)630 1680 y Ft(-C)384 b Fu(Ev)-5 b(aluate)33 +b Fr(callbac)m(k)39 b Fu(eac)m(h)33 b(time)f Fr(quan)m(tum)p +Fu(P)f(lines)h(are)g(read.)45 b(The)31 b Ft(-c)g Fu(op-)1110 +1789 y(tion)g(sp)s(eci\014es)f Fr(quan)m(tum)p Fu(.)630 +1943 y Ft(-c)384 b Fu(Sp)s(ecify)30 b(the)g(n)m(um)m(b)s(er)f(of)i +(lines)f(read)h(b)s(et)m(w)m(een)g(eac)m(h)g(call)h(to)f +Fr(callbac)m(k)p Fu(.)630 2096 y(If)36 b Ft(-C)g Fu(is)g(sp)s +(eci\014ed)g(without)g Ft(-c)p Fu(,)h(the)g(default)f(quan)m(tum)g(is)h +(5000.)60 b(When)36 b Fr(callbac)m(k)44 b Fu(is)630 2206 +y(ev)-5 b(aluated,)30 b(it)e(is)g(supplied)f(the)h(index)f(of)i(the)f +(next)g(arra)m(y)g(elemen)m(t)h(to)g(b)s(e)e(assigned)i(and)630 +2315 y(the)39 b(line)g(to)h(b)s(e)e(assigned)h(to)h(that)f(elemen)m(t)i +(as)e(additional)h(argumen)m(ts.)66 b Fr(callbac)m(k)47 +b Fu(is)630 2425 y(ev)-5 b(aluated)32 b(after)e(the)h(line)g(is)f(read) +g(but)g(b)s(efore)g(the)h(arra)m(y)g(elemen)m(t)g(is)g(assigned.)630 +2556 y(If)25 b(not)g(supplied)f(with)h(an)g(explicit)i(origin,)g +Ft(mapfile)c Fu(will)j(clear)g Fr(arra)m(y)34 b Fu(b)s(efore)24 +b(assigning)630 2666 y(to)31 b(it.)630 2798 y Ft(mapfile)41 +b Fu(returns)g(successfully)i(unless)e(an)i(in)m(v)-5 b(alid)43 b(option)g(or)g(option)g(argumen)m(t)g(is)630 -3753 y(supplied,)29 b Fq(arra)m(y)39 b Ft(is)30 b(in)m(v)-5 -b(alid)31 b(or)g(unassignable,)f(or)h Fq(arra)m(y)38 -b Ft(is)31 b(not)f(an)h(indexed)e(arra)m(y)-8 b(.)150 -3909 y Fs(printf)870 4042 y(printf)46 b([-v)h Fi(var)11 -b Fs(])46 b Fi(format)57 b Fs([)p Fi(arguments)11 b Fs(])630 -4174 y Ft(W)-8 b(rite)27 b(the)g(formatted)f Fq(argumen)m(ts)k -Ft(to)d(the)f(standard)f(output)h(under)e(the)i(con)m(trol)i(of)e(the) -630 4284 y Fq(format)r Ft(.)57 b(The)35 b(`)p Fs(-v)p -Ft(')h(option)g(causes)g(the)g(output)g(to)g(b)s(e)f(assigned)h(to)h -(the)e(v)-5 b(ariable)37 b Fq(v)-5 b(ar)630 4394 y Ft(rather)30 -b(than)g(b)s(eing)g(prin)m(ted)g(to)h(the)g(standard)e(output.)630 -4526 y(The)36 b Fq(format)i Ft(is)f(a)f(c)m(haracter)i(string)e(whic)m -(h)g(con)m(tains)i(three)e(t)m(yp)s(es)g(of)h(ob)5 b(jects:)53 -b(plain)630 4636 y(c)m(haracters,)41 b(whic)m(h)c(are)h(simply)e +2907 y(supplied,)29 b Fr(arra)m(y)39 b Fu(is)30 b(in)m(v)-5 +b(alid)31 b(or)g(unassignable,)f(or)h Fr(arra)m(y)38 +b Fu(is)31 b(not)f(an)h(indexed)e(arra)m(y)-8 b(.)150 +3061 y Ft(printf)870 3192 y(printf)46 b([-v)h Fj(var)p +Ft(])g Fj(format)f Ft([)p Fj(arguments)p Ft(])630 3324 +y Fu(W)-8 b(rite)27 b(the)g(formatted)f Fr(argumen)m(ts)k +Fu(to)d(the)f(standard)f(output)h(under)e(the)i(con)m(trol)i(of)e(the) +630 3433 y Fr(format)p Fu(.)66 b(The)39 b Ft(-v)f Fu(option)h(causes)g +(the)g(output)g(to)g(b)s(e)f(assigned)h(to)h(the)f(v)-5 +b(ariable)39 b Fr(v)-5 b(ar)630 3543 y Fu(rather)30 b(than)g(b)s(eing)g +(prin)m(ted)g(to)h(the)g(standard)e(output.)630 3674 +y(The)36 b Fr(format)i Fu(is)f(a)f(c)m(haracter)i(string)e(whic)m(h)g +(con)m(tains)i(three)e(t)m(yp)s(es)g(of)h(ob)5 b(jects:)53 +b(plain)630 3784 y(c)m(haracters,)41 b(whic)m(h)c(are)h(simply)e (copied)i(to)g(standard)f(output,)i(c)m(haracter)g(escap)s(e)e(se-)630 -4746 y(quences,)g(whic)m(h)f(are)g(con)m(v)m(erted)h(and)f(copied)g(to) -g(the)g(standard)f(output,)i(and)f(format)630 4855 y(sp)s -(eci\014cations,)i(eac)m(h)g(of)e(whic)m(h)g(causes)g(prin)m(ting)g(of) -g(the)h(next)f(successiv)m(e)h Fq(argumen)m(t)r Ft(.)630 -4965 y(In)24 b(addition)h(to)g(the)g(standard)f Fs(printf\(1\))e -Ft(formats,)27 b Fs(printf)c Ft(in)m(terprets)i(the)f(follo)m(wing)630 -5074 y(extensions:)630 5230 y Fs(\045b)384 b Ft(Causes)30 -b Fs(printf)e Ft(to)j(expand)f(bac)m(kslash)h(escap)s(e)f(sequences)h -(in)f(the)g(corre-)1110 5340 y(sp)s(onding)19 b Fq(argumen)m(t)r -Ft(,)k(except)f(that)f(`)p Fs(\\c)p Ft(')g(terminates)h(output,)g(bac)m -(kslashes)p eop end +3893 y(quences,)g(whic)m(h)f(are)g(con)m(v)m(erted)h(and)f(copied)g(to) +g(the)g(standard)f(output,)i(and)f(format)630 4003 y(sp)s +(eci\014cations,)j(eac)m(h)e(of)g(whic)m(h)f(causes)g(prin)m(ting)g(of) +h(the)f(next)h(successiv)m(e)g Fr(argumen)m(t)p Fu(.)630 +4113 y(In)24 b(addition)h(to)g(the)g(standard)f Ft(printf\(1\))e +Fu(formats,)27 b Ft(printf)c Fu(in)m(terprets)i(the)f(follo)m(wing)630 +4222 y(extensions:)630 4376 y Ft(\045b)384 b Fu(Causes)30 +b Ft(printf)e Fu(to)j(expand)f(bac)m(kslash)h(escap)s(e)f(sequences)h +(in)f(the)g(corre-)1110 4485 y(sp)s(onding)19 b Fr(argumen)m(t)p +Fu(,)24 b(except)e(that)g(`)p Ft(\\c)p Fu(')e(terminates)i(output,)h +(bac)m(kslashes)1110 4595 y(in)k(`)p Ft(\\')p Fu(',)h(`)p +Ft(\\")p Fu(',)g(and)f(`)p Ft(\\?)p Fu(')g(are)h(not)f(remo)m(v)m(ed,)j +(and)c(o)s(ctal)j(escap)s(es)f(b)s(eginning)1110 4704 +y(with)i(`)p Ft(\\0)p Fu(')g(ma)m(y)h(con)m(tain)h(up)d(to)i(four)f +(digits.)630 4858 y Ft(\045q)384 b Fu(Causes)32 b Ft(printf)e +Fu(to)i(output)g(the)g(corresp)s(onding)f Fr(argumen)m(t)j +Fu(in)d(a)i(format)1110 4967 y(that)e(can)g(b)s(e)e(reused)h(as)h +(shell)f(input.)630 5121 y Ft(\045\()p Fj(datefmt)p Ft(\)T)1110 +5230 y Fu(Causes)f Ft(printf)e Fu(to)j(output)f(the)g(date-time)i +(string)e(resulting)h(from)e(using)1110 5340 y Fr(datefm)m(t)45 +b Fu(as)d(a)g(format)g(string)g(for)g Ft(strftime)p Fu(\(3\).)74 +b(The)41 b(corresp)s(onding)p eop end %%Page: 55 61 -TeXDict begin 55 60 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(55)1110 299 y(in)27 -b(`)p Fs(\\')p Ft(',)h(`)p Fs(\\")p Ft(',)g(and)f(`)p -Fs(\\?)p Ft(')g(are)h(not)f(remo)m(v)m(ed,)j(and)c(o)s(ctal)j(escap)s -(es)f(b)s(eginning)1110 408 y(with)i(`)p Fs(\\0)p Ft(')g(ma)m(y)h(con)m -(tain)h(up)d(to)i(four)f(digits.)630 587 y Fs(\045q)384 -b Ft(Causes)32 b Fs(printf)e Ft(to)i(output)g(the)g(corresp)s(onding)f -Fq(argumen)m(t)j Ft(in)d(a)i(format)1110 696 y(that)e(can)g(b)s(e)e -(reused)h(as)h(shell)f(input.)630 874 y Fs(\045\()p Fi(datefmt)11 -b Fs(\)T)1110 984 y Ft(Causes)29 b Fs(printf)e Ft(to)j(output)f(the)g -(date-time)i(string)e(resulting)h(from)e(using)1110 1093 -y Fq(datefm)m(t)45 b Ft(as)d(a)g(format)g(string)g(for)g -Fs(strftime)p Ft(\(3\).)74 b(The)41 b(corresp)s(onding)1110 -1203 y Fq(argumen)m(t)h Ft(is)e(an)g(in)m(teger)i(represen)m(ting)e -(the)g(n)m(um)m(b)s(er)f(of)h(seconds)g(since)1110 1313 -y(the)24 b(ep)s(o)s(c)m(h.)38 b(Tw)m(o)24 b(sp)s(ecial)h(argumen)m(t)f -(v)-5 b(alues)24 b(ma)m(y)h(b)s(e)e(used:)36 b(-1)25 -b(represen)m(ts)1110 1422 y(the)30 b(curren)m(t)g(time,)h(and)e(-2)i -(represen)m(ts)f(the)g(time)h(the)f(shell)g(w)m(as)g(in)m(v)m(ok)m(ed.) -1110 1532 y(If)38 b(no)g(argumen)m(t)h(is)f(sp)s(eci\014ed,)i(con)m(v)m +TeXDict begin 55 60 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(55)1110 299 y +Fr(argumen)m(t)42 b Fu(is)e(an)g(in)m(teger)i(represen)m(ting)e(the)g +(n)m(um)m(b)s(er)f(of)h(seconds)g(since)1110 408 y(the)24 +b(ep)s(o)s(c)m(h.)38 b(Tw)m(o)24 b(sp)s(ecial)h(argumen)m(t)f(v)-5 +b(alues)24 b(ma)m(y)h(b)s(e)e(used:)36 b(-1)25 b(represen)m(ts)1110 +518 y(the)30 b(curren)m(t)g(time,)h(and)e(-2)i(represen)m(ts)f(the)g +(time)h(the)f(shell)g(w)m(as)g(in)m(v)m(ok)m(ed.)1110 +628 y(If)38 b(no)g(argumen)m(t)h(is)f(sp)s(eci\014ed,)i(con)m(v)m (ersion)f(b)s(eha)m(v)m(es)g(as)g(if)f(-1)h(had)f(b)s(een)1110 -1641 y(giv)m(en.)k(This)29 b(is)i(an)f(exception)i(to)f(the)f(usual)g -Fs(printf)f Ft(b)s(eha)m(vior.)630 1819 y(Argumen)m(ts)f(to)h +737 y(giv)m(en.)k(This)29 b(is)i(an)f(exception)i(to)f(the)f(usual)g +Ft(printf)f Fu(b)s(eha)m(vior.)630 896 y(Argumen)m(ts)f(to)h (non-string)e(format)i(sp)s(eci\014ers)e(are)h(treated)h(as)g(C)e -(language)j(constan)m(ts,)630 1929 y(except)22 b(that)g(a)g(leading)g +(language)j(constan)m(ts,)630 1005 y(except)22 b(that)g(a)g(leading)g (plus)e(or)h(min)m(us)f(sign)i(is)f(allo)m(w)m(ed,)k(and)c(if)g(the)g -(leading)h(c)m(haracter)h(is)630 2039 y(a)i(single)g(or)f(double)h +(leading)h(c)m(haracter)h(is)630 1115 y(a)i(single)g(or)f(double)h (quote,)h(the)f(v)-5 b(alue)25 b(is)f(the)h(ASCI)s(I)e(v)-5 b(alue)25 b(of)f(the)h(follo)m(wing)h(c)m(haracter.)630 -2182 y(The)31 b Fq(format)i Ft(is)e(reused)f(as)i(necessary)f(to)h -(consume)f(all)h(of)f(the)g Fq(argumen)m(ts)t Ft(.)43 -b(If)31 b(the)g Fq(for-)630 2292 y(mat)d Ft(requires)e(more)g -Fq(argumen)m(ts)k Ft(than)25 b(are)i(supplied,)e(the)h(extra)h(format)f -(sp)s(eci\014cations)630 2402 y(b)s(eha)m(v)m(e)j(as)g(if)f(a)h(zero)g +1249 y(The)31 b Fr(format)i Fu(is)f(reused)e(as)i(necessary)f(to)i +(consume)e(all)h(of)f(the)h Fr(argumen)m(ts)p Fu(.)44 +b(If)30 b(the)i Fr(for-)630 1358 y(mat)c Fu(requires)e(more)g +Fr(argumen)m(ts)k Fu(than)25 b(are)i(supplied,)e(the)h(extra)h(format)f +(sp)s(eci\014cations)630 1468 y(b)s(eha)m(v)m(e)j(as)g(if)f(a)h(zero)g (v)-5 b(alue)29 b(or)g(n)m(ull)f(string,)h(as)g(appropriate,)g(had)f(b) -s(een)g(supplied.)38 b(The)630 2511 y(return)29 b(v)-5 +s(een)g(supplied.)38 b(The)630 1577 y(return)29 b(v)-5 b(alue)31 b(is)g(zero)g(on)f(success,)h(non-zero)g(on)f(failure.)150 -2689 y Fs(read)870 2833 y(read)47 b([-ers])f([-a)h Fi(aname)11 -b Fs(])45 b([-d)i Fi(delim)11 b Fs(])46 b([-i)h Fi(text)11 -b Fs(])46 b([-n)g Fi(nchars)11 b Fs(])1061 2943 y([-N)47 -b Fi(nchars)11 b Fs(])45 b([-p)i Fi(prompt)11 b Fs(])45 -b([-t)i Fi(timeout)11 b Fs(])45 b([-u)i Fi(fd)11 b Fs(])47 -b([)p Fi(name)57 b Fs(...)o(])630 3087 y Ft(One)26 b(line)h(is)g(read)f -(from)h(the)f(standard)g(input,)h(or)g(from)f(the)h(\014le)f -(descriptor)h Fq(fd)i Ft(supplied)630 3196 y(as)37 b(an)g(argumen)m(t)h -(to)f(the)h(`)p Fs(-u)p Ft(')e(option,)k(and)c(the)i(\014rst)e(w)m(ord) -g(is)h(assigned)h(to)f(the)h(\014rst)630 3306 y Fq(name)5 -b Ft(,)28 b(the)g(second)g(w)m(ord)f(to)h(the)f(second)h -Fq(name)5 b Ft(,)28 b(and)f(so)h(on,)g(with)f(lefto)m(v)m(er)j(w)m -(ords)d(and)630 3415 y(their)h(in)m(terv)m(ening)g(separators)g -(assigned)g(to)h(the)e(last)i Fq(name)5 b Ft(.)40 b(If)27 -b(there)h(are)g(few)m(er)f(w)m(ords)630 3525 y(read)44 -b(from)f(the)g(input)g(stream)h(than)g(names,)j(the)c(remaining)h -(names)g(are)g(assigned)630 3634 y(empt)m(y)31 b(v)-5 -b(alues.)41 b(The)30 b(c)m(haracters)i(in)e(the)h(v)-5 -b(alue)31 b(of)g(the)f Fs(IFS)g Ft(v)-5 b(ariable)31 -b(are)g(used)f(to)h(split)630 3744 y(the)e(line)g(in)m(to)h(w)m(ords)f -(using)f(the)h(same)g(rules)g(the)g(shell)g(uses)f(for)h(expansion)g -(\(describ)s(ed)630 3854 y(ab)s(o)m(v)m(e)34 b(in)f(Section)g(3.5.7)i -([W)-8 b(ord)33 b(Splitting],)i(page)e(29\).)49 b(The)33 -b(bac)m(kslash)g(c)m(haracter)i(`)p Fs(\\)p Ft(')630 -3963 y(ma)m(y)j(b)s(e)f(used)g(to)h(remo)m(v)m(e)h(an)m(y)f(sp)s(ecial) -g(meaning)f(for)h(the)f(next)h(c)m(haracter)h(read)f(and)630 -4073 y(for)i(line)h(con)m(tin)m(uation.)73 b(If)40 b(no)h(names)f(are)h -(supplied,)h(the)f(line)f(read)h(is)f(assigned)h(to)630 -4182 y(the)34 b(v)-5 b(ariable)35 b Fs(REPLY)p Ft(.)51 -b(The)33 b(return)g(co)s(de)i(is)f(zero,)i(unless)e(end-of-\014le)g(is) -g(encoun)m(tered,)630 4292 y Fs(read)d Ft(times)i(out)g(\(in)g(whic)m -(h)f(case)h(the)g(return)e(co)s(de)i(is)g(greater)g(than)f(128\),)j(a)e -(v)-5 b(ariable)630 4402 y(assignmen)m(t)27 b(error)e(\(suc)m(h)h(as)g -(assigning)g(to)g(a)h(readonly)e(v)-5 b(ariable\))27 -b(o)s(ccurs,)g(or)f(an)f(in)m(v)-5 b(alid)630 4511 y(\014le)30 -b(descriptor)h(is)f(supplied)f(as)i(the)f(argumen)m(t)h(to)g(`)p -Fs(-u)p Ft('.)630 4655 y(Options,)f(if)h(supplied,)e(ha)m(v)m(e)i(the)g -(follo)m(wing)h(meanings:)630 4833 y Fs(-a)e Fi(aname)114 -b Ft(The)34 b(w)m(ords)f(are)i(assigned)f(to)h(sequen)m(tial)h(indices) -e(of)g(the)g(arra)m(y)h(v)-5 b(ariable)1110 4943 y Fq(aname)5 -b Ft(,)29 b(starting)g(at)f(0.)40 b(All)29 b(elemen)m(ts)g(are)f(remo)m -(v)m(ed)h(from)e Fq(aname)33 b Ft(b)s(efore)1110 5052 -y(the)e(assignmen)m(t.)41 b(Other)30 b Fq(name)36 b Ft(argumen)m(ts)30 -b(are)h(ignored.)630 5230 y Fs(-d)f Fi(delim)114 b Ft(The)41 -b(\014rst)h(c)m(haracter)h(of)f Fq(delim)g Ft(is)g(used)g(to)g -(terminate)h(the)f(input)f(line,)1110 5340 y(rather)30 -b(than)g(newline.)p eop end -%%Page: 56 62 -TeXDict begin 56 61 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(56)630 299 y Fs(-e)384 -b Ft(Readline)46 b(\(see)g(Chapter)e(8)h([Command)f(Line)h(Editing],)50 -b(page)45 b(102\))i(is)1110 408 y(used)37 b(to)i(obtain)g(the)f(line.) +1736 y Ft(read)870 1870 y(read)47 b([-ers])f([-a)h Fj(aname)p +Ft(])f([-d)h Fj(delim)p Ft(])f([-i)h Fj(text)p Ft(])f([-n)h +Fj(nchars)p Ft(])1061 1979 y([-N)g Fj(nchars)p Ft(])f([-p)h +Fj(prompt)p Ft(])e([-t)i Fj(timeout)p Ft(])f([-u)h Fj(fd)p +Ft(])g([)p Fj(name)f Ft(...)o(])630 2113 y Fu(One)26 +b(line)h(is)g(read)f(from)h(the)f(standard)g(input,)h(or)g(from)f(the)h +(\014le)f(descriptor)h Fr(fd)i Fu(supplied)630 2223 y(as)23 +b(an)g(argumen)m(t)h(to)f(the)h Ft(-u)e Fu(option,)j(and)e(the)g +(\014rst)f(w)m(ord)h(is)g(assigned)g(to)h(the)f(\014rst)g +Fr(name)p Fu(,)630 2332 y(the)32 b(second)g(w)m(ord)f(to)i(the)f +(second)g Fr(name)p Fu(,)g(and)g(so)g(on,)g(with)f(lefto)m(v)m(er)j(w)m +(ords)e(and)f(their)630 2442 y(in)m(terv)m(ening)f(separators)g +(assigned)g(to)g(the)g(last)g Fr(name)p Fu(.)40 b(If)29 +b(there)h(are)g(few)m(er)f(w)m(ords)g(read)630 2552 y(from)36 +b(the)i(input)d(stream)j(than)e(names,)j(the)e(remaining)g(names)g(are) +g(assigned)h(empt)m(y)630 2661 y(v)-5 b(alues.)40 b(The)26 +b(c)m(haracters)j(in)d(the)i(v)-5 b(alue)27 b(of)g(the)g +Ft(IFS)f Fu(v)-5 b(ariable)28 b(are)f(used)g(to)g(split)g(the)h(line) +630 2771 y(in)m(to)36 b(w)m(ords)e(using)g(the)h(same)g(rules)f(the)h +(shell)g(uses)f(for)g(expansion)h(\(describ)s(ed)f(ab)s(o)m(v)m(e)630 +2880 y(in)j(Section)h(3.5.7)i([W)-8 b(ord)38 b(Splitting],)i(page)e +(29\).)63 b(The)37 b(bac)m(kslash)h(c)m(haracter)h(`)p +Ft(\\)p Fu(')e(ma)m(y)630 2990 y(b)s(e)28 b(used)g(to)i(remo)m(v)m(e)g +(an)m(y)f(sp)s(ecial)h(meaning)f(for)g(the)g(next)g(c)m(haracter)h +(read)f(and)f(for)h(line)630 3099 y(con)m(tin)m(uation.)42 +b(If)27 b(no)h(names)f(are)h(supplied,)g(the)f(line)h(read)g(is)g +(assigned)g(to)g(the)g(v)-5 b(ariable)630 3209 y Ft(REPLY)p +Fu(.)37 b(The)23 b(return)f(co)s(de)h(is)g(zero,)j(unless)d +(end-of-\014le)g(is)h(encoun)m(tered,)h Ft(read)d Fu(times)i(out)630 +3319 y(\(in)k(whic)m(h)f(case)i(the)e(return)g(co)s(de)h(is)f(greater)i +(than)f(128\),)i(a)e(v)-5 b(ariable)28 b(assignmen)m(t)g(error)630 +3428 y(\(suc)m(h)g(as)h(assigning)g(to)g(a)f(readonly)h(v)-5 +b(ariable\))29 b(o)s(ccurs,)g(or)f(an)g(in)m(v)-5 b(alid)29 +b(\014le)g(descriptor)f(is)630 3538 y(supplied)h(as)i(the)f(argumen)m +(t)h(to)g Ft(-u)p Fu(.)630 3672 y(Options,)f(if)h(supplied,)e(ha)m(v)m +(e)i(the)g(follo)m(wing)h(meanings:)630 3830 y Ft(-a)e +Fj(aname)114 b Fu(The)34 b(w)m(ords)f(are)i(assigned)f(to)h(sequen)m +(tial)h(indices)e(of)g(the)g(arra)m(y)h(v)-5 b(ariable)1110 +3940 y Fr(aname)p Fu(,)29 b(starting)h(at)f(0.)40 b(All)29 +b(elemen)m(ts)h(are)e(remo)m(v)m(ed)i(from)d Fr(aname)34 +b Fu(b)s(efore)1110 4049 y(the)d(assignmen)m(t.)41 b(Other)30 +b Fr(name)36 b Fu(argumen)m(ts)30 b(are)h(ignored.)630 +4208 y Ft(-d)f Fj(delim)114 b Fu(The)41 b(\014rst)h(c)m(haracter)h(of)f +Fr(delim)g Fu(is)g(used)g(to)g(terminate)h(the)f(input)f(line,)1110 +4317 y(rather)30 b(than)g(newline.)630 4475 y Ft(-e)384 +b Fu(Readline)46 b(\(see)g(Chapter)e(8)h([Command)f(Line)h(Editing],)50 +b(page)45 b(101\))i(is)1110 4585 y(used)37 b(to)i(obtain)g(the)f(line.) 65 b(Readline)39 b(uses)e(the)i(curren)m(t)f(\(or)g(default,)j(if)1110 -518 y(line)31 b(editing)g(w)m(as)f(not)h(previously)f(activ)m(e\))j -(editing)e(settings.)630 671 y Fs(-i)f Fi(text)162 b -Ft(If)36 b(Readline)i(is)f(b)s(eing)g(used)f(to)h(read)g(the)g(line,)j -Fq(text)f Ft(is)e(placed)h(in)m(to)g(the)1110 781 y(editing)31 -b(bu\013er)e(b)s(efore)h(editing)h(b)s(egins.)630 934 -y Fs(-n)f Fi(nchars)1110 1044 y Fs(read)38 b Ft(returns)f(after)j -(reading)f Fq(nc)m(hars)j Ft(c)m(haracters)e(rather)f(than)g(w)m -(aiting)1110 1154 y(for)g(a)h(complete)h(line)f(of)f(input,)i(but)e -(honor)g(a)h(delimiter)g(if)f(few)m(er)h(than)1110 1263 -y Fq(nc)m(hars)34 b Ft(c)m(haracters)e(are)e(read)h(b)s(efore)f(the)g -(delimiter.)630 1417 y Fs(-N)g Fi(nchars)1110 1526 y -Fs(read)39 b Ft(returns)f(after)j(reading)e(exactly)j -Fq(nc)m(hars)h Ft(c)m(haracters)f(rather)d(than)1110 -1636 y(w)m(aiting)32 b(for)f(a)g(complete)i(line)e(of)g(input,)g -(unless)f(EOF)h(is)g(encoun)m(tered)g(or)1110 1745 y -Fs(read)f Ft(times)i(out.)43 b(Delimiter)33 b(c)m(haracters)f(encoun)m -(tered)g(in)f(the)g(input)g(are)1110 1855 y(not)g(treated)h(sp)s -(ecially)g(and)f(do)f(not)i(cause)f Fs(read)f Ft(to)i(return)e(un)m -(til)h Fq(nc)m(hars)1110 1965 y Ft(c)m(haracters)h(are)f(read.)630 -2118 y Fs(-p)f Fi(prompt)1110 2228 y Ft(Displa)m(y)38 -b Fq(prompt)r Ft(,)f(without)g(a)f(trailing)i(newline,)g(b)s(efore)e -(attempting)i(to)1110 2337 y(read)f(an)m(y)h(input.)60 -b(The)37 b(prompt)g(is)g(displa)m(y)m(ed)h(only)f(if)g(input)g(is)g -(coming)1110 2447 y(from)30 b(a)h(terminal.)630 2600 -y Fs(-r)384 b Ft(If)21 b(this)h(option)g(is)f(giv)m(en,)k(bac)m(kslash) -d(do)s(es)f(not)h(act)h(as)f(an)f(escap)s(e)h(c)m(haracter.)1110 -2710 y(The)30 b(bac)m(kslash)i(is)f(considered)g(to)h(b)s(e)e(part)h -(of)g(the)g(line.)43 b(In)30 b(particular,)i(a)1110 2819 -y(bac)m(kslash-newline)f(pair)f(ma)m(y)h(not)g(b)s(e)f(used)f(as)i(a)g -(line)f(con)m(tin)m(uation.)630 2973 y Fs(-s)384 b Ft(Silen)m(t)28 -b(mo)s(de.)40 b(If)27 b(input)f(is)i(coming)g(from)f(a)h(terminal,)h(c) -m(haracters)g(are)f(not)1110 3082 y(ec)m(ho)s(ed.)630 -3236 y Fs(-t)i Fi(timeout)1110 3345 y Ft(Cause)42 b Fs(read)g -Ft(to)h(time)h(out)f(and)f(return)f(failure)i(if)g(a)g(complete)h(line) -f(of)1110 3455 y(input)26 b(\(or)h(a)g(sp)s(eci\014ed)f(n)m(um)m(b)s -(er)g(of)h(c)m(haracters\))h(is)f(not)g(read)g(within)f -Fq(time-)1110 3565 y(out)37 b Ft(seconds.)53 b Fq(timeout)38 -b Ft(ma)m(y)d(b)s(e)f(a)h(decimal)h(n)m(um)m(b)s(er)d(with)h(a)h -(fractional)1110 3674 y(p)s(ortion)29 b(follo)m(wing)h(the)f(decimal)h -(p)s(oin)m(t.)40 b(This)29 b(option)g(is)g(only)g(e\013ectiv)m(e)j(if) -1110 3784 y Fs(read)j Ft(is)i(reading)g(input)e(from)h(a)h(terminal,)i -(pip)s(e,)e(or)g(other)f(sp)s(ecial)i(\014le;)1110 3893 -y(it)31 b(has)g(no)g(e\013ect)h(when)e(reading)h(from)g(regular)g -(\014les.)42 b(If)30 b Fs(read)g Ft(times)h(out,)1110 -4003 y Fs(read)d Ft(sa)m(v)m(es)i(an)m(y)g(partial)g(input)e(read)h(in) -m(to)h(the)f(sp)s(eci\014ed)g(v)-5 b(ariable)30 b Fq(name)5 -b Ft(.)1110 4113 y(If)35 b Fq(timeout)j Ft(is)e(0,)h -Fs(read)e Ft(returns)f(immediately)-8 b(,)39 b(without)c(trying)h(to)g -(read)1110 4222 y(and)30 b(data.)44 b(The)30 b(exit)i(status)f(is)g(0)g -(if)g(input)f(is)h(a)m(v)-5 b(ailable)34 b(on)c(the)i(sp)s(eci\014ed) -1110 4332 y(\014le)g(descriptor,)g(non-zero)h(otherwise.)46 -b(The)31 b(exit)i(status)f(is)g(greater)h(than)1110 4441 -y(128)f(if)e(the)h(timeout)g(is)f(exceeded.)630 4595 -y Fs(-u)g Fi(fd)258 b Ft(Read)31 b(input)e(from)h(\014le)g(descriptor)h -Fq(fd)t Ft(.)150 4748 y Fs(readarray)870 4858 y(readarray)45 -b([-n)i Fi(count)11 b Fs(])46 b([-O)h Fi(origin)11 b -Fs(])45 b([-s)i Fi(count)11 b Fs(])46 b([-t])g([-u)h -Fi(fd)11 b Fs(])1061 4967 y([-C)47 b Fi(callback)11 b -Fs(])45 b([-c)i Fi(quantum)11 b Fs(])45 b([)p Fi(array)11 -b Fs(])630 5099 y Ft(Read)37 b(lines)g(from)f(the)h(standard)f(input)g -(in)m(to)h(the)g(indexed)f(arra)m(y)i(v)-5 b(ariable)37 -b Fq(arra)m(y)8 b Ft(,)39 b(or)630 5208 y(from)30 b(\014le)g -(descriptor)h Fq(fd)i Ft(if)d(the)h(`)p Fs(-u)p Ft(')f(option)h(is)f -(supplied.)630 5340 y(A)g(synon)m(ym)g(for)g Fs(mapfile)p -Ft(.)p eop end +4695 y(line)31 b(editing)g(w)m(as)f(not)h(previously)f(activ)m(e\))j +(editing)e(settings.)630 4853 y Ft(-i)f Fj(text)162 b +Fu(If)36 b(Readline)i(is)f(b)s(eing)g(used)f(to)h(read)g(the)g(line,)j +Fr(text)f Fu(is)e(placed)h(in)m(to)g(the)1110 4963 y(editing)31 +b(bu\013er)e(b)s(efore)h(editing)h(b)s(egins.)630 5121 +y Ft(-n)f Fj(nchars)66 b Ft(read)38 b Fu(returns)f(after)j(reading)f +Fr(nc)m(hars)j Fu(c)m(haracters)e(rather)f(than)g(w)m(aiting)1110 +5230 y(for)g(a)h(complete)h(line)f(of)f(input,)i(but)e(honor)g(a)h +(delimiter)g(if)f(few)m(er)h(than)1110 5340 y Fr(nc)m(hars)34 +b Fu(c)m(haracters)e(are)e(read)h(b)s(efore)f(the)g(delimiter.)p +eop end +%%Page: 56 62 +TeXDict begin 56 61 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(56)630 299 y Ft(-N)30 +b Fj(nchars)66 b Ft(read)39 b Fu(returns)f(after)j(reading)e(exactly)j +Fr(nc)m(hars)h Fu(c)m(haracters)f(rather)d(than)1110 +408 y(w)m(aiting)32 b(for)f(a)g(complete)i(line)e(of)g(input,)g(unless) +f(EOF)h(is)g(encoun)m(tered)g(or)1110 518 y Ft(read)f +Fu(times)i(out.)43 b(Delimiter)33 b(c)m(haracters)f(encoun)m(tered)g +(in)f(the)g(input)g(are)1110 628 y(not)g(treated)h(sp)s(ecially)f(and)f +(do)h(not)g(cause)g Ft(read)e Fu(to)j(return)d(un)m(til)i +Fr(nc)m(hars)1110 737 y Fu(c)m(haracters)h(are)f(read.)630 +904 y Ft(-p)f Fj(prompt)66 b Fu(Displa)m(y)38 b Fr(prompt)p +Fu(,)g(without)e(a)h(trailing)h(newline,)h(b)s(efore)d(attempting)i(to) +1110 1014 y(read)f(an)m(y)h(input.)60 b(The)37 b(prompt)g(is)g(displa)m +(y)m(ed)h(only)f(if)g(input)g(is)g(coming)1110 1123 y(from)30 +b(a)h(terminal.)630 1290 y Ft(-r)384 b Fu(If)21 b(this)h(option)g(is)f +(giv)m(en,)k(bac)m(kslash)d(do)s(es)f(not)h(act)h(as)f(an)f(escap)s(e)h +(c)m(haracter.)1110 1400 y(The)30 b(bac)m(kslash)i(is)f(considered)g +(to)h(b)s(e)e(part)h(of)g(the)g(line.)43 b(In)30 b(particular,)i(a)1110 +1509 y(bac)m(kslash-newline)f(pair)f(ma)m(y)h(not)g(b)s(e)f(used)f(as)i +(a)g(line)f(con)m(tin)m(uation.)630 1676 y Ft(-s)384 +b Fu(Silen)m(t)28 b(mo)s(de.)40 b(If)27 b(input)f(is)i(coming)g(from)f +(a)h(terminal,)h(c)m(haracters)g(are)f(not)1110 1785 +y(ec)m(ho)s(ed.)630 1952 y Ft(-t)i Fj(timeout)1110 2062 +y Fu(Cause)42 b Ft(read)g Fu(to)h(time)h(out)f(and)f(return)f(failure)i +(if)g(a)g(complete)h(line)f(of)1110 2171 y(input)26 b(\(or)h(a)g(sp)s +(eci\014ed)f(n)m(um)m(b)s(er)g(of)h(c)m(haracters\))h(is)f(not)g(read)g +(within)f Fr(time-)1110 2281 y(out)37 b Fu(seconds.)53 +b Fr(timeout)38 b Fu(ma)m(y)d(b)s(e)f(a)h(decimal)h(n)m(um)m(b)s(er)d +(with)h(a)h(fractional)1110 2391 y(p)s(ortion)29 b(follo)m(wing)h(the)f +(decimal)h(p)s(oin)m(t.)40 b(This)29 b(option)g(is)g(only)g(e\013ectiv) +m(e)j(if)1110 2500 y Ft(read)j Fu(is)i(reading)g(input)e(from)h(a)h +(terminal,)i(pip)s(e,)e(or)g(other)f(sp)s(ecial)i(\014le;)1110 +2610 y(it)31 b(has)g(no)g(e\013ect)h(when)e(reading)h(from)g(regular)g +(\014les.)42 b(If)30 b Ft(read)g Fu(times)h(out,)1110 +2719 y Ft(read)d Fu(sa)m(v)m(es)j(an)m(y)f(partial)h(input)d(read)i(in) +m(to)h(the)e(sp)s(eci\014ed)g(v)-5 b(ariable)31 b Fr(name)p +Fu(.)1110 2829 y(If)k Fr(timeout)j Fu(is)e(0,)h Ft(read)e +Fu(returns)f(immediately)-8 b(,)39 b(without)c(trying)h(to)g(read)1110 +2939 y(and)30 b(data.)44 b(The)30 b(exit)i(status)f(is)g(0)g(if)g +(input)f(is)h(a)m(v)-5 b(ailable)34 b(on)c(the)i(sp)s(eci\014ed)1110 +3048 y(\014le)g(descriptor,)g(non-zero)h(otherwise.)46 +b(The)31 b(exit)i(status)f(is)g(greater)h(than)1110 3158 +y(128)f(if)e(the)h(timeout)g(is)f(exceeded.)630 3324 +y Ft(-u)g Fj(fd)258 b Fu(Read)31 b(input)e(from)h(\014le)g(descriptor)h +Fr(fd)p Fu(.)150 3491 y Ft(readarray)870 3601 y(readarray)45 +b([-n)i Fj(count)p Ft(])f([-O)h Fj(origin)p Ft(])f([-s)h +Fj(count)p Ft(])f([-t])h([-u)g Fj(fd)p Ft(])1061 3710 +y([-C)g Fj(callback)p Ft(])e([-c)i Fj(quantum)p Ft(])f([)p +Fj(array)p Ft(])630 3849 y Fu(Read)38 b(lines)f(from)g(the)h(standard)e +(input)g(in)m(to)j(the)e(indexed)g(arra)m(y)h(v)-5 b(ariable)38 +b Fr(arra)m(y)p Fu(,)i(or)630 3958 y(from)30 b(\014le)g(descriptor)h +Fr(fd)i Fu(if)d(the)h Ft(-u)e Fu(option)i(is)g(supplied.)630 +4096 y(A)f(synon)m(ym)g(for)g Ft(mapfile)p Fu(.)150 4263 +y Ft(source)870 4401 y(source)46 b Fj(filename)630 4539 +y Fu(A)30 b(synon)m(ym)g(for)g Ft(.)g Fu(\(see)i(Section)f(4.1)g +([Bourne)g(Shell)f(Builtins],)h(page)g(41\).)150 4706 +y Ft(type)870 4844 y(type)47 b([-afptP])e([)p Fj(name)i +Ft(...)o(])630 4983 y Fu(F)-8 b(or)42 b(eac)m(h)g Fr(name)p +Fu(,)i(indicate)e(ho)m(w)g(it)f(w)m(ould)g(b)s(e)g(in)m(terpreted)g(if) +g(used)f(as)i(a)f(command)630 5092 y(name.)630 5230 y(If)g(the)g +Ft(-t)g Fu(option)h(is)f(used,)j Ft(type)c Fu(prin)m(ts)h(a)h(single)g +(w)m(ord)f(whic)m(h)g(is)g(one)h(of)g(`)p Ft(alias)p +Fu(',)630 5340 y(`)p Ft(function)p Fu(',)32 b(`)p Ft(builtin)p +Fu(',)g(`)p Ft(file)p Fu(')g(or)h(`)p Ft(keyword)p Fu(',)f(if)h +Fr(name)38 b Fu(is)33 b(an)f(alias,)j(shell)e(function,)p +eop end %%Page: 57 63 -TeXDict begin 57 62 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(57)150 299 y Fs(source)870 -435 y(source)46 b Fi(filename)630 571 y Ft(A)30 b(synon)m(ym)g(for)g -Fs(.)g Ft(\(see)i(Section)f(4.1)g([Bourne)g(Shell)f(Builtins],)h(page)g -(41\).)150 734 y Fs(type)870 870 y(type)47 b([-afptP])e([)p -Fi(name)57 b Fs(...)o(])630 1006 y Ft(F)-8 b(or)41 b(eac)m(h)h -Fq(name)5 b Ft(,)44 b(indicate)e(ho)m(w)f(it)g(w)m(ould)f(b)s(e)g(in)m -(terpreted)h(if)g(used)f(as)h(a)g(command)630 1116 y(name.)630 -1252 y(If)d(the)g(`)p Fs(-t)p Ft(')g(option)g(is)g(used,)i -Fs(type)d Ft(prin)m(ts)g(a)i(single)f(w)m(ord)g(whic)m(h)g(is)g(one)g -(of)h(`)p Fs(alias)p Ft(',)630 1362 y(`)p Fs(function)p -Ft(',)32 b(`)p Fs(builtin)p Ft(',)g(`)p Fs(file)p Ft(')g(or)h(`)p -Fs(keyword)p Ft(',)f(if)h Fq(name)38 b Ft(is)33 b(an)f(alias,)j(shell)e -(function,)630 1471 y(shell)i(builtin,)g(disk)g(\014le,)h(or)e(shell)h -(reserv)m(ed)g(w)m(ord,)h(resp)s(ectiv)m(ely)-8 b(.)55 -b(If)34 b(the)h Fq(name)40 b Ft(is)35 b(not)630 1581 -y(found,)29 b(then)h(nothing)h(is)f(prin)m(ted,)g(and)g -Fs(type)f Ft(returns)g(a)i(failure)g(status.)630 1717 -y(If)39 b(the)g(`)p Fs(-p)p Ft(')g(option)h(is)f(used,)i -Fs(type)d Ft(either)h(returns)f(the)i(name)f(of)g(the)g(disk)g(\014le)g -(that)630 1826 y(w)m(ould)30 b(b)s(e)g(executed,)h(or)g(nothing)f(if)g -(`)p Fs(-t)p Ft(')h(w)m(ould)f(not)g(return)g(`)p Fs(file)p -Ft('.)630 1963 y(The)23 b(`)p Fs(-P)p Ft(')g(option)h(forces)g(a)g -(path)f(searc)m(h)h(for)f(eac)m(h)h Fq(name)5 b Ft(,)26 -b(ev)m(en)e(if)f(`)p Fs(-t)p Ft(')g(w)m(ould)g(not)h(return)630 -2072 y(`)p Fs(file)p Ft('.)630 2208 y(If)41 b(a)h(command)f(is)h -(hashed,)i(`)p Fs(-p)p Ft(')d(and)g(`)p Fs(-P)p Ft(')g(prin)m(t)g(the)h -(hashed)f(v)-5 b(alue,)45 b(whic)m(h)c(is)h(not)630 2318 -y(necessarily)31 b(the)g(\014le)f(that)h(app)s(ears)f(\014rst)g(in)g -Fs($PATH)p Ft(.)630 2454 y(If)36 b(the)h(`)p Fs(-a)p -Ft(')g(option)g(is)g(used,)g Fs(type)f Ft(returns)f(all)j(of)f(the)g -(places)g(that)g(con)m(tain)h(an)f(exe-)630 2564 y(cutable)d(named)f -Fq(\014le)5 b Ft(.)49 b(This)32 b(includes)h(aliases)i(and)d -(functions,)i(if)f(and)f(only)i(if)f(the)g(`)p Fs(-p)p -Ft(')630 2673 y(option)e(is)f(not)h(also)g(used.)630 -2809 y(If)26 b(the)h(`)p Fs(-f)p Ft(')g(option)g(is)g(used,)g -Fs(type)e Ft(do)s(es)i(not)g(attempt)g(to)h(\014nd)d(shell)i -(functions,)g(as)g(with)630 2919 y(the)k Fs(command)d -Ft(builtin.)630 3055 y(The)j(return)f(status)h(is)g(zero)h(if)f(all)h -(of)f(the)h Fq(names)i Ft(are)e(found,)e(non-zero)i(if)f(an)m(y)g(are)h -(not)630 3165 y(found.)150 3328 y Fs(typeset)870 3464 -y(typeset)46 b([-afFgrxilnrtux])d([-p])k([)p Fi(name)11 -b Fs([=)p Fi(value)g Fs(])43 b(...)o(])630 3600 y Ft(The)31 -b Fs(typeset)e Ft(command)i(is)g(supplied)f(for)h(compatibilit)m(y)i -(with)e(the)g(Korn)f(shell.)44 b(It)31 b(is)630 3709 -y(a)g(synon)m(ym)f(for)g(the)g Fs(declare)f Ft(builtin)h(command.)150 -3872 y Fs(ulimit)870 4008 y(ulimit)46 b([-abcdefilmnpqrstuvxHST])41 -b([)p Fi(limit)11 b Fs(])630 4144 y(ulimit)25 b Ft(pro)m(vides)h(con)m -(trol)i(o)m(v)m(er)g(the)f(resources)f(a)m(v)-5 b(ailable)29 -b(to)e(pro)s(cesses)f(started)h(b)m(y)g(the)630 4254 -y(shell,)i(on)f(systems)g(that)h(allo)m(w)h(suc)m(h)e(con)m(trol.)41 -b(If)28 b(an)g(option)h(is)f(giv)m(en,)i(it)e(is)h(in)m(terpreted)630 -4364 y(as)i(follo)m(ws:)630 4526 y Fs(-S)384 b Ft(Change)30 -b(and)g(rep)s(ort)g(the)g(soft)h(limit)g(asso)s(ciated)h(with)e(a)h -(resource.)630 4689 y Fs(-H)384 b Ft(Change)30 b(and)g(rep)s(ort)g(the) -g(hard)g(limit)h(asso)s(ciated)h(with)e(a)h(resource.)630 -4852 y Fs(-a)384 b Ft(All)31 b(curren)m(t)f(limits)h(are)g(rep)s -(orted.)630 5015 y Fs(-b)384 b Ft(The)30 b(maxim)m(um)g(so)s(c)m(k)m -(et)i(bu\013er)e(size.)630 5177 y Fs(-c)384 b Ft(The)30 -b(maxim)m(um)g(size)h(of)g(core)g(\014les)f(created.)630 -5340 y Fs(-d)384 b Ft(The)30 b(maxim)m(um)g(size)h(of)g(a)g(pro)s -(cess's)f(data)h(segmen)m(t.)p eop end -%%Page: 58 64 -TeXDict begin 58 63 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(58)630 299 y Fs(-e)384 -b Ft(The)30 b(maxim)m(um)g(sc)m(heduling)h(priorit)m(y)f(\()p -Fs(")p Ft(nice)p Fs(")p Ft(\).)630 482 y Fs(-f)384 b -Ft(The)30 b(maxim)m(um)g(size)h(of)g(\014les)f(written)h(b)m(y)f(the)g -(shell)h(and)f(its)h(c)m(hildren.)630 666 y Fs(-i)384 -b Ft(The)30 b(maxim)m(um)g(n)m(um)m(b)s(er)f(of)i(p)s(ending)e -(signals.)630 849 y Fs(-l)384 b Ft(The)30 b(maxim)m(um)g(size)h(that)g +TeXDict begin 57 62 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(57)630 299 y(shell)35 +b(builtin,)g(disk)g(\014le,)h(or)e(shell)h(reserv)m(ed)g(w)m(ord,)h +(resp)s(ectiv)m(ely)-8 b(.)55 b(If)34 b(the)h Fr(name)40 +b Fu(is)35 b(not)630 408 y(found,)29 b(then)h(nothing)h(is)f(prin)m +(ted,)g(and)g Ft(type)f Fu(returns)g(a)i(failure)g(status.)630 +544 y(If)25 b(the)g Ft(-p)g Fu(option)h(is)f(used,)h +Ft(type)e Fu(either)h(returns)g(the)g(name)g(of)h(the)f(disk)g(\014le)g +(that)h(w)m(ould)630 654 y(b)s(e)k(executed,)h(or)g(nothing)f(if)g +Ft(-t)g Fu(w)m(ould)g(not)h(return)e(`)p Ft(file)p Fu('.)630 +789 y(The)h Ft(-P)g Fu(option)h(forces)g(a)g(path)f(searc)m(h)h(for)g +(eac)m(h)g Fr(name)p Fu(,)g(ev)m(en)g(if)g Ft(-t)f Fu(w)m(ould)g(not)h +(return)630 899 y(`)p Ft(file)p Fu('.)630 1034 y(If)f(a)g(command)g(is) +g(hashed,)f Ft(-p)h Fu(and)f Ft(-P)g Fu(prin)m(t)h(the)g(hashed)f(v)-5 +b(alue,)31 b(whic)m(h)f(is)g(not)g(neces-)630 1144 y(sarily)h(the)f +(\014le)h(that)g(app)s(ears)e(\014rst)h(in)g Ft($PATH)p +Fu(.)630 1279 y(If)22 b(the)i Ft(-a)e Fu(option)h(is)g(used,)h +Ft(type)e Fu(returns)f(all)j(of)f(the)g(places)h(that)f(con)m(tain)i +(an)d(executable)630 1389 y(named)32 b Fr(\014le)p Fu(.)49 +b(This)32 b(includes)h(aliases)h(and)e(functions,)i(if)f(and)f(only)h +(if)g(the)g Ft(-p)f Fu(option)i(is)630 1499 y(not)d(also)g(used.)630 +1634 y(If)f(the)g Ft(-f)g Fu(option)g(is)h(used,)e Ft(type)g +Fu(do)s(es)h(not)h(attempt)g(to)g(\014nd)d(shell)j(functions,)f(as)g +(with)630 1744 y(the)h Ft(command)d Fu(builtin.)630 1879 +y(The)j(return)f(status)h(is)g(zero)h(if)f(all)h(of)f(the)h +Fr(names)i Fu(are)e(found,)e(non-zero)i(if)f(an)m(y)g(are)h(not)630 +1989 y(found.)150 2150 y Ft(typeset)870 2286 y(typeset)46 +b([-afFgrxilnrtux])d([-p])k([)p Fj(name)p Ft([=)p Fj(value)p +Ft(])d(...)o(])630 2421 y Fu(The)31 b Ft(typeset)e Fu(command)i(is)g +(supplied)f(for)h(compatibilit)m(y)i(with)e(the)g(Korn)f(shell.)44 +b(It)31 b(is)630 2531 y(a)g(synon)m(ym)f(for)g(the)g +Ft(declare)f Fu(builtin)h(command.)150 2693 y Ft(ulimit)870 +2828 y(ulimit)46 b([-abcdefilmnpqrstuvxHST])41 b([)p +Fj(limit)p Ft(])630 2964 y(ulimit)25 b Fu(pro)m(vides)h(con)m(trol)i(o) +m(v)m(er)g(the)f(resources)f(a)m(v)-5 b(ailable)29 b(to)e(pro)s(cesses) +f(started)h(b)m(y)g(the)630 3073 y(shell,)i(on)f(systems)g(that)h(allo) +m(w)h(suc)m(h)e(con)m(trol.)41 b(If)28 b(an)g(option)h(is)f(giv)m(en,)i +(it)e(is)h(in)m(terpreted)630 3183 y(as)i(follo)m(ws:)630 +3344 y Ft(-S)384 b Fu(Change)30 b(and)g(rep)s(ort)g(the)g(soft)h(limit) +g(asso)s(ciated)h(with)e(a)h(resource.)630 3506 y Ft(-H)384 +b Fu(Change)30 b(and)g(rep)s(ort)g(the)g(hard)g(limit)h(asso)s(ciated)h +(with)e(a)h(resource.)630 3667 y Ft(-a)384 b Fu(All)31 +b(curren)m(t)f(limits)h(are)g(rep)s(orted.)630 3829 y +Ft(-b)384 b Fu(The)30 b(maxim)m(um)g(so)s(c)m(k)m(et)i(bu\013er)e +(size.)630 3990 y Ft(-c)384 b Fu(The)30 b(maxim)m(um)g(size)h(of)g +(core)g(\014les)f(created.)630 4152 y Ft(-d)384 b Fu(The)30 +b(maxim)m(um)g(size)h(of)g(a)g(pro)s(cess's)f(data)h(segmen)m(t.)630 +4313 y Ft(-e)384 b Fu(The)30 b(maxim)m(um)g(sc)m(heduling)h(priorit)m +(y)f(\()p Ft(")p Fu(nice)p Ft(")p Fu(\).)630 4475 y Ft(-f)384 +b Fu(The)30 b(maxim)m(um)g(size)h(of)g(\014les)f(written)h(b)m(y)f(the) +g(shell)h(and)f(its)h(c)m(hildren.)630 4636 y Ft(-i)384 +b Fu(The)30 b(maxim)m(um)g(n)m(um)m(b)s(er)f(of)i(p)s(ending)e +(signals.)630 4798 y Ft(-l)384 b Fu(The)30 b(maxim)m(um)g(size)h(that)g (ma)m(y)g(b)s(e)f(lo)s(c)m(k)m(ed)i(in)m(to)f(memory)-8 -b(.)630 1033 y Fs(-m)384 b Ft(The)36 b(maxim)m(um)g(residen)m(t)h(set)g +b(.)630 4959 y Ft(-m)384 b Fu(The)36 b(maxim)m(um)g(residen)m(t)h(set)g (size)g(\(man)m(y)g(systems)f(do)h(not)f(honor)g(this)1110 -1142 y(limit\).)630 1326 y Fs(-n)384 b Ft(The)38 b(maxim)m(um)h(n)m(um) +5069 y(limit\).)630 5230 y Ft(-n)384 b Fu(The)38 b(maxim)m(um)h(n)m(um) m(b)s(er)e(of)i(op)s(en)f(\014le)h(descriptors)g(\(most)g(systems)g(do) -1110 1435 y(not)31 b(allo)m(w)g(this)g(v)-5 b(alue)31 -b(to)g(b)s(e)e(set\).)630 1619 y Fs(-p)384 b Ft(The)30 -b(pip)s(e)f(bu\013er)h(size.)630 1802 y Fs(-q)384 b Ft(The)30 -b(maxim)m(um)g(n)m(um)m(b)s(er)f(of)i(b)m(ytes)g(in)f(POSIX)f(message)j -(queues.)630 1986 y Fs(-r)384 b Ft(The)30 b(maxim)m(um)g(real-time)i -(sc)m(heduling)f(priorit)m(y)-8 b(.)630 2169 y Fs(-s)384 -b Ft(The)30 b(maxim)m(um)g(stac)m(k)i(size.)630 2352 -y Fs(-t)384 b Ft(The)30 b(maxim)m(um)g(amoun)m(t)h(of)f(cpu)g(time)h -(in)f(seconds.)630 2536 y Fs(-u)384 b Ft(The)30 b(maxim)m(um)g(n)m(um)m -(b)s(er)f(of)i(pro)s(cesses)f(a)m(v)-5 b(ailable)33 b(to)e(a)f(single)i -(user.)630 2719 y Fs(-v)384 b Ft(The)41 b(maxim)m(um)h(amoun)m(t)g(of)h -(virtual)f(memory)g(a)m(v)-5 b(ailable)44 b(to)e(the)g(shell,)1110 -2829 y(and,)30 b(on)g(some)h(systems,)g(to)g(its)g(c)m(hildren.)630 -3012 y Fs(-x)384 b Ft(The)30 b(maxim)m(um)g(n)m(um)m(b)s(er)f(of)i -(\014le)f(lo)s(c)m(ks.)630 3196 y Fs(-T)384 b Ft(The)30 -b(maxim)m(um)g(n)m(um)m(b)s(er)f(of)i(threads.)630 3379 -y(If)i Fq(limit)k Ft(is)d(giv)m(en,)h(and)f(the)f(`)p -Fs(-a)p Ft(')h(option)g(is)g(not)g(used,)g Fq(limit)j -Ft(is)c(the)h(new)g(v)-5 b(alue)34 b(of)g(the)630 3489 -y(sp)s(eci\014ed)f(resource.)51 b(The)34 b(sp)s(ecial)g -Fq(limit)j Ft(v)-5 b(alues)34 b Fs(hard)p Ft(,)g Fs(soft)p -Ft(,)g(and)f Fs(unlimited)e Ft(stand)630 3598 y(for)h(the)g(curren)m(t) -g(hard)f(limit,)i(the)g(curren)m(t)f(soft)g(limit,)h(and)f(no)g(limit,) -h(resp)s(ectiv)m(ely)-8 b(.)48 b(A)630 3708 y(hard)24 -b(limit)i(cannot)g(b)s(e)e(increased)h(b)m(y)g(a)h(non-ro)s(ot)f(user)f -(once)i(it)g(is)f(set;)j(a)d(soft)g(limit)h(ma)m(y)630 -3818 y(b)s(e)37 b(increased)h(up)e(to)j(the)f(v)-5 b(alue)38 -b(of)f(the)h(hard)f(limit.)63 b(Otherwise,)39 b(the)f(curren)m(t)f(v)-5 -b(alue)630 3927 y(of)36 b(the)f(soft)h(limit)h(for)e(the)g(sp)s -(eci\014ed)g(resource)h(is)f(prin)m(ted,)i(unless)e(the)h(`)p -Fs(-H)p Ft(')f(option)h(is)630 4037 y(supplied.)j(When)28 -b(setting)h(new)f(limits,)h(if)f(neither)h(`)p Fs(-H)p -Ft(')f(nor)f(`)p Fs(-S)p Ft(')h(is)h(supplied,)e(b)s(oth)h(the)630 -4146 y(hard)g(and)h(soft)h(limits)g(are)g(set.)41 b(If)29 -b(no)g(option)h(is)f(giv)m(en,)i(then)e(`)p Fs(-f)p Ft(')h(is)f -(assumed.)40 b(V)-8 b(alues)630 4256 y(are)38 b(in)f(1024-b)m(yte)k -(incremen)m(ts,)f(except)e(for)g(`)p Fs(-t)p Ft(',)h(whic)m(h)e(is)h -(in)f(seconds;)42 b(`)p Fs(-p)p Ft(',)d(whic)m(h)630 -4366 y(is)33 b(in)f(units)g(of)h(512-b)m(yte)i(blo)s(c)m(ks;)g(and)d(`) -p Fs(-T)p Ft(',)i(`)p Fs(-b)p Ft(',)f(`)p Fs(-n)p Ft(')g(and)f(`)p -Fs(-u)p Ft(',)h(whic)m(h)g(are)g(unscaled)630 4475 y(v)-5 -b(alues.)630 4622 y(The)34 b(return)g(status)h(is)f(zero)i(unless)e(an) +1110 5340 y(not)31 b(allo)m(w)g(this)g(v)-5 b(alue)31 +b(to)g(b)s(e)e(set\).)p eop end +%%Page: 58 64 +TeXDict begin 58 63 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(58)630 299 y Ft(-p)384 +b Fu(The)30 b(pip)s(e)f(bu\013er)h(size.)630 454 y Ft(-q)384 +b Fu(The)30 b(maxim)m(um)g(n)m(um)m(b)s(er)f(of)i(b)m(ytes)g(in)f +(POSIX)f(message)j(queues.)630 608 y Ft(-r)384 b Fu(The)30 +b(maxim)m(um)g(real-time)i(sc)m(heduling)f(priorit)m(y)-8 +b(.)630 763 y Ft(-s)384 b Fu(The)30 b(maxim)m(um)g(stac)m(k)i(size.)630 +918 y Ft(-t)384 b Fu(The)30 b(maxim)m(um)g(amoun)m(t)h(of)f(cpu)g(time) +h(in)f(seconds.)630 1072 y Ft(-u)384 b Fu(The)30 b(maxim)m(um)g(n)m(um) +m(b)s(er)f(of)i(pro)s(cesses)f(a)m(v)-5 b(ailable)33 +b(to)e(a)f(single)i(user.)630 1227 y Ft(-v)384 b Fu(The)41 +b(maxim)m(um)h(amoun)m(t)g(of)h(virtual)f(memory)g(a)m(v)-5 +b(ailable)44 b(to)e(the)g(shell,)1110 1337 y(and,)30 +b(on)g(some)h(systems,)g(to)g(its)g(c)m(hildren.)630 +1491 y Ft(-x)384 b Fu(The)30 b(maxim)m(um)g(n)m(um)m(b)s(er)f(of)i +(\014le)f(lo)s(c)m(ks.)630 1646 y Ft(-T)384 b Fu(The)30 +b(maxim)m(um)g(n)m(um)m(b)s(er)f(of)i(threads.)630 1801 +y(If)36 b Fr(limit)k Fu(is)c(giv)m(en,)k(and)c(the)h +Ft(-a)f Fu(option)h(is)f(not)h(used,)h Fr(limit)h Fu(is)e(the)g(new)f +(v)-5 b(alue)37 b(of)g(the)630 1910 y(sp)s(eci\014ed)c(resource.)51 +b(The)34 b(sp)s(ecial)g Fr(limit)j Fu(v)-5 b(alues)34 +b Ft(hard)p Fu(,)g Ft(soft)p Fu(,)g(and)f Ft(unlimited)e +Fu(stand)630 2020 y(for)h(the)g(curren)m(t)g(hard)f(limit,)i(the)g +(curren)m(t)f(soft)g(limit,)h(and)f(no)g(limit,)h(resp)s(ectiv)m(ely)-8 +b(.)48 b(A)630 2130 y(hard)37 b(limit)h(cannot)h(b)s(e)e(increased)h(b) +m(y)f(a)h(non-ro)s(ot)g(user)f(once)i(it)f(is)g(set;)k(a)c(soft)g +(limit)630 2239 y(ma)m(y)j(b)s(e)e(increased)i(up)e(to)h(the)h(v)-5 +b(alue)40 b(of)g(the)h(hard)e(limit.)70 b(Otherwise,)43 +b(the)d(curren)m(t)630 2349 y(v)-5 b(alue)29 b(of)h(the)f(soft)g(limit) +h(for)e(the)h(sp)s(eci\014ed)g(resource)g(is)g(prin)m(ted,)g(unless)f +(the)h Ft(-H)f Fu(option)630 2458 y(is)h(supplied.)39 +b(When)29 b(setting)h(new)f(limits,)h(if)f(neither)g +Ft(-H)g Fu(nor)f Ft(-S)h Fu(is)g(supplied,)f(b)s(oth)h(the)630 +2568 y(hard)i(and)h(soft)h(limits)g(are)f(set.)48 b(If)31 +b(no)i(option)f(is)h(giv)m(en,)h(then)e Ft(-f)g Fu(is)g(assumed.)46 +b(V)-8 b(alues)630 2677 y(are)31 b(in)f(1024-b)m(yte)j(incremen)m(ts,)e +(except)g(for)f Ft(-t)p Fu(,)g(whic)m(h)g(is)g(in)g(seconds;)h +Ft(-p)p Fu(,)f(whic)m(h)g(is)g(in)630 2787 y(units)g(of)g(512-b)m(yte)j +(blo)s(c)m(ks;)e(and)f Ft(-T)p Fu(,)g Ft(-b)p Fu(,)g +Ft(-n)g Fu(and)f Ft(-u)p Fu(,)h(whic)m(h)g(are)h(unscaled)f(v)-5 +b(alues.)630 2919 y(The)34 b(return)g(status)h(is)f(zero)i(unless)e(an) g(in)m(v)-5 b(alid)36 b(option)f(or)f(argumen)m(t)i(is)e(supplied,)h -(or)630 4731 y(an)30 b(error)g(o)s(ccurs)g(while)h(setting)g(a)g(new)f -(limit.)150 4915 y Fs(unalias)870 5061 y(unalias)46 b([-a])g([)p -Fi(name)57 b Fs(...)47 b(])630 5208 y Ft(Remo)m(v)m(e)39 -b(eac)m(h)f Fq(name)k Ft(from)36 b(the)h(list)h(of)f(aliases.)61 -b(If)36 b(`)p Fs(-a)p Ft(')h(is)g(supplied,)h(all)f(aliases)i(are)630 -5317 y(remo)m(v)m(ed.)j(Aliases)31 b(are)g(describ)s(ed)e(in)h(Section) -i(6.6)f([Aliases],)h(page)f(88.)p eop end -%%Page: 59 65 -TeXDict begin 59 64 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(59)150 299 y Fr(4.3)68 -b(Mo)t(difying)45 b(Shell)g(Beha)l(vior)150 520 y Fj(4.3.1)63 -b(The)41 b(Set)g(Builtin)150 667 y Ft(This)35 b(builtin)h(is)g(so)g +(or)630 3029 y(an)30 b(error)g(o)s(ccurs)g(while)h(setting)g(a)g(new)f +(limit.)150 3183 y Ft(unalias)870 3316 y(unalias)46 b([-a])g([)p +Fj(name)h Ft(...)g(])630 3448 y Fu(Remo)m(v)m(e)42 b(eac)m(h)f +Fr(name)k Fu(from)39 b(the)i(list)f(of)g(aliases.)71 +b(If)40 b Ft(-a)f Fu(is)h(supplied,)h(all)g(aliases)h(are)630 +3557 y(remo)m(v)m(ed.)g(Aliases)31 b(are)g(describ)s(ed)e(in)h(Section) +i(6.6)f([Aliases],)h(page)f(88.)150 3785 y Fs(4.3)68 +b(Mo)t(difying)45 b(Shell)g(Beha)l(vior)150 4007 y Fk(4.3.1)63 +b(The)41 b(Set)g(Builtin)150 4154 y Fu(This)35 b(builtin)h(is)g(so)g (complicated)i(that)f(it)f(deserv)m(es)h(its)f(o)m(wn)g(section.)59 -b Fs(set)35 b Ft(allo)m(ws)j(y)m(ou)e(to)h(c)m(hange)150 -777 y(the)c(v)-5 b(alues)34 b(of)f(shell)g(options)h(and)e(set)i(the)f +b Ft(set)35 b Fu(allo)m(ws)j(y)m(ou)e(to)h(c)m(hange)150 +4263 y(the)c(v)-5 b(alues)34 b(of)f(shell)g(options)h(and)e(set)i(the)f (p)s(ositional)h(parameters,)h(or)e(to)h(displa)m(y)f(the)g(names)h -(and)150 886 y(v)-5 b(alues)31 b(of)f(shell)h(v)-5 b(ariables.)150 -1041 y Fs(set)870 1172 y(set)47 b([--abefhkmnptuvxBCEHPT])41 -b([-o)47 b Fi(option-name)11 b Fs(])44 b([)p Fi(argument)56 -b Fs(...)o(])870 1282 y(set)47 b([+abefhkmnptuvxBCEHPT])42 -b([+o)47 b Fi(option-name)11 b Fs(])43 b([)p Fi(argument)56 -b Fs(...)o(])630 1414 y Ft(If)22 b(no)h(options)g(or)g(argumen)m(ts)g -(are)g(supplied,)g Fs(set)f Ft(displa)m(ys)g(the)h(names)g(and)f(v)-5 -b(alues)23 b(of)g(all)630 1523 y(shell)j(v)-5 b(ariables)27 +(and)150 4373 y(v)-5 b(alues)31 b(of)f(shell)h(v)-5 b(ariables.)150 +4528 y Ft(set)870 4660 y(set)47 b([--abefhkmnptuvxBCEHPT])41 +b([-o)47 b Fj(option-name)p Ft(])e([)p Fj(argument)g +Ft(...)o(])870 4769 y(set)i([+abefhkmnptuvxBCEHPT])42 +b([+o)47 b Fj(option-name)p Ft(])d([)p Fj(argument)h +Ft(...)o(])630 4902 y Fu(If)22 b(no)h(options)g(or)g(argumen)m(ts)g +(are)g(supplied,)g Ft(set)f Fu(displa)m(ys)g(the)h(names)g(and)f(v)-5 +b(alues)23 b(of)g(all)630 5011 y(shell)j(v)-5 b(ariables)27 b(and)e(functions,)h(sorted)g(according)h(to)g(the)f(curren)m(t)f(lo)s -(cale,)k(in)c(a)i(format)630 1633 y(that)i(ma)m(y)h(b)s(e)e(reused)g +(cale,)k(in)c(a)i(format)630 5121 y(that)i(ma)m(y)h(b)s(e)e(reused)g (as)h(input)f(for)h(setting)h(or)e(resetting)i(the)f(curren)m(tly-set)h -(v)-5 b(ariables.)630 1743 y(Read-only)37 b(v)-5 b(ariables)37 -b(cannot)h(b)s(e)e(reset.)59 b(In)36 b Fl(posix)g Ft(mo)s(de,)i(only)f -(shell)f(v)-5 b(ariables)38 b(are)630 1852 y(listed.)630 -1984 y(When)29 b(options)g(are)g(supplied,)f(they)h(set)h(or)f(unset)f -(shell)h(attributes.)41 b(Options,)29 b(if)g(sp)s(ec-)630 -2094 y(i\014ed,)h(ha)m(v)m(e)i(the)e(follo)m(wing)i(meanings:)630 -2248 y Fs(-a)384 b Ft(Mark)32 b(v)-5 b(ariables)33 b(and)e(function)h +(v)-5 b(ariables.)630 5230 y(Read-only)37 b(v)-5 b(ariables)37 +b(cannot)h(b)s(e)e(reset.)59 b(In)36 b Fm(posix)g Fu(mo)s(de,)i(only)f +(shell)f(v)-5 b(ariables)38 b(are)630 5340 y(listed.)p +eop end +%%Page: 59 65 +TeXDict begin 59 64 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(59)630 299 y(When)29 +b(options)g(are)g(supplied,)f(they)h(set)h(or)f(unset)f(shell)h +(attributes.)41 b(Options,)29 b(if)g(sp)s(ec-)630 408 +y(i\014ed,)h(ha)m(v)m(e)i(the)e(follo)m(wing)i(meanings:)630 +555 y Ft(-a)384 b Fu(Mark)32 b(v)-5 b(ariables)33 b(and)e(function)h (whic)m(h)g(are)g(mo)s(di\014ed)f(or)h(created)h(for)f(ex-)1110 -2357 y(p)s(ort)e(to)h(the)f(en)m(vironmen)m(t)h(of)g(subsequen)m(t)f -(commands.)630 2511 y Fs(-b)384 b Ft(Cause)44 b(the)h(status)g(of)f +664 y(p)s(ort)e(to)h(the)f(en)m(vironmen)m(t)h(of)g(subsequen)m(t)f +(commands.)630 810 y Ft(-b)384 b Fu(Cause)44 b(the)h(status)g(of)f (terminated)h(bac)m(kground)g(jobs)f(to)h(b)s(e)f(rep)s(orted)1110 -2621 y(immediately)-8 b(,)30 b(rather)d(than)f(b)s(efore)h(prin)m(ting) -g(the)g(next)g(primary)g(prompt.)630 2775 y Fs(-e)384 -b Ft(Exit)65 b(immediately)g(if)f(a)h(pip)s(eline)e(\(see)i(Section)g -(3.2.2)h([Pip)s(elines],)1110 2885 y(page)56 b(8\),)62 +920 y(immediately)-8 b(,)30 b(rather)d(than)f(b)s(efore)h(prin)m(ting)g +(the)g(next)g(primary)g(prompt.)630 1066 y Ft(-e)384 +b Fu(Exit)65 b(immediately)g(if)f(a)h(pip)s(eline)e(\(see)i(Section)g +(3.2.2)h([Pip)s(elines],)1110 1176 y(page)56 b(8\),)62 b(whic)m(h)55 b(ma)m(y)h(consist)f(of)h(a)f(single)h(simple)f(command)g -(\(see)1110 2994 y(Section)30 b(3.2.1)i([Simple)d(Commands],)g(page)h -(8\),)h(a)f(list)g(\(see)h(Section)f(3.2.3)1110 3104 +(\(see)1110 1285 y(Section)30 b(3.2.1)i([Simple)d(Commands],)g(page)h +(8\),)h(a)f(list)g(\(see)h(Section)f(3.2.3)1110 1395 y([Lists],)66 b(page)59 b(9\),)67 b(or)58 b(a)h(comp)s(ound)e(command)h -(\(see)h(Section)g(3.2.4)1110 3213 y([Comp)s(ound)67 +(\(see)h(Section)g(3.2.4)1110 1504 y([Comp)s(ound)67 b(Commands],)77 b(page)69 b(9\))g(returns)e(a)i(non-zero)g(status.)1110 -3323 y(The)41 b(shell)g(do)s(es)g(not)g(exit)h(if)f(the)h(command)f -(that)h(fails)f(is)g(part)g(of)h(the)1110 3432 y(command)g(list)h -(immediately)g(follo)m(wing)g(a)g Fs(while)e Ft(or)h -Fs(until)e Ft(k)m(eyw)m(ord,)1110 3542 y(part)61 b(of)g(the)g(test)h -(in)e(an)h Fs(if)f Ft(statemen)m(t,)71 b(part)61 b(of)g(an)m(y)g -(command)1110 3652 y(executed)50 b(in)e(a)h Fs(&&)f Ft(or)h -Fs(||)f Ft(list)h(except)g(the)g(command)g(follo)m(wing)h(the)1110 -3761 y(\014nal)37 b Fs(&&)g Ft(or)g Fs(||)p Ft(,)h(an)m(y)g(command)f +1614 y(The)41 b(shell)g(do)s(es)g(not)g(exit)h(if)f(the)h(command)f +(that)h(fails)f(is)g(part)g(of)h(the)1110 1724 y(command)g(list)h +(immediately)g(follo)m(wing)g(a)g Ft(while)e Fu(or)h +Ft(until)e Fu(k)m(eyw)m(ord,)1110 1833 y(part)61 b(of)g(the)g(test)h +(in)e(an)h Ft(if)f Fu(statemen)m(t,)71 b(part)61 b(of)g(an)m(y)g +(command)1110 1943 y(executed)50 b(in)e(a)h Ft(&&)f Fu(or)h +Ft(||)f Fu(list)h(except)g(the)g(command)g(follo)m(wing)h(the)1110 +2052 y(\014nal)37 b Ft(&&)g Fu(or)g Ft(||)p Fu(,)h(an)m(y)g(command)f (in)g(a)g(pip)s(eline)g(but)g(the)g(last,)j(or)e(if)f(the)1110 -3871 y(command's)c(return)f(status)h(is)g(b)s(eing)g(in)m(v)m(erted)h -(with)e Fs(!)p Ft(.)48 b(If)33 b(a)g(comp)s(ound)1110 -3980 y(command)g(other)g(than)f(a)i(subshell)d(returns)h(a)h(non-zero)h -(status)f(b)s(ecause)1110 4090 y(a)g(command)f(failed)h(while)f(`)p -Fs(-e)p Ft(')h(w)m(as)f(b)s(eing)g(ignored,)h(the)g(shell)g(do)s(es)f -(not)1110 4200 y(exit.)42 b(A)30 b(trap)g(on)h Fs(ERR)p -Ft(,)e(if)i(set,)g(is)f(executed)i(b)s(efore)e(the)g(shell)h(exits.) -1110 4331 y(This)f(option)h(applies)f(to)h(the)g(shell)g(en)m(vironmen) -m(t)g(and)f(eac)m(h)h(subshell)f(en-)1110 4441 y(vironmen)m(t)j -(separately)i(\(see)f(Section)g(3.7.3)h([Command)d(Execution)i(En-)1110 -4551 y(vironmen)m(t],)i(page)f(36\),)i(and)d(ma)m(y)h(cause)f -(subshells)g(to)h(exit)g(b)s(efore)f(exe-)1110 4660 y(cuting)d(all)g -(the)g(commands)f(in)g(the)g(subshell.)1110 4792 y(If)41 +2162 y(command's)c(return)f(status)h(is)g(b)s(eing)g(in)m(v)m(erted)h +(with)e Ft(!)p Fu(.)48 b(If)33 b(a)g(comp)s(ound)1110 +2271 y(command)g(other)g(than)f(a)i(subshell)d(returns)h(a)h(non-zero)h +(status)f(b)s(ecause)1110 2381 y(a)k(command)g(failed)g(while)g +Ft(-e)f Fu(w)m(as)i(b)s(eing)e(ignored,)j(the)e(shell)g(do)s(es)g(not) +1110 2491 y(exit.)42 b(A)30 b(trap)g(on)h Ft(ERR)p Fu(,)e(if)i(set,)g +(is)f(executed)i(b)s(efore)e(the)g(shell)h(exits.)1110 +2619 y(This)f(option)h(applies)f(to)h(the)g(shell)g(en)m(vironmen)m(t)g +(and)f(eac)m(h)h(subshell)f(en-)1110 2728 y(vironmen)m(t)j(separately)i +(\(see)f(Section)g(3.7.3)h([Command)d(Execution)i(En-)1110 +2838 y(vironmen)m(t],)i(page)f(36\),)i(and)d(ma)m(y)h(cause)f +(subshells)g(to)h(exit)g(b)s(efore)f(exe-)1110 2947 y(cuting)d(all)g +(the)g(commands)f(in)g(the)g(subshell.)1110 3075 y(If)41 b(a)g(comp)s(ound)e(command)i(or)g(shell)g(function)g(executes)h(in)f -(a)g(con)m(text)1110 4902 y(where)26 b(`)p Fs(-e)p Ft(')g(is)g(b)s -(eing)g(ignored,)i(none)e(of)g(the)g(commands)g(executed)h(within)1110 -5011 y(the)35 b(comp)s(ound)f(command)h(or)g(function)f(b)s(o)s(dy)g -(will)h(b)s(e)f(a\013ected)j(b)m(y)e(the)1110 5121 y(`)p -Fs(-e)p Ft(')41 b(setting,)k(ev)m(en)d(if)g(`)p Fs(-e)p -Ft(')f(is)g(set)h(and)e(a)i(command)f(returns)f(a)i(failure)1110 -5230 y(status.)60 b(If)37 b(a)g(comp)s(ound)e(command)i(or)g(shell)g -(function)f(sets)h(`)p Fs(-e)p Ft(')g(while)1110 5340 -y(executing)f(in)f(a)g(con)m(text)i(where)d(`)p Fs(-e)p -Ft(')h(is)g(ignored,)h(that)f(setting)h(will)g(not)p -eop end -%%Page: 60 66 -TeXDict begin 60 65 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(60)1110 299 y(ha)m(v)m(e)26 -b(an)m(y)f(e\013ect)h(un)m(til)f(the)g(comp)s(ound)e(command)h(or)h -(the)g(command)f(con-)1110 408 y(taining)31 b(the)g(function)f(call)h -(completes.)630 564 y Fs(-f)384 b Ft(Disable)31 b(\014lename)g -(expansion)f(\(globbing\).)630 720 y Fs(-h)384 b Ft(Lo)s(cate)33 +(a)g(con)m(text)1110 3185 y(where)31 b Ft(-e)g Fu(is)g(b)s(eing)g +(ignored,)h(none)f(of)h(the)f(commands)g(executed)h(within)1110 +3294 y(the)j(comp)s(ound)f(command)h(or)g(function)f(b)s(o)s(dy)g(will) +h(b)s(e)f(a\013ected)j(b)m(y)e(the)1110 3404 y Ft(-e)25 +b Fu(setting,)j(ev)m(en)e(if)g Ft(-e)f Fu(is)h(set)g(and)f(a)h(command) +g(returns)e(a)i(failure)g(status.)1110 3513 y(If)32 b(a)i(comp)s(ound)d +(command)i(or)g(shell)g(function)f(sets)i Ft(-e)e Fu(while)h(executing) +1110 3623 y(in)40 b(a)h(con)m(text)i(where)d Ft(-e)g +Fu(is)h(ignored,)j(that)d(setting)h(will)f(not)g(ha)m(v)m(e)h(an)m(y) +1110 3733 y(e\013ect)g(un)m(til)e(the)h(comp)s(ound)e(command)h(or)g +(the)g(command)g(con)m(taining)1110 3842 y(the)31 b(function)f(call)h +(completes.)630 3988 y Ft(-f)384 b Fu(Disable)31 b(\014lename)g +(expansion)f(\(globbing\).)630 4134 y Ft(-h)384 b Fu(Lo)s(cate)33 b(and)e(remem)m(b)s(er)h(\(hash\))g(commands)f(as)h(they)g(are)g(lo)s -(ok)m(ed)h(up)e(for)1110 830 y(execution.)42 b(This)29 -b(option)i(is)g(enabled)f(b)m(y)g(default.)630 985 y -Fs(-k)384 b Ft(All)34 b(argumen)m(ts)g(in)f(the)h(form)f(of)g +(ok)m(ed)h(up)e(for)1110 4244 y(execution.)42 b(This)29 +b(option)i(is)g(enabled)f(b)m(y)g(default.)630 4390 y +Ft(-k)384 b Fu(All)34 b(argumen)m(ts)g(in)f(the)h(form)f(of)g (assignmen)m(t)h(statemen)m(ts)i(are)d(placed)h(in)1110 -1095 y(the)k(en)m(vironmen)m(t)g(for)g(a)g(command,)h(not)f(just)f -(those)i(that)f(precede)g(the)1110 1204 y(command)30 -b(name.)630 1360 y Fs(-m)384 b Ft(Job)32 b(con)m(trol)h(is)f(enabled)g -(\(see)h(Chapter)f(7)g([Job)g(Con)m(trol],)i(page)e(98\).)47 -b(All)1110 1470 y(pro)s(cesses)27 b(run)f(in)i(a)g(separate)g(pro)s +4500 y(the)k(en)m(vironmen)m(t)g(for)g(a)g(command,)h(not)f(just)f +(those)i(that)f(precede)g(the)1110 4609 y(command)30 +b(name.)630 4756 y Ft(-m)384 b Fu(Job)32 b(con)m(trol)h(is)f(enabled)g +(\(see)h(Chapter)f(7)g([Job)g(Con)m(trol],)i(page)e(97\).)47 +b(All)1110 4865 y(pro)s(cesses)27 b(run)f(in)i(a)g(separate)g(pro)s (cess)f(group.)40 b(When)27 b(a)h(bac)m(kground)f(job)1110 -1579 y(completes,)32 b(the)f(shell)f(prin)m(ts)g(a)h(line)f(con)m -(taining)i(its)f(exit)g(status.)630 1735 y Fs(-n)384 -b Ft(Read)21 b(commands)f(but)g(do)h(not)g(execute)h(them;)i(this)d(ma) -m(y)g(b)s(e)f(used)g(to)h(c)m(hec)m(k)1110 1845 y(a)42 +4975 y(completes,)32 b(the)f(shell)f(prin)m(ts)g(a)h(line)f(con)m +(taining)i(its)f(exit)g(status.)630 5121 y Ft(-n)384 +b Fu(Read)21 b(commands)f(but)g(do)h(not)g(execute)h(them;)i(this)d(ma) +m(y)g(b)s(e)f(used)g(to)h(c)m(hec)m(k)1110 5230 y(a)42 b(script)g(for)g(syn)m(tax)g(errors.)75 b(This)41 b(option)h(is)g -(ignored)g(b)m(y)g(in)m(teractiv)m(e)1110 1954 y(shells.)630 -2110 y Fs(-o)30 b Fi(option-name)1110 2220 y Ft(Set)h(the)f(option)h -(corresp)s(onding)e(to)i Fq(option-name)5 b Ft(:)1110 -2375 y Fs(allexport)1590 2485 y Ft(Same)30 b(as)h Fs(-a)p -Ft(.)1110 2641 y Fs(braceexpand)1590 2750 y Ft(Same)f(as)h -Fs(-B)p Ft(.)1110 2906 y Fs(emacs)240 b Ft(Use)25 b(an)f -Fs(emacs)p Ft(-st)m(yle)h(line)f(editing)h(in)m(terface)h(\(see)g -(Chapter)e(8)1590 3016 y([Command)33 b(Line)g(Editing],)h(page)h -(102\).)51 b(This)32 b(also)i(a\013ects)1590 3125 y(the)d(editing)g(in) -m(terface)h(used)d(for)h Fs(read)f(-e)p Ft(.)1110 3281 -y Fs(errexit)144 b Ft(Same)30 b(as)h Fs(-e)p Ft(.)1110 -3437 y Fs(errtrace)96 b Ft(Same)30 b(as)h Fs(-E)p Ft(.)1110 -3592 y Fs(functrace)1590 3702 y Ft(Same)f(as)h Fs(-T)p -Ft(.)1110 3858 y Fs(hashall)144 b Ft(Same)30 b(as)h Fs(-h)p -Ft(.)1110 4013 y Fs(histexpand)1590 4123 y Ft(Same)f(as)h -Fs(-H)p Ft(.)1110 4279 y Fs(history)144 b Ft(Enable)39 -b(command)g(history)-8 b(,)42 b(as)d(describ)s(ed)f(in)h(Section)h(9.1) -1590 4388 y([Bash)d(History)g(F)-8 b(acilities],)41 b(page)c(134.)60 -b(This)36 b(option)h(is)f(on)1590 4498 y(b)m(y)30 b(default)h(in)f(in)m -(teractiv)m(e)j(shells.)1110 4654 y Fs(ignoreeof)1590 -4763 y Ft(An)d(in)m(teractiv)m(e)j(shell)e(will)g(not)f(exit)h(up)s(on) -e(reading)i(EOF.)1110 4919 y Fs(keyword)144 b Ft(Same)30 -b(as)h Fs(-k)p Ft(.)1110 5075 y Fs(monitor)144 b Ft(Same)30 -b(as)h Fs(-m)p Ft(.)1110 5230 y Fs(noclobber)1590 5340 -y Ft(Same)f(as)h Fs(-C)p Ft(.)p eop end -%%Page: 61 67 -TeXDict begin 61 66 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(61)1110 299 y -Fs(noexec)192 b Ft(Same)30 b(as)h Fs(-n)p Ft(.)1110 470 -y Fs(noglob)192 b Ft(Same)30 b(as)h Fs(-f)p Ft(.)1110 -641 y Fs(nolog)240 b Ft(Curren)m(tly)30 b(ignored.)1110 -813 y Fs(notify)192 b Ft(Same)30 b(as)h Fs(-b)p Ft(.)1110 -984 y Fs(nounset)144 b Ft(Same)30 b(as)h Fs(-u)p Ft(.)1110 -1155 y Fs(onecmd)192 b Ft(Same)30 b(as)h Fs(-t)p Ft(.)1110 -1326 y Fs(physical)96 b Ft(Same)30 b(as)h Fs(-P)p Ft(.)1110 -1498 y Fs(pipefail)96 b Ft(If)44 b(set,)k(the)d(return)e(v)-5 +(ignored)g(b)m(y)g(in)m(teractiv)m(e)1110 5340 y(shells.)p +eop end +%%Page: 60 66 +TeXDict begin 60 65 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(60)630 299 y Ft(-o)30 +b Fj(option-name)1110 408 y Fu(Set)h(the)f(option)h(corresp)s(onding)e +(to)i Fr(option-name)5 b Fu(:)1110 575 y Ft(allexport)1590 +685 y Fu(Same)30 b(as)h Ft(-a)p Fu(.)1110 852 y Ft(braceexpand)1590 +962 y Fu(Same)f(as)h Ft(-B)p Fu(.)1110 1129 y Ft(emacs)240 +b Fu(Use)25 b(an)f Ft(emacs)p Fu(-st)m(yle)h(line)f(editing)h(in)m +(terface)h(\(see)g(Chapter)e(8)1590 1238 y([Command)33 +b(Line)g(Editing],)h(page)h(101\).)51 b(This)32 b(also)i(a\013ects)1590 +1348 y(the)d(editing)g(in)m(terface)h(used)d(for)h Ft(read)f(-e)p +Fu(.)1110 1515 y Ft(errexit)144 b Fu(Same)30 b(as)h Ft(-e)p +Fu(.)1110 1682 y Ft(errtrace)96 b Fu(Same)30 b(as)h Ft(-E)p +Fu(.)1110 1849 y Ft(functrace)1590 1958 y Fu(Same)f(as)h +Ft(-T)p Fu(.)1110 2125 y Ft(hashall)144 b Fu(Same)30 +b(as)h Ft(-h)p Fu(.)1110 2292 y Ft(histexpand)1590 2402 +y Fu(Same)f(as)h Ft(-H)p Fu(.)1110 2569 y Ft(history)144 +b Fu(Enable)39 b(command)g(history)-8 b(,)42 b(as)d(describ)s(ed)f(in)h +(Section)h(9.1)1590 2679 y([Bash)d(History)g(F)-8 b(acilities],)41 +b(page)c(133.)60 b(This)36 b(option)h(is)f(on)1590 2788 +y(b)m(y)30 b(default)h(in)f(in)m(teractiv)m(e)j(shells.)1110 +2955 y Ft(ignoreeof)1590 3065 y Fu(An)d(in)m(teractiv)m(e)j(shell)e +(will)g(not)f(exit)h(up)s(on)e(reading)i(EOF.)1110 3232 +y Ft(keyword)144 b Fu(Same)30 b(as)h Ft(-k)p Fu(.)1110 +3399 y Ft(monitor)144 b Fu(Same)30 b(as)h Ft(-m)p Fu(.)1110 +3566 y Ft(noclobber)1590 3675 y Fu(Same)f(as)h Ft(-C)p +Fu(.)1110 3842 y Ft(noexec)192 b Fu(Same)30 b(as)h Ft(-n)p +Fu(.)1110 4009 y Ft(noglob)192 b Fu(Same)30 b(as)h Ft(-f)p +Fu(.)1110 4176 y Ft(nolog)240 b Fu(Curren)m(tly)30 b(ignored.)1110 +4343 y Ft(notify)192 b Fu(Same)30 b(as)h Ft(-b)p Fu(.)1110 +4510 y Ft(nounset)144 b Fu(Same)30 b(as)h Ft(-u)p Fu(.)1110 +4677 y Ft(onecmd)192 b Fu(Same)30 b(as)h Ft(-t)p Fu(.)1110 +4844 y Ft(physical)96 b Fu(Same)30 b(as)h Ft(-P)p Fu(.)1110 +5011 y Ft(pipefail)96 b Fu(If)44 b(set,)k(the)d(return)e(v)-5 b(alue)45 b(of)f(a)h(pip)s(eline)e(is)i(the)f(v)-5 b(alue)45 -b(of)1590 1607 y(the)33 b(last)h(\(righ)m(tmost\))h(command)e(to)h -(exit)g(with)f(a)g(non-zero)1590 1717 y(status,)28 b(or)f(zero)g(if)f +b(of)1590 5121 y(the)33 b(last)h(\(righ)m(tmost\))h(command)e(to)h +(exit)g(with)f(a)g(non-zero)1590 5230 y(status,)28 b(or)f(zero)g(if)f (all)i(commands)e(in)g(the)h(pip)s(eline)f(exit)i(suc-)1590 -1826 y(cessfully)-8 b(.)41 b(This)30 b(option)h(is)f(disabled)g(b)m(y)h -(default.)1110 1998 y Fs(posix)240 b Ft(Change)30 b(the)g(b)s(eha)m -(vior)h(of)f(Bash)g(where)g(the)g(default)h(op)s(era-)1590 -2107 y(tion)25 b(di\013ers)f(from)g(the)h Fl(posix)f -Ft(standard)f(to)i(matc)m(h)h(the)f(stan-)1590 2217 y(dard)32 -b(\(see)i(Section)g(6.11)h([Bash)e(POSIX)f(Mo)s(de],)j(page)e(94\).) -1590 2326 y(This)k(is)g(in)m(tended)g(to)h(mak)m(e)g(Bash)g(b)s(eha)m -(v)m(e)g(as)g(a)f(strict)h(su-)1590 2436 y(p)s(erset)30 -b(of)h(that)f(standard.)1110 2607 y Fs(privileged)1590 -2717 y Ft(Same)g(as)h Fs(-p)p Ft(.)1110 2888 y Fs(verbose)144 -b Ft(Same)30 b(as)h Fs(-v)p Ft(.)1110 3059 y Fs(vi)384 -b Ft(Use)36 b(a)g Fs(vi)p Ft(-st)m(yle)g(line)g(editing)g(in)m -(terface.)58 b(This)35 b(also)h(a\013ects)1590 3169 y(the)31 -b(editing)g(in)m(terface)h(used)d(for)h Fs(read)f(-e)p -Ft(.)1110 3340 y Fs(xtrace)192 b Ft(Same)30 b(as)h Fs(-x)p -Ft(.)630 3511 y Fs(-p)384 b Ft(T)-8 b(urn)33 b(on)h(privileged)h(mo)s -(de.)51 b(In)34 b(this)g(mo)s(de,)h(the)f Fs($BASH_ENV)e -Ft(and)h Fs($ENV)1110 3621 y Ft(\014les)23 b(are)h(not)f(pro)s(cessed,) +5340 y(cessfully)-8 b(.)41 b(This)30 b(option)h(is)f(disabled)g(b)m(y)h +(default.)p eop end +%%Page: 61 67 +TeXDict begin 61 66 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(61)1110 299 y +Ft(posix)240 b Fu(Change)30 b(the)g(b)s(eha)m(vior)h(of)f(Bash)g(where) +g(the)g(default)h(op)s(era-)1590 408 y(tion)25 b(di\013ers)f(from)g +(the)h Fm(posix)f Fu(standard)f(to)i(matc)m(h)h(the)f(stan-)1590 +518 y(dard)32 b(\(see)i(Section)g(6.11)h([Bash)e(POSIX)f(Mo)s(de],)j +(page)e(94\).)1590 628 y(This)k(is)g(in)m(tended)g(to)h(mak)m(e)g(Bash) +g(b)s(eha)m(v)m(e)g(as)g(a)f(strict)h(su-)1590 737 y(p)s(erset)30 +b(of)h(that)f(standard.)1110 911 y Ft(privileged)1590 +1020 y Fu(Same)g(as)h Ft(-p)p Fu(.)1110 1194 y Ft(verbose)144 +b Fu(Same)30 b(as)h Ft(-v)p Fu(.)1110 1367 y Ft(vi)384 +b Fu(Use)36 b(a)g Ft(vi)p Fu(-st)m(yle)g(line)g(editing)g(in)m +(terface.)58 b(This)35 b(also)h(a\013ects)1590 1477 y(the)31 +b(editing)g(in)m(terface)h(used)d(for)h Ft(read)f(-e)p +Fu(.)1110 1650 y Ft(xtrace)192 b Fu(Same)30 b(as)h Ft(-x)p +Fu(.)630 1824 y Ft(-p)384 b Fu(T)-8 b(urn)33 b(on)h(privileged)h(mo)s +(de.)51 b(In)34 b(this)g(mo)s(de,)h(the)f Ft($BASH_ENV)e +Fu(and)h Ft($ENV)1110 1934 y Fu(\014les)23 b(are)h(not)f(pro)s(cessed,) h(shell)g(functions)e(are)i(not)f(inherited)g(from)f(the)i(en-)1110 -3730 y(vironmen)m(t,)h(and)e(the)g Fs(SHELLOPTS)p Ft(,)f -Fs(BASHOPTS)p Ft(,)h Fs(CDPATH)e Ft(and)i Fs(GLOBIGNORE)1110 -3840 y Ft(v)-5 b(ariables,)23 b(if)e(they)g(app)s(ear)f(in)g(the)h(en)m +2043 y(vironmen)m(t,)h(and)e(the)g Ft(SHELLOPTS)p Fu(,)f +Ft(BASHOPTS)p Fu(,)h Ft(CDPATH)e Fu(and)i Ft(GLOBIGNORE)1110 +2153 y Fu(v)-5 b(ariables,)23 b(if)e(they)g(app)s(ear)f(in)g(the)h(en)m (vironmen)m(t,)i(are)e(ignored.)38 b(If)20 b(the)h(shell)1110 -3950 y(is)37 b(started)h(with)f(the)g(e\013ectiv)m(e)j(user)d +2262 y(is)37 b(started)h(with)f(the)g(e\013ectiv)m(e)j(user)d (\(group\))g(id)g(not)g(equal)h(to)g(the)f(real)1110 -4059 y(user)d(\(group\))g(id,)i(and)e(the)g(`)p Fs(-p)p -Ft(')g(option)h(is)g(not)f(supplied,)h(these)g(actions)1110 -4169 y(are)d(tak)m(en)i(and)d(the)h(e\013ectiv)m(e)j(user)c(id)h(is)g -(set)h(to)f(the)h(real)f(user)g(id.)45 b(If)32 b(the)1110 -4278 y(`)p Fs(-p)p Ft(')e(option)i(is)e(supplied)g(at)h(startup,)f(the) -h(e\013ectiv)m(e)i(user)d(id)h(is)f(not)h(reset.)1110 -4388 y(T)-8 b(urning)35 b(this)i(option)g(o\013)g(causes)g(the)g -(e\013ectiv)m(e)i(user)d(and)g(group)g(ids)g(to)1110 -4498 y(b)s(e)30 b(set)h(to)g(the)f(real)h(user)f(and)g(group)g(ids.)630 -4669 y Fs(-t)384 b Ft(Exit)31 b(after)g(reading)f(and)g(executing)h -(one)g(command.)630 4840 y Fs(-u)384 b Ft(T)-8 b(reat)25 -b(unset)e(v)-5 b(ariables)25 b(and)e(parameters)h(other)h(than)e(the)h -(sp)s(ecial)h(param-)1110 4950 y(eters)35 b(`)p Fs(@)p -Ft(')f(or)g(`)p Fs(*)p Ft(')h(as)f(an)g(error)g(when)f(p)s(erforming)g -(parameter)i(expansion.)1110 5059 y(An)28 b(error)h(message)g(will)g(b) -s(e)f(written)h(to)h(the)e(standard)g(error,)h(and)f(a)h(non-)1110 -5169 y(in)m(teractiv)m(e)k(shell)e(will)g(exit.)630 5340 -y Fs(-v)384 b Ft(Prin)m(t)30 b(shell)h(input)e(lines)i(as)g(they)f(are) -h(read.)p eop end +2372 y(user)h(\(group\))h(id,)i(and)d(the)h Ft(-p)f Fu(option)i(is)e +(not)i(supplied,)f(these)h(actions)1110 2482 y(are)32 +b(tak)m(en)i(and)d(the)h(e\013ectiv)m(e)j(user)c(id)h(is)g(set)h(to)f +(the)h(real)f(user)g(id.)45 b(If)32 b(the)1110 2591 y +Ft(-p)i Fu(option)h(is)g(supplied)f(at)h(startup,)h(the)f(e\013ectiv)m +(e)i(user)d(id)g(is)h(not)g(reset.)1110 2701 y(T)-8 b(urning)35 +b(this)i(option)g(o\013)g(causes)g(the)g(e\013ectiv)m(e)i(user)d(and)g +(group)g(ids)g(to)1110 2810 y(b)s(e)30 b(set)h(to)g(the)f(real)h(user)f +(and)g(group)g(ids.)630 2984 y Ft(-t)384 b Fu(Exit)31 +b(after)g(reading)f(and)g(executing)h(one)g(command.)630 +3157 y Ft(-u)384 b Fu(T)-8 b(reat)25 b(unset)e(v)-5 b(ariables)25 +b(and)e(parameters)h(other)h(than)e(the)h(sp)s(ecial)h(param-)1110 +3267 y(eters)35 b(`)p Ft(@)p Fu(')f(or)g(`)p Ft(*)p Fu(')h(as)f(an)g +(error)g(when)f(p)s(erforming)g(parameter)i(expansion.)1110 +3377 y(An)28 b(error)h(message)g(will)g(b)s(e)f(written)h(to)h(the)e +(standard)g(error,)h(and)f(a)h(non-)1110 3486 y(in)m(teractiv)m(e)k +(shell)e(will)g(exit.)630 3660 y Ft(-v)384 b Fu(Prin)m(t)30 +b(shell)h(input)e(lines)i(as)g(they)f(are)h(read.)630 +3833 y Ft(-x)384 b Fu(Prin)m(t)21 b(a)h(trace)h(of)f(simple)f +(commands,)i Ft(for)e Fu(commands,)i Ft(case)d Fu(commands,)1110 +3943 y Ft(select)29 b Fu(commands,)j(and)e(arithmetic)j +Ft(for)d Fu(commands)h(and)f(their)i(argu-)1110 4052 +y(men)m(ts)h(or)f(asso)s(ciated)i(w)m(ord)e(lists)h(after)g(they)f(are) +h(expanded)f(and)f(b)s(efore)1110 4162 y(they)i(are)g(executed.)49 +b(The)32 b(v)-5 b(alue)33 b(of)g(the)g Ft(PS4)f Fu(v)-5 +b(ariable)34 b(is)f(expanded)f(and)1110 4271 y(the)24 +b(resultan)m(t)h(v)-5 b(alue)24 b(is)g(prin)m(ted)g(b)s(efore)f(the)h +(command)g(and)f(its)i(expanded)1110 4381 y(argumen)m(ts.)630 +4555 y Ft(-B)384 b Fu(The)41 b(shell)g(will)g(p)s(erform)f(brace)h +(expansion)g(\(see)h(Section)g(3.5.1)g([Brace)1110 4664 +y(Expansion],)30 b(page)h(21\).)42 b(This)30 b(option)h(is)f(on)g(b)m +(y)h(default.)630 4838 y Ft(-C)384 b Fu(Prev)m(en)m(t)25 +b(output)e(redirection)h(using)f(`)p Ft(>)p Fu(',)i(`)p +Ft(>&)p Fu(',)g(and)e(`)p Ft(<>)p Fu(')g(from)h(o)m(v)m(erwriting)1110 +4947 y(existing)31 b(\014les.)630 5121 y Ft(-E)384 b +Fu(If)39 b(set,)j(an)m(y)e(trap)f(on)g Ft(ERR)g Fu(is)g(inherited)g(b)m +(y)g(shell)h(functions,)h(command)1110 5230 y(substitutions,)35 +b(and)e(commands)g(executed)i(in)f(a)g(subshell)f(en)m(vironmen)m(t.) +1110 5340 y(The)d Ft(ERR)f Fu(trap)i(is)f(normally)h(not)f(inherited)g +(in)g(suc)m(h)g(cases.)p eop end %%Page: 62 68 -TeXDict begin 62 67 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(62)630 299 y Fs(-x)384 -b Ft(Prin)m(t)21 b(a)h(trace)h(of)f(simple)f(commands,)i -Fs(for)e Ft(commands,)i Fs(case)d Ft(commands,)1110 408 -y Fs(select)29 b Ft(commands,)j(and)e(arithmetic)j Fs(for)d -Ft(commands)h(and)f(their)i(argu-)1110 518 y(men)m(ts)h(or)f(asso)s -(ciated)i(w)m(ord)e(lists)h(after)g(they)f(are)h(expanded)f(and)f(b)s -(efore)1110 628 y(they)i(are)g(executed.)49 b(The)32 -b(v)-5 b(alue)33 b(of)g(the)g Fs(PS4)f Ft(v)-5 b(ariable)34 -b(is)f(expanded)f(and)1110 737 y(the)24 b(resultan)m(t)h(v)-5 -b(alue)24 b(is)g(prin)m(ted)g(b)s(efore)f(the)h(command)g(and)f(its)i -(expanded)1110 847 y(argumen)m(ts.)630 1000 y Fs(-B)384 -b Ft(The)41 b(shell)g(will)g(p)s(erform)f(brace)h(expansion)g(\(see)h -(Section)g(3.5.1)g([Brace)1110 1110 y(Expansion],)30 -b(page)h(21\).)42 b(This)30 b(option)h(is)f(on)g(b)m(y)h(default.)630 -1263 y Fs(-C)384 b Ft(Prev)m(en)m(t)25 b(output)e(redirection)h(using)f -(`)p Fs(>)p Ft(',)i(`)p Fs(>&)p Ft(',)g(and)e(`)p Fs(<>)p -Ft(')g(from)h(o)m(v)m(erwriting)1110 1373 y(existing)31 -b(\014les.)630 1526 y Fs(-E)384 b Ft(If)39 b(set,)j(an)m(y)e(trap)f(on) -g Fs(ERR)g Ft(is)g(inherited)g(b)m(y)g(shell)h(functions,)h(command) -1110 1636 y(substitutions,)35 b(and)e(commands)g(executed)i(in)f(a)g -(subshell)f(en)m(vironmen)m(t.)1110 1745 y(The)d Fs(ERR)f -Ft(trap)i(is)f(normally)h(not)f(inherited)g(in)g(suc)m(h)g(cases.)630 -1899 y Fs(-H)384 b Ft(Enable)38 b(`)p Fs(!)p Ft(')h(st)m(yle)h(history) -e(substitution)g(\(see)h(Section)h(9.3)f([History)g(In-)1110 -2008 y(teraction],)g(page)d(136\).)57 b(This)34 b(option)i(is)f(on)g(b) -m(y)h(default)f(for)g(in)m(teractiv)m(e)1110 2118 y(shells.)630 -2271 y Fs(-P)384 b Ft(If)39 b(set,)j(do)d(not)g(resolv)m(e)i(sym)m(b)s -(olic)e(links)g(when)f(p)s(erforming)g(commands)1110 -2381 y(suc)m(h)29 b(as)h Fs(cd)f Ft(whic)m(h)g(c)m(hange)h(the)g -(curren)m(t)f(directory)-8 b(.)42 b(The)28 b(ph)m(ysical)j(direc-)1110 -2491 y(tory)j(is)g(used)f(instead.)52 b(By)34 b(default,)h(Bash)f -(follo)m(ws)h(the)f(logical)i(c)m(hain)f(of)1110 2600 -y(directories)j(when)d(p)s(erforming)h(commands)g(whic)m(h)g(c)m(hange) -i(the)f(curren)m(t)1110 2710 y(directory)-8 b(.)1110 -2841 y(F)g(or)31 b(example,)g(if)f(`)p Fs(/usr/sys)p -Ft(')e(is)i(a)g(sym)m(b)s(olic)h(link)f(to)g(`)p Fs(/usr/local/sys)p -Ft(')1110 2951 y(then:)1350 3082 y Fs($)47 b(cd)h(/usr/sys;)d(echo)i -($PWD)1350 3192 y(/usr/sys)1350 3302 y($)g(cd)h(..;)f(pwd)1350 -3411 y(/usr)1110 3543 y Ft(If)30 b Fs(set)f(-P)h Ft(is)h(on,)f(then:) -1350 3674 y Fs($)47 b(cd)h(/usr/sys;)d(echo)i($PWD)1350 -3784 y(/usr/local/sys)1350 3893 y($)g(cd)h(..;)f(pwd)1350 -4003 y(/usr/local)630 4156 y(-T)384 b Ft(If)34 b(set,)j(an)m(y)e(trap)g -(on)g Fs(DEBUG)e Ft(and)i Fs(RETURN)e Ft(are)i(inherited)g(b)m(y)f -(shell)i(func-)1110 4266 y(tions,)k(command)d(substitutions,)h(and)f -(commands)g(executed)h(in)f(a)h(sub-)1110 4376 y(shell)33 -b(en)m(vironmen)m(t.)49 b(The)32 b Fs(DEBUG)g Ft(and)g -Fs(RETURN)f Ft(traps)h(are)i(normally)f(not)1110 4485 -y(inherited)d(in)g(suc)m(h)g(cases.)630 4639 y Fs(--)384 -b Ft(If)31 b(no)h(argumen)m(ts)f(follo)m(w)i(this)f(option,)g(then)f -(the)h(p)s(ositional)h(parameters)1110 4748 y(are)h(unset.)49 -b(Otherwise,)34 b(the)g(p)s(ositional)g(parameters)g(are)g(set)g(to)g -(the)g Fq(ar-)1110 4858 y(gumen)m(ts)t Ft(,)d(ev)m(en)g(if)f(some)h(of) -f(them)h(b)s(egin)f(with)g(a)g(`)p Fs(-)p Ft('.)630 5011 -y Fs(-)432 b Ft(Signal)45 b(the)g(end)f(of)h(options,)k(cause)c(all)h -(remaining)e Fq(argumen)m(ts)49 b Ft(to)d(b)s(e)1110 -5121 y(assigned)38 b(to)h(the)f(p)s(ositional)h(parameters.)65 -b(The)37 b(`)p Fs(-x)p Ft(')h(and)g(`)p Fs(-v)p Ft(')g(options)1110 -5230 y(are)25 b(turned)e(o\013.)40 b(If)24 b(there)h(are)g(no)f -(argumen)m(ts,)i(the)f(p)s(ositional)h(parameters)1110 -5340 y(remain)k(unc)m(hanged.)p eop end -%%Page: 63 69 -TeXDict begin 63 68 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(63)630 299 y(Using)27 -b(`)p Fs(+)p Ft(')h(rather)f(than)g(`)p Fs(-)p Ft(')g(causes)h(these)f -(options)h(to)g(b)s(e)e(turned)g(o\013.)40 b(The)27 b(options)h(can)630 -408 y(also)36 b(b)s(e)f(used)f(up)s(on)g(in)m(v)m(o)s(cation)j(of)e -(the)g(shell.)56 b(The)34 b(curren)m(t)h(set)h(of)f(options)h(ma)m(y)g -(b)s(e)630 518 y(found)29 b(in)h Fs($-)p Ft(.)630 659 -y(The)43 b(remaining)h(N)f Fq(argumen)m(ts)48 b Ft(are)c(p)s(ositional) -g(parameters)g(and)f(are)h(assigned,)j(in)630 769 y(order,)30 -b(to)h Fs($1)p Ft(,)f Fs($2)p Ft(,)36 b(.)22 b(.)g(.)42 -b Fs($N)p Ft(.)e(The)30 b(sp)s(ecial)h(parameter)g Fs(#)f -Ft(is)g(set)h(to)g(N.)630 910 y(The)f(return)f(status)i(is)f(alw)m(a)m +TeXDict begin 62 67 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(62)630 299 y Ft(-H)384 +b Fu(Enable)38 b(`)p Ft(!)p Fu(')h(st)m(yle)h(history)e(substitution)g +(\(see)h(Section)h(9.3)f([History)g(In-)1110 408 y(teraction],)g(page)d +(135\).)57 b(This)34 b(option)i(is)f(on)g(b)m(y)h(default)f(for)g(in)m +(teractiv)m(e)1110 518 y(shells.)630 670 y Ft(-P)384 +b Fu(If)39 b(set,)j(do)d(not)g(resolv)m(e)i(sym)m(b)s(olic)e(links)g +(when)f(p)s(erforming)g(commands)1110 780 y(suc)m(h)29 +b(as)h Ft(cd)f Fu(whic)m(h)g(c)m(hange)h(the)g(curren)m(t)f(directory) +-8 b(.)42 b(The)28 b(ph)m(ysical)j(direc-)1110 890 y(tory)j(is)g(used)f +(instead.)52 b(By)34 b(default,)h(Bash)f(follo)m(ws)h(the)f(logical)i +(c)m(hain)f(of)1110 999 y(directories)j(when)d(p)s(erforming)h +(commands)g(whic)m(h)g(c)m(hange)i(the)f(curren)m(t)1110 +1109 y(directory)-8 b(.)1110 1240 y(F)g(or)42 b(example,)i(if)d +Ft(/usr/sys)e Fu(is)i(a)g(sym)m(b)s(olic)g(link)g(to)h +Ft(/usr/local/sys)1110 1349 y Fu(then:)1350 1480 y Ft($)47 +b(cd)h(/usr/sys;)d(echo)i($PWD)1350 1590 y(/usr/sys)1350 +1700 y($)g(cd)h(..;)f(pwd)1350 1809 y(/usr)1110 1940 +y Fu(If)30 b Ft(set)f(-P)h Fu(is)h(on,)f(then:)1350 2071 +y Ft($)47 b(cd)h(/usr/sys;)d(echo)i($PWD)1350 2181 y(/usr/local/sys) +1350 2290 y($)g(cd)h(..;)f(pwd)1350 2400 y(/usr/local)630 +2552 y(-T)384 b Fu(If)34 b(set,)j(an)m(y)e(trap)g(on)g +Ft(DEBUG)e Fu(and)i Ft(RETURN)e Fu(are)i(inherited)g(b)m(y)f(shell)i +(func-)1110 2662 y(tions,)k(command)d(substitutions,)h(and)f(commands)g +(executed)h(in)f(a)h(sub-)1110 2771 y(shell)33 b(en)m(vironmen)m(t.)49 +b(The)32 b Ft(DEBUG)g Fu(and)g Ft(RETURN)f Fu(traps)h(are)i(normally)f +(not)1110 2881 y(inherited)d(in)g(suc)m(h)g(cases.)630 +3033 y Ft(--)384 b Fu(If)44 b(no)g(argumen)m(ts)g(follo)m(w)i(this)e +(option,)k(then)c(the)h(p)s(ositional)g(parame-)1110 +3143 y(ters)31 b(are)g(unset.)40 b(Otherwise,)31 b(the)f(p)s(ositional) +i(parameters)f(are)f(set)h(to)h(the)1110 3253 y Fr(argumen)m(ts)p +Fu(,)f(ev)m(en)g(if)f(some)h(of)g(them)f(b)s(egin)g(with)g(a)h(`)p +Ft(-)p Fu('.)630 3405 y Ft(-)432 b Fu(Signal)45 b(the)g(end)f(of)h +(options,)k(cause)c(all)h(remaining)e Fr(argumen)m(ts)49 +b Fu(to)d(b)s(e)1110 3515 y(assigned)33 b(to)h(the)g(p)s(ositional)g +(parameters.)49 b(The)33 b Ft(-x)g Fu(and)f Ft(-v)h Fu(options)h(are) +1110 3624 y(turned)k(o\013.)68 b(If)38 b(there)i(are)f(no)g(argumen)m +(ts,)j(the)e(p)s(ositional)g(parameters)1110 3734 y(remain)30 +b(unc)m(hanged.)630 3886 y(Using)d(`)p Ft(+)p Fu(')h(rather)f(than)g(`) +p Ft(-)p Fu(')g(causes)h(these)f(options)h(to)g(b)s(e)e(turned)g +(o\013.)40 b(The)27 b(options)h(can)630 3996 y(also)36 +b(b)s(e)f(used)f(up)s(on)g(in)m(v)m(o)s(cation)j(of)e(the)g(shell.)56 +b(The)34 b(curren)m(t)h(set)h(of)f(options)h(ma)m(y)g(b)s(e)630 +4105 y(found)29 b(in)h Ft($-)p Fu(.)630 4236 y(The)43 +b(remaining)h(N)f Fr(argumen)m(ts)48 b Fu(are)c(p)s(ositional)g +(parameters)g(and)f(are)h(assigned,)j(in)630 4346 y(order,)30 +b(to)h Ft($1)p Fu(,)f Ft($2)p Fu(,)36 b(.)22 b(.)g(.)42 +b Ft($N)p Fu(.)e(The)30 b(sp)s(ecial)h(parameter)g Ft(#)f +Fu(is)g(set)h(to)g(N.)630 4477 y(The)f(return)f(status)i(is)f(alw)m(a)m (ys)i(zero)f(unless)f(an)g(in)m(v)-5 b(alid)31 b(option)g(is)f -(supplied.)150 1123 y Fj(4.3.2)63 b(The)41 b(Shopt)h(Builtin)150 -1270 y Ft(This)30 b(builtin)g(allo)m(ws)h(y)m(ou)g(to)g(c)m(hange)h +(supplied.)150 4669 y Fk(4.3.2)63 b(The)41 b(Shopt)h(Builtin)150 +4816 y Fu(This)30 b(builtin)g(allo)m(ws)h(y)m(ou)g(to)g(c)m(hange)h (additional)f(shell)f(optional)i(b)s(eha)m(vior.)150 -1450 y Fs(shopt)870 1591 y(shopt)46 b([-pqsu])g([-o])h([)p -Fi(optname)56 b Fs(...)o(])630 1732 y Ft(T)-8 b(oggle)37 -b(the)e(v)-5 b(alues)35 b(of)g(settings)h(con)m(trolling)g(optional)g -(shell)f(b)s(eha)m(vior.)55 b(The)34 b(settings)630 1842 -y(can)h(b)s(e)f(either)i(those)f(listed)h(b)s(elo)m(w,)g(or,)h(if)d -(the)i(`)p Fs(-o)p Ft(')e(option)i(is)f(used,)g(those)h(a)m(v)-5 -b(ailable)630 1952 y(with)37 b(the)h(`)p Fs(-o)p Ft(')f(option)h(to)h -(the)e Fs(set)g Ft(builtin)g(command)g(\(see)i(Section)f(4.3.1)h([The)f -(Set)630 2061 y(Builtin],)27 b(page)f(59\).)40 b(With)26 -b(no)f(options,)i(or)e(with)g(the)g(`)p Fs(-p)p Ft(')g(option,)i(a)e -(list)h(of)f(all)h(settable)630 2171 y(options)31 b(is)f(displa)m(y)m -(ed,)h(with)f(an)g(indication)h(of)g(whether)e(or)i(not)f(eac)m(h)i(is) -e(set.)41 b(The)30 b(`)p Fs(-p)p Ft(')630 2280 y(option)37 -b(causes)f(output)g(to)h(b)s(e)f(displa)m(y)m(ed)g(in)g(a)h(form)f -(that)g(ma)m(y)h(b)s(e)f(reused)f(as)i(input.)630 2390 -y(Other)30 b(options)h(ha)m(v)m(e)g(the)g(follo)m(wing)h(meanings:)630 -2563 y Fs(-s)384 b Ft(Enable)30 b(\(set\))i(eac)m(h)f -Fq(optname)5 b Ft(.)630 2736 y Fs(-u)384 b Ft(Disable)31 -b(\(unset\))g(eac)m(h)h Fq(optname)5 b Ft(.)630 2909 -y Fs(-q)384 b Ft(Suppresses)28 b(normal)h(output;)h(the)g(return)e -(status)i(indicates)h(whether)e(the)1110 3019 y Fq(optname)37 -b Ft(is)31 b(set)h(or)f(unset.)43 b(If)31 b(m)m(ultiple)h -Fq(optname)37 b Ft(argumen)m(ts)31 b(are)h(giv)m(en)1110 -3128 y(with)43 b(`)p Fs(-q)p Ft(',)j(the)d(return)f(status)h(is)g(zero) -h(if)f(all)g Fq(optnames)k Ft(are)d(enabled;)1110 3238 -y(non-zero)31 b(otherwise.)630 3411 y Fs(-o)384 b Ft(Restricts)28 -b(the)g(v)-5 b(alues)28 b(of)f Fq(optname)33 b Ft(to)c(b)s(e)d(those)i -(de\014ned)f(for)g(the)g(`)p Fs(-o)p Ft(')h(op-)1110 -3520 y(tion)23 b(to)h(the)f Fs(set)f Ft(builtin)h(\(see)g(Section)h -(4.3.1)h([The)d(Set)i(Builtin],)h(page)e(59\).)630 3693 -y(If)40 b(either)g(`)p Fs(-s)p Ft(')g(or)g(`)p Fs(-u)p -Ft(')g(is)g(used)g(with)g(no)g Fq(optname)45 b Ft(argumen)m(ts,)e -Fs(shopt)c Ft(sho)m(ws)h(only)630 3803 y(those)31 b(options)g(whic)m(h) -f(are)g(set)h(or)g(unset,)f(resp)s(ectiv)m(ely)-8 b(.)630 -3944 y(Unless)30 b(otherwise)h(noted,)g(the)g Fs(shopt)d -Ft(options)j(are)g(disabled)f(\(o\013)7 b(\))32 b(b)m(y)e(default.)630 -4086 y(The)d(return)f(status)i(when)f(listing)h(options)g(is)f(zero)i -(if)e(all)i Fq(optnames)i Ft(are)d(enabled,)g(non-)630 -4195 y(zero)40 b(otherwise.)66 b(When)39 b(setting)h(or)f(unsetting)g -(options,)i(the)e(return)f(status)h(is)g(zero)630 4305 -y(unless)30 b(an)g Fq(optname)36 b Ft(is)30 b(not)h(a)g(v)-5 -b(alid)30 b(shell)h(option.)630 4446 y(The)f(list)h(of)f -Fs(shopt)f Ft(options)i(is:)630 4619 y Fs(autocd)192 -b Ft(If)27 b(set,)h(a)g(command)f(name)g(that)h(is)f(the)g(name)g(of)h -(a)f(directory)h(is)f(executed)1110 4729 y(as)j(if)f(it)h(w)m(ere)f -(the)h(argumen)m(t)g(to)g(the)f Fs(cd)g Ft(command.)40 -b(This)29 b(option)g(is)h(only)1110 4838 y(used)g(b)m(y)g(in)m -(teractiv)m(e)j(shells.)630 5011 y Fs(cdable_vars)1110 -5121 y Ft(If)h(this)h(is)g(set,)i(an)e(argumen)m(t)g(to)h(the)f -Fs(cd)f Ft(builtin)h(command)f(that)i(is)f(not)1110 5230 +4968 y Ft(shopt)870 5099 y(shopt)46 b([-pqsu])g([-o])h([)p +Fj(optname)e Ft(...])630 5230 y Fu(T)-8 b(oggle)37 b(the)e(v)-5 +b(alues)35 b(of)g(settings)h(con)m(trolling)g(optional)g(shell)f(b)s +(eha)m(vior.)55 b(The)34 b(settings)630 5340 y(can)24 +b(b)s(e)g(either)h(those)f(listed)h(b)s(elo)m(w,)h(or,)f(if)g(the)f +Ft(-o)f Fu(option)i(is)f(used,)h(those)g(a)m(v)-5 b(ailable)26 +b(with)p eop end +%%Page: 63 69 +TeXDict begin 63 68 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(63)630 299 y(the)30 +b Ft(-o)f Fu(option)i(to)f(the)g Ft(set)f Fu(builtin)h(command)f(\(see) +i(Section)g(4.3.1)g([The)f(Set)g(Builtin],)630 408 y(page)i(58\).)45 +b(With)32 b(no)f(options,)h(or)g(with)f(the)g Ft(-p)g +Fu(option,)h(a)g(list)g(of)f(all)i(settable)g(options)630 +518 y(is)j(displa)m(y)m(ed,)h(with)f(an)f(indication)i(of)e(whether)g +(or)h(not)g(eac)m(h)h(is)e(set.)57 b(The)35 b Ft(-p)g +Fu(option)630 628 y(causes)i(output)e(to)i(b)s(e)e(displa)m(y)m(ed)i +(in)f(a)g(form)g(that)h(ma)m(y)f(b)s(e)g(reused)f(as)h(input.)57 +b(Other)630 737 y(options)31 b(ha)m(v)m(e)g(the)g(follo)m(wing)h +(meanings:)630 894 y Ft(-s)384 b Fu(Enable)30 b(\(set\))i(eac)m(h)f +Fr(optname)p Fu(.)630 1052 y Ft(-u)384 b Fu(Disable)31 +b(\(unset\))g(eac)m(h)h Fr(optname)p Fu(.)630 1209 y +Ft(-q)384 b Fu(Suppresses)28 b(normal)h(output;)h(the)g(return)e +(status)i(indicates)h(whether)e(the)1110 1319 y Fr(optname)37 +b Fu(is)31 b(set)h(or)f(unset.)43 b(If)31 b(m)m(ultiple)h +Fr(optname)37 b Fu(argumen)m(ts)31 b(are)h(giv)m(en)1110 +1428 y(with)d Ft(-q)p Fu(,)g(the)g(return)f(status)h(is)g(zero)h(if)f +(all)h Fr(optnames)j Fu(are)d(enabled;)f(non-)1110 1538 +y(zero)i(otherwise.)630 1695 y Ft(-o)384 b Fu(Restricts)22 +b(the)f(v)-5 b(alues)22 b(of)f Fr(optname)27 b Fu(to)22 +b(b)s(e)e(those)i(de\014ned)e(for)h(the)g Ft(-o)f Fu(option)1110 +1805 y(to)31 b(the)g Ft(set)e Fu(builtin)h(\(see)h(Section)h(4.3.1)g +([The)e(Set)g(Builtin],)i(page)f(58\).)630 1962 y(If)e(either)i +Ft(-s)e Fu(or)h Ft(-u)f Fu(is)h(used)f(with)g(no)h Fr(optname)35 +b Fu(argumen)m(ts,)c Ft(shopt)d Fu(sho)m(ws)h(only)h(those)630 +2071 y(options)h(whic)m(h)f(are)h(set)f(or)h(unset,)f(resp)s(ectiv)m +(ely)-8 b(.)630 2205 y(Unless)30 b(otherwise)h(noted,)g(the)g +Ft(shopt)d Fu(options)j(are)g(disabled)f(\(o\013)7 b(\))32 +b(b)m(y)e(default.)630 2338 y(The)d(return)f(status)i(when)f(listing)h +(options)g(is)f(zero)i(if)e(all)i Fr(optnames)i Fu(are)d(enabled,)g +(non-)630 2448 y(zero)40 b(otherwise.)66 b(When)39 b(setting)h(or)f +(unsetting)g(options,)i(the)e(return)f(status)h(is)g(zero)630 +2557 y(unless)30 b(an)g Fr(optname)36 b Fu(is)30 b(not)h(a)g(v)-5 +b(alid)30 b(shell)h(option.)630 2691 y(The)f(list)h(of)f +Ft(shopt)f Fu(options)i(is:)630 2848 y Ft(autocd)192 +b Fu(If)27 b(set,)h(a)g(command)f(name)g(that)h(is)f(the)g(name)g(of)h +(a)f(directory)h(is)f(executed)1110 2958 y(as)j(if)f(it)h(w)m(ere)f +(the)h(argumen)m(t)g(to)g(the)f Ft(cd)g Fu(command.)40 +b(This)29 b(option)g(is)h(only)1110 3067 y(used)g(b)m(y)g(in)m +(teractiv)m(e)j(shells.)630 3224 y Ft(cdable_vars)1110 +3334 y Fu(If)h(this)h(is)g(set,)i(an)e(argumen)m(t)g(to)h(the)f +Ft(cd)f Fu(builtin)h(command)f(that)i(is)f(not)1110 3444 y(a)c(directory)g(is)g(assumed)f(to)h(b)s(e)f(the)h(name)f(of)h(a)g(v) --5 b(ariable)31 b(whose)g(v)-5 b(alue)31 b(is)1110 5340 -y(the)g(directory)f(to)i(c)m(hange)f(to.)p eop end -%%Page: 64 70 -TeXDict begin 64 69 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(64)630 299 y Fs(cdspell)144 -b Ft(If)27 b(set,)h(minor)f(errors)f(in)h(the)g(sp)s(elling)h(of)f(a)g -(directory)h(comp)s(onen)m(t)f(in)g(a)h Fs(cd)1110 408 -y Ft(command)i(will)h(b)s(e)f(corrected.)43 b(The)30 +-5 b(ariable)31 b(whose)g(v)-5 b(alue)31 b(is)1110 3553 +y(the)g(directory)f(to)i(c)m(hange)f(to.)630 3710 y Ft(cdspell)144 +b Fu(If)27 b(set,)h(minor)f(errors)f(in)h(the)g(sp)s(elling)h(of)f(a)g +(directory)h(comp)s(onen)m(t)f(in)g(a)h Ft(cd)1110 3820 +y Fu(command)i(will)h(b)s(e)f(corrected.)43 b(The)30 b(errors)g(c)m(hec)m(k)m(ed)j(for)d(are)h(transp)s(osed)1110 -518 y(c)m(haracters,)46 b(a)c(missing)f(c)m(haracter,)47 +3930 y(c)m(haracters,)46 b(a)c(missing)f(c)m(haracter,)47 b(and)40 b(a)i(c)m(haracter)h(to)s(o)g(man)m(y)-8 b(.)74 -b(If)42 b(a)1110 628 y(correction)25 b(is)e(found,)g(the)h(corrected)g -(path)f(is)g(prin)m(ted,)h(and)f(the)g(command)1110 737 +b(If)42 b(a)1110 4039 y(correction)25 b(is)e(found,)g(the)h(corrected)g +(path)f(is)g(prin)m(ted,)h(and)f(the)g(command)1110 4149 y(pro)s(ceeds.)40 b(This)30 b(option)h(is)f(only)h(used)e(b)m(y)h(in)m -(teractiv)m(e)k(shells.)630 883 y Fs(checkhash)1110 993 -y Ft(If)29 b(this)h(is)g(set,)g(Bash)g(c)m(hec)m(ks)h(that)g(a)f -(command)f(found)g(in)g(the)h(hash)f(table)1110 1103 +(teractiv)m(e)k(shells.)630 4306 y Ft(checkhash)1110 +4416 y Fu(If)29 b(this)h(is)g(set,)g(Bash)g(c)m(hec)m(ks)h(that)g(a)f +(command)f(found)g(in)g(the)h(hash)f(table)1110 4525 y(exists)k(b)s(efore)f(trying)h(to)h(execute)g(it.)48 -b(If)32 b(a)h(hashed)e(command)i(no)f(longer)1110 1212 +b(If)32 b(a)h(hashed)e(command)i(no)f(longer)1110 4635 y(exists,)f(a)g(normal)f(path)g(searc)m(h)h(is)g(p)s(erformed.)630 -1358 y Fs(checkjobs)1110 1468 y Ft(If)d(set,)i(Bash)e(lists)h(the)g +4792 y Ft(checkjobs)1110 4902 y Fu(If)d(set,)i(Bash)e(lists)h(the)g (status)g(of)f(an)m(y)h(stopp)s(ed)f(and)g(running)e(jobs)i(b)s(efore) -1110 1577 y(exiting)42 b(an)f(in)m(teractiv)m(e)j(shell.)72 +1110 5011 y(exiting)42 b(an)f(in)m(teractiv)m(e)j(shell.)72 b(If)41 b(an)m(y)g(jobs)f(are)i(running,)g(this)f(causes)1110 -1687 y(the)30 b(exit)g(to)g(b)s(e)f(deferred)g(un)m(til)h(a)f(second)h -(exit)g(is)g(attempted)h(without)e(an)1110 1797 y(in)m(terv)m(ening)j -(command)e(\(see)h(Chapter)f(7)h([Job)f(Con)m(trol],)i(page)f(98\).)42 -b(The)1110 1906 y(shell)31 b(alw)m(a)m(ys)g(p)s(ostp)s(ones)f(exiting)h -(if)g(an)m(y)f(jobs)g(are)h(stopp)s(ed.)630 2052 y Fs(checkwinsize)1110 -2162 y Ft(If)41 b(set,)k(Bash)c(c)m(hec)m(ks)i(the)f(windo)m(w)e(size)j -(after)f(eac)m(h)g(command)f(and,)j(if)1110 2271 y(necessary)-8 -b(,)31 b(up)s(dates)f(the)g(v)-5 b(alues)31 b(of)g Fs(LINES)e -Ft(and)g Fs(COLUMNS)p Ft(.)630 2418 y Fs(cmdhist)144 -b Ft(If)33 b(set,)j(Bash)e(attempts)h(to)g(sa)m(v)m(e)g(all)g(lines)f -(of)g(a)h(m)m(ultiple-line)g(command)1110 2527 y(in)c(the)g(same)g -(history)g(en)m(try)-8 b(.)42 b(This)30 b(allo)m(ws)i(easy)g -(re-editing)g(of)f(m)m(ulti-line)1110 2637 y(commands.)630 -2783 y Fs(compat31)96 b Ft(If)27 b(set,)i(Bash)e(c)m(hanges)i(its)f(b)s -(eha)m(vior)f(to)i(that)f(of)f(v)m(ersion)h(3.1)h(with)e(resp)s(ect) -1110 2892 y(to)39 b(quoted)f(argumen)m(ts)g(to)h(the)f(conditional)h -(command's)f(`)p Fs(=~)p Ft(')g(op)s(erator)1110 3002 -y(and)i(with)f(resp)s(ect)i(to)g(lo)s(cale-sp)s(eci\014c)h(string)e -(comparison)g(when)f(using)1110 3112 y(the)31 b Fs([[)e -Ft(conditional)j(command's)e(`)p Fs(<)p Ft(')h(and)f(`)p -Fs(>)p Ft(')g(op)s(erators.)41 b(Bash)31 b(v)m(ersions)1110 -3221 y(prior)g(to)h(bash-4.1)g(use)g(ASCI)s(I)e(collation)j(and)e -(strcmp\(3\);)i(bash-4.1)g(and)1110 3331 y(later)e(use)f(the)h(curren)m -(t)f(lo)s(cale's)i(collation)h(sequence)e(and)f(strcoll\(3\).)630 -3477 y Fs(compat32)96 b Ft(If)27 b(set,)i(Bash)e(c)m(hanges)i(its)f(b)s -(eha)m(vior)f(to)i(that)f(of)f(v)m(ersion)h(3.2)h(with)e(resp)s(ect) -1110 3587 y(to)34 b(lo)s(cale-sp)s(eci\014c)h(string)e(comparison)g -(when)f(using)h(the)g Fs([[)g Ft(conditional)1110 3696 -y(command's)d(`)p Fs(<)p Ft(')h(and)f(`)p Fs(>)p Ft(')g(op)s(erators)h -(\(see)g(previous)f(item\).)630 3842 y Fs(compat40)96 -b Ft(If)27 b(set,)i(Bash)e(c)m(hanges)i(its)f(b)s(eha)m(vior)f(to)i -(that)f(of)f(v)m(ersion)h(4.0)h(with)e(resp)s(ect)1110 -3952 y(to)34 b(lo)s(cale-sp)s(eci\014c)h(string)e(comparison)g(when)f -(using)h(the)g Fs([[)g Ft(conditional)1110 4061 y(command's)28 -b(`)p Fs(<)p Ft(')h(and)f(`)p Fs(>)p Ft(')h(op)s(erators)f(\(see)i -(description)e(of)h Fs(compat31)p Ft(\))e(and)1110 4171 -y(the)38 b(e\013ect)i(of)e(in)m(terrupting)f(a)i(command)e(list.)64 -b(Bash)38 b(v)m(ersions)h(4.0)g(and)1110 4281 y(later)24 -b(in)m(terrupt)f(the)g(list)h(as)g(if)f(the)h(shell)f(receiv)m(ed)i -(the)e(in)m(terrupt;)i(previous)1110 4390 y(v)m(ersions)31 -b(con)m(tin)m(ue)g(with)f(the)h(next)g(command)f(in)g(the)g(list.)630 -4536 y Fs(compat41)96 b Ft(If)25 b(set,)j(Bash,)e(when)f(in)g -Fl(posix)g Ft(mo)s(de,)i(treats)f(a)g(single)h(quote)f(in)f(a)h -(double-)1110 4646 y(quoted)46 b(parameter)h(expansion)f(as)g(a)h(sp)s -(ecial)f(c)m(haracter.)90 b(The)45 b(single)1110 4756 -y(quotes)34 b(m)m(ust)g(matc)m(h)h(\(an)f(ev)m(en)h(n)m(um)m(b)s(er\))e -(and)g(the)h(c)m(haracters)h(b)s(et)m(w)m(een)1110 4865 -y(the)40 b(single)g(quotes)g(are)g(considered)g(quoted.)69 -b(This)38 b(is)i(the)g(b)s(eha)m(vior)g(of)1110 4975 -y Fl(posix)f Ft(mo)s(de)g(through)g(v)m(ersion)h(4.1.)69 +5121 y(the)30 b(exit)g(to)g(b)s(e)f(deferred)g(un)m(til)h(a)f(second)h +(exit)g(is)g(attempted)h(without)e(an)1110 5230 y(in)m(terv)m(ening)j +(command)e(\(see)h(Chapter)f(7)h([Job)f(Con)m(trol],)i(page)f(97\).)42 +b(The)1110 5340 y(shell)31 b(alw)m(a)m(ys)g(p)s(ostp)s(ones)f(exiting)h +(if)g(an)m(y)f(jobs)g(are)h(stopp)s(ed.)p eop end +%%Page: 64 70 +TeXDict begin 64 69 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(64)630 299 y Ft(checkwinsize) +1110 408 y Fu(If)41 b(set,)k(Bash)c(c)m(hec)m(ks)i(the)f(windo)m(w)e +(size)j(after)f(eac)m(h)g(command)f(and,)j(if)1110 518 +y(necessary)-8 b(,)31 b(up)s(dates)f(the)g(v)-5 b(alues)31 +b(of)g Ft(LINES)e Fu(and)g Ft(COLUMNS)p Fu(.)630 669 +y Ft(cmdhist)144 b Fu(If)33 b(set,)j(Bash)e(attempts)h(to)g(sa)m(v)m(e) +g(all)g(lines)f(of)g(a)h(m)m(ultiple-line)g(command)1110 +778 y(in)c(the)g(same)g(history)g(en)m(try)-8 b(.)42 +b(This)30 b(allo)m(ws)i(easy)g(re-editing)g(of)f(m)m(ulti-line)1110 +888 y(commands.)630 1039 y Ft(compat31)96 b Fu(If)27 +b(set,)i(Bash)e(c)m(hanges)i(its)f(b)s(eha)m(vior)f(to)i(that)f(of)f(v) +m(ersion)h(3.1)h(with)e(resp)s(ect)1110 1148 y(to)39 +b(quoted)f(argumen)m(ts)g(to)h(the)f(conditional)h(command's)f(`)p +Ft(=~)p Fu(')g(op)s(erator)1110 1258 y(and)i(with)f(resp)s(ect)i(to)g +(lo)s(cale-sp)s(eci\014c)h(string)e(comparison)g(when)f(using)1110 +1367 y(the)31 b Ft([[)e Fu(conditional)j(command's)e(`)p +Ft(<)p Fu(')h(and)f(`)p Ft(>)p Fu(')g(op)s(erators.)41 +b(Bash)31 b(v)m(ersions)1110 1477 y(prior)g(to)h(bash-4.1)g(use)g(ASCI) +s(I)e(collation)j(and)e(strcmp\(3\);)i(bash-4.1)g(and)1110 +1587 y(later)e(use)f(the)h(curren)m(t)f(lo)s(cale's)i(collation)h +(sequence)e(and)f(strcoll\(3\).)630 1737 y Ft(compat32)96 +b Fu(If)27 b(set,)i(Bash)e(c)m(hanges)i(its)f(b)s(eha)m(vior)f(to)i +(that)f(of)f(v)m(ersion)h(3.2)h(with)e(resp)s(ect)1110 +1847 y(to)34 b(lo)s(cale-sp)s(eci\014c)h(string)e(comparison)g(when)f +(using)h(the)g Ft([[)g Fu(conditional)1110 1956 y(command's)d(`)p +Ft(<)p Fu(')h(and)f(`)p Ft(>)p Fu(')g(op)s(erators)h(\(see)g(previous)f +(item\).)630 2107 y Ft(compat40)96 b Fu(If)27 b(set,)i(Bash)e(c)m +(hanges)i(its)f(b)s(eha)m(vior)f(to)i(that)f(of)f(v)m(ersion)h(4.0)h +(with)e(resp)s(ect)1110 2217 y(to)34 b(lo)s(cale-sp)s(eci\014c)h +(string)e(comparison)g(when)f(using)h(the)g Ft([[)g Fu(conditional)1110 +2326 y(command's)28 b(`)p Ft(<)p Fu(')h(and)f(`)p Ft(>)p +Fu(')h(op)s(erators)f(\(see)i(description)e(of)h Ft(compat31)p +Fu(\))e(and)1110 2436 y(the)38 b(e\013ect)i(of)e(in)m(terrupting)f(a)i +(command)e(list.)64 b(Bash)38 b(v)m(ersions)h(4.0)g(and)1110 +2545 y(later)24 b(in)m(terrupt)f(the)g(list)h(as)g(if)f(the)h(shell)f +(receiv)m(ed)i(the)e(in)m(terrupt;)i(previous)1110 2655 +y(v)m(ersions)31 b(con)m(tin)m(ue)g(with)f(the)h(next)g(command)f(in)g +(the)g(list.)630 2806 y Ft(compat41)96 b Fu(If)25 b(set,)j(Bash,)e +(when)f(in)g Fm(posix)g Fu(mo)s(de,)i(treats)f(a)g(single)h(quote)f(in) +f(a)h(double-)1110 2915 y(quoted)46 b(parameter)h(expansion)f(as)g(a)h +(sp)s(ecial)f(c)m(haracter.)90 b(The)45 b(single)1110 +3025 y(quotes)34 b(m)m(ust)g(matc)m(h)h(\(an)f(ev)m(en)h(n)m(um)m(b)s +(er\))e(and)g(the)h(c)m(haracters)h(b)s(et)m(w)m(een)1110 +3134 y(the)40 b(single)g(quotes)g(are)g(considered)g(quoted.)69 +b(This)38 b(is)i(the)g(b)s(eha)m(vior)g(of)1110 3244 +y Fm(posix)f Fu(mo)s(de)g(through)g(v)m(ersion)h(4.1.)69 b(The)39 b(default)g(Bash)h(b)s(eha)m(vior)g(re-)1110 -5084 y(mains)30 b(as)h(in)f(previous)g(v)m(ersions.)630 -5230 y Fs(compat42)96 b Ft(If)29 b(set,)i(Bash)f(do)s(es)f(not)h(pro)s +3354 y(mains)30 b(as)h(in)f(previous)g(v)m(ersions.)630 +3504 y Ft(compat42)96 b Fu(If)29 b(set,)i(Bash)f(do)s(es)f(not)h(pro)s (cess)g(the)g(replacemen)m(t)h(string)e(in)h(the)g(pattern)1110 -5340 y(substitution)g(w)m(ord)g(expansion)g(using)g(quote)h(remo)m(v)-5 -b(al.)p eop end -%%Page: 65 71 -TeXDict begin 65 70 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(65)630 299 y Fs -(complete_fullquote)1110 408 y Ft(If)31 b(set,)g(Bash)h(quotes)f(all)h -(shell)f(metac)m(haracters)i(in)e(\014lenames)g(and)g(direc-)1110 -518 y(tory)g(names)f(when)g(p)s(erforming)f(completion.)43 -b(If)30 b(not)h(set,)g(Bash)g(remo)m(v)m(es)1110 628 -y(metac)m(haracters)40 b(suc)m(h)d(as)h(the)g(dollar)g(sign)g(from)f -(the)h(set)g(of)f(c)m(haracters)1110 737 y(that)f(will)g(b)s(e)f -(quoted)g(in)g(completed)i(\014lenames)e(when)f(these)i(metac)m(har-) -1110 847 y(acters)29 b(app)s(ear)e(in)g(shell)h(v)-5 -b(ariable)28 b(references)g(in)f(w)m(ords)g(to)i(b)s(e)e(completed.) -1110 956 y(This)k(means)i(that)g(dollar)f(signs)g(in)g(v)-5 -b(ariable)33 b(names)g(that)f(expand)g(to)h(di-)1110 -1066 y(rectories)28 b(will)g(not)f(b)s(e)f(quoted;)j(ho)m(w)m(ev)m(er,) -g(an)m(y)e(dollar)h(signs)f(app)s(earing)f(in)1110 1176 +3614 y(substitution)g(w)m(ord)g(expansion)g(using)g(quote)h(remo)m(v)-5 +b(al.)630 3765 y Ft(complete_fullquote)1110 3874 y Fu(If)31 +b(set,)g(Bash)h(quotes)f(all)h(shell)f(metac)m(haracters)i(in)e +(\014lenames)g(and)g(direc-)1110 3984 y(tory)g(names)f(when)g(p)s +(erforming)f(completion.)43 b(If)30 b(not)h(set,)g(Bash)g(remo)m(v)m +(es)1110 4093 y(metac)m(haracters)40 b(suc)m(h)d(as)h(the)g(dollar)g +(sign)g(from)f(the)h(set)g(of)f(c)m(haracters)1110 4203 +y(that)f(will)g(b)s(e)f(quoted)g(in)g(completed)i(\014lenames)e(when)f +(these)i(metac)m(har-)1110 4313 y(acters)29 b(app)s(ear)e(in)g(shell)h +(v)-5 b(ariable)28 b(references)g(in)f(w)m(ords)g(to)i(b)s(e)e +(completed.)1110 4422 y(This)k(means)i(that)g(dollar)f(signs)g(in)g(v) +-5 b(ariable)33 b(names)g(that)f(expand)g(to)h(di-)1110 +4532 y(rectories)28 b(will)g(not)f(b)s(e)f(quoted;)j(ho)m(w)m(ev)m(er,) +g(an)m(y)e(dollar)h(signs)f(app)s(earing)f(in)1110 4641 y(\014lenames)j(will)h(not)f(b)s(e)g(quoted,)h(either.)41 b(This)28 b(is)i(activ)m(e)h(only)e(when)g(bash)1110 -1285 y(is)39 b(using)f(bac)m(kslashes)i(to)g(quote)g(completed)f -(\014lenames.)67 b(This)38 b(v)-5 b(ariable)1110 1395 +4751 y(is)39 b(using)f(bac)m(kslashes)i(to)g(quote)g(completed)f +(\014lenames.)67 b(This)38 b(v)-5 b(ariable)1110 4861 y(is)41 b(set)g(b)m(y)g(default,)j(whic)m(h)c(is)h(the)g(default)g -(Bash)g(b)s(eha)m(vior)g(in)g(v)m(ersions)1110 1504 y(through)30 -b(4.2.)630 1682 y Fs(direxpand)1110 1792 y Ft(If)k(set,)i(Bash)f +(Bash)g(b)s(eha)m(vior)g(in)g(v)m(ersions)1110 4970 y(through)30 +b(4.2.)630 5121 y Ft(direxpand)1110 5230 y Fu(If)k(set,)i(Bash)f (replaces)g(directory)g(names)g(with)f(the)g(results)h(of)f(w)m(ord)g -(ex-)1110 1902 y(pansion)k(when)g(p)s(erforming)f(\014lename)i -(completion.)67 b(This)38 b(c)m(hanges)i(the)1110 2011 -y(con)m(ten)m(ts)29 b(of)e(the)g(readline)h(editing)g(bu\013er.)38 -b(If)27 b(not)g(set,)i(Bash)e(attempts)h(to)1110 2121 -y(preserv)m(e)j(what)f(the)g(user)g(t)m(yp)s(ed.)630 -2299 y Fs(dirspell)96 b Ft(If)26 b(set,)i(Bash)f(attempts)g(sp)s -(elling)g(correction)g(on)g(directory)g(names)f(during)1110 -2408 y(w)m(ord)36 b(completion)h(if)f(the)g(directory)g(name)g -(initially)h(supplied)e(do)s(es)h(not)1110 2518 y(exist.)630 -2696 y Fs(dotglob)144 b Ft(If)27 b(set,)i(Bash)f(includes)g -(\014lenames)g(b)s(eginning)f(with)g(a)h(`.')41 b(in)27 -b(the)h(results)g(of)1110 2806 y(\014lename)j(expansion.)630 -2984 y Fs(execfail)96 b Ft(If)24 b(this)h(is)f(set,)j(a)e(non-in)m +(ex-)1110 5340 y(pansion)k(when)g(p)s(erforming)f(\014lename)i +(completion.)67 b(This)38 b(c)m(hanges)i(the)p eop end +%%Page: 65 71 +TeXDict begin 65 70 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(65)1110 299 y(con)m(ten)m(ts)29 +b(of)e(the)g(readline)h(editing)g(bu\013er.)38 b(If)27 +b(not)g(set,)i(Bash)e(attempts)h(to)1110 408 y(preserv)m(e)j(what)f +(the)g(user)g(t)m(yp)s(ed.)630 555 y Ft(dirspell)96 b +Fu(If)26 b(set,)i(Bash)f(attempts)g(sp)s(elling)g(correction)g(on)g +(directory)g(names)f(during)1110 664 y(w)m(ord)36 b(completion)h(if)f +(the)g(directory)g(name)g(initially)h(supplied)e(do)s(es)h(not)1110 +774 y(exist.)630 920 y Ft(dotglob)144 b Fu(If)27 b(set,)i(Bash)f +(includes)g(\014lenames)g(b)s(eginning)f(with)g(a)h(`.')41 +b(in)27 b(the)h(results)g(of)1110 1029 y(\014lename)j(expansion.)630 +1176 y Ft(execfail)96 b Fu(If)24 b(this)h(is)f(set,)j(a)e(non-in)m (teractiv)m(e)i(shell)e(will)f(not)h(exit)h(if)e(it)h(cannot)h(execute) -1110 3093 y(the)i(\014le)g(sp)s(eci\014ed)g(as)g(an)g(argumen)m(t)g(to) -h(the)f Fs(exec)f Ft(builtin)h(command.)39 b(An)1110 -3203 y(in)m(teractiv)m(e)33 b(shell)e(do)s(es)f(not)g(exit)i(if)e -Fs(exec)f Ft(fails.)630 3381 y Fs(expand_aliases)1110 -3491 y Ft(If)j(set,)h(aliases)g(are)g(expanded)e(as)h(describ)s(ed)f(b) -s(elo)m(w)h(under)f(Aliases,)i(Sec-)1110 3600 y(tion)38 +1110 1285 y(the)i(\014le)g(sp)s(eci\014ed)g(as)g(an)g(argumen)m(t)g(to) +h(the)f Ft(exec)f Fu(builtin)h(command.)39 b(An)1110 +1395 y(in)m(teractiv)m(e)33 b(shell)e(do)s(es)f(not)g(exit)i(if)e +Ft(exec)f Fu(fails.)630 1541 y Ft(expand_aliases)1110 +1650 y Fu(If)j(set,)h(aliases)g(are)g(expanded)e(as)h(describ)s(ed)f(b) +s(elo)m(w)h(under)f(Aliases,)i(Sec-)1110 1760 y(tion)38 b(6.6)h([Aliases],)j(page)d(88.)64 b(This)37 b(option)h(is)g(enabled)g -(b)m(y)g(default)g(for)1110 3710 y(in)m(teractiv)m(e)33 -b(shells.)630 3888 y Fs(extdebug)96 b Ft(If)30 b(set,)h(b)s(eha)m(vior) +(b)m(y)g(default)g(for)1110 1870 y(in)m(teractiv)m(e)33 +b(shells.)630 2016 y Ft(extdebug)96 b Fu(If)30 b(set,)h(b)s(eha)m(vior) g(in)m(tended)f(for)g(use)g(b)m(y)g(debuggers)g(is)h(enabled:)1159 -4032 y(1.)61 b(The)32 b(`)p Fs(-F)p Ft(')g(option)h(to)g(the)g -Fs(declare)d Ft(builtin)i(\(see)i(Section)f(4.2)h([Bash)1290 -4141 y(Builtins],)29 b(page)g(48\))g(displa)m(ys)f(the)g(source)h -(\014le)f(name)g(and)f(line)h(n)m(um-)1290 4251 y(b)s(er)h(corresp)s +2144 y(1.)61 b(The)37 b Ft(-F)g Fu(option)h(to)g(the)g +Ft(declare)d Fu(builtin)i(\(see)i(Section)f(4.2)h([Bash)1290 +2253 y(Builtins],)29 b(page)g(48\))g(displa)m(ys)f(the)g(source)h +(\014le)f(name)g(and)f(line)h(n)m(um-)1290 2363 y(b)s(er)h(corresp)s (onding)g(to)i(eac)m(h)g(function)f(name)g(supplied)f(as)i(an)f(argu-) -1290 4361 y(men)m(t.)1159 4504 y(2.)61 b(If)20 b(the)h(command)g(run)e -(b)m(y)i(the)f Fs(DEBUG)g Ft(trap)g(returns)g(a)h(non-zero)g(v)-5 -b(alue,)1290 4614 y(the)31 b(next)f(command)g(is)h(skipp)s(ed)e(and)g -(not)i(executed.)1159 4758 y(3.)61 b(If)37 b(the)g(command)g(run)f(b)m -(y)i(the)f Fs(DEBUG)f Ft(trap)h(returns)f(a)i(v)-5 b(alue)38 -b(of)f(2,)1290 4867 y(and)c(the)g(shell)h(is)f(executing)i(in)e(a)h -(subroutine)e(\(a)i(shell)g(function)f(or)1290 4977 y(a)h(shell)h -(script)f(executed)h(b)m(y)f(the)g Fs(.)g Ft(or)g Fs(source)e -Ft(builtins\),)j(a)g(call)g(to)1290 5087 y Fs(return)29 -b Ft(is)h(sim)m(ulated.)1159 5230 y(4.)61 b Fs(BASH_ARGC)34 -b Ft(and)i Fs(BASH_ARGV)e Ft(are)j(up)s(dated)e(as)h(describ)s(ed)g(in) -g(their)1290 5340 y(descriptions)30 b(\(see)i(Section)f(5.2)g([Bash)g -(V)-8 b(ariables],)32 b(page)f(69\).)p eop end -%%Page: 66 72 -TeXDict begin 66 71 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(66)1159 299 y(5.)61 +1290 2472 y(men)m(t.)1159 2600 y(2.)61 b(If)20 b(the)h(command)g(run)e +(b)m(y)i(the)f Ft(DEBUG)g Fu(trap)g(returns)g(a)h(non-zero)g(v)-5 +b(alue,)1290 2710 y(the)31 b(next)f(command)g(is)h(skipp)s(ed)e(and)g +(not)i(executed.)1159 2838 y(3.)61 b(If)37 b(the)g(command)g(run)f(b)m +(y)i(the)f Ft(DEBUG)f Fu(trap)h(returns)f(a)i(v)-5 b(alue)38 +b(of)f(2,)1290 2947 y(and)c(the)g(shell)h(is)f(executing)i(in)e(a)h +(subroutine)e(\(a)i(shell)g(function)f(or)1290 3057 y(a)h(shell)h +(script)f(executed)h(b)m(y)f(the)g Ft(.)g Fu(or)g Ft(source)e +Fu(builtins\),)j(a)g(call)g(to)1290 3166 y Ft(return)29 +b Fu(is)h(sim)m(ulated.)1159 3294 y(4.)61 b Ft(BASH_ARGC)34 +b Fu(and)i Ft(BASH_ARGV)e Fu(are)j(up)s(dated)e(as)h(describ)s(ed)g(in) +g(their)1290 3404 y(descriptions)30 b(\(see)i(Section)f(5.2)g([Bash)g +(V)-8 b(ariables],)32 b(page)f(69\).)1159 3532 y(5.)61 b(F)-8 b(unction)57 b(tracing)g(is)g(enabled:)93 b(command)56 -b(substitution,)63 b(shell)1290 408 y(functions,)30 b(and)f(subshells)g -(in)m(v)m(ok)m(ed)j(with)d Fs(\()h Fi(command)39 b Fs(\))30 -b Ft(inherit)g(the)1290 518 y Fs(DEBUG)f Ft(and)h Fs(RETURN)e -Ft(traps.)1159 649 y(6.)61 b(Error)41 b(tracing)i(is)f(enabled:)63 -b(command)42 b(substitution,)i(shell)f(func-)1290 758 -y(tions,)30 b(and)f(subshells)g(in)m(v)m(ok)m(ed)i(with)e -Fs(\()h Fi(command)39 b Fs(\))29 b Ft(inherit)g(the)h -Fs(ERR)1290 868 y Ft(trap.)630 1019 y Fs(extglob)144 -b Ft(If)26 b(set,)i(the)f(extended)f(pattern)h(matc)m(hing)g(features)g -(describ)s(ed)e(ab)s(o)m(v)m(e)j(\(see)1110 1129 y(Section)j(3.5.8.1)i +b(substitution,)63 b(shell)1290 3641 y(functions,)32 +b(and)e(subshells)h(in)m(v)m(ok)m(ed)i(with)e Ft(\()f +Fj(command)e Ft(\))j Fu(inherit)h(the)1290 3751 y Ft(DEBUG)d +Fu(and)h Ft(RETURN)e Fu(traps.)1159 3879 y(6.)61 b(Error)41 +b(tracing)i(is)f(enabled:)63 b(command)42 b(substitution,)i(shell)f +(func-)1290 3988 y(tions,)32 b(and)e(subshells)g(in)m(v)m(ok)m(ed)i +(with)e Ft(\()g Fj(command)f Ft(\))h Fu(inherit)h(the)g +Ft(ERR)1290 4098 y Fu(trap.)630 4244 y Ft(extglob)144 +b Fu(If)26 b(set,)i(the)f(extended)f(pattern)h(matc)m(hing)g(features)g +(describ)s(ed)e(ab)s(o)m(v)m(e)j(\(see)1110 4354 y(Section)j(3.5.8.1)i ([P)m(attern)f(Matc)m(hing],)g(page)f(30\))h(are)f(enabled.)630 -1280 y Fs(extquote)96 b Ft(If)49 b(set,)54 b Fs($')p -Fi(string)11 b Fs(')46 b Ft(and)j Fs($")p Fi(string)11 -b Fs(")46 b Ft(quoting)k(is)f(p)s(erformed)e(within)1110 -1390 y Fs(${)p Fi(parameter)11 b Fs(})30 b Ft(expansions)j(enclosed)h -(in)g(double)f(quotes.)51 b(This)32 b(option)1110 1499 -y(is)e(enabled)h(b)m(y)f(default.)630 1650 y Fs(failglob)96 -b Ft(If)36 b(set,)j(patterns)d(whic)m(h)g(fail)h(to)h(matc)m(h)f -(\014lenames)f(during)g(\014lename)g(ex-)1110 1760 y(pansion)30 -b(result)g(in)g(an)g(expansion)h(error.)630 1911 y Fs(force_fignore) -1110 2021 y Ft(If)43 b(set,)k(the)d(su\016xes)f(sp)s(eci\014ed)f(b)m(y) -i(the)f Fs(FIGNORE)f Ft(shell)h(v)-5 b(ariable)44 b(cause)1110 -2131 y(w)m(ords)31 b(to)h(b)s(e)f(ignored)h(when)f(p)s(erforming)f(w)m -(ord)h(completion)i(ev)m(en)f(if)g(the)1110 2240 y(ignored)37 +4500 y Ft(extquote)96 b Fu(If)51 b(set,)58 b Ft($')p +Fj(string)p Ft(')49 b Fu(and)i Ft($")p Fj(string)p Ft(")e +Fu(quoting)k(is)e(p)s(erformed)f(within)1110 4609 y Ft(${)p +Fj(parameter)p Ft(})31 b Fu(expansions)k(enclosed)g(in)g(double)f +(quotes.)55 b(This)33 b(option)1110 4719 y(is)d(enabled)h(b)m(y)f +(default.)630 4865 y Ft(failglob)96 b Fu(If)36 b(set,)j(patterns)d +(whic)m(h)g(fail)h(to)h(matc)m(h)f(\014lenames)f(during)g(\014lename)g +(ex-)1110 4975 y(pansion)30 b(result)g(in)g(an)g(expansion)h(error.)630 +5121 y Ft(force_fignore)1110 5230 y Fu(If)43 b(set,)k(the)d(su\016xes)f +(sp)s(eci\014ed)f(b)m(y)i(the)f Ft(FIGNORE)f Fu(shell)h(v)-5 +b(ariable)44 b(cause)1110 5340 y(w)m(ords)31 b(to)h(b)s(e)f(ignored)h +(when)f(p)s(erforming)f(w)m(ord)h(completion)i(ev)m(en)f(if)g(the)p +eop end +%%Page: 66 72 +TeXDict begin 66 71 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(66)1110 299 y(ignored)37 b(w)m(ords)g(are)g(the)h(only)f(p)s(ossible)g(completions.)62 -b(See)37 b(Section)h(5.2)1110 2350 y([Bash)24 b(V)-8 -b(ariables],)27 b(page)e(69,)h(for)d(a)h(description)g(of)g -Fs(FIGNORE)p Ft(.)37 b(This)22 b(option)1110 2459 y(is)30 -b(enabled)h(b)m(y)f(default.)630 2611 y Fs(globasciiranges)1110 -2720 y Ft(If)j(set,)h(range)f(expressions)g(used)f(in)h(pattern)g(matc) -m(hing)h(brac)m(k)m(et)h(expres-)1110 2830 y(sions)28 -b(\(see)h(Section)h(3.5.8.1)g([P)m(attern)g(Matc)m(hing],)h(page)e -(30\))g(b)s(eha)m(v)m(e)g(as)g(if)1110 2939 y(in)i(the)g(traditional)i -(C)d(lo)s(cale)j(when)d(p)s(erforming)g(comparisons.)44 -b(That)31 b(is,)1110 3049 y(the)d(curren)m(t)g(lo)s(cale's)i(collating) -h(sequence)d(is)h(not)f(tak)m(en)h(in)m(to)g(accoun)m(t,)i(so)1110 -3159 y(`)p Fs(b)p Ft(')j(will)g(not)g(collate)i(b)s(et)m(w)m(een)e(`)p -Fs(A)p Ft(')g(and)f(`)p Fs(B)p Ft(',)h(and)f(upp)s(er-case)g(and)g(lo)m -(w)m(er-)1110 3268 y(case)e(ASCI)s(I)e(c)m(haracters)j(will)f(collate)i -(together.)630 3420 y Fs(globstar)96 b Ft(If)38 b(set,)j(the)e(pattern) -f(`)p Fs(**)p Ft(')h(used)e(in)i(a)f(\014lename)h(expansion)f(con)m -(text)j(will)1110 3529 y(matc)m(h)36 b(all)g(\014les)f(and)f(zero)i(or) -f(more)g(directories)h(and)e(sub)s(directories.)54 b(If)1110 -3639 y(the)30 b(pattern)g(is)g(follo)m(w)m(ed)i(b)m(y)d(a)i(`)p -Fs(/)p Ft(',)f(only)g(directories)h(and)f(sub)s(directories)1110 -3748 y(matc)m(h.)630 3900 y Fs(gnu_errfmt)1110 4009 y -Ft(If)35 b(set,)j(shell)e(error)g(messages)g(are)h(written)e(in)h(the)g -(standard)f Fl(gnu)g Ft(error)1110 4119 y(message)c(format.)630 -4270 y Fs(histappend)1110 4380 y Ft(If)c(set,)j(the)e(history)g(list)g +b(See)37 b(Section)h(5.2)1110 408 y([Bash)24 b(V)-8 b(ariables],)27 +b(page)e(69,)h(for)d(a)h(description)g(of)g Ft(FIGNORE)p +Fu(.)37 b(This)22 b(option)1110 518 y(is)30 b(enabled)h(b)m(y)f +(default.)630 701 y Ft(globasciiranges)1110 810 y Fu(If)j(set,)h(range) +f(expressions)g(used)f(in)h(pattern)g(matc)m(hing)h(brac)m(k)m(et)h +(expres-)1110 920 y(sions)28 b(\(see)h(Section)h(3.5.8.1)g([P)m(attern) +g(Matc)m(hing],)h(page)e(30\))g(b)s(eha)m(v)m(e)g(as)g(if)1110 +1029 y(in)i(the)g(traditional)i(C)d(lo)s(cale)j(when)d(p)s(erforming)g +(comparisons.)44 b(That)31 b(is,)1110 1139 y(the)d(curren)m(t)g(lo)s +(cale's)i(collating)h(sequence)d(is)h(not)f(tak)m(en)h(in)m(to)g +(accoun)m(t,)i(so)1110 1249 y(`)p Ft(b)p Fu(')j(will)g(not)g(collate)i +(b)s(et)m(w)m(een)e(`)p Ft(A)p Fu(')g(and)f(`)p Ft(B)p +Fu(',)h(and)f(upp)s(er-case)g(and)g(lo)m(w)m(er-)1110 +1358 y(case)e(ASCI)s(I)e(c)m(haracters)j(will)f(collate)i(together.)630 +1541 y Ft(globstar)96 b Fu(If)38 b(set,)j(the)e(pattern)f(`)p +Ft(**)p Fu(')h(used)e(in)i(a)f(\014lename)h(expansion)f(con)m(text)j +(will)1110 1650 y(matc)m(h)36 b(all)g(\014les)f(and)f(zero)i(or)f(more) +g(directories)h(and)e(sub)s(directories.)54 b(If)1110 +1760 y(the)30 b(pattern)g(is)g(follo)m(w)m(ed)i(b)m(y)d(a)i(`)p +Ft(/)p Fu(',)f(only)g(directories)h(and)f(sub)s(directories)1110 +1870 y(matc)m(h.)630 2052 y Ft(gnu_errfmt)1110 2162 y +Fu(If)35 b(set,)j(shell)e(error)g(messages)g(are)h(written)e(in)h(the)g +(standard)f Fm(gnu)g Fu(error)1110 2271 y(message)c(format.)630 +2454 y Ft(histappend)1110 2564 y Fu(If)c(set,)j(the)e(history)g(list)g (is)g(app)s(ended)e(to)j(the)f(\014le)g(named)f(b)m(y)h(the)g(v)-5 -b(alue)29 b(of)1110 4489 y(the)d Fs(HISTFILE)d Ft(v)-5 +b(alue)29 b(of)1110 2673 y(the)d Ft(HISTFILE)d Fu(v)-5 b(ariable)26 b(when)e(the)h(shell)h(exits,)h(rather)e(than)h(o)m(v)m -(erwriting)1110 4599 y(the)31 b(\014le.)630 4750 y Fs(histreedit)1110 -4860 y Ft(If)i(set,)h(and)f(Readline)h(is)f(b)s(eing)g(used,)g(a)g +(erwriting)1110 2783 y(the)31 b(\014le.)630 2966 y Ft(histreedit)1110 +3075 y Fu(If)i(set,)h(and)f(Readline)h(is)f(b)s(eing)g(used,)g(a)g (user)g(is)g(giv)m(en)h(the)g(opp)s(ortunit)m(y)1110 -4969 y(to)d(re-edit)g(a)g(failed)g(history)f(substitution.)630 -5121 y Fs(histverify)1110 5230 y Ft(If)35 b(set,)i(and)e(Readline)h(is) +3185 y(to)d(re-edit)g(a)g(failed)g(history)f(substitution.)630 +3367 y Ft(histverify)1110 3477 y Fu(If)35 b(set,)i(and)e(Readline)h(is) f(b)s(eing)g(used,)h(the)f(results)g(of)g(history)h(substitu-)1110 -5340 y(tion)h(are)g(not)g(immediately)h(passed)e(to)h(the)g(shell)g -(parser.)59 b(Instead,)38 b(the)p eop end -%%Page: 67 73 -TeXDict begin 67 72 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(67)1110 299 y(resulting)40 -b(line)f(is)h(loaded)g(in)m(to)g(the)g(Readline)g(editing)g(bu\013er,)h -(allo)m(wing)1110 408 y(further)29 b(mo)s(di\014cation.)630 -564 y Fs(hostcomplete)1110 673 y Ft(If)38 b(set,)j(and)c(Readline)i(is) -f(b)s(eing)g(used,)h(Bash)g(will)f(attempt)h(to)g(p)s(erform)1110 -783 y(hostname)d(completion)h(when)e(a)h(w)m(ord)f(con)m(taining)i(a)f -(`)p Fs(@)p Ft(')g(is)g(b)s(eing)f(com-)1110 892 y(pleted)g(\(see)h +3587 y(tion)h(are)g(not)g(immediately)h(passed)e(to)h(the)g(shell)g +(parser.)59 b(Instead,)38 b(the)1110 3696 y(resulting)i(line)f(is)h +(loaded)g(in)m(to)g(the)g(Readline)g(editing)g(bu\013er,)h(allo)m(wing) +1110 3806 y(further)29 b(mo)s(di\014cation.)630 3988 +y Ft(hostcomplete)1110 4098 y Fu(If)38 b(set,)j(and)c(Readline)i(is)f +(b)s(eing)g(used,)h(Bash)g(will)f(attempt)h(to)g(p)s(erform)1110 +4208 y(hostname)d(completion)h(when)e(a)h(w)m(ord)f(con)m(taining)i(a)f +(`)p Ft(@)p Fu(')g(is)g(b)s(eing)f(com-)1110 4317 y(pleted)g(\(see)h (Section)f(8.4.6)i([Commands)d(F)-8 b(or)36 b(Completion],)g(page)g -(121\).)1110 1002 y(This)30 b(option)g(is)h(enabled)f(b)m(y)g(default.) -630 1157 y Fs(huponexit)1110 1267 y Ft(If)i(set,)i(Bash)f(will)h(send)d -Fs(SIGHUP)h Ft(to)h(all)h(jobs)e(when)g(an)g(in)m(teractiv)m(e)k(login) -1110 1377 y(shell)31 b(exits)g(\(see)g(Section)g(3.7.6)h([Signals],)g -(page)f(38\).)630 1532 y Fs(interactive_comments)1110 -1641 y Ft(Allo)m(w)c(a)g(w)m(ord)e(b)s(eginning)g(with)h(`)p -Fs(#)p Ft(')g(to)h(cause)f(that)h(w)m(ord)f(and)f(all)i(remain-)1110 -1751 y(ing)41 b(c)m(haracters)i(on)e(that)h(line)g(to)g(b)s(e)f +(120\).)1110 4427 y(This)30 b(option)g(is)h(enabled)f(b)m(y)g(default.) +630 4609 y Ft(huponexit)1110 4719 y Fu(If)i(set,)i(Bash)f(will)h(send)d +Ft(SIGHUP)h Fu(to)h(all)h(jobs)e(when)g(an)g(in)m(teractiv)m(e)k(login) +1110 4829 y(shell)31 b(exits)g(\(see)g(Section)g(3.7.6)h([Signals],)g +(page)f(38\).)630 5011 y Ft(interactive_comments)1110 +5121 y Fu(Allo)m(w)c(a)g(w)m(ord)e(b)s(eginning)g(with)h(`)p +Ft(#)p Fu(')g(to)h(cause)f(that)h(w)m(ord)f(and)f(all)i(remain-)1110 +5230 y(ing)41 b(c)m(haracters)i(on)e(that)h(line)g(to)g(b)s(e)f (ignored)g(in)g(an)g(in)m(teractiv)m(e)j(shell.)1110 -1861 y(This)30 b(option)g(is)h(enabled)f(b)m(y)g(default.)630 -2016 y Fs(lastpipe)96 b Ft(If)24 b(set,)i(and)e(job)g(con)m(trol)i(is)f -(not)f(activ)m(e,)k(the)d(shell)f(runs)f(the)i(last)g(command)1110 -2125 y(of)37 b(a)h(pip)s(eline)e(not)h(executed)h(in)f(the)g(bac)m -(kground)g(in)g(the)g(curren)m(t)g(shell)1110 2235 y(en)m(vironmen)m -(t.)630 2390 y Fs(lithist)144 b Ft(If)22 b(enabled,)i(and)d(the)h -Fs(cmdhist)e Ft(option)j(is)f(enabled,)i(m)m(ulti-line)f(commands)1110 -2500 y(are)28 b(sa)m(v)m(ed)h(to)g(the)f(history)g(with)f(em)m(b)s -(edded)g(newlines)h(rather)g(than)f(using)1110 2609 y(semicolon)32 -b(separators)f(where)e(p)s(ossible.)630 2765 y Fs(login_shell)1110 -2874 y Ft(The)35 b(shell)h(sets)g(this)f(option)h(if)g(it)g(is)f +5340 y(This)30 b(option)g(is)h(enabled)f(b)m(y)g(default.)p +eop end +%%Page: 67 73 +TeXDict begin 67 72 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(67)630 299 y Ft(lastpipe)96 +b Fu(If)24 b(set,)i(and)e(job)g(con)m(trol)i(is)f(not)f(activ)m(e,)k +(the)d(shell)f(runs)f(the)i(last)g(command)1110 408 y(of)37 +b(a)h(pip)s(eline)e(not)h(executed)h(in)f(the)g(bac)m(kground)g(in)g +(the)g(curren)m(t)g(shell)1110 518 y(en)m(vironmen)m(t.)630 +677 y Ft(lithist)144 b Fu(If)22 b(enabled,)i(and)d(the)h +Ft(cmdhist)e Fu(option)j(is)f(enabled,)i(m)m(ulti-line)f(commands)1110 +787 y(are)28 b(sa)m(v)m(ed)h(to)g(the)f(history)g(with)f(em)m(b)s +(edded)g(newlines)h(rather)g(than)f(using)1110 897 y(semicolon)32 +b(separators)f(where)e(p)s(ossible.)630 1056 y Ft(login_shell)1110 +1166 y Fu(The)35 b(shell)h(sets)g(this)f(option)h(if)g(it)g(is)f (started)h(as)g(a)g(login)g(shell)g(\(see)g(Sec-)1110 -2984 y(tion)29 b(6.1)g([In)m(v)m(oking)h(Bash],)f(page)g(80\).)41 +1275 y(tion)29 b(6.1)g([In)m(v)m(oking)h(Bash],)f(page)g(80\).)41 b(The)28 b(v)-5 b(alue)29 b(ma)m(y)g(not)f(b)s(e)g(c)m(hanged.)630 -3139 y Fs(mailwarn)96 b Ft(If)34 b(set,)i(and)e(a)h(\014le)g(that)g +1435 y Ft(mailwarn)96 b Fu(If)34 b(set,)i(and)e(a)h(\014le)g(that)g (Bash)f(is)h(c)m(hec)m(king)h(for)f(mail)g(has)f(b)s(een)g(accessed) -1110 3249 y(since)24 b(the)h(last)g(time)f(it)h(w)m(as)f(c)m(hec)m(k)m -(ed,)k(the)c(message)h Fs("The)k(mail)h(in)f Fi(mail-)1110 -3358 y(file)40 b Fs(has)29 b(been)g(read")g Ft(is)i(displa)m(y)m(ed.) -630 3513 y Fs(no_empty_cmd_completion)1110 3623 y Ft(If)f(set,)g(and)g +1110 1544 y(since)24 b(the)h(last)g(time)f(it)h(w)m(as)f(c)m(hec)m(k)m +(ed,)k(the)c(message)h Ft("The)k(mail)h(in)f Fj(mail-)1110 +1654 y(file)g Ft(has)h(been)f(read")g Fu(is)h(displa)m(y)m(ed.)630 +1813 y Ft(no_empty_cmd_completion)1110 1923 y Fu(If)g(set,)g(and)g (Readline)g(is)h(b)s(eing)e(used,)h(Bash)g(will)g(not)g(attempt)i(to)e -(searc)m(h)1110 3733 y(the)25 b Fs(PATH)f Ft(for)h(p)s(ossible)f +(searc)m(h)1110 2032 y(the)25 b Ft(PATH)f Fu(for)h(p)s(ossible)f (completions)j(when)d(completion)i(is)f(attempted)h(on)1110 -3842 y(an)k(empt)m(y)h(line.)630 3998 y Fs(nocaseglob)1110 -4107 y Ft(If)38 b(set,)k(Bash)d(matc)m(hes)g(\014lenames)g(in)f(a)h -(case-insensitiv)m(e)j(fashion)c(when)1110 4217 y(p)s(erforming)29 -b(\014lename)i(expansion.)630 4372 y Fs(nocasematch)1110 -4482 y Ft(If)42 b(set,)k(Bash)d(matc)m(hes)g(patterns)g(in)f(a)h -(case-insensitiv)m(e)i(fashion)d(when)1110 4591 y(p)s(erforming)31 -b(matc)m(hing)i(while)f(executing)i Fs(case)d Ft(or)h -Fs([[)g Ft(conditional)h(com-)1110 4701 y(mands.)630 -4856 y Fs(nullglob)96 b Ft(If)23 b(set,)j(Bash)e(allo)m(ws)g +2142 y(an)k(empt)m(y)h(line.)630 2301 y Ft(nocaseglob)1110 +2411 y Fu(If)38 b(set,)k(Bash)d(matc)m(hes)g(\014lenames)g(in)f(a)h +(case-insensitiv)m(e)j(fashion)c(when)1110 2521 y(p)s(erforming)29 +b(\014lename)i(expansion.)630 2680 y Ft(nocasematch)1110 +2790 y Fu(If)42 b(set,)k(Bash)d(matc)m(hes)g(patterns)g(in)f(a)h +(case-insensitiv)m(e)i(fashion)d(when)1110 2899 y(p)s(erforming)31 +b(matc)m(hing)i(while)f(executing)i Ft(case)d Fu(or)h +Ft([[)g Fu(conditional)h(com-)1110 3009 y(mands.)630 +3168 y Ft(nullglob)96 b Fu(If)23 b(set,)j(Bash)e(allo)m(ws)g (\014lename)g(patterns)g(whic)m(h)f(matc)m(h)h(no)g(\014les)f(to)i -(expand)1110 4966 y(to)31 b(a)g(n)m(ull)f(string,)h(rather)f(than)g -(themselv)m(es.)630 5121 y Fs(progcomp)96 b Ft(If)25 +(expand)1110 3278 y(to)31 b(a)g(n)m(ull)f(string,)h(rather)f(than)g +(themselv)m(es.)630 3437 y Ft(progcomp)96 b Fu(If)25 b(set,)i(the)f(programmable)g(completion)g(facilities)i(\(see)f -(Section)f(8.6)h([Pro-)1110 5230 y(grammable)45 b(Completion],)k(page)c -(125\))h(are)f(enabled.)82 b(This)44 b(option)h(is)1110 -5340 y(enabled)30 b(b)m(y)h(default.)p eop end -%%Page: 68 74 -TeXDict begin 68 73 bop 150 -116 a Ft(Chapter)30 b(4:)41 -b(Shell)30 b(Builtin)h(Commands)2069 b(68)630 299 y Fs(promptvars)1110 -408 y Ft(If)50 b(set,)56 b(prompt)49 b(strings)h(undergo)g(parameter)h -(expansion,)k(command)1110 518 y(substitution,)35 b(arithmetic)g +(Section)f(8.6)h([Pro-)1110 3547 y(grammable)45 b(Completion],)k(page)c +(124\))h(are)f(enabled.)82 b(This)44 b(option)h(is)1110 +3656 y(enabled)30 b(b)m(y)h(default.)630 3816 y Ft(promptvars)1110 +3925 y Fu(If)50 b(set,)56 b(prompt)49 b(strings)h(undergo)g(parameter)h +(expansion,)k(command)1110 4035 y(substitution,)35 b(arithmetic)g (expansion,)g(and)e(quote)i(remo)m(v)-5 b(al)35 b(after)f(b)s(eing)1110 -628 y(expanded)53 b(as)h(describ)s(ed)e(b)s(elo)m(w)i(\(see)h(Section)f -(6.9)h([Con)m(trolling)g(the)1110 737 y(Prompt],)30 b(page)h(92\).)42 -b(This)30 b(option)h(is)f(enabled)h(b)m(y)f(default.)630 -897 y Fs(restricted_shell)1110 1006 y Ft(The)40 b(shell)h(sets)g(this)g -(option)g(if)g(it)h(is)e(started)i(in)e(restricted)i(mo)s(de)e(\(see) -1110 1116 y(Section)c(6.10)g([The)f(Restricted)g(Shell],)i(page)e -(93\).)56 b(The)34 b(v)-5 b(alue)35 b(ma)m(y)h(not)1110 -1225 y(b)s(e)c(c)m(hanged.)49 b(This)32 b(is)h(not)h(reset)f(when)f -(the)h(startup)g(\014les)f(are)i(executed,)1110 1335 -y(allo)m(wing)k(the)e(startup)f(\014les)h(to)g(disco)m(v)m(er)h -(whether)f(or)f(not)i(a)f(shell)g(is)g(re-)1110 1445 -y(stricted.)630 1604 y Fs(shift_verbose)1110 1714 y Ft(If)g(this)g(is)g -(set,)j(the)d Fs(shift)f Ft(builtin)h(prin)m(ts)f(an)h(error)g(message) -i(when)d(the)1110 1823 y(shift)30 b(coun)m(t)h(exceeds)g(the)g(n)m(um)m -(b)s(er)e(of)h(p)s(ositional)i(parameters.)630 1983 y -Fs(sourcepath)1110 2092 y Ft(If)22 b(set,)j(the)e Fs(source)e -Ft(builtin)h(uses)g(the)h(v)-5 b(alue)23 b(of)g Fs(PATH)e -Ft(to)j(\014nd)d(the)h(directory)1110 2202 y(con)m(taining)29 -b(the)e(\014le)h(supplied)e(as)h(an)g(argumen)m(t.)40 -b(This)27 b(option)h(is)f(enabled)1110 2311 y(b)m(y)j(default.)630 -2471 y Fs(xpg_echo)96 b Ft(If)31 b(set,)h(the)g Fs(echo)e -Ft(builtin)h(expands)f(bac)m(kslash-escap)s(e)j(sequences)f(b)m(y)f -(de-)1110 2580 y(fault.)630 2740 y(The)c(return)f(status)i(when)f -(listing)h(options)g(is)f(zero)i(if)e(all)i Fq(optnames)i -Ft(are)d(enabled,)g(non-)630 2849 y(zero)40 b(otherwise.)66 +4144 y(expanded)53 b(as)h(describ)s(ed)e(b)s(elo)m(w)i(\(see)h(Section) +f(6.9)h([Con)m(trolling)g(the)1110 4254 y(Prompt],)30 +b(page)h(92\).)42 b(This)30 b(option)h(is)f(enabled)h(b)m(y)f(default.) +630 4413 y Ft(restricted_shell)1110 4523 y Fu(The)40 +b(shell)h(sets)g(this)g(option)g(if)g(it)h(is)e(started)i(in)e +(restricted)i(mo)s(de)e(\(see)1110 4633 y(Section)c(6.10)g([The)f +(Restricted)g(Shell],)i(page)e(93\).)56 b(The)34 b(v)-5 +b(alue)35 b(ma)m(y)h(not)1110 4742 y(b)s(e)c(c)m(hanged.)49 +b(This)32 b(is)h(not)h(reset)f(when)f(the)h(startup)g(\014les)f(are)i +(executed,)1110 4852 y(allo)m(wing)k(the)e(startup)f(\014les)h(to)g +(disco)m(v)m(er)h(whether)f(or)f(not)i(a)f(shell)g(is)g(re-)1110 +4961 y(stricted.)630 5121 y Ft(shift_verbose)1110 5230 +y Fu(If)g(this)g(is)g(set,)j(the)d Ft(shift)f Fu(builtin)h(prin)m(ts)f +(an)h(error)g(message)i(when)d(the)1110 5340 y(shift)30 +b(coun)m(t)h(exceeds)g(the)g(n)m(um)m(b)s(er)e(of)h(p)s(ositional)i +(parameters.)p eop end +%%Page: 68 74 +TeXDict begin 68 73 bop 150 -116 a Fu(Chapter)30 b(4:)41 +b(Shell)30 b(Builtin)h(Commands)2069 b(68)630 299 y Ft(sourcepath)1110 +408 y Fu(If)22 b(set,)j(the)e Ft(source)e Fu(builtin)h(uses)g(the)h(v) +-5 b(alue)23 b(of)g Ft(PATH)e Fu(to)j(\014nd)d(the)h(directory)1110 +518 y(con)m(taining)29 b(the)e(\014le)h(supplied)e(as)h(an)g(argumen)m +(t.)40 b(This)27 b(option)h(is)f(enabled)1110 628 y(b)m(y)j(default.) +630 787 y Ft(xpg_echo)96 b Fu(If)31 b(set,)h(the)g Ft(echo)e +Fu(builtin)h(expands)f(bac)m(kslash-escap)s(e)j(sequences)f(b)m(y)f +(de-)1110 897 y(fault.)630 1056 y(The)c(return)f(status)i(when)f +(listing)h(options)g(is)f(zero)i(if)e(all)i Fr(optnames)i +Fu(are)d(enabled,)g(non-)630 1166 y(zero)40 b(otherwise.)66 b(When)39 b(setting)h(or)f(unsetting)g(options,)i(the)e(return)f -(status)h(is)g(zero)630 2959 y(unless)30 b(an)g Fq(optname)36 -b Ft(is)30 b(not)h(a)g(v)-5 b(alid)30 b(shell)h(option.)150 -3191 y Fr(4.4)68 b(Sp)t(ecial)45 b(Builtins)150 3351 -y Ft(F)-8 b(or)35 b(historical)h(reasons,)g(the)e Fl(posix)g -Ft(standard)f(has)i(classi\014ed)f(sev)m(eral)i(builtin)e(commands)g -(as)h Fk(sp)-5 b(e-)150 3460 y(cial)p Ft(.)47 b(When)33 -b(Bash)f(is)h(executing)g(in)f Fl(posix)g Ft(mo)s(de,)h(the)g(sp)s +(status)h(is)g(zero)630 1275 y(unless)30 b(an)g Fr(optname)36 +b Fu(is)30 b(not)h(a)g(v)-5 b(alid)30 b(shell)h(option.)150 +1508 y Fs(4.4)68 b(Sp)t(ecial)45 b(Builtins)150 1667 +y Fu(F)-8 b(or)35 b(historical)h(reasons,)g(the)e Fm(posix)g +Fu(standard)f(has)i(classi\014ed)f(sev)m(eral)i(builtin)e(commands)g +(as)h Fl(sp)-5 b(e-)150 1777 y(cial)p Fu(.)47 b(When)33 +b(Bash)f(is)h(executing)g(in)f Fm(posix)g Fu(mo)s(de,)h(the)g(sp)s (ecial)g(builtins)e(di\013er)i(from)f(other)g(builtin)150 -3570 y(commands)e(in)g(three)h(resp)s(ects:)199 3704 +1886 y(commands)e(in)g(three)h(resp)s(ects:)199 2021 y(1.)61 b(Sp)s(ecial)31 b(builtins)e(are)i(found)e(b)s(efore)h(shell)h -(functions)f(during)f(command)h(lo)s(okup.)199 3839 y(2.)61 +(functions)f(during)f(command)h(lo)s(okup.)199 2155 y(2.)61 b(If)30 b(a)h(sp)s(ecial)g(builtin)f(returns)f(an)h(error)g(status,)h -(a)g(non-in)m(teractiv)m(e)i(shell)d(exits.)199 3973 +(a)g(non-in)m(teractiv)m(e)i(shell)d(exits.)199 2290 y(3.)61 b(Assignmen)m(t)30 b(statemen)m(ts)h(preceding)f(the)f(command) g(sta)m(y)i(in)e(e\013ect)i(in)e(the)h(shell)f(en)m(vironmen)m(t)330 -4083 y(after)i(the)f(command)h(completes.)275 4242 y(When)36 -b(Bash)g(is)h(not)f(executing)i(in)e Fl(posix)f Ft(mo)s(de,)j(these)f +2399 y(after)i(the)f(command)h(completes.)275 2559 y(When)36 +b(Bash)g(is)h(not)f(executing)i(in)e Fm(posix)f Fu(mo)s(de,)j(these)f (builtins)f(b)s(eha)m(v)m(e)h(no)f(di\013eren)m(tly)h(than)150 -4352 y(the)31 b(rest)f(of)h(the)f(Bash)h(builtin)e(commands.)41 -b(The)30 b(Bash)g Fl(posix)g Ft(mo)s(de)g(is)g(describ)s(ed)f(in)h -(Section)h(6.11)150 4462 y([Bash)g(POSIX)e(Mo)s(de],)i(page)g(94.)275 -4596 y(These)f(are)g(the)h Fl(posix)f Ft(sp)s(ecial)h(builtins:)390 -4731 y Fs(break)46 b(:)i(.)f(continue)f(eval)g(exec)h(exit)g(export)f -(readonly)f(return)h(set)390 4840 y(shift)g(trap)h(unset)p +2668 y(the)31 b(rest)f(of)h(the)f(Bash)h(builtin)e(commands.)41 +b(The)30 b(Bash)g Fm(posix)g Fu(mo)s(de)g(is)g(describ)s(ed)f(in)h +(Section)h(6.11)150 2778 y([Bash)g(POSIX)e(Mo)s(de],)i(page)g(94.)275 +2912 y(These)f(are)g(the)h Fm(posix)f Fu(sp)s(ecial)h(builtins:)390 +3047 y Ft(break)46 b(:)i(.)f(continue)f(eval)g(exec)h(exit)g(export)f +(readonly)f(return)h(set)390 3156 y(shift)g(trap)h(unset)p eop end %%Page: 69 75 -TeXDict begin 69 74 bop 150 -116 a Ft(Chapter)30 b(5:)41 -b(Shell)30 b(V)-8 b(ariables)2459 b(69)150 299 y Fo(5)80 -b(Shell)53 b(V)-13 b(ariables)150 541 y Ft(This)21 b(c)m(hapter)i +TeXDict begin 69 74 bop 150 -116 a Fu(Chapter)30 b(5:)41 +b(Shell)30 b(V)-8 b(ariables)2459 b(69)150 299 y Fp(5)80 +b(Shell)53 b(V)-13 b(ariables)150 541 y Fu(This)21 b(c)m(hapter)i (describ)s(es)e(the)i(shell)f(v)-5 b(ariables)23 b(that)f(Bash)h(uses.) 37 b(Bash)23 b(automatically)h(assigns)f(default)150 651 y(v)-5 b(alues)31 b(to)g(a)g(n)m(um)m(b)s(er)e(of)h(v)-5 -b(ariables.)150 888 y Fr(5.1)68 b(Bourne)45 b(Shell)g(V)-11 -b(ariables)150 1047 y Ft(Bash)30 b(uses)g(certain)h(shell)g(v)-5 +b(ariables.)150 888 y Fs(5.1)68 b(Bourne)45 b(Shell)g(V)-11 +b(ariables)150 1047 y Fu(Bash)30 b(uses)g(certain)h(shell)g(v)-5 b(ariables)31 b(in)f(the)g(same)h(w)m(a)m(y)g(as)g(the)f(Bourne)g (shell.)41 b(In)30 b(some)g(cases,)i(Bash)150 1157 y(assigns)f(a)f (default)h(v)-5 b(alue)31 b(to)g(the)f(v)-5 b(ariable.)150 -1320 y Fs(CDPATH)192 b Ft(A)39 b(colon-separated)i(list)e(of)g +1320 y Ft(CDPATH)192 b Fu(A)39 b(colon-separated)i(list)e(of)g (directories)h(used)f(as)g(a)g(searc)m(h)h(path)e(for)h(the)g -Fs(cd)f Ft(builtin)630 1430 y(command.)150 1592 y Fs(HOME)288 -b Ft(The)23 b(curren)m(t)h(user's)f(home)g(directory;)k(the)d(default)g -(for)f(the)h Fs(cd)f Ft(builtin)g(command.)38 b(The)630 +Ft(cd)f Fu(builtin)630 1430 y(command.)150 1592 y Ft(HOME)288 +b Fu(The)23 b(curren)m(t)h(user's)f(home)g(directory;)k(the)d(default)g +(for)f(the)h Ft(cd)f Fu(builtin)g(command.)38 b(The)630 1702 y(v)-5 b(alue)37 b(of)f(this)g(v)-5 b(ariable)37 b(is)g(also)g(used)e(b)m(y)h(tilde)h(expansion)f(\(see)i(Section)f (3.5.2)h([Tilde)630 1811 y(Expansion],)30 b(page)h(22\).)150 -1973 y Fs(IFS)336 b Ft(A)25 b(list)i(of)e(c)m(haracters)i(that)f +1973 y Ft(IFS)336 b Fu(A)25 b(list)i(of)e(c)m(haracters)i(that)f (separate)g(\014elds;)h(used)e(when)f(the)i(shell)f(splits)h(w)m(ords)e -(as)i(part)630 2083 y(of)31 b(expansion.)150 2245 y Fs(MAIL)288 -b Ft(If)44 b(this)g(parameter)h(is)g(set)g(to)g(a)f(\014lename)h(or)f -(directory)h(name)g(and)f(the)g Fs(MAILPATH)630 2355 -y Ft(v)-5 b(ariable)32 b(is)e(not)h(set,)h(Bash)f(informs)f(the)h(user) +(as)i(part)630 2083 y(of)31 b(expansion.)150 2245 y Ft(MAIL)288 +b Fu(If)44 b(this)g(parameter)h(is)g(set)g(to)g(a)f(\014lename)h(or)f +(directory)h(name)g(and)f(the)g Ft(MAILPATH)630 2355 +y Fu(v)-5 b(ariable)32 b(is)e(not)h(set,)h(Bash)f(informs)f(the)h(user) f(of)h(the)g(arriv)-5 b(al)31 b(of)g(mail)g(in)g(the)g(sp)s(eci\014ed) 630 2464 y(\014le)f(or)h(Maildir-format)g(directory)-8 -b(.)150 2627 y Fs(MAILPATH)96 b Ft(A)33 b(colon-separated)i(list)f(of)f +b(.)150 2627 y Ft(MAILPATH)96 b Fu(A)33 b(colon-separated)i(list)f(of)f (\014lenames)h(whic)m(h)f(the)g(shell)g(p)s(erio)s(dically)h(c)m(hec)m (ks)g(for)f(new)630 2736 y(mail.)60 b(Eac)m(h)37 b(list)g(en)m(try)g (can)g(sp)s(ecify)f(the)h(message)h(that)f(is)g(prin)m(ted)f(when)f (new)h(mail)630 2846 y(arriv)m(es)31 b(in)g(the)g(mail)g(\014le)g(b)m (y)g(separating)h(the)f(\014lename)g(from)f(the)h(message)h(with)e(a)i -(`)p Fs(?)p Ft('.)630 2955 y(When)g(used)f(in)h(the)g(text)i(of)e(the)g -(message,)i Fs($_)e Ft(expands)f(to)i(the)f(name)g(of)h(the)f(curren)m -(t)630 3065 y(mail)f(\014le.)150 3227 y Fs(OPTARG)192 -b Ft(The)30 b(v)-5 b(alue)31 b(of)f(the)h(last)g(option)g(argumen)m(t)g -(pro)s(cessed)f(b)m(y)g(the)g Fs(getopts)f Ft(builtin.)150 -3389 y Fs(OPTIND)192 b Ft(The)30 b(index)g(of)g(the)h(last)g(option)g -(argumen)m(t)g(pro)s(cessed)f(b)m(y)g(the)g Fs(getopts)f -Ft(builtin.)150 3552 y Fs(PATH)288 b Ft(A)32 b(colon-separated)i(list)f +(`)p Ft(?)p Fu('.)630 2955 y(When)g(used)f(in)h(the)g(text)i(of)e(the)g +(message,)i Ft($_)e Fu(expands)f(to)i(the)f(name)g(of)h(the)f(curren)m +(t)630 3065 y(mail)f(\014le.)150 3227 y Ft(OPTARG)192 +b Fu(The)30 b(v)-5 b(alue)31 b(of)f(the)h(last)g(option)g(argumen)m(t)g +(pro)s(cessed)f(b)m(y)g(the)g Ft(getopts)f Fu(builtin.)150 +3389 y Ft(OPTIND)192 b Fu(The)30 b(index)g(of)g(the)h(last)g(option)g +(argumen)m(t)g(pro)s(cessed)f(b)m(y)g(the)g Ft(getopts)f +Fu(builtin.)150 3552 y Ft(PATH)288 b Fu(A)32 b(colon-separated)i(list)f (of)f(directories)h(in)e(whic)m(h)h(the)g(shell)g(lo)s(oks)h(for)f (commands.)45 b(A)630 3661 y(zero-length)e(\(n)m(ull\))g(directory)f -(name)g(in)g(the)g(v)-5 b(alue)42 b(of)g Fs(PATH)f Ft(indicates)i(the)f +(name)g(in)g(the)g(v)-5 b(alue)42 b(of)g Ft(PATH)f Fu(indicates)i(the)f (curren)m(t)630 3771 y(directory)-8 b(.)49 b(A)33 b(n)m(ull)f (directory)i(name)e(ma)m(y)i(app)s(ear)e(as)h(t)m(w)m(o)h(adjacen)m(t)g (colons,)g(or)f(as)g(an)630 3880 y(initial)f(or)e(trailing)h(colon.)150 -4042 y Fs(PS1)336 b Ft(The)35 b(primary)f(prompt)h(string.)55 -b(The)35 b(default)h(v)-5 b(alue)35 b(is)h(`)p Fs(\\s-\\v\\$)28 -b Ft('.)56 b(See)36 b(Section)g(6.9)630 4152 y([Con)m(trolling)42 +4042 y Ft(PS1)336 b Fu(The)35 b(primary)f(prompt)h(string.)55 +b(The)35 b(default)h(v)-5 b(alue)35 b(is)h(`)p Ft(\\s-\\v\\$)28 +b Fu('.)56 b(See)36 b(Section)g(6.9)630 4152 y([Con)m(trolling)42 b(the)e(Prompt],)j(page)e(92,)j(for)c(the)g(complete)i(list)f(of)f (escap)s(e)h(sequences)630 4262 y(that)31 b(are)g(expanded)e(b)s(efore) -h Fs(PS1)g Ft(is)g(displa)m(y)m(ed.)150 4424 y Fs(PS2)336 -b Ft(The)30 b(secondary)g(prompt)g(string.)41 b(The)29 -b(default)i(v)-5 b(alue)31 b(is)f(`)p Fs(>)g Ft('.)150 -4661 y Fr(5.2)68 b(Bash)45 b(V)-11 b(ariables)150 4820 -y Ft(These)45 b(v)-5 b(ariables)46 b(are)g(set)g(or)f(used)f(b)m(y)h +h Ft(PS1)g Fu(is)g(displa)m(y)m(ed.)150 4424 y Ft(PS2)336 +b Fu(The)30 b(secondary)g(prompt)g(string.)41 b(The)29 +b(default)i(v)-5 b(alue)31 b(is)f(`)p Ft(>)g Fu('.)150 +4661 y Fs(5.2)68 b(Bash)45 b(V)-11 b(ariables)150 4820 +y Fu(These)45 b(v)-5 b(ariables)46 b(are)g(set)g(or)f(used)f(b)m(y)h (Bash,)50 b(but)44 b(other)i(shells)f(do)h(not)f(normally)h(treat)g (them)150 4929 y(sp)s(ecially)-8 b(.)275 5067 y(A)24 b(few)g(v)-5 b(ariables)24 b(used)g(b)m(y)f(Bash)i(are)f(describ)s(ed)f (in)h(di\013eren)m(t)g(c)m(hapters:)38 b(v)-5 b(ariables)25 b(for)f(con)m(trolling)150 5176 y(the)31 b(job)f(con)m(trol)h (facilities)i(\(see)e(Section)g(7.3)h([Job)e(Con)m(trol)h(V)-8 -b(ariables],)32 b(page)g(101\).)150 5340 y Fs(BASH)288 -b Ft(The)30 b(full)g(pathname)g(used)g(to)h(execute)h(the)e(curren)m(t) +b(ariables],)32 b(page)g(100\).)150 5340 y Ft(BASH)288 +b Fu(The)30 b(full)g(pathname)g(used)g(to)h(execute)h(the)e(curren)m(t) g(instance)h(of)g(Bash.)p eop end %%Page: 70 76 -TeXDict begin 70 75 bop 150 -116 a Ft(Chapter)30 b(5:)41 -b(Shell)30 b(V)-8 b(ariables)2459 b(70)150 299 y Fs(BASHOPTS)96 -b Ft(A)31 b(colon-separated)h(list)f(of)g(enabled)f(shell)h(options.)41 +TeXDict begin 70 75 bop 150 -116 a Fu(Chapter)30 b(5:)41 +b(Shell)30 b(V)-8 b(ariables)2459 b(70)150 299 y Ft(BASHOPTS)96 +b Fu(A)31 b(colon-separated)h(list)f(of)g(enabled)f(shell)h(options.)41 b(Eac)m(h)31 b(w)m(ord)f(in)g(the)h(list)g(is)g(a)g(v)-5 -b(alid)630 408 y(argumen)m(t)33 b(for)g(the)f(`)p Fs(-s)p -Ft(')h(option)g(to)g(the)g Fs(shopt)e Ft(builtin)i(command)f(\(see)i -(Section)f(4.3.2)630 518 y([The)j(Shopt)g(Builtin],)i(page)f(63\).)60 -b(The)36 b(options)h(app)s(earing)f(in)g Fs(BASHOPTS)e -Ft(are)i(those)630 628 y(rep)s(orted)e(as)h(`)p Fs(on)p -Ft(')f(b)m(y)h(`)p Fs(shopt)p Ft('.)53 b(If)34 b(this)g(v)-5 +b(alid)630 408 y(argumen)m(t)37 b(for)g(the)g Ft(-s)f +Fu(option)i(to)f(the)g Ft(shopt)f Fu(builtin)g(command)h(\(see)g +(Section)h(4.3.2)630 518 y([The)e(Shopt)g(Builtin],)i(page)f(62\).)60 +b(The)36 b(options)h(app)s(earing)f(in)g Ft(BASHOPTS)e +Fu(are)i(those)630 628 y(rep)s(orted)e(as)h(`)p Ft(on)p +Fu(')f(b)m(y)h(`)p Ft(shopt)p Fu('.)53 b(If)34 b(this)g(v)-5 b(ariable)36 b(is)f(in)f(the)h(en)m(vironmen)m(t)g(when)f(Bash)630 737 y(starts)25 b(up,)f(eac)m(h)i(shell)e(option)h(in)e(the)i(list)g (will)f(b)s(e)g(enabled)g(b)s(efore)g(reading)g(an)m(y)g(startup)630 847 y(\014les.)41 b(This)29 b(v)-5 b(ariable)31 b(is)g(readonly)-8 -b(.)150 1003 y Fs(BASHPID)144 b Ft(Expands)35 b(to)i(the)f(pro)s(cess)f +b(.)150 1003 y Ft(BASHPID)144 b Fu(Expands)35 b(to)i(the)f(pro)s(cess)f (ID)i(of)f(the)g(curren)m(t)g(Bash)g(pro)s(cess.)58 b(This)35 -b(di\013ers)h(from)g Fs($$)630 1113 y Ft(under)31 b(certain)j +b(di\013ers)h(from)g Ft($$)630 1113 y Fu(under)31 b(certain)j (circumstances,)h(suc)m(h)e(as)g(subshells)f(that)i(do)f(not)g(require) g(Bash)g(to)h(b)s(e)630 1223 y(re-initialized.)150 1379 -y Fs(BASH_ALIASES)630 1489 y Ft(An)40 b(asso)s(ciativ)m(e)j(arra)m(y)d +y Ft(BASH_ALIASES)630 1489 y Fu(An)40 b(asso)s(ciativ)m(e)j(arra)m(y)d (v)-5 b(ariable)41 b(whose)f(mem)m(b)s(ers)f(corresp)s(ond)g(to)i(the)f (in)m(ternal)h(list)630 1598 y(of)c(aliases)h(as)f(main)m(tained)g(b)m -(y)g(the)g Fs(alias)e Ft(builtin.)59 b(\(see)37 b(Section)h(4.1)f +(y)g(the)g Ft(alias)e Fu(builtin.)59 b(\(see)37 b(Section)h(4.1)f ([Bourne)g(Shell)630 1708 y(Builtins],)f(page)e(41\).)53 b(Elemen)m(ts)35 b(added)e(to)i(this)e(arra)m(y)i(app)s(ear)e(in)h(the) g(alias)h(list;)i(un-)630 1817 y(setting)31 b(arra)m(y)g(elemen)m(ts)h (cause)f(aliases)h(to)f(b)s(e)f(remo)m(v)m(ed)h(from)f(the)h(alias)g -(list.)150 1974 y Fs(BASH_ARGC)630 2084 y Ft(An)f(arra)m(y)h(v)-5 +(list.)150 1974 y Ft(BASH_ARGC)630 2084 y Fu(An)f(arra)m(y)h(v)-5 b(ariable)31 b(whose)f(v)-5 b(alues)31 b(are)g(the)f(n)m(um)m(b)s(er)g (of)g(parameters)h(in)f(eac)m(h)h(frame)g(of)630 2193 y(the)26 b(curren)m(t)f(bash)g(execution)i(call)g(stac)m(k.)41 b(The)25 b(n)m(um)m(b)s(er)g(of)h(parameters)g(to)g(the)g(curren)m(t) 630 2303 y(subroutine)i(\(shell)i(function)g(or)f(script)g(executed)i -(with)e Fs(.)g Ft(or)h Fs(source)p Ft(\))e(is)h(at)h(the)g(top)g(of)630 +(with)e Ft(.)g Fu(or)h Ft(source)p Fu(\))e(is)h(at)h(the)g(top)g(of)630 2412 y(the)37 b(stac)m(k.)63 b(When)37 b(a)h(subroutine)e(is)h (executed,)j(the)e(n)m(um)m(b)s(er)d(of)j(parameters)f(passed)630 -2522 y(is)g(pushed)f(on)m(to)i Fs(BASH_ARGC)p Ft(.)59 -b(The)37 b(shell)g(sets)h Fs(BASH_ARGC)c Ft(only)k(when)e(in)h +2522 y(is)g(pushed)f(on)m(to)i Ft(BASH_ARGC)p Fu(.)59 +b(The)37 b(shell)g(sets)h Ft(BASH_ARGC)c Fu(only)k(when)e(in)h (extended)630 2632 y(debugging)23 b(mo)s(de)f(\(see)h(Section)g(4.3.2)i -([The)d(Shopt)g(Builtin],)j(page)e(63)h(for)e(a)h(description)630 -2741 y(of)31 b(the)f Fs(extdebug)e Ft(option)j(to)g(the)g -Fs(shopt)e Ft(builtin\).)150 2898 y Fs(BASH_ARGV)630 -3007 y Ft(An)24 b(arra)m(y)g(v)-5 b(ariable)25 b(con)m(taining)h(all)f +([The)d(Shopt)g(Builtin],)j(page)e(62)h(for)e(a)h(description)630 +2741 y(of)31 b(the)f Ft(extdebug)e Fu(option)j(to)g(the)g +Ft(shopt)e Fu(builtin\).)150 2898 y Ft(BASH_ARGV)630 +3007 y Fu(An)24 b(arra)m(y)g(v)-5 b(ariable)25 b(con)m(taining)h(all)f (of)f(the)h(parameters)f(in)g(the)g(curren)m(t)g(bash)g(execution)630 3117 y(call)35 b(stac)m(k.)53 b(The)34 b(\014nal)g(parameter)g(of)g (the)g(last)h(subroutine)e(call)i(is)f(at)h(the)f(top)h(of)f(the)630 3226 y(stac)m(k;)28 b(the)c(\014rst)f(parameter)i(of)f(the)g(initial)i (call)f(is)f(at)h(the)f(b)s(ottom.)39 b(When)24 b(a)g(subroutine)630 3336 y(is)40 b(executed,)j(the)d(parameters)h(supplied)d(are)i(pushed)f -(on)m(to)i Fs(BASH_ARGV)p Ft(.)66 b(The)40 b(shell)630 -3446 y(sets)28 b Fs(BASH_ARGV)e Ft(only)i(when)f(in)h(extended)g +(on)m(to)i Ft(BASH_ARGV)p Fu(.)66 b(The)40 b(shell)630 +3446 y(sets)28 b Ft(BASH_ARGV)e Fu(only)i(when)f(in)h(extended)g (debugging)g(mo)s(de)g(\(see)h(Section)f(4.3.2)i([The)630 -3555 y(Shopt)i(Builtin],)h(page)g(63)g(for)f(a)h(description)f(of)h -(the)f Fs(extdebug)e Ft(option)j(to)g(the)f Fs(shopt)630 -3665 y Ft(builtin\).)150 3821 y Fs(BASH_CMDS)630 3931 -y Ft(An)i(asso)s(ciativ)m(e)i(arra)m(y)f(v)-5 b(ariable)35 +3555 y(Shopt)i(Builtin],)h(page)g(62)g(for)f(a)h(description)f(of)h +(the)f Ft(extdebug)e Fu(option)j(to)g(the)f Ft(shopt)630 +3665 y Fu(builtin\).)150 3821 y Ft(BASH_CMDS)630 3931 +y Fu(An)i(asso)s(ciativ)m(e)i(arra)m(y)f(v)-5 b(ariable)35 b(whose)f(mem)m(b)s(ers)f(corresp)s(ond)g(to)i(the)f(in)m(ternal)h (hash)630 4041 y(table)c(of)g(commands)f(as)g(main)m(tained)h(b)m(y)g -(the)f Fs(hash)f Ft(builtin)h(\(see)h(Section)g(4.1)h([Bourne)630 +(the)f Ft(hash)f Fu(builtin)h(\(see)h(Section)g(4.1)h([Bourne)630 4150 y(Shell)23 b(Builtins],)j(page)e(41\).)40 b(Elemen)m(ts)24 b(added)e(to)j(this)e(arra)m(y)h(app)s(ear)e(in)i(the)f(hash)g(table;) 630 4260 y(unsetting)30 b(arra)m(y)h(elemen)m(ts)h(cause)f(commands)f (to)h(b)s(e)f(remo)m(v)m(ed)h(from)f(the)h(hash)e(table.)150 -4416 y Fs(BASH_COMMAND)630 4526 y Ft(The)39 b(command)h(curren)m(tly)g +4416 y Ft(BASH_COMMAND)630 4526 y Fu(The)39 b(command)h(curren)m(tly)g (b)s(eing)f(executed)i(or)e(ab)s(out)h(to)g(b)s(e)f(executed,)44 b(unless)39 b(the)630 4635 y(shell)g(is)g(executing)g(a)g(command)g(as) g(the)f(result)h(of)g(a)g(trap,)i(in)d(whic)m(h)g(case)i(it)f(is)g(the) 630 4745 y(command)30 b(executing)i(at)f(the)f(time)h(of)g(the)g(trap.) -150 4902 y Fs(BASH_COMPAT)630 5011 y Ft(The)i(v)-5 b(alue)34 +150 4902 y Ft(BASH_COMPAT)630 5011 y Fu(The)i(v)-5 b(alue)34 b(is)f(used)g(to)h(set)f(the)h(shell's)g(compatibilit)m(y)h(lev)m(el.) 51 b(See)34 b(Section)g(4.3.2)h([The)630 5121 y(Shopt)40 -b(Builtin],)45 b(page)c(63,)k(for)c(a)g(description)g(of)g(the)g(v)-5 +b(Builtin],)45 b(page)c(62,)k(for)c(a)g(description)g(of)g(the)g(v)-5 b(arious)41 b(compatibilit)m(y)i(lev)m(els)630 5230 y(and)31 b(their)g(e\013ects.)45 b(The)31 b(v)-5 b(alue)31 b(ma)m(y)h(b)s(e)f(a) h(decimal)g(n)m(um)m(b)s(er)e(\(e.g.,)j(4.2\))g(or)e(an)h(in)m(teger) 630 5340 y(\(e.g.,)39 b(42\))f(corresp)s(onding)d(to)i(the)f(desired)f -(compatibilit)m(y)k(lev)m(el.)59 b(If)36 b Fs(BASH_COMPAT)d -Ft(is)p eop end +(compatibilit)m(y)k(lev)m(el.)59 b(If)36 b Ft(BASH_COMPAT)d +Fu(is)p eop end %%Page: 71 77 -TeXDict begin 71 76 bop 150 -116 a Ft(Chapter)30 b(5:)41 +TeXDict begin 71 76 bop 150 -116 a Fu(Chapter)30 b(5:)41 b(Shell)30 b(V)-8 b(ariables)2459 b(71)630 299 y(unset)37 b(or)g(set)h(to)g(the)g(empt)m(y)f(string,)j(the)d(compatibilit)m(y)j (lev)m(el)f(is)e(set)h(to)g(the)g(default)630 408 y(for)i(the)h(curren) -m(t)f(v)m(ersion.)72 b(If)40 b Fs(BASH_COMPAT)e Ft(is)i(set)h(to)h(a)e +m(t)f(v)m(ersion.)72 b(If)40 b Ft(BASH_COMPAT)e Fu(is)i(set)h(to)h(a)e (v)-5 b(alue)41 b(that)h(is)e(not)h(one)g(of)630 518 y(the)f(v)-5 b(alid)40 b(compatibilit)m(y)i(lev)m(els,)i(the)c(shell)g (prin)m(ts)f(an)h(error)f(message)i(and)f(sets)g(the)630 @@ -12530,315 +13048,314 @@ y(the)f(v)-5 b(alid)40 b(compatibilit)m(y)i(lev)m(els,)i(the)c(shell)g (curren)m(t)g(v)m(ersion.)38 b(The)20 b(v)-5 b(alid)21 b(compatibilit)m(y)630 737 y(lev)m(els)40 b(corresp)s(ond)e(to)h(the)g (compatibilit)m(y)i(options)e(accepted)h(b)m(y)f(the)g -Fs(shopt)e Ft(builtin)630 847 y(describ)s(ed)20 b(ab)s(o)m(v)m(e)i -(\(for)g(example,)h Fq(compat42)31 b Ft(means)21 b(that)g(4.2)i(and)d +Ft(shopt)e Fu(builtin)630 847 y(describ)s(ed)20 b(ab)s(o)m(v)m(e)i +(\(for)g(example,)h Fr(compat42)31 b Fu(means)21 b(that)g(4.2)i(and)d (42)i(are)g(v)-5 b(alid)21 b(v)-5 b(alues\).)630 956 y(The)30 b(curren)m(t)g(v)m(ersion)h(is)f(also)i(a)e(v)-5 -b(alid)31 b(v)-5 b(alue.)150 1121 y Fs(BASH_ENV)96 b -Ft(If)28 b(this)g(v)-5 b(ariable)30 b(is)e(set)h(when)f(Bash)g(is)h(in) +b(alid)31 b(v)-5 b(alue.)150 1121 y Ft(BASH_ENV)96 b +Fu(If)28 b(this)g(v)-5 b(ariable)30 b(is)e(set)h(when)f(Bash)g(is)h(in) m(v)m(ok)m(ed)h(to)f(execute)h(a)e(shell)h(script,)g(its)g(v)-5 b(alue)29 b(is)630 1230 y(expanded)k(and)h(used)g(as)g(the)h(name)f(of) g(a)h(startup)f(\014le)g(to)h(read)f(b)s(efore)g(executing)i(the)630 1340 y(script.)41 b(See)30 b(Section)h(6.2)h([Bash)f(Startup)e(Files],) -j(page)f(82.)150 1504 y Fs(BASH_EXECUTION_STRING)630 -1614 y Ft(The)f(command)g(argumen)m(t)h(to)g(the)g(`)p -Fs(-c)p Ft(')f(in)m(v)m(o)s(cation)i(option.)150 1778 -y Fs(BASH_LINENO)630 1888 y Ft(An)62 b(arra)m(y)i(v)-5 -b(ariable)63 b(whose)g(mem)m(b)s(ers)e(are)j(the)e(line)h(n)m(um)m(b)s -(ers)f(in)g(source)h(\014les)630 1998 y(where)46 b(eac)m(h)i(corresp)s -(onding)e(mem)m(b)s(er)f(of)i Fq(FUNCNAME)53 b Ft(w)m(as)47 -b(in)m(v)m(ok)m(ed.)91 b Fs(${BASH_)630 2107 y(LINENO[$i]})39 -b Ft(is)i(the)h(line)g(n)m(um)m(b)s(er)e(in)i(the)f(source)h(\014le)g -(\()p Fs(${BASH_SOURCE[$i+1]})p Ft(\))630 2217 y(where)d -Fs(${FUNCNAME[$i]})c Ft(w)m(as)k(called)i(\(or)e Fs -(${BASH_LINENO[$i-1]})34 b Ft(if)39 b(referenced)630 +j(page)f(82.)150 1504 y Ft(BASH_EXECUTION_STRING)630 +1614 y Fu(The)f(command)g(argumen)m(t)h(to)g(the)g Ft(-c)e +Fu(in)m(v)m(o)s(cation)k(option.)150 1778 y Ft(BASH_LINENO)630 +1888 y Fu(An)62 b(arra)m(y)i(v)-5 b(ariable)63 b(whose)g(mem)m(b)s(ers) +e(are)j(the)e(line)h(n)m(um)m(b)s(ers)f(in)g(source)h(\014les)630 +1998 y(where)46 b(eac)m(h)i(corresp)s(onding)d(mem)m(b)s(er)h(of)h +Fr(FUNCNAME)53 b Fu(w)m(as)47 b(in)m(v)m(ok)m(ed.)91 +b Ft(${BASH_)630 2107 y(LINENO[$i]})39 b Fu(is)i(the)h(line)g(n)m(um)m +(b)s(er)e(in)i(the)f(source)h(\014le)g(\()p Ft(${BASH_SOURCE[$i+1]})p +Fu(\))630 2217 y(where)d Ft(${FUNCNAME[$i]})c Fu(w)m(as)k(called)i +(\(or)e Ft(${BASH_LINENO[$i-1]})34 b Fu(if)39 b(referenced)630 2326 y(within)30 b(another)g(shell)h(function\).)41 b(Use)31 -b Fs(LINENO)d Ft(to)j(obtain)g(the)g(curren)m(t)f(line)h(n)m(um)m(b)s -(er.)150 2491 y Fs(BASH_REMATCH)630 2600 y Ft(An)43 b(arra)m(y)i(v)-5 +b Ft(LINENO)d Fu(to)j(obtain)g(the)g(curren)m(t)f(line)h(n)m(um)m(b)s +(er.)150 2491 y Ft(BASH_REMATCH)630 2600 y Fu(An)43 b(arra)m(y)i(v)-5 b(ariable)44 b(whose)g(mem)m(b)s(ers)f(are)h(assigned)g(b)m(y)f(the)h -(`)p Fs(=~)p Ft(')g(binary)f(op)s(erator)630 2710 y(to)37 -b(the)f Fs([[)g Ft(conditional)i(command)e(\(see)h(Section)g(3.2.4.2)i +(`)p Ft(=~)p Fu(')g(binary)f(op)s(erator)630 2710 y(to)37 +b(the)f Ft([[)g Fu(conditional)i(command)e(\(see)h(Section)g(3.2.4.2)i ([Conditional)e(Constructs],)630 2819 y(page)e(10\).)52 b(The)33 b(elemen)m(t)j(with)d(index)g(0)i(is)f(the)g(p)s(ortion)f(of)h (the)g(string)g(matc)m(hing)h(the)630 2929 y(en)m(tire)29 b(regular)f(expression.)40 b(The)27 b(elemen)m(t)j(with)d(index)h -Fq(n)f Ft(is)h(the)g(p)s(ortion)g(of)g(the)g(string)630 -3039 y(matc)m(hing)j(the)g Fq(n)p Ft(th)f(paren)m(thesized)h(sub)s +Fr(n)f Fu(is)h(the)g(p)s(ortion)g(of)g(the)g(string)630 +3039 y(matc)m(hing)j(the)g Fr(n)p Fu(th)f(paren)m(thesized)h(sub)s (expression.)39 b(This)29 b(v)-5 b(ariable)31 b(is)g(read-only)-8 -b(.)150 3203 y Fs(BASH_SOURCE)630 3313 y Ft(An)40 b(arra)m(y)h(v)-5 +b(.)150 3203 y Ft(BASH_SOURCE)630 3313 y Fu(An)40 b(arra)m(y)h(v)-5 b(ariable)41 b(whose)f(mem)m(b)s(ers)g(are)h(the)g(source)f (\014lenames)h(where)f(the)g(corre-)630 3422 y(sp)s(onding)27 -b(shell)i(function)f(names)g(in)g(the)h Fs(FUNCNAME)d -Ft(arra)m(y)j(v)-5 b(ariable)30 b(are)f(de\014ned.)38 -b(The)630 3532 y(shell)26 b(function)g Fs(${FUNCNAME[$i]})c -Ft(is)k(de\014ned)f(in)g(the)h(\014le)h Fs(${BASH_SOURCE[$i]})21 -b Ft(and)630 3641 y(called)32 b(from)d Fs(${BASH_SOURCE[$i+1]})150 -3806 y(BASH_SUBSHELL)630 3915 y Ft(Incremen)m(ted)24 +b(shell)i(function)f(names)g(in)g(the)h Ft(FUNCNAME)d +Fu(arra)m(y)j(v)-5 b(ariable)30 b(are)f(de\014ned.)38 +b(The)630 3532 y(shell)26 b(function)g Ft(${FUNCNAME[$i]})c +Fu(is)k(de\014ned)f(in)g(the)h(\014le)h Ft(${BASH_SOURCE[$i]})21 +b Fu(and)630 3641 y(called)32 b(from)d Ft(${BASH_SOURCE[$i+1]})150 +3806 y(BASH_SUBSHELL)630 3915 y Fu(Incremen)m(ted)24 b(b)m(y)f(one)h(within)f(eac)m(h)i(subshell)d(or)i(subshell)e(en)m (vironmen)m(t)i(when)f(the)h(shell)630 4025 y(b)s(egins)30 b(executing)h(in)f(that)h(en)m(vironmen)m(t.)42 b(The)30 -b(initial)h(v)-5 b(alue)31 b(is)f(0.)150 4189 y Fs(BASH_VERSINFO)630 -4299 y Ft(A)36 b(readonly)g(arra)m(y)g(v)-5 b(ariable)37 +b(initial)h(v)-5 b(alue)31 b(is)f(0.)150 4189 y Ft(BASH_VERSINFO)630 +4299 y Fu(A)36 b(readonly)g(arra)m(y)g(v)-5 b(ariable)37 b(\(see)f(Section)h(6.7)g([Arra)m(ys],)h(page)e(89\))h(whose)f(mem)m(b) s(ers)630 4408 y(hold)c(v)m(ersion)h(information)f(for)g(this)g (instance)h(of)g(Bash.)46 b(The)32 b(v)-5 b(alues)32 b(assigned)h(to)g(the)630 4518 y(arra)m(y)e(mem)m(b)s(ers)e(are)i(as)g -(follo)m(ws:)630 4682 y Fs(BASH_VERSINFO[0])1110 4792 -y Ft(The)f(ma)5 b(jor)30 b(v)m(ersion)h(n)m(um)m(b)s(er)e(\(the)i -Fq(release)5 b Ft(\).)630 4956 y Fs(BASH_VERSINFO[1])1110 -5066 y Ft(The)30 b(minor)g(v)m(ersion)h(n)m(um)m(b)s(er)e(\(the)i -Fq(v)m(ersion)p Ft(\).)630 5230 y Fs(BASH_VERSINFO[2])1110 -5340 y Ft(The)f(patc)m(h)h(lev)m(el.)p eop end +(follo)m(ws:)630 4682 y Ft(BASH_VERSINFO[0])1110 4792 +y Fu(The)f(ma)5 b(jor)30 b(v)m(ersion)h(n)m(um)m(b)s(er)e(\(the)i +Fr(release)5 b Fu(\).)630 4956 y Ft(BASH_VERSINFO[1])1110 +5066 y Fu(The)30 b(minor)g(v)m(ersion)h(n)m(um)m(b)s(er)e(\(the)i +Fr(v)m(ersion)p Fu(\).)630 5230 y Ft(BASH_VERSINFO[2])1110 +5340 y Fu(The)f(patc)m(h)h(lev)m(el.)p eop end %%Page: 72 78 -TeXDict begin 72 77 bop 150 -116 a Ft(Chapter)30 b(5:)41 -b(Shell)30 b(V)-8 b(ariables)2459 b(72)630 299 y Fs(BASH_VERSINFO[3]) -1110 408 y Ft(The)30 b(build)f(v)m(ersion.)630 591 y -Fs(BASH_VERSINFO[4])1110 701 y Ft(The)h(release)i(status)e(\(e.g.,)j -Fq(b)s(eta1)7 b Ft(\).)630 883 y Fs(BASH_VERSINFO[5])1110 -993 y Ft(The)30 b(v)-5 b(alue)31 b(of)f Fs(MACHTYPE)p -Ft(.)150 1176 y Fs(BASH_VERSION)630 1285 y Ft(The)g(v)m(ersion)h(n)m +TeXDict begin 72 77 bop 150 -116 a Fu(Chapter)30 b(5:)41 +b(Shell)30 b(V)-8 b(ariables)2459 b(72)630 299 y Ft(BASH_VERSINFO[3]) +1110 408 y Fu(The)30 b(build)f(v)m(ersion.)630 591 y +Ft(BASH_VERSINFO[4])1110 701 y Fu(The)h(release)i(status)e(\(e.g.,)j +Fr(b)s(eta1)7 b Fu(\).)630 883 y Ft(BASH_VERSINFO[5])1110 +993 y Fu(The)30 b(v)-5 b(alue)31 b(of)f Ft(MACHTYPE)p +Fu(.)150 1176 y Ft(BASH_VERSION)630 1285 y Fu(The)g(v)m(ersion)h(n)m (um)m(b)s(er)e(of)h(the)h(curren)m(t)f(instance)h(of)g(Bash.)150 -1468 y Fs(BASH_XTRACEFD)630 1577 y Ft(If)f(set)h(to)h(an)e(in)m(teger)i +1468 y Ft(BASH_XTRACEFD)630 1577 y Fu(If)f(set)h(to)h(an)e(in)m(teger)i (corresp)s(onding)e(to)h(a)g(v)-5 b(alid)31 b(\014le)g(descriptor,)g (Bash)g(will)g(write)g(the)630 1687 y(trace)37 b(output)f(generated)h -(when)f(`)p Fs(set)29 b(-x)p Ft(')36 b(is)g(enabled)h(to)g(that)f +(when)f(`)p Ft(set)29 b(-x)p Fu(')36 b(is)g(enabled)h(to)g(that)f (\014le)h(descriptor.)58 b(This)630 1797 y(allo)m(ws)29 b(tracing)h(output)d(to)i(b)s(e)f(separated)g(from)g(diagnostic)h(and)f (error)f(messages.)41 b(The)630 1906 y(\014le)31 b(descriptor)f(is)h -(closed)g(when)f Fs(BASH_XTRACEFD)d Ft(is)k(unset)f(or)g(assigned)h(a)g -(new)f(v)-5 b(alue.)630 2016 y(Unsetting)45 b Fs(BASH_XTRACEFD)40 -b Ft(or)k(assigning)g(it)g(the)g(empt)m(y)h(string)e(causes)i(the)f +(closed)g(when)f Ft(BASH_XTRACEFD)d Fu(is)k(unset)f(or)g(assigned)h(a)g +(new)f(v)-5 b(alue.)630 2016 y(Unsetting)45 b Ft(BASH_XTRACEFD)40 +b Fu(or)k(assigning)g(it)g(the)g(empt)m(y)h(string)e(causes)i(the)f (trace)630 2125 y(output)33 b(to)i(b)s(e)d(sen)m(t)j(to)f(the)g -(standard)e(error.)50 b(Note)35 b(that)g(setting)f Fs(BASH_XTRACEFD)c -Ft(to)630 2235 y(2)39 b(\(the)h(standard)e(error)g(\014le)h +(standard)e(error.)50 b(Note)35 b(that)g(setting)f Ft(BASH_XTRACEFD)c +Fu(to)630 2235 y(2)39 b(\(the)h(standard)e(error)g(\014le)h (descriptor\))h(and)e(then)h(unsetting)g(it)g(will)g(result)g(in)g(the) 630 2345 y(standard)30 b(error)g(b)s(eing)f(closed.)150 -2527 y Fs(CHILD_MAX)630 2637 y Ft(Set)35 b(the)h(n)m(um)m(b)s(er)e(of)h +2527 y Ft(CHILD_MAX)630 2637 y Fu(Set)35 b(the)h(n)m(um)m(b)s(er)e(of)h (exited)h(c)m(hild)g(status)f(v)-5 b(alues)36 b(for)f(the)g(shell)g(to) h(remem)m(b)s(er.)55 b(Bash)630 2746 y(will)37 b(not)g(allo)m(w)i(this) e(v)-5 b(alue)37 b(to)h(b)s(e)e(decreased)i(b)s(elo)m(w)f(a)g -Fl(posix)p Ft(-mandated)f(minim)m(um,)630 2856 y(and)30 +Fm(posix)p Fu(-mandated)f(minim)m(um,)630 2856 y(and)30 b(there)g(is)g(a)h(maxim)m(um)f(v)-5 b(alue)30 b(\(curren)m(tly)h (8192\))h(that)f(this)f(ma)m(y)g(not)h(exceed.)41 b(The)630 2966 y(minim)m(um)30 b(v)-5 b(alue)30 b(is)h(system-dep)s(enden)m(t.) -150 3148 y Fs(COLUMNS)144 b Ft(Used)32 b(b)m(y)f(the)h -Fs(select)e Ft(command)h(to)i(determine)f(the)f(terminal)i(width)d +150 3148 y Ft(COLUMNS)144 b Fu(Used)32 b(b)m(y)f(the)h +Ft(select)e Fu(command)h(to)i(determine)f(the)f(terminal)i(width)d (when)h(prin)m(ting)630 3258 y(selection)39 b(lists.)63 -b(Automatically)41 b(set)d(if)f(the)h Fs(checkwinsize)d -Ft(option)j(is)f(enabled)h(\(see)630 3367 y(Section)44 -b(4.3.2)h([The)e(Shopt)g(Builtin],)k(page)d(63\),)k(or)43 +b(Automatically)41 b(set)d(if)f(the)h Ft(checkwinsize)d +Fu(option)j(is)f(enabled)h(\(see)630 3367 y(Section)44 +b(4.3.2)h([The)e(Shopt)g(Builtin],)k(page)d(62\),)k(or)43 b(in)g(an)g(in)m(teractiv)m(e)j(shell)e(up)s(on)630 3477 -y(receipt)31 b(of)g(a)g Fs(SIGWINCH)p Ft(.)150 3660 y -Fs(COMP_CWORD)630 3769 y Ft(An)38 b(index)g(in)m(to)h -Fs(${COMP_WORDS})c Ft(of)k(the)g(w)m(ord)f(con)m(taining)i(the)e +y(receipt)31 b(of)g(a)g Ft(SIGWINCH)p Fu(.)150 3660 y +Ft(COMP_CWORD)630 3769 y Fu(An)38 b(index)g(in)m(to)h +Ft(${COMP_WORDS})c Fu(of)k(the)g(w)m(ord)f(con)m(taining)i(the)e (curren)m(t)g(cursor)g(p)s(o-)630 3879 y(sition.)72 b(This)40 b(v)-5 b(ariable)41 b(is)f(a)m(v)-5 b(ailable)43 b(only)e(in)f(shell)h (functions)f(in)m(v)m(ok)m(ed)i(b)m(y)e(the)h(pro-)630 3988 y(grammable)36 b(completion)g(facilities)i(\(see)e(Section)g(8.6)g -([Programmable)g(Completion],)630 4098 y(page)31 b(125\).)150 -4281 y Fs(COMP_LINE)630 4390 y Ft(The)38 b(curren)m(t)h(command)f +([Programmable)g(Completion],)630 4098 y(page)31 b(124\).)150 +4281 y Ft(COMP_LINE)630 4390 y Fu(The)38 b(curren)m(t)h(command)f (line.)66 b(This)37 b(v)-5 b(ariable)40 b(is)f(a)m(v)-5 b(ailable)41 b(only)d(in)h(shell)f(functions)630 4500 y(and)25 b(external)h(commands)f(in)m(v)m(ok)m(ed)h(b)m(y)f(the)h (programmable)f(completion)i(facilities)g(\(see)630 4609 -y(Section)k(8.6)h([Programmable)f(Completion],)g(page)g(125\).)150 -4792 y Fs(COMP_POINT)630 4902 y Ft(The)25 b(index)g(of)h(the)g(curren)m +y(Section)k(8.6)h([Programmable)f(Completion],)g(page)g(124\).)150 +4792 y Ft(COMP_POINT)630 4902 y Fu(The)25 b(index)g(of)h(the)g(curren)m (t)f(cursor)g(p)s(osition)h(relativ)m(e)i(to)e(the)g(b)s(eginning)f(of) g(the)h(curren)m(t)630 5011 y(command.)40 b(If)27 b(the)h(curren)m(t)g (cursor)g(p)s(osition)g(is)g(at)g(the)g(end)g(of)g(the)g(curren)m(t)g (command,)630 5121 y(the)i(v)-5 b(alue)30 b(of)g(this)g(v)-5 -b(ariable)31 b(is)f(equal)g(to)h Fs(${#COMP_LINE})p Ft(.)37 +b(ariable)31 b(is)f(equal)g(to)h Ft(${#COMP_LINE})p Fu(.)37 b(This)29 b(v)-5 b(ariable)31 b(is)f(a)m(v)-5 b(ailable)630 5230 y(only)36 b(in)f(shell)h(functions)f(and)g(external)h(commands)g (in)m(v)m(ok)m(ed)h(b)m(y)e(the)h(programmable)630 5340 y(completion)c(facilities)g(\(see)g(Section)f(8.6)g([Programmable)g -(Completion],)h(page)f(125\).)p eop end +(Completion],)h(page)f(124\).)p eop end %%Page: 73 79 -TeXDict begin 73 78 bop 150 -116 a Ft(Chapter)30 b(5:)41 -b(Shell)30 b(V)-8 b(ariables)2459 b(73)150 299 y Fs(COMP_TYPE)630 -408 y Ft(Set)27 b(to)h(an)f(in)m(teger)h(v)-5 b(alue)28 +TeXDict begin 73 78 bop 150 -116 a Fu(Chapter)30 b(5:)41 +b(Shell)30 b(V)-8 b(ariables)2459 b(73)150 299 y Ft(COMP_TYPE)630 +408 y Fu(Set)27 b(to)h(an)f(in)m(teger)h(v)-5 b(alue)28 b(corresp)s(onding)e(to)h(the)h(t)m(yp)s(e)f(of)g(completion)h -(attempted)g(that)630 518 y(caused)e(a)g(completion)i(function)d(to)i -(b)s(e)e(called:)40 b Fq(T)-8 b(AB)5 b Ft(,)27 b(for)f(normal)g -(completion,)i(`)p Fs(?)p Ft(',)f(for)630 628 y(listing)35 -b(completions)h(after)f(successiv)m(e)g(tabs,)h(`)p Fs(!)p -Ft(',)g(for)e(listing)h(alternativ)m(es)i(on)d(partial)630 -737 y(w)m(ord)22 b(completion,)k(`)p Fs(@)p Ft(',)f(to)e(list)g +(attempted)g(that)630 518 y(caused)e(a)h(completion)h(function)e(to)h +(b)s(e)f(called:)40 b Fr(T)-8 b(AB)p Fu(,)27 b(for)g(normal)f +(completion,)j(`)p Ft(?)p Fu(',)e(for)630 628 y(listing)35 +b(completions)h(after)f(successiv)m(e)g(tabs,)h(`)p Ft(!)p +Fu(',)g(for)e(listing)h(alternativ)m(es)i(on)d(partial)630 +737 y(w)m(ord)22 b(completion,)k(`)p Ft(@)p Fu(',)f(to)e(list)g (completions)h(if)f(the)g(w)m(ord)f(is)h(not)g(unmo)s(di\014ed,)f(or)h -(`)p Fs(\045)p Ft(',)h(for)630 847 y(men)m(u)i(completion.)41 +(`)p Ft(\045)p Fu(',)h(for)630 847 y(men)m(u)i(completion.)41 b(This)25 b(v)-5 b(ariable)27 b(is)g(a)m(v)-5 b(ailable)28 b(only)f(in)f(shell)g(functions)g(and)g(external)630 956 y(commands)32 b(in)m(v)m(ok)m(ed)i(b)m(y)e(the)g(programmable)h (completion)g(facilities)i(\(see)e(Section)g(8.6)630 -1066 y([Programmable)e(Completion],)h(page)f(125\).)150 -1241 y Fs(COMP_KEY)96 b Ft(The)29 b(k)m(ey)i(\(or)g(\014nal)e(k)m(ey)i +1066 y([Programmable)e(Completion],)h(page)f(124\).)150 +1241 y Ft(COMP_KEY)96 b Fu(The)29 b(k)m(ey)i(\(or)g(\014nal)e(k)m(ey)i (of)f(a)g(k)m(ey)h(sequence\))g(used)e(to)i(in)m(v)m(ok)m(e)h(the)e (curren)m(t)g(completion)630 1351 y(function.)150 1526 -y Fs(COMP_WORDBREAKS)630 1636 y Ft(The)f(set)i(of)e(c)m(haracters)j +y Ft(COMP_WORDBREAKS)630 1636 y Fu(The)f(set)i(of)e(c)m(haracters)j (that)e(the)g(Readline)g(library)g(treats)g(as)g(w)m(ord)g(separators)g (when)630 1745 y(p)s(erforming)i(w)m(ord)h(completion.)51 -b(If)33 b Fs(COMP_WORDBREAKS)c Ft(is)34 b(unset,)g(it)f(loses)i(its)e +b(If)33 b Ft(COMP_WORDBREAKS)c Fu(is)34 b(unset,)g(it)f(loses)i(its)e (sp)s(ecial)630 1855 y(prop)s(erties,)d(ev)m(en)h(if)f(it)h(is)g -(subsequen)m(tly)f(reset.)150 2030 y Fs(COMP_WORDS)630 -2140 y Ft(An)36 b(arra)m(y)g(v)-5 b(ariable)37 b(consisting)g(of)f(the) +(subsequen)m(tly)f(reset.)150 2030 y Ft(COMP_WORDS)630 +2140 y Fu(An)36 b(arra)m(y)g(v)-5 b(ariable)37 b(consisting)g(of)f(the) g(individual)f(w)m(ords)h(in)f(the)h(curren)m(t)g(command)630 2250 y(line.)94 b(The)47 b(line)i(is)f(split)g(in)m(to)h(w)m(ords)e(as) -h(Readline)h(w)m(ould)f(split)g(it,)53 b(using)47 b Fs(COMP_)630 -2359 y(WORDBREAKS)34 b Ft(as)i(describ)s(ed)g(ab)s(o)m(v)m(e.)60 +h(Readline)h(w)m(ould)f(split)g(it,)53 b(using)47 b Ft(COMP_)630 +2359 y(WORDBREAKS)34 b Fu(as)i(describ)s(ed)g(ab)s(o)m(v)m(e.)60 b(This)36 b(v)-5 b(ariable)37 b(is)f(a)m(v)-5 b(ailable)39 b(only)e(in)f(shell)h(func-)630 2469 y(tions)32 b(in)m(v)m(ok)m(ed)i(b) m(y)d(the)i(programmable)f(completion)h(facilities)h(\(see)f(Section)g -(8.6)g([Pro-)630 2578 y(grammable)e(Completion],)g(page)g(125\).)150 -2754 y Fs(COMPREPLY)630 2863 y Ft(An)37 b(arra)m(y)h(v)-5 +(8.6)g([Pro-)630 2578 y(grammable)e(Completion],)g(page)g(124\).)150 +2754 y Ft(COMPREPLY)630 2863 y Fu(An)37 b(arra)m(y)h(v)-5 b(ariable)38 b(from)f(whic)m(h)g(Bash)g(reads)g(the)h(p)s(ossible)e (completions)j(generated)630 2973 y(b)m(y)33 b(a)g(shell)h(function)f (in)m(v)m(ok)m(ed)h(b)m(y)f(the)g(programmable)h(completion)g(facilit)m (y)h(\(see)f(Sec-)630 3082 y(tion)g(8.6)g([Programmable)g(Completion],) -h(page)f(125\).)51 b(Eac)m(h)34 b(arra)m(y)g(elemen)m(t)h(con)m(tains) +h(page)f(124\).)51 b(Eac)m(h)34 b(arra)m(y)g(elemen)m(t)h(con)m(tains) 630 3192 y(one)c(p)s(ossible)f(completion.)150 3367 y -Fs(COPROC)192 b Ft(An)27 b(arra)m(y)g(v)-5 b(ariable)28 +Ft(COPROC)192 b Fu(An)27 b(arra)m(y)g(v)-5 b(ariable)28 b(created)g(to)f(hold)g(the)g(\014le)g(descriptors)g(for)g(output)f (from)h(and)f(input)630 3477 y(to)31 b(an)f(unnamed)f(copro)s(cess)i (\(see)g(Section)h(3.2.5)g([Copro)s(cesses],)f(page)g(15\).)150 -3652 y Fs(DIRSTACK)96 b Ft(An)26 b(arra)m(y)h(v)-5 b(ariable)28 +3652 y Ft(DIRSTACK)96 b Fu(An)26 b(arra)m(y)h(v)-5 b(ariable)28 b(con)m(taining)g(the)f(curren)m(t)f(con)m(ten)m(ts)j(of)e(the)f (directory)i(stac)m(k.)41 b(Direc-)630 3762 y(tories)33 b(app)s(ear)f(in)g(the)h(stac)m(k)h(in)e(the)h(order)f(they)h(are)g -(displa)m(y)m(ed)g(b)m(y)f(the)h Fs(dirs)e Ft(builtin.)630 +(displa)m(y)m(ed)g(b)m(y)f(the)h Ft(dirs)e Fu(builtin.)630 3871 y(Assigning)f(to)h(mem)m(b)s(ers)f(of)g(this)g(arra)m(y)g(v)-5 b(ariable)31 b(ma)m(y)g(b)s(e)e(used)h(to)h(mo)s(dify)e(directories)630 3981 y(already)41 b(in)f(the)h(stac)m(k,)k(but)40 b(the)h -Fs(pushd)e Ft(and)h Fs(popd)f Ft(builtins)h(m)m(ust)h(b)s(e)e(used)h +Ft(pushd)e Fu(and)h Ft(popd)f Fu(builtins)h(m)m(ust)h(b)s(e)e(used)h (to)i(add)630 4091 y(and)37 b(remo)m(v)m(e)h(directories.)63 b(Assignmen)m(t)37 b(to)h(this)f(v)-5 b(ariable)38 b(will)g(not)f(c)m (hange)i(the)e(cur-)630 4200 y(ren)m(t)c(directory)-8 -b(.)47 b(If)32 b Fs(DIRSTACK)e Ft(is)i(unset,)g(it)h(loses)g(its)g(sp)s +b(.)47 b(If)32 b Ft(DIRSTACK)e Fu(is)i(unset,)g(it)h(loses)g(its)g(sp)s (ecial)g(prop)s(erties,)f(ev)m(en)h(if)f(it)h(is)630 -4310 y(subsequen)m(tly)d(reset.)150 4485 y Fs(EMACS)240 -b Ft(If)31 b(Bash)h(\014nds)d(this)j(v)-5 b(ariable)32 +4310 y(subsequen)m(tly)d(reset.)150 4485 y Ft(EMACS)240 +b Fu(If)31 b(Bash)h(\014nds)d(this)j(v)-5 b(ariable)32 b(in)f(the)h(en)m(vironmen)m(t)g(when)e(the)i(shell)f(starts)h(with)f -(v)-5 b(alue)630 4595 y(`)p Fs(t)p Ft(',)36 b(it)f(assumes)f(that)h +(v)-5 b(alue)630 4595 y(`)p Ft(t)p Fu(',)36 b(it)f(assumes)f(that)h (the)g(shell)f(is)h(running)e(in)h(an)g(Emacs)h(shell)g(bu\013er)e(and) -h(disables)630 4704 y(line)d(editing.)150 4880 y Fs(ENV)336 -b Ft(Similar)35 b(to)g Fs(BASH_ENV)p Ft(;)h(used)e(when)g(the)h(shell)g -(is)g(in)m(v)m(ok)m(ed)h(in)e Fl(posix)h Ft(Mo)s(de)g(\(see)g(Sec-)630 +h(disables)630 4704 y(line)d(editing.)150 4880 y Ft(ENV)336 +b Fu(Similar)35 b(to)g Ft(BASH_ENV)p Fu(;)h(used)e(when)g(the)h(shell)g +(is)g(in)m(v)m(ok)m(ed)h(in)e Fm(posix)h Fu(Mo)s(de)g(\(see)g(Sec-)630 4989 y(tion)c(6.11)h([Bash)f(POSIX)e(Mo)s(de],)i(page)g(94\).)150 -5165 y Fs(EUID)288 b Ft(The)30 b(n)m(umeric)g(e\013ectiv)m(e)j(user)d +5165 y Ft(EUID)288 b Fu(The)30 b(n)m(umeric)g(e\013ectiv)m(e)j(user)d (id)g(of)g(the)h(curren)m(t)f(user.)40 b(This)30 b(v)-5 -b(ariable)31 b(is)f(readonly)-8 b(.)150 5340 y Fs(FCEDIT)192 -b Ft(The)30 b(editor)h(used)e(as)i(a)g(default)f(b)m(y)h(the)f(`)p -Fs(-e)p Ft(')g(option)h(to)g(the)g Fs(fc)f Ft(builtin)g(command.)p +b(ariable)31 b(is)f(readonly)-8 b(.)150 5340 y Ft(FCEDIT)192 +b Fu(The)30 b(editor)h(used)e(as)i(a)g(default)f(b)m(y)h(the)f +Ft(-e)g Fu(option)h(to)g(the)f Ft(fc)g Fu(builtin)g(command.)p eop end %%Page: 74 80 -TeXDict begin 74 79 bop 150 -116 a Ft(Chapter)30 b(5:)41 -b(Shell)30 b(V)-8 b(ariables)2459 b(74)150 299 y Fs(FIGNORE)144 -b Ft(A)35 b(colon-separated)i(list)f(of)g(su\016xes)e(to)i(ignore)g +TeXDict begin 74 79 bop 150 -116 a Fu(Chapter)30 b(5:)41 +b(Shell)30 b(V)-8 b(ariables)2459 b(74)150 299 y Ft(FIGNORE)144 +b Fu(A)35 b(colon-separated)i(list)f(of)g(su\016xes)e(to)i(ignore)g (when)e(p)s(erforming)g(\014lename)i(comple-)630 408 y(tion.)k(A)27 b(\014lename)g(whose)f(su\016x)g(matc)m(hes)i(one)f(of)g -(the)g(en)m(tries)g(in)g Fs(FIGNORE)d Ft(is)j(excluded)630 +(the)g(en)m(tries)g(in)g Ft(FIGNORE)d Fu(is)j(excluded)630 518 y(from)j(the)g(list)h(of)g(matc)m(hed)g(\014lenames.)41 -b(A)30 b(sample)h(v)-5 b(alue)31 b(is)f(`)p Fs(.o:~)p -Ft(')150 671 y Fs(FUNCNAME)96 b Ft(An)35 b(arra)m(y)i(v)-5 +b(A)30 b(sample)h(v)-5 b(alue)31 b(is)f(`)p Ft(.o:~)p +Fu(')150 671 y Ft(FUNCNAME)96 b Fu(An)35 b(arra)m(y)i(v)-5 b(ariable)36 b(con)m(taining)h(the)f(names)g(of)g(all)g(shell)g (functions)g(curren)m(tly)f(in)h(the)630 781 y(execution)g(call)h(stac) m(k.)57 b(The)34 b(elemen)m(t)j(with)e(index)g(0)h(is)f(the)g(name)h (of)f(an)m(y)h(curren)m(tly-)630 891 y(executing)f(shell)f(function.)51 b(The)34 b(b)s(ottom-most)h(elemen)m(t)g(\(the)g(one)f(with)g(the)g -(highest)630 1000 y(index\))e(is)h Fs("main")p Ft(.)44 +(highest)630 1000 y(index\))e(is)h Ft("main")p Fu(.)44 b(This)32 b(v)-5 b(ariable)33 b(exists)g(only)g(when)e(a)i(shell)f (function)g(is)g(executing.)630 1110 y(Assignmen)m(ts)23 -b(to)h Fs(FUNCNAME)c Ft(ha)m(v)m(e)k(no)f(e\013ect)h(and)e(return)g(an) -g(error)g(status.)39 b(If)22 b Fs(FUNCNAME)630 1219 y -Ft(is)30 b(unset,)h(it)g(loses)g(its)f(sp)s(ecial)h(prop)s(erties,)f +b(to)h Ft(FUNCNAME)c Fu(ha)m(v)m(e)k(no)f(e\013ect)h(and)e(return)g(an) +g(error)g(status.)39 b(If)22 b Ft(FUNCNAME)630 1219 y +Fu(is)30 b(unset,)h(it)g(loses)g(its)f(sp)s(ecial)h(prop)s(erties,)f (ev)m(en)h(if)g(it)g(is)f(subsequen)m(tly)g(reset.)630 1351 y(This)h(v)-5 b(ariable)32 b(can)f(b)s(e)g(used)g(with)g -Fs(BASH_LINENO)d Ft(and)j Fs(BASH_SOURCE)p Ft(.)40 b(Eac)m(h)32 -b(elemen)m(t)630 1461 y(of)g Fs(FUNCNAME)d Ft(has)j(corresp)s(onding)e -(elemen)m(ts)j(in)f Fs(BASH_LINENO)c Ft(and)k Fs(BASH_SOURCE)c -Ft(to)630 1570 y(describ)s(e)39 b(the)h(call)h(stac)m(k.)70 -b(F)-8 b(or)41 b(instance,)i Fs(${FUNCNAME[$i]})35 b -Ft(w)m(as)41 b(called)f(from)g(the)630 1680 y(\014le)27 -b Fs(${BASH_SOURCE[$i+1]})21 b Ft(at)27 b(line)h(n)m(um)m(b)s(er)d -Fs(${BASH_LINENO[$i]})p Ft(.)34 b(The)27 b Fs(caller)630 -1789 y Ft(builtin)j(displa)m(ys)g(the)h(curren)m(t)f(call)i(stac)m(k)g -(using)d(this)i(information.)150 1943 y Fs(FUNCNEST)96 -b Ft(If)34 b(set)i(to)f(a)h(n)m(umeric)e(v)-5 b(alue)36 +Ft(BASH_LINENO)d Fu(and)j Ft(BASH_SOURCE)p Fu(.)40 b(Eac)m(h)32 +b(elemen)m(t)630 1461 y(of)g Ft(FUNCNAME)d Fu(has)j(corresp)s(onding)e +(elemen)m(ts)j(in)f Ft(BASH_LINENO)c Fu(and)k Ft(BASH_SOURCE)c +Fu(to)630 1570 y(describ)s(e)39 b(the)h(call)h(stac)m(k.)70 +b(F)-8 b(or)41 b(instance,)i Ft(${FUNCNAME[$i]})35 b +Fu(w)m(as)41 b(called)f(from)g(the)630 1680 y(\014le)27 +b Ft(${BASH_SOURCE[$i+1]})21 b Fu(at)27 b(line)h(n)m(um)m(b)s(er)d +Ft(${BASH_LINENO[$i]})p Fu(.)34 b(The)27 b Ft(caller)630 +1789 y Fu(builtin)j(displa)m(ys)g(the)h(curren)m(t)f(call)i(stac)m(k)g +(using)d(this)i(information.)150 1943 y Ft(FUNCNEST)96 +b Fu(If)34 b(set)i(to)f(a)h(n)m(umeric)e(v)-5 b(alue)36 b(greater)g(than)e(0,)j(de\014nes)d(a)h(maxim)m(um)g(function)g (nesting)630 2052 y(lev)m(el.)42 b(F)-8 b(unction)29 b(in)m(v)m(o)s(cations)h(that)f(exceed)h(this)e(nesting)h(lev)m(el)h (will)f(cause)g(the)f(curren)m(t)630 2162 y(command)i(to)h(ab)s(ort.) -150 2315 y Fs(GLOBIGNORE)630 2425 y Ft(A)38 b(colon-separated)i(list)f +150 2315 y Ft(GLOBIGNORE)630 2425 y Fu(A)38 b(colon-separated)i(list)f (of)f(patterns)g(de\014ning)f(the)h(set)g(of)h(\014lenames)f(to)g(b)s (e)g(ignored)630 2534 y(b)m(y)31 b(\014lename)g(expansion.)43 b(If)31 b(a)h(\014lename)f(matc)m(hed)h(b)m(y)f(a)g(\014lename)h (expansion)f(pattern)630 2644 y(also)i(matc)m(hes)g(one)f(of)g(the)g -(patterns)g(in)f Fs(GLOBIGNORE)p Ft(,)f(it)i(is)g(remo)m(v)m(ed)h(from) -e(the)h(list)h(of)630 2754 y(matc)m(hes.)150 2907 y Fs(GROUPS)192 -b Ft(An)36 b(arra)m(y)g(v)-5 b(ariable)37 b(con)m(taining)g(the)f(list) +(patterns)g(in)f Ft(GLOBIGNORE)p Fu(,)f(it)i(is)g(remo)m(v)m(ed)h(from) +e(the)h(list)h(of)630 2754 y(matc)m(hes.)150 2907 y Ft(GROUPS)192 +b Fu(An)36 b(arra)m(y)g(v)-5 b(ariable)37 b(con)m(taining)g(the)f(list) h(of)f(groups)g(of)g(whic)m(h)f(the)i(curren)m(t)e(user)h(is)g(a)630 -3017 y(mem)m(b)s(er.)47 b(Assignmen)m(ts)33 b(to)g Fs(GROUPS)e -Ft(ha)m(v)m(e)j(no)f(e\013ect)h(and)e(return)g(an)g(error)g(status.)48 -b(If)630 3126 y Fs(GROUPS)29 b Ft(is)h(unset,)g(it)h(loses)g(its)g(sp)s +3017 y(mem)m(b)s(er.)47 b(Assignmen)m(ts)33 b(to)g Ft(GROUPS)e +Fu(ha)m(v)m(e)j(no)f(e\013ect)h(and)e(return)g(an)g(error)g(status.)48 +b(If)630 3126 y Ft(GROUPS)29 b Fu(is)h(unset,)g(it)h(loses)g(its)g(sp)s (ecial)g(prop)s(erties,)f(ev)m(en)h(if)f(it)h(is)g(subsequen)m(tly)f -(reset.)150 3280 y Fs(histchars)630 3389 y Ft(Up)c(to)g(three)g(c)m +(reset.)150 3280 y Ft(histchars)630 3389 y Fu(Up)c(to)g(three)g(c)m (haracters)i(whic)m(h)d(con)m(trol)j(history)d(expansion,)i(quic)m(k)g (substitution,)g(and)630 3499 y(tok)m(enization)k(\(see)f(Section)f -(9.3)h([History)f(In)m(teraction],)i(page)f(136\).)41 +(9.3)h([History)f(In)m(teraction],)i(page)f(135\).)41 b(The)29 b(\014rst)e(c)m(harac-)630 3608 y(ter)j(is)f(the)g -Fq(history)g(expansion)g Ft(c)m(haracter,)j(that)e(is,)f(the)h(c)m +Fr(history)g(expansion)g Fu(c)m(haracter,)j(that)e(is,)f(the)h(c)m (haracter)h(whic)m(h)d(signi\014es)i(the)630 3718 y(start)25 -b(of)f(a)h(history)f(expansion,)i(normally)e(`)p Fs(!)p -Ft('.)39 b(The)24 b(second)g(c)m(haracter)i(is)e(the)g(c)m(haracter)630 +b(of)f(a)h(history)f(expansion,)i(normally)e(`)p Ft(!)p +Fu('.)39 b(The)24 b(second)g(c)m(haracter)i(is)e(the)g(c)m(haracter)630 3828 y(whic)m(h)36 b(signi\014es)g(`quic)m(k)h(substitution')f(when)f (seen)h(as)g(the)g(\014rst)f(c)m(haracter)j(on)e(a)g(line,)630 -3937 y(normally)27 b(`)p Fs(^)p Ft('.)39 b(The)26 b(optional)i(third)d +3937 y(normally)27 b(`)p Ft(^)p Fu('.)39 b(The)26 b(optional)i(third)d (c)m(haracter)j(is)e(the)h(c)m(haracter)h(whic)m(h)e(indicates)h(that) 630 4047 y(the)34 b(remainder)f(of)h(the)g(line)g(is)f(a)h(commen)m(t)h (when)e(found)f(as)i(the)g(\014rst)f(c)m(haracter)i(of)f(a)630 -4156 y(w)m(ord,)i(usually)f(`)p Fs(#)p Ft('.)55 b(The)34 +4156 y(w)m(ord,)i(usually)f(`)p Ft(#)p Fu('.)55 b(The)34 b(history)h(commen)m(t)h(c)m(haracter)h(causes)e(history)g (substitution)630 4266 y(to)27 b(b)s(e)f(skipp)s(ed)f(for)i(the)f (remaining)h(w)m(ords)f(on)h(the)f(line.)40 b(It)27 b(do)s(es)f(not)h (necessarily)g(cause)630 4376 y(the)k(shell)f(parser)g(to)h(treat)g (the)g(rest)g(of)f(the)h(line)f(as)h(a)g(commen)m(t.)150 -4529 y Fs(HISTCMD)144 b Ft(The)35 b(history)h(n)m(um)m(b)s(er,)g(or)f +4529 y Ft(HISTCMD)144 b Fu(The)35 b(history)h(n)m(um)m(b)s(er,)g(or)f (index)g(in)h(the)g(history)f(list,)j(of)e(the)g(curren)m(t)f(command.) -56 b(If)630 4639 y Fs(HISTCMD)28 b Ft(is)h(unset,)h(it)g(loses)h(its)f +56 b(If)630 4639 y Ft(HISTCMD)28 b Fu(is)h(unset,)h(it)g(loses)h(its)f (sp)s(ecial)g(prop)s(erties,)g(ev)m(en)g(if)g(it)g(is)g(subsequen)m -(tly)f(reset.)150 4792 y Fs(HISTCONTROL)630 4902 y Ft(A)40 +(tly)f(reset.)150 4792 y Ft(HISTCONTROL)630 4902 y Fu(A)40 b(colon-separated)i(list)f(of)f(v)-5 b(alues)40 b(con)m(trolling)i(ho)m (w)e(commands)g(are)h(sa)m(v)m(ed)g(on)f(the)630 5011 y(history)29 b(list.)41 b(If)28 b(the)h(list)h(of)f(v)-5 -b(alues)29 b(includes)f(`)p Fs(ignorespace)p Ft(',)f(lines)i(whic)m(h)g +b(alues)29 b(includes)f(`)p Ft(ignorespace)p Fu(',)f(lines)i(whic)m(h)g (b)s(egin)f(with)630 5121 y(a)39 b(space)g(c)m(haracter)i(are)e(not)g (sa)m(v)m(ed)g(in)g(the)g(history)f(list.)66 b(A)39 b(v)-5 -b(alue)39 b(of)g(`)p Fs(ignoredups)p Ft(')630 5230 y(causes)34 +b(alue)39 b(of)g(`)p Ft(ignoredups)p Fu(')630 5230 y(causes)34 b(lines)h(whic)m(h)f(matc)m(h)h(the)f(previous)f(history)h(en)m(try)h (to)g(not)f(b)s(e)f(sa)m(v)m(ed.)53 b(A)34 b(v)-5 b(alue)630 -5340 y(of)32 b(`)p Fs(ignoreboth)p Ft(')d(is)j(shorthand)e(for)i(`)p -Fs(ignorespace)p Ft(')d(and)i(`)p Fs(ignoredups)p Ft('.)42 +5340 y(of)32 b(`)p Ft(ignoreboth)p Fu(')d(is)j(shorthand)e(for)i(`)p +Ft(ignorespace)p Fu(')d(and)i(`)p Ft(ignoredups)p Fu('.)42 b(A)32 b(v)-5 b(alue)32 b(of)p eop end %%Page: 75 81 -TeXDict begin 75 80 bop 150 -116 a Ft(Chapter)30 b(5:)41 +TeXDict begin 75 80 bop 150 -116 a Fu(Chapter)30 b(5:)41 b(Shell)30 b(V)-8 b(ariables)2459 b(75)630 299 y(`)p -Fs(erasedups)p Ft(')31 b(causes)i(all)h(previous)f(lines)g(matc)m(hing) +Ft(erasedups)p Fu(')31 b(causes)i(all)h(previous)f(lines)g(matc)m(hing) h(the)f(curren)m(t)g(line)g(to)h(b)s(e)e(remo)m(v)m(ed)630 408 y(from)42 b(the)h(history)f(list)i(b)s(efore)e(that)h(line)g(is)g (sa)m(v)m(ed.)78 b(An)m(y)43 b(v)-5 b(alue)43 b(not)g(in)f(the)h(ab)s (o)m(v)m(e)630 518 y(list)35 b(is)g(ignored.)53 b(If)34 -b Fs(HISTCONTROL)e Ft(is)i(unset,)i(or)e(do)s(es)h(not)g(include)f(a)h +b Ft(HISTCONTROL)e Fu(is)i(unset,)i(or)e(do)s(es)h(not)g(include)f(a)h (v)-5 b(alid)35 b(v)-5 b(alue,)36 b(all)630 628 y(lines)30 b(read)g(b)m(y)g(the)g(shell)g(parser)g(are)g(sa)m(v)m(ed)h(on)f(the)g (history)g(list,)h(sub)5 b(ject)30 b(to)g(the)g(v)-5 -b(alue)630 737 y(of)42 b Fs(HISTIGNORE)p Ft(.)73 b(The)42 +b(alue)630 737 y(of)42 b Ft(HISTIGNORE)p Fu(.)73 b(The)42 b(second)g(and)g(subsequen)m(t)f(lines)h(of)h(a)f(m)m(ulti-line)h(comp) s(ound)630 847 y(command)33 b(are)h(not)g(tested,)i(and)d(are)h(added)f (to)h(the)g(history)g(regardless)g(of)g(the)f(v)-5 b(alue)630 -956 y(of)31 b Fs(HISTCONTROL)p Ft(.)150 1117 y Fs(HISTFILE)96 -b Ft(The)27 b(name)h(of)g(the)g(\014le)g(to)h(whic)m(h)f(the)g(command) +956 y(of)31 b Ft(HISTCONTROL)p Fu(.)150 1117 y Ft(HISTFILE)96 +b Fu(The)27 b(name)h(of)g(the)g(\014le)g(to)h(whic)m(h)f(the)g(command) f(history)h(is)g(sa)m(v)m(ed.)41 b(The)27 b(default)h(v)-5 -b(alue)630 1226 y(is)30 b(`)p Fs(~/.bash_history)p Ft('.)150 -1386 y Fs(HISTFILESIZE)630 1496 y Ft(The)c(maxim)m(um)f(n)m(um)m(b)s +b(alue)630 1226 y(is)30 b Ft(~/.bash_history)p Fu(.)150 +1386 y Ft(HISTFILESIZE)630 1496 y Fu(The)c(maxim)m(um)f(n)m(um)m(b)s (er)g(of)h(lines)h(con)m(tained)g(in)f(the)g(history)g(\014le.)39 b(When)26 b(this)g(v)-5 b(ariable)630 1606 y(is)25 b(assigned)h(a)g(v) -5 b(alue,)27 b(the)f(history)f(\014le)h(is)f(truncated,)i(if)e @@ -12852,33 +13369,33 @@ b(is)630 1934 y(0,)g(the)e(history)f(\014le)h(is)g(truncated)f(to)i b(and)f(n)m(umeric)630 2044 y(v)-5 b(alues)31 b(less)f(than)g(zero)h (inhibit)f(truncation.)41 b(The)29 b(shell)i(sets)f(the)h(default)f(v) -5 b(alue)31 b(to)g(the)630 2153 y(v)-5 b(alue)31 b(of)f -Fs(HISTSIZE)f Ft(after)h(reading)h(an)m(y)g(startup)f(\014les.)150 -2314 y Fs(HISTIGNORE)630 2423 y Ft(A)j(colon-separated)h(list)f(of)g +Ft(HISTSIZE)f Fu(after)h(reading)h(an)m(y)g(startup)f(\014les.)150 +2314 y Ft(HISTIGNORE)630 2423 y Fu(A)j(colon-separated)h(list)f(of)g (patterns)f(used)g(to)h(decide)g(whic)m(h)f(command)g(lines)h(should) 630 2533 y(b)s(e)f(sa)m(v)m(ed)h(on)g(the)f(history)h(list.)47 b(Eac)m(h)33 b(pattern)g(is)f(anc)m(hored)h(at)g(the)f(b)s(eginning)g (of)h(the)630 2642 y(line)43 b(and)e(m)m(ust)h(matc)m(h)h(the)g -(complete)h(line)e(\(no)h(implicit)g(`)p Fs(*)p Ft(')f(is)g(app)s +(complete)h(line)e(\(no)h(implicit)g(`)p Ft(*)p Fu(')f(is)g(app)s (ended\).)75 b(Eac)m(h)630 2752 y(pattern)42 b(is)g(tested)g(against)h (the)f(line)g(after)g(the)g(c)m(hec)m(ks)h(sp)s(eci\014ed)e(b)m(y)h -Fs(HISTCONTROL)630 2862 y Ft(are)37 b(applied.)59 b(In)36 +Ft(HISTCONTROL)630 2862 y Fu(are)37 b(applied.)59 b(In)36 b(addition)h(to)g(the)g(normal)g(shell)f(pattern)h(matc)m(hing)h(c)m -(haracters,)i(`)p Fs(&)p Ft(')630 2971 y(matc)m(hes)d(the)f(previous)g -(history)g(line.)57 b(`)p Fs(&)p Ft(')36 b(ma)m(y)h(b)s(e)e(escap)s(ed) +(haracters,)i(`)p Ft(&)p Fu(')630 2971 y(matc)m(hes)d(the)f(previous)g +(history)g(line.)57 b(`)p Ft(&)p Fu(')36 b(ma)m(y)h(b)s(e)e(escap)s(ed) h(using)g(a)g(bac)m(kslash;)k(the)630 3081 y(bac)m(kslash)34 b(is)g(remo)m(v)m(ed)h(b)s(efore)e(attempting)i(a)g(matc)m(h.)51 b(The)34 b(second)f(and)h(subsequen)m(t)630 3190 y(lines)e(of)h(a)g(m)m (ulti-line)g(comp)s(ound)e(command)h(are)h(not)f(tested,)i(and)e(are)g (added)g(to)h(the)630 3300 y(history)d(regardless)h(of)g(the)f(v)-5 -b(alue)31 b(of)g Fs(HISTIGNORE)p Ft(.)630 3435 y Fs(HISTIGNORE)20 -b Ft(subsumes)g(the)j(function)f(of)h Fs(HISTCONTROL)p -Ft(.)35 b(A)23 b(pattern)f(of)h(`)p Fs(&)p Ft(')g(is)f(iden)m(tical)630 -3544 y(to)k Fs(ignoredups)p Ft(,)e(and)h(a)h(pattern)g(of)f(`)p -Fs([)31 b(]*)p Ft(')25 b(is)h(iden)m(tical)h(to)f Fs(ignorespace)p -Ft(.)36 b(Com)m(bining)630 3654 y(these)30 b(t)m(w)m(o)h(patterns,)f +b(alue)31 b(of)g Ft(HISTIGNORE)p Fu(.)630 3435 y Ft(HISTIGNORE)20 +b Fu(subsumes)g(the)j(function)f(of)h Ft(HISTCONTROL)p +Fu(.)35 b(A)23 b(pattern)f(of)h(`)p Ft(&)p Fu(')g(is)f(iden)m(tical)630 +3544 y(to)k Ft(ignoredups)p Fu(,)e(and)h(a)h(pattern)g(of)f(`)p +Ft([)31 b(]*)p Fu(')25 b(is)h(iden)m(tical)h(to)f Ft(ignorespace)p +Fu(.)36 b(Com)m(bining)630 3654 y(these)30 b(t)m(w)m(o)h(patterns,)f (separating)g(them)g(with)f(a)h(colon,)h(pro)m(vides)e(the)h -(functionalit)m(y)h(of)630 3764 y Fs(ignoreboth)p Ft(.)150 -3924 y Fs(HISTSIZE)96 b Ft(The)37 b(maxim)m(um)g(n)m(um)m(b)s(er)e(of)j +(functionalit)m(y)h(of)630 3764 y Ft(ignoreboth)p Fu(.)150 +3924 y Ft(HISTSIZE)96 b Fu(The)37 b(maxim)m(um)g(n)m(um)m(b)s(er)e(of)j (commands)f(to)g(remem)m(b)s(er)g(on)g(the)g(history)g(list.)62 b(If)37 b(the)630 4033 y(v)-5 b(alue)26 b(is)g(0,)i(commands)d(are)h (not)h(sa)m(v)m(ed)g(in)e(the)h(history)g(list.)40 b(Numeric)26 @@ -12886,1594 +13403,1580 @@ b(v)-5 b(alues)26 b(less)g(than)630 4143 y(zero)i(result)e(in)h(ev)m (ery)g(command)g(b)s(eing)f(sa)m(v)m(ed)i(on)f(the)g(history)f(list)i (\(there)f(is)g(no)g(limit\).)630 4253 y(The)j(shell)g(sets)h(the)g (default)f(v)-5 b(alue)31 b(to)g(500)h(after)f(reading)f(an)m(y)h -(startup)f(\014les.)150 4413 y Fs(HISTTIMEFORMAT)630 -4522 y Ft(If)44 b(this)g(v)-5 b(ariable)45 b(is)f(set)g(and)g(not)g(n)m +(startup)f(\014les.)150 4413 y Ft(HISTTIMEFORMAT)630 +4522 y Fu(If)44 b(this)g(v)-5 b(ariable)45 b(is)f(set)g(and)g(not)g(n)m (ull,)k(its)d(v)-5 b(alue)44 b(is)g(used)g(as)g(a)h(format)f(string)g -(for)630 4632 y Fq(strftime)c Ft(to)35 b(prin)m(t)f(the)h(time)g(stamp) +(for)630 4632 y Fr(strftime)c Fu(to)35 b(prin)m(t)f(the)h(time)g(stamp) f(asso)s(ciated)i(with)f(eac)m(h)g(history)g(en)m(try)f(displa)m(y)m -(ed)630 4741 y(b)m(y)g(the)f Fs(history)f Ft(builtin.)50 +(ed)630 4741 y(b)m(y)g(the)f Ft(history)f Fu(builtin.)50 b(If)33 b(this)h(v)-5 b(ariable)34 b(is)g(set,)h(time)f(stamps)g(are)g (written)f(to)i(the)630 4851 y(history)26 b(\014le)g(so)g(they)g(ma)m (y)h(b)s(e)e(preserv)m(ed)g(across)i(shell)f(sessions.)39 b(This)25 b(uses)h(the)g(history)630 4961 y(commen)m(t)31 b(c)m(haracter)h(to)f(distinguish)f(timestamps)h(from)f(other)g -(history)h(lines.)150 5121 y Fs(HOSTFILE)96 b Ft(Con)m(tains)39 -b(the)f(name)g(of)h(a)g(\014le)f(in)g(the)g(same)h(format)g(as)f(`)p -Fs(/etc/hosts)p Ft(')e(that)j(should)630 5230 y(b)s(e)i(read)h(when)f -(the)i(shell)f(needs)f(to)i(complete)h(a)e(hostname.)76 -b(The)42 b(list)g(of)g(p)s(ossible)630 5340 y(hostname)26 -b(completions)g(ma)m(y)h(b)s(e)d(c)m(hanged)j(while)e(the)h(shell)g(is) -f(running;)h(the)g(next)f(time)p eop end +(history)h(lines.)150 5121 y Ft(HOSTFILE)96 b Fu(Con)m(tains)33 +b(the)g(name)f(of)h(a)g(\014le)f(in)g(the)h(same)g(format)g(as)f +Ft(/etc/hosts)e Fu(that)j(should)f(b)s(e)630 5230 y(read)21 +b(when)g(the)g(shell)h(needs)f(to)h(complete)h(a)e(hostname.)38 +b(The)21 b(list)h(of)g(p)s(ossible)f(hostname)630 5340 +y(completions)27 b(ma)m(y)f(b)s(e)f(c)m(hanged)h(while)f(the)h(shell)g +(is)f(running;)h(the)g(next)f(time)i(hostname)p eop end %%Page: 76 82 -TeXDict begin 76 81 bop 150 -116 a Ft(Chapter)30 b(5:)41 -b(Shell)30 b(V)-8 b(ariables)2459 b(76)630 299 y(hostname)37 -b(completion)i(is)e(attempted)h(after)g(the)f(v)-5 b(alue)37 -b(is)h(c)m(hanged,)h(Bash)e(adds)g(the)630 408 y(con)m(ten)m(ts)43 -b(of)f(the)f(new)g(\014le)h(to)g(the)f(existing)i(list.)74 -b(If)41 b Fs(HOSTFILE)e Ft(is)i(set,)k(but)c(has)g(no)630 -518 y(v)-5 b(alue,)29 b(or)e(do)s(es)h(not)g(name)f(a)h(readable)g -(\014le,)h(Bash)f(attempts)g(to)g(read)g(`)p Fs(/etc/hosts)p -Ft(')d(to)630 628 y(obtain)j(the)g(list)h(of)f(p)s(ossible)f(hostname)h -(completions.)41 b(When)28 b Fs(HOSTFILE)e Ft(is)i(unset,)g(the)630 -737 y(hostname)j(list)g(is)f(cleared.)150 906 y Fs(HOSTNAME)96 -b Ft(The)30 b(name)g(of)h(the)f(curren)m(t)h(host.)150 -1074 y Fs(HOSTTYPE)96 b Ft(A)30 b(string)h(describing)f(the)g(mac)m -(hine)h(Bash)g(is)f(running)f(on.)150 1243 y Fs(IGNOREEOF)630 -1353 y Ft(Con)m(trols)e(the)h(action)g(of)f(the)g(shell)g(on)g(receipt) -h(of)f(an)g Fs(EOF)f Ft(c)m(haracter)i(as)g(the)f(sole)h(input.)630 +TeXDict begin 76 81 bop 150 -116 a Fu(Chapter)30 b(5:)41 +b(Shell)30 b(V)-8 b(ariables)2459 b(76)630 299 y(completion)33 +b(is)g(attempted)g(after)g(the)f(v)-5 b(alue)33 b(is)f(c)m(hanged,)i +(Bash)e(adds)f(the)i(con)m(ten)m(ts)h(of)630 408 y(the)h(new)f(\014le)g +(to)h(the)g(existing)h(list.)53 b(If)34 b Ft(HOSTFILE)e +Fu(is)j(set,)h(but)e(has)g(no)h(v)-5 b(alue,)36 b(or)e(do)s(es)630 +518 y(not)d(name)f(a)h(readable)g(\014le,)g(Bash)f(attempts)i(to)f +(read)f Ft(/etc/hosts)e Fu(to)j(obtain)g(the)f(list)630 +628 y(of)h(p)s(ossible)f(hostname)h(completions.)43 b(When)31 +b Ft(HOSTFILE)d Fu(is)j(unset,)f(the)h(hostname)g(list)630 +737 y(is)f(cleared.)150 906 y Ft(HOSTNAME)96 b Fu(The)30 +b(name)g(of)h(the)f(curren)m(t)h(host.)150 1074 y Ft(HOSTTYPE)96 +b Fu(A)30 b(string)h(describing)f(the)g(mac)m(hine)h(Bash)g(is)f +(running)f(on.)150 1243 y Ft(IGNOREEOF)630 1353 y Fu(Con)m(trols)e(the) +h(action)g(of)f(the)g(shell)g(on)g(receipt)h(of)f(an)g +Ft(EOF)f Fu(c)m(haracter)i(as)g(the)f(sole)h(input.)630 1462 y(If)i(set,)i(the)f(v)-5 b(alue)32 b(denotes)f(the)g(n)m(um)m(b)s -(er)f(of)h(consecutiv)m(e)i Fs(EOF)d Ft(c)m(haracters)i(that)f(can)h(b) +(er)f(of)h(consecutiv)m(e)i Ft(EOF)d Fu(c)m(haracters)i(that)f(can)h(b) s(e)630 1572 y(read)40 b(as)f(the)h(\014rst)f(c)m(haracter)i(on)f(an)f (input)g(line)h(b)s(efore)f(the)h(shell)g(will)g(exit.)70 b(If)39 b(the)630 1681 y(v)-5 b(ariable)38 b(exists)f(but)f(do)s(es)g (not)h(ha)m(v)m(e)h(a)g(n)m(umeric)e(v)-5 b(alue)37 b(\(or)h(has)e(no)h (v)-5 b(alue\))37 b(then)g(the)630 1791 y(default)31 b(is)g(10.)43 b(If)30 b(the)h(v)-5 b(ariable)31 b(do)s(es)g(not)g -(exist,)h(then)e Fs(EOF)g Ft(signi\014es)h(the)g(end)f(of)h(input)630 +(exist,)h(then)e Ft(EOF)g Fu(signi\014es)h(the)g(end)f(of)h(input)630 1901 y(to)g(the)g(shell.)41 b(This)29 b(is)i(only)f(in)g(e\013ect)i -(for)e(in)m(teractiv)m(e)j(shells.)150 2069 y Fs(INPUTRC)144 -b Ft(The)68 b(name)h(of)f(the)h(Readline)g(initialization)j(\014le,)78 -b(o)m(v)m(erriding)69 b(the)g(default)g(of)630 2179 y(`)p -Fs(~/.inputrc)p Ft('.)150 2347 y Fs(LANG)288 b Ft(Used)28 +(for)e(in)m(teractiv)m(e)j(shells.)150 2069 y Ft(INPUTRC)144 +b Fu(The)68 b(name)h(of)f(the)h(Readline)g(initialization)j(\014le,)78 +b(o)m(v)m(erriding)69 b(the)g(default)g(of)630 2179 y +Ft(~/.inputrc)p Fu(.)150 2347 y Ft(LANG)288 b Fu(Used)28 b(to)h(determine)f(the)g(lo)s(cale)h(category)h(for)e(an)m(y)h (category)h(not)e(sp)s(eci\014cally)g(selected)630 2457 -y(with)i(a)h(v)-5 b(ariable)31 b(starting)g(with)f Fs(LC_)p -Ft(.)150 2626 y Fs(LC_ALL)192 b Ft(This)28 b(v)-5 b(ariable)29 -b(o)m(v)m(errides)h(the)f(v)-5 b(alue)29 b(of)g Fs(LANG)f -Ft(and)g(an)m(y)h(other)g Fs(LC_)f Ft(v)-5 b(ariable)29 +y(with)i(a)h(v)-5 b(ariable)31 b(starting)g(with)f Ft(LC_)p +Fu(.)150 2626 y Ft(LC_ALL)192 b Fu(This)28 b(v)-5 b(ariable)29 +b(o)m(v)m(errides)h(the)f(v)-5 b(alue)29 b(of)g Ft(LANG)f +Fu(and)g(an)m(y)h(other)g Ft(LC_)f Fu(v)-5 b(ariable)29 b(sp)s(ecifying)630 2735 y(a)i(lo)s(cale)h(category)-8 -b(.)150 2904 y Fs(LC_COLLATE)630 3013 y Ft(This)37 b(v)-5 +b(.)150 2904 y Ft(LC_COLLATE)630 3013 y Fu(This)37 b(v)-5 b(ariable)38 b(determines)g(the)g(collation)i(order)d(used)g(when)f (sorting)i(the)g(results)g(of)630 3123 y(\014lename)e(expansion,)i(and) e(determines)g(the)h(b)s(eha)m(vior)f(of)g(range)h(expressions,)h (equiv-)630 3232 y(alence)e(classes,)h(and)e(collating)i(sequences)e (within)f(\014lename)h(expansion)g(and)f(pattern)630 3342 y(matc)m(hing)d(\(see)h(Section)f(3.5.8)h([Filename)g(Expansion],) -e(page)h(29\).)150 3511 y Fs(LC_CTYPE)96 b Ft(This)36 +e(page)h(29\).)150 3511 y Ft(LC_CTYPE)96 b Fu(This)36 b(v)-5 b(ariable)37 b(determines)f(the)h(in)m(terpretation)h(of)f(c)m (haracters)h(and)e(the)g(b)s(eha)m(vior)h(of)630 3620 y(c)m(haracter)46 b(classes)g(within)e(\014lename)h(expansion)g(and)f (pattern)h(matc)m(hing)h(\(see)f(Sec-)630 3730 y(tion)31 b(3.5.8)h([Filename)g(Expansion],)e(page)h(29\).)150 -3898 y Fs(LC_MESSAGES)630 4008 y Ft(This)25 b(v)-5 b(ariable)27 +3898 y Ft(LC_MESSAGES)630 4008 y Fu(This)25 b(v)-5 b(ariable)27 b(determines)f(the)g(lo)s(cale)i(used)d(to)i(translate)g(double-quoted) f(strings)g(pre-)630 4118 y(ceded)31 b(b)m(y)f(a)h(`)p -Fs($)p Ft(')f(\(see)h(Section)h(3.1.2.5)g([Lo)s(cale)g(T)-8 -b(ranslation],)32 b(page)f(7\).)150 4286 y Fs(LC_NUMERIC)630 -4396 y Ft(This)f(v)-5 b(ariable)31 b(determines)f(the)h(lo)s(cale)h +Ft($)p Fu(')f(\(see)h(Section)h(3.1.2.5)g([Lo)s(cale)g(T)-8 +b(ranslation],)32 b(page)f(7\).)150 4286 y Ft(LC_NUMERIC)630 +4396 y Fu(This)f(v)-5 b(ariable)31 b(determines)f(the)h(lo)s(cale)h (category)g(used)e(for)g(n)m(um)m(b)s(er)f(formatting.)150 -4564 y Fs(LINENO)192 b Ft(The)30 b(line)h(n)m(um)m(b)s(er)e(in)h(the)g +4564 y Ft(LINENO)192 b Fu(The)30 b(line)h(n)m(um)m(b)s(er)e(in)h(the)g (script)h(or)f(shell)g(function)h(curren)m(tly)f(executing.)150 -4733 y Fs(LINES)240 b Ft(Used)43 b(b)m(y)g(the)g Fs(select)e -Ft(command)i(to)g(determine)g(the)g(column)g(length)g(for)g(prin)m +4733 y Ft(LINES)240 b Fu(Used)43 b(b)m(y)g(the)g Ft(select)e +Fu(command)i(to)g(determine)g(the)g(column)g(length)g(for)g(prin)m (ting)630 4843 y(selection)c(lists.)63 b(Automatically)41 -b(set)d(if)f(the)h Fs(checkwinsize)d Ft(option)j(is)f(enabled)h(\(see) +b(set)d(if)f(the)h Ft(checkwinsize)d Fu(option)j(is)f(enabled)h(\(see) 630 4952 y(Section)44 b(4.3.2)h([The)e(Shopt)g(Builtin],)k(page)d -(63\),)k(or)43 b(in)g(an)g(in)m(teractiv)m(e)j(shell)e(up)s(on)630 -5062 y(receipt)31 b(of)g(a)g Fs(SIGWINCH)p Ft(.)150 5230 -y Fs(MACHTYPE)96 b Ft(A)26 b(string)g(that)h(fully)f(describ)s(es)f +(62\),)k(or)43 b(in)g(an)g(in)m(teractiv)m(e)j(shell)e(up)s(on)630 +5062 y(receipt)31 b(of)g(a)g Ft(SIGWINCH)p Fu(.)150 5230 +y Ft(MACHTYPE)96 b Fu(A)26 b(string)g(that)h(fully)f(describ)s(es)f (the)h(system)g(t)m(yp)s(e)h(on)f(whic)m(h)f(Bash)i(is)f(executing,)i -(in)e(the)630 5340 y(standard)k Fl(gnu)g Fq(cpu-compan)m(y-system)h -Ft(format.)p eop end +(in)e(the)630 5340 y(standard)k Fm(gnu)g Fr(cpu-compan)m(y-system)h +Fu(format.)p eop end %%Page: 77 83 -TeXDict begin 77 82 bop 150 -116 a Ft(Chapter)30 b(5:)41 -b(Shell)30 b(V)-8 b(ariables)2459 b(77)150 299 y Fs(MAILCHECK)630 -408 y Ft(Ho)m(w)28 b(often)g(\(in)g(seconds\))g(that)g(the)f(shell)h +TeXDict begin 77 82 bop 150 -116 a Fu(Chapter)30 b(5:)41 +b(Shell)30 b(V)-8 b(ariables)2459 b(77)150 299 y Ft(MAILCHECK)630 +408 y Fu(Ho)m(w)28 b(often)g(\(in)g(seconds\))g(that)g(the)f(shell)h (should)f(c)m(hec)m(k)i(for)e(mail)h(in)f(the)h(\014les)g(sp)s -(eci\014ed)630 518 y(in)i(the)h Fs(MAILPATH)e Ft(or)i -Fs(MAIL)e Ft(v)-5 b(ariables.)43 b(The)30 b(default)h(is)f(60)i +(eci\014ed)630 518 y(in)i(the)h Ft(MAILPATH)e Fu(or)i +Ft(MAIL)e Fu(v)-5 b(ariables.)43 b(The)30 b(default)h(is)f(60)i (seconds.)42 b(When)30 b(it)h(is)g(time)630 628 y(to)37 b(c)m(hec)m(k)h(for)e(mail,)j(the)e(shell)f(do)s(es)g(so)h(b)s(efore)f (displa)m(ying)h(the)f(primary)g(prompt.)57 b(If)630 737 y(this)37 b(v)-5 b(ariable)38 b(is)f(unset,)h(or)f(set)h(to)g(a)f (v)-5 b(alue)38 b(that)f(is)g(not)h(a)f(n)m(um)m(b)s(er)f(greater)i (than)f(or)630 847 y(equal)31 b(to)g(zero,)g(the)g(shell)g(disables)f -(mail)h(c)m(hec)m(king.)150 996 y Fs(MAPFILE)144 b Ft(An)35 +(mail)h(c)m(hec)m(king.)150 996 y Ft(MAPFILE)144 b Fu(An)35 b(arra)m(y)h(v)-5 b(ariable)36 b(created)g(to)h(hold)e(the)g(text)i -(read)e(b)m(y)g(the)h Fs(mapfile)d Ft(builtin)i(when)630 +(read)e(b)m(y)g(the)h Ft(mapfile)d Fu(builtin)i(when)630 1105 y(no)30 b(v)-5 b(ariable)31 b(name)g(is)f(supplied.)150 -1254 y Fs(OLDPWD)192 b Ft(The)30 b(previous)g(w)m(orking)g(directory)h -(as)g(set)g(b)m(y)f(the)h Fs(cd)e Ft(builtin.)150 1403 -y Fs(OPTERR)192 b Ft(If)35 b(set)i(to)f(the)h(v)-5 b(alue)36 +1254 y Ft(OLDPWD)192 b Fu(The)30 b(previous)g(w)m(orking)g(directory)h +(as)g(set)g(b)m(y)f(the)h Ft(cd)e Fu(builtin.)150 1403 +y Ft(OPTERR)192 b Fu(If)35 b(set)i(to)f(the)h(v)-5 b(alue)36 b(1,)i(Bash)e(displa)m(ys)g(error)f(messages)i(generated)g(b)m(y)f(the) -g Fs(getopts)630 1512 y Ft(builtin)30 b(command.)150 -1661 y Fs(OSTYPE)192 b Ft(A)30 b(string)h(describing)f(the)g(op)s +g Ft(getopts)630 1512 y Fu(builtin)30 b(command.)150 +1661 y Ft(OSTYPE)192 b Fu(A)30 b(string)h(describing)f(the)g(op)s (erating)h(system)g(Bash)f(is)h(running)d(on.)150 1810 -y Fs(PIPESTATUS)630 1919 y Ft(An)23 b(arra)m(y)h(v)-5 +y Ft(PIPESTATUS)630 1919 y Fu(An)23 b(arra)m(y)h(v)-5 b(ariable)24 b(\(see)h(Section)f(6.7)h([Arra)m(ys],)g(page)f(89\))h (con)m(taining)g(a)f(list)g(of)g(exit)g(sta-)630 2029 y(tus)h(v)-5 b(alues)27 b(from)e(the)h(pro)s(cesses)g(in)f(the)h (most-recen)m(tly-executed)j(foreground)c(pip)s(eline)630 2138 y(\(whic)m(h)30 b(ma)m(y)h(con)m(tain)h(only)f(a)f(single)h -(command\).)150 2287 y Fs(POSIXLY_CORRECT)630 2397 y -Ft(If)h(this)g(v)-5 b(ariable)34 b(is)e(in)g(the)h(en)m(vironmen)m(t)g -(when)e(Bash)i(starts,)g(the)g(shell)g(en)m(ters)g Fl(posix)630 -2506 y Ft(mo)s(de)22 b(\(see)h(Section)g(6.11)h([Bash)e(POSIX)f(Mo)s +(command\).)150 2287 y Ft(POSIXLY_CORRECT)630 2397 y +Fu(If)h(this)g(v)-5 b(ariable)34 b(is)e(in)g(the)h(en)m(vironmen)m(t)g +(when)e(Bash)i(starts,)g(the)g(shell)g(en)m(ters)g Fm(posix)630 +2506 y Fu(mo)s(de)22 b(\(see)h(Section)g(6.11)h([Bash)e(POSIX)f(Mo)s (de],)k(page)e(94\))g(b)s(efore)f(reading)g(the)g(startup)630 -2616 y(\014les,)32 b(as)f(if)h(the)f(`)p Fs(--posix)p -Ft(')f(in)m(v)m(o)s(cation)j(option)f(had)f(b)s(een)g(supplied.)42 -b(If)31 b(it)h(is)f(set)h(while)630 2725 y(the)f(shell)f(is)h(running,) -d(Bash)j(enables)g Fl(posix)e Ft(mo)s(de,)h(as)h(if)f(the)h(command)870 -2855 y Fs(set)47 b(-o)g(posix)630 2984 y Ft(had)30 b(b)s(een)f -(executed.)150 3133 y Fs(PPID)288 b Ft(The)30 b(pro)s(cess)g -Fl(id)g Ft(of)h(the)f(shell's)h(paren)m(t)g(pro)s(cess.)40 +2616 y(\014les,)36 b(as)e(if)h(the)f Ft(--posix)f Fu(in)m(v)m(o)s +(cation)j(option)f(had)f(b)s(een)g(supplied.)51 b(If)34 +b(it)h(is)g(set)g(while)630 2725 y(the)c(shell)f(is)h(running,)d(Bash)j +(enables)g Fm(posix)e Fu(mo)s(de,)h(as)h(if)f(the)h(command)870 +2855 y Ft(set)47 b(-o)g(posix)630 2984 y Fu(had)30 b(b)s(een)f +(executed.)150 3133 y Ft(PPID)288 b Fu(The)30 b(pro)s(cess)g +Fm(id)g Fu(of)h(the)f(shell's)h(paren)m(t)g(pro)s(cess.)40 b(This)30 b(v)-5 b(ariable)31 b(is)f(readonly)-8 b(.)150 -3281 y Fs(PROMPT_COMMAND)630 3391 y Ft(If)32 b(set,)h(the)f(v)-5 +3281 y Ft(PROMPT_COMMAND)630 3391 y Fu(If)32 b(set,)h(the)f(v)-5 b(alue)33 b(is)f(in)m(terpreted)g(as)g(a)h(command)f(to)h(execute)g(b)s (efore)f(the)g(prin)m(ting)g(of)630 3500 y(eac)m(h)g(primary)d(prompt)g -(\()p Fs($PS1)p Ft(\).)150 3649 y Fs(PROMPT_DIRTRIM)630 -3759 y Ft(If)e(set)g(to)h(a)g(n)m(um)m(b)s(er)e(greater)i(than)f(zero,) +(\()p Ft($PS1)p Fu(\).)150 3649 y Ft(PROMPT_DIRTRIM)630 +3759 y Fu(If)e(set)g(to)h(a)g(n)m(um)m(b)s(er)e(greater)i(than)f(zero,) i(the)e(v)-5 b(alue)28 b(is)f(used)g(as)g(the)h(n)m(um)m(b)s(er)e(of)h (trailing)630 3868 y(directory)35 b(comp)s(onen)m(ts)g(to)h(retain)f -(when)f(expanding)g(the)h Fs(\\w)f Ft(and)g Fs(\\W)g -Ft(prompt)g(string)630 3978 y(escap)s(es)21 b(\(see)h(Section)f(6.9)h +(when)f(expanding)g(the)h Ft(\\w)f Fu(and)g Ft(\\W)g +Fu(prompt)g(string)630 3978 y(escap)s(es)21 b(\(see)h(Section)f(6.9)h ([Con)m(trolling)g(the)f(Prompt],)h(page)f(92\).)39 b(Characters)21 b(remo)m(v)m(ed)630 4088 y(are)31 b(replaced)g(with)f(an)g(ellipsis.) -150 4236 y Fs(PS3)336 b Ft(The)34 b(v)-5 b(alue)35 b(of)f(this)g(v)-5 +150 4236 y Ft(PS3)336 b Fu(The)34 b(v)-5 b(alue)35 b(of)f(this)g(v)-5 b(ariable)35 b(is)g(used)e(as)i(the)f(prompt)g(for)g(the)g -Fs(select)f Ft(command.)52 b(If)630 4346 y(this)30 b(v)-5 -b(ariable)31 b(is)g(not)f(set,)i(the)e Fs(select)f Ft(command)h -(prompts)f(with)h(`)p Fs(#?)g Ft(')150 4495 y Fs(PS4)336 -b Ft(The)20 b(v)-5 b(alue)22 b(is)e(the)h(prompt)f(prin)m(ted)h(b)s -(efore)f(the)h(command)g(line)g(is)g(ec)m(ho)s(ed)g(when)f(the)h(`)p -Fs(-x)p Ft(')630 4604 y(option)32 b(is)f(set)h(\(see)g(Section)h(4.3.1) -g([The)e(Set)g(Builtin],)i(page)f(59\).)45 b(The)31 b(\014rst)f(c)m -(haracter)630 4714 y(of)k Fs(PS4)g Ft(is)g(replicated)i(m)m(ultiple)f +Ft(select)f Fu(command.)52 b(If)630 4346 y(this)30 b(v)-5 +b(ariable)31 b(is)g(not)f(set,)i(the)e Ft(select)f Fu(command)h +(prompts)f(with)h(`)p Ft(#?)g Fu(')150 4495 y Ft(PS4)336 +b Fu(The)24 b(v)-5 b(alue)25 b(is)f(the)h(prompt)e(prin)m(ted)h(b)s +(efore)g(the)h(command)f(line)h(is)f(ec)m(ho)s(ed)i(when)d(the)i +Ft(-x)630 4604 y Fu(option)32 b(is)f(set)h(\(see)g(Section)h(4.3.1)g +([The)e(Set)g(Builtin],)i(page)f(58\).)45 b(The)31 b(\014rst)f(c)m +(haracter)630 4714 y(of)k Ft(PS4)g Fu(is)g(replicated)i(m)m(ultiple)f (times,)h(as)e(necessary)-8 b(,)37 b(to)e(indicate)g(m)m(ultiple)g(lev) m(els)h(of)630 4823 y(indirection.)41 b(The)30 b(default)h(is)f(`)p -Fs(+)g Ft('.)150 4972 y Fs(PWD)336 b Ft(The)30 b(curren)m(t)g(w)m -(orking)h(directory)g(as)f(set)h(b)m(y)f(the)h Fs(cd)f -Ft(builtin.)150 5121 y Fs(RANDOM)192 b Ft(Eac)m(h)30 +Ft(+)g Fu('.)150 4972 y Ft(PWD)336 b Fu(The)30 b(curren)m(t)g(w)m +(orking)h(directory)g(as)f(set)h(b)m(y)f(the)h Ft(cd)f +Fu(builtin.)150 5121 y Ft(RANDOM)192 b Fu(Eac)m(h)30 b(time)g(this)f(parameter)g(is)g(referenced,)h(a)f(random)g(in)m(teger) h(b)s(et)m(w)m(een)g(0)f(and)g(32767)630 5230 y(is)i(generated.)43 b(Assigning)31 b(a)g(v)-5 b(alue)31 b(to)g(this)g(v)-5 b(ariable)31 b(seeds)g(the)g(random)f(n)m(um)m(b)s(er)f(gen-)630 5340 y(erator.)p eop end %%Page: 78 84 -TeXDict begin 78 83 bop 150 -116 a Ft(Chapter)30 b(5:)41 -b(Shell)30 b(V)-8 b(ariables)2459 b(78)150 299 y Fs(READLINE_LINE)630 -408 y Ft(The)27 b(con)m(ten)m(ts)i(of)f(the)g(Readline)g(line)g -(bu\013er,)f(for)h(use)f(with)g(`)p Fs(bind)j(-x)p Ft(')d(\(see)h +TeXDict begin 78 83 bop 150 -116 a Fu(Chapter)30 b(5:)41 +b(Shell)30 b(V)-8 b(ariables)2459 b(78)150 299 y Ft(READLINE_LINE)630 +408 y Fu(The)27 b(con)m(ten)m(ts)i(of)f(the)g(Readline)g(line)g +(bu\013er,)f(for)h(use)f(with)g(`)p Ft(bind)j(-x)p Fu(')d(\(see)h (Section)h(4.2)630 518 y([Bash)i(Builtins],)g(page)g(48\).)150 -667 y Fs(READLINE_POINT)630 776 y Ft(The)23 b(p)s(osition)g(of)g(the)h +667 y Ft(READLINE_POINT)630 776 y Fu(The)23 b(p)s(osition)g(of)g(the)h (insertion)f(p)s(oin)m(t)g(in)g(the)g(Readline)h(line)f(bu\013er,)h -(for)f(use)g(with)g(`)p Fs(bind)630 886 y(-x)p Ft(')30 +(for)f(use)g(with)g(`)p Ft(bind)630 886 y(-x)p Fu(')30 b(\(see)h(Section)h(4.2)f([Bash)g(Builtins],)g(page)g(48\).)150 -1035 y Fs(REPLY)240 b Ft(The)30 b(default)g(v)-5 b(ariable)32 -b(for)e(the)g Fs(read)g Ft(builtin.)150 1183 y Fs(SECONDS)144 -b Ft(This)40 b(v)-5 b(ariable)41 b(expands)f(to)h(the)g(n)m(um)m(b)s +1035 y Ft(REPLY)240 b Fu(The)30 b(default)g(v)-5 b(ariable)32 +b(for)e(the)g Ft(read)g Fu(builtin.)150 1183 y Ft(SECONDS)144 +b Fu(This)40 b(v)-5 b(ariable)41 b(expands)f(to)h(the)g(n)m(um)m(b)s (er)e(of)i(seconds)g(since)g(the)f(shell)h(w)m(as)g(started.)630 1293 y(Assignmen)m(t)i(to)g(this)g(v)-5 b(ariable)43 b(resets)g(the)g(coun)m(t)g(to)g(the)g(v)-5 b(alue)43 b(assigned,)j(and)c(the)630 1403 y(expanded)35 b(v)-5 b(alue)36 b(b)s(ecomes)h(the)f(v)-5 b(alue)36 b(assigned)g(plus)f(the)h (n)m(um)m(b)s(er)f(of)h(seconds)g(since)630 1512 y(the)31 -b(assignmen)m(t.)150 1661 y Fs(SHELL)240 b Ft(The)29 +b(assignmen)m(t.)150 1661 y Ft(SHELL)240 b Fu(The)29 b(full)h(pathname)g(to)h(the)f(shell)g(is)g(k)m(ept)g(in)g(this)g(en)m (vironmen)m(t)g(v)-5 b(ariable.)42 b(If)29 b(it)i(is)f(not)630 1771 y(set)36 b(when)f(the)h(shell)g(starts,)i(Bash)e(assigns)h(to)f (it)h(the)f(full)f(pathname)h(of)g(the)g(curren)m(t)630 -1880 y(user's)30 b(login)h(shell.)150 2029 y Fs(SHELLOPTS)630 -2138 y Ft(A)g(colon-separated)h(list)f(of)g(enabled)f(shell)h(options.) +1880 y(user's)30 b(login)h(shell.)150 2029 y Ft(SHELLOPTS)630 +2138 y Fu(A)g(colon-separated)h(list)f(of)g(enabled)f(shell)h(options.) 41 b(Eac)m(h)31 b(w)m(ord)f(in)g(the)h(list)g(is)g(a)g(v)-5 -b(alid)630 2248 y(argumen)m(t)24 b(for)f(the)h(`)p Fs(-o)p -Ft(')f(option)h(to)g(the)g Fs(set)f Ft(builtin)g(command)g(\(see)i -(Section)f(4.3.1)h([The)630 2358 y(Set)k(Builtin],)h(page)f(59\).)42 -b(The)28 b(options)h(app)s(earing)f(in)g Fs(SHELLOPTS)e -Ft(are)j(those)h(rep)s(orted)630 2467 y(as)g(`)p Fs(on)p -Ft(')f(b)m(y)h(`)p Fs(set)g(-o)p Ft('.)40 b(If)29 b(this)h(v)-5 +b(alid)630 2248 y(argumen)m(t)28 b(for)f(the)h Ft(-o)e +Fu(option)i(to)g(the)g Ft(set)e Fu(builtin)h(command)g(\(see)i(Section) +f(4.3.1)h([The)630 2358 y(Set)g(Builtin],)h(page)f(58\).)42 +b(The)28 b(options)h(app)s(earing)f(in)g Ft(SHELLOPTS)e +Fu(are)j(those)h(rep)s(orted)630 2467 y(as)g(`)p Ft(on)p +Fu(')f(b)m(y)h(`)p Ft(set)g(-o)p Fu('.)40 b(If)29 b(this)h(v)-5 b(ariable)30 b(is)g(in)f(the)h(en)m(vironmen)m(t)g(when)f(Bash)h (starts)g(up,)630 2577 y(eac)m(h)41 b(shell)e(option)h(in)f(the)h(list) g(will)f(b)s(e)g(enabled)h(b)s(efore)f(reading)g(an)m(y)h(startup)f (\014les.)630 2686 y(This)30 b(v)-5 b(ariable)31 b(is)f(readonly)-8 -b(.)150 2835 y Fs(SHLVL)240 b Ft(Incremen)m(ted)21 b(b)m(y)g(one)g(eac) +b(.)150 2835 y Ft(SHLVL)240 b Fu(Incremen)m(ted)21 b(b)m(y)g(one)g(eac) m(h)h(time)f(a)h(new)e(instance)h(of)g(Bash)g(is)g(started.)38 b(This)20 b(is)h(in)m(tended)630 2945 y(to)31 b(b)s(e)f(a)h(coun)m(t)g (of)f(ho)m(w)h(deeply)f(y)m(our)g(Bash)h(shells)f(are)h(nested.)150 -3093 y Fs(TIMEFORMAT)630 3203 y Ft(The)f(v)-5 b(alue)32 +3093 y Ft(TIMEFORMAT)630 3203 y Fu(The)f(v)-5 b(alue)32 b(of)f(this)g(parameter)g(is)g(used)f(as)h(a)g(format)h(string)f(sp)s (ecifying)f(ho)m(w)h(the)g(tim-)630 3313 y(ing)37 b(information)f(for)h -(pip)s(elines)f(pre\014xed)f(with)h(the)h Fs(time)e Ft(reserv)m(ed)i(w) +(pip)s(elines)f(pre\014xed)f(with)h(the)h Ft(time)e Fu(reserv)m(ed)i(w) m(ord)f(should)g(b)s(e)630 3422 y(displa)m(y)m(ed.)k(The)27 -b(`)p Fs(\045)p Ft(')h(c)m(haracter)h(in)m(tro)s(duces)e(an)h(escap)s +b(`)p Ft(\045)p Fu(')h(c)m(haracter)h(in)m(tro)s(duces)e(an)h(escap)s (e)g(sequence)g(that)g(is)f(expanded)g(to)630 3532 y(a)37 b(time)g(v)-5 b(alue)36 b(or)h(other)f(information.)59 b(The)36 b(escap)s(e)g(sequences)h(and)e(their)i(meanings)630 3641 y(are)31 b(as)f(follo)m(ws;)i(the)f(braces)f(denote)h(optional)h -(p)s(ortions.)630 3790 y Fs(\045\045)384 b Ft(A)30 b(literal)i(`)p -Fs(\045)p Ft('.)630 3939 y Fs(\045[)p Fi(p)11 b Fs(][l]R)85 -b Ft(The)30 b(elapsed)h(time)g(in)f(seconds.)630 4088 -y Fs(\045[)p Fi(p)11 b Fs(][l]U)85 b Ft(The)30 b(n)m(um)m(b)s(er)f(of)h +(p)s(ortions.)630 3790 y Ft(\045\045)384 b Fu(A)30 b(literal)i(`)p +Ft(\045)p Fu('.)630 3939 y Ft(\045[)p Fj(p)p Ft(][l]R)96 +b Fu(The)30 b(elapsed)h(time)g(in)f(seconds.)630 4088 +y Ft(\045[)p Fj(p)p Ft(][l]U)96 b Fu(The)30 b(n)m(um)m(b)s(er)f(of)h (CPU)g(seconds)h(sp)s(en)m(t)f(in)g(user)f(mo)s(de.)630 -4236 y Fs(\045[)p Fi(p)11 b Fs(][l]S)85 b Ft(The)30 b(n)m(um)m(b)s(er)f +4236 y Ft(\045[)p Fj(p)p Ft(][l]S)96 b Fu(The)30 b(n)m(um)m(b)s(er)f (of)h(CPU)g(seconds)h(sp)s(en)m(t)f(in)g(system)g(mo)s(de.)630 -4385 y Fs(\045P)384 b Ft(The)30 b(CPU)g(p)s(ercen)m(tage,)i(computed)e -(as)h(\(\045U)f Fs(+)g Ft(\045S\))g(/)h(\045R.)630 4534 -y(The)23 b(optional)j Fq(p)g Ft(is)e(a)g(digit)h(sp)s(ecifying)e(the)h +4385 y Ft(\045P)384 b Fu(The)30 b(CPU)g(p)s(ercen)m(tage,)i(computed)e +(as)h(\(\045U)f Ft(+)g Fu(\045S\))g(/)h(\045R.)630 4534 +y(The)23 b(optional)j Fr(p)g Fu(is)e(a)g(digit)h(sp)s(ecifying)e(the)h (precision,)i(the)e(n)m(um)m(b)s(er)f(of)h(fractional)h(digits)630 4643 y(after)36 b(a)f(decimal)i(p)s(oin)m(t.)55 b(A)35 b(v)-5 b(alue)36 b(of)f(0)h(causes)g(no)f(decimal)h(p)s(oin)m(t)f(or)h (fraction)g(to)g(b)s(e)630 4753 y(output.)48 b(A)m(t)34 b(most)f(three)g(places)h(after)f(the)g(decimal)h(p)s(oin)m(t)f(ma)m(y) h(b)s(e)e(sp)s(eci\014ed;)i(v)-5 b(alues)630 4862 y(of)31 -b Fq(p)h Ft(greater)g(than)e(3)h(are)f(c)m(hanged)h(to)g(3.)42 -b(If)29 b Fq(p)k Ft(is)d(not)h(sp)s(eci\014ed,)f(the)h(v)-5 +b Fr(p)h Fu(greater)g(than)e(3)h(are)f(c)m(hanged)h(to)g(3.)42 +b(If)29 b Fr(p)k Fu(is)d(not)h(sp)s(eci\014ed,)f(the)h(v)-5 b(alue)30 b(3)h(is)g(used.)630 4992 y(The)54 b(optional)h -Fs(l)f Ft(sp)s(eci\014es)g(a)h(longer)f(format,)61 b(including)54 -b(min)m(utes,)61 b(of)54 b(the)g(form)630 5101 y Fq(MM)10 -b Ft(m)p Fq(SS)5 b Ft(.)p Fq(FF)i Ft(s.)102 b(The)50 -b(v)-5 b(alue)51 b(of)g Fq(p)i Ft(determines)e(whether)f(or)h(not)f -(the)h(fraction)h(is)630 5211 y(included.)630 5340 y(If)30 +Ft(l)f Fu(sp)s(eci\014es)g(a)h(longer)f(format,)61 b(including)54 +b(min)m(utes,)61 b(of)54 b(the)g(form)630 5101 y Fr(MM)10 +b Fu(m)p Fr(SS)p Fu(.)p Fr(FF)d Fu(s.)103 b(The)50 b(v)-5 +b(alue)52 b(of)f Fr(p)j Fu(determines)d(whether)f(or)h(not)h(the)f +(fraction)h(is)630 5211 y(included.)630 5340 y(If)30 b(this)g(v)-5 b(ariable)31 b(is)g(not)f(set,)i(Bash)e(acts)h(as)g(if)f (it)h(had)f(the)h(v)-5 b(alue)p eop end %%Page: 79 85 -TeXDict begin 79 84 bop 150 -116 a Ft(Chapter)30 b(5:)41 -b(Shell)30 b(V)-8 b(ariables)2459 b(79)870 299 y Fs +TeXDict begin 79 84 bop 150 -116 a Fu(Chapter)30 b(5:)41 +b(Shell)30 b(V)-8 b(ariables)2459 b(79)870 299 y Ft ($'\\nreal\\t\0453lR\\nuser\\t\0453)o(lU\\n)o(sys\\)o(t\0453)o(lS')630 -433 y Ft(If)37 b(the)g(v)-5 b(alue)38 b(is)f(n)m(ull,)i(no)f(timing)f +433 y Fu(If)37 b(the)g(v)-5 b(alue)38 b(is)f(n)m(ull,)i(no)f(timing)f (information)h(is)f(displa)m(y)m(ed.)62 b(A)37 b(trailing)i(newline)e (is)630 543 y(added)30 b(when)f(the)i(format)f(string)h(is)f(displa)m -(y)m(ed.)150 702 y Fs(TMOUT)240 b Ft(If)22 b(set)h(to)g(a)g(v)-5 -b(alue)23 b(greater)h(than)e(zero,)j Fs(TMOUT)d Ft(is)g(treated)i(as)e -(the)h(default)g(timeout)g(for)g(the)630 812 y Fs(read)31 -b Ft(builtin)h(\(see)h(Section)f(4.2)i([Bash)e(Builtins],)h(page)g -(48\).)47 b(The)32 b Fs(select)e Ft(command)630 922 y(\(see)f(Section)h +(y)m(ed.)150 702 y Ft(TMOUT)240 b Fu(If)22 b(set)h(to)g(a)g(v)-5 +b(alue)23 b(greater)h(than)e(zero,)j Ft(TMOUT)d Fu(is)g(treated)i(as)e +(the)h(default)g(timeout)g(for)g(the)630 812 y Ft(read)31 +b Fu(builtin)h(\(see)h(Section)f(4.2)i([Bash)e(Builtins],)h(page)g +(48\).)47 b(The)32 b Ft(select)e Fu(command)630 922 y(\(see)f(Section)h (3.2.4.2)g([Conditional)g(Constructs],)e(page)i(10\))f(terminates)g(if) g(input)e(do)s(es)630 1031 y(not)k(arriv)m(e)g(after)g -Fs(TMOUT)e Ft(seconds)h(when)f(input)h(is)g(coming)h(from)f(a)h +Ft(TMOUT)e Fu(seconds)h(when)f(input)h(is)g(coming)h(from)f(a)h (terminal.)630 1166 y(In)40 b(an)h(in)m(teractiv)m(e)i(shell,)h(the)d (v)-5 b(alue)41 b(is)g(in)m(terpreted)g(as)f(the)h(n)m(um)m(b)s(er)f (of)h(seconds)f(to)630 1275 y(w)m(ait)28 b(for)e(a)g(line)h(of)g(input) e(after)i(issuing)f(the)h(primary)e(prompt.)39 b(Bash)26 b(terminates)h(after)630 1385 y(w)m(aiting)32 b(for)e(that)h(n)m(um)m (b)s(er)e(of)h(seconds)h(if)f(a)h(complete)h(line)e(of)h(input)e(do)s -(es)h(not)h(arriv)m(e.)150 1544 y Fs(TMPDIR)192 b Ft(If)39 +(es)h(not)h(arriv)m(e.)150 1544 y Ft(TMPDIR)192 b Fu(If)39 b(set,)j(Bash)e(uses)f(its)h(v)-5 b(alue)40 b(as)f(the)h(name)f(of)h(a) g(directory)g(in)f(whic)m(h)g(Bash)h(creates)630 1654 y(temp)s(orary)30 b(\014les)g(for)g(the)h(shell's)g(use.)150 -1813 y Fs(UID)336 b Ft(The)30 b(n)m(umeric)g(real)h(user)f(id)g(of)g +1813 y Ft(UID)336 b Fu(The)30 b(n)m(umeric)g(real)h(user)f(id)g(of)g (the)h(curren)m(t)f(user.)40 b(This)30 b(v)-5 b(ariable)31 b(is)f(readonly)-8 b(.)p eop end %%Page: 80 86 -TeXDict begin 80 85 bop 150 -116 a Ft(Chapter)30 b(6:)41 -b(Bash)30 b(F)-8 b(eatures)2484 b(80)150 299 y Fo(6)80 -b(Bash)54 b(F)-13 b(eatures)150 524 y Ft(This)30 b(c)m(hapter)h -(describ)s(es)e(features)i(unique)e(to)i(Bash.)150 752 -y Fr(6.1)68 b(In)l(v)l(oking)46 b(Bash)390 912 y Fs(bash)h([long-opt])e -([-ir])h([-abefhkmnptuvxdBCDHP])c([-o)47 b Fi(option)11 -b Fs(])45 b([-O)i Fi(shopt_option)11 b Fs(])44 b([)p -Fi(ar-)390 1021 y(gument)57 b Fs(...)o(])390 1131 y(bash)47 -b([long-opt])e([-abefhkmnptuvxdBCDHP])c([-o)47 b Fi(option)11 -b Fs(])46 b([-O)g Fi(shopt_option)11 b Fs(])44 b(-c)j -Fi(string)57 b Fs([)p Fi(ar-)390 1240 y(gument)g Fs(...)o(])390 -1350 y(bash)47 b([long-opt])e(-s)i([-abefhkmnptuvxdBCDHP])42 -b([-o)k Fi(option)11 b Fs(])46 b([-O)h Fi(shopt_option)11 -b Fs(])43 b([)p Fi(ar-)390 1460 y(gument)57 b Fs(...)o(])275 -1592 y Ft(All)31 b(of)g(the)f(single-c)m(haracter)k(options)d(used)f -(with)g(the)h Fs(set)f Ft(builtin)g(\(see)h(Section)h(4.3.1)g([The)f -(Set)150 1702 y(Builtin],)45 b(page)c(59\))i(can)e(b)s(e)f(used)h(as)g -(options)g(when)f(the)i(shell)f(is)g(in)m(v)m(ok)m(ed.)74 -b(In)41 b(addition,)j(there)150 1811 y(are)38 b(sev)m(eral)h(m)m +TeXDict begin 80 85 bop 150 -116 a Fu(Chapter)30 b(6:)41 +b(Bash)30 b(F)-8 b(eatures)2484 b(80)150 299 y Fp(6)80 +b(Bash)54 b(F)-13 b(eatures)150 504 y Fu(This)30 b(c)m(hapter)h +(describ)s(es)e(features)i(unique)e(to)i(Bash.)150 725 +y Fs(6.1)68 b(In)l(v)l(oking)46 b(Bash)390 884 y Ft(bash)h([long-opt])e +([-ir])h([-abefhkmnptuvxdBCDHP])c([-o)47 b Fj(option)p +Ft(])e([-O)i Fj(shopt_option)p Ft(])e([)p Fj(ar-)390 +994 y(gument)h Ft(...)o(])390 1103 y(bash)h([long-opt])e +([-abefhkmnptuvxdBCDHP])c([-o)47 b Fj(option)p Ft(])f([-O)h +Fj(shopt_option)p Ft(])d(-c)j Fj(string)f Ft([)p Fj(ar-)390 +1213 y(gument)g Ft(...)o(])390 1323 y(bash)h([long-opt])e(-s)i +([-abefhkmnptuvxdBCDHP])42 b([-o)k Fj(option)p Ft(])g([-O)h +Fj(shopt_option)p Ft(])d([)p Fj(ar-)390 1432 y(gument)i +Ft(...)o(])275 1561 y Fu(All)31 b(of)g(the)f(single-c)m(haracter)k +(options)d(used)f(with)g(the)h Ft(set)f Fu(builtin)g(\(see)h(Section)h +(4.3.1)g([The)f(Set)150 1670 y(Builtin],)45 b(page)c(58\))i(can)e(b)s +(e)f(used)h(as)g(options)g(when)f(the)i(shell)f(is)g(in)m(v)m(ok)m(ed.) +74 b(In)41 b(addition,)j(there)150 1780 y(are)38 b(sev)m(eral)h(m)m (ulti-c)m(haracter)h(options)d(that)h(y)m(ou)g(can)g(use.)61 b(These)38 b(options)f(m)m(ust)h(app)s(ear)e(on)i(the)150 -1921 y(command)30 b(line)h(b)s(efore)f(the)g(single-c)m(haracter)j -(options)e(to)g(b)s(e)f(recognized.)150 2076 y Fs(--debugger)630 -2186 y Ft(Arrange)j(for)g(the)g(debugger)g(pro\014le)g(to)h(b)s(e)e +1890 y(command)30 b(line)h(b)s(efore)f(the)g(single-c)m(haracter)j +(options)e(to)g(b)s(e)f(recognized.)150 2037 y Ft(--debugger)630 +2147 y Fu(Arrange)j(for)g(the)g(debugger)g(pro\014le)g(to)h(b)s(e)e (executed)i(b)s(efore)f(the)g(shell)g(starts.)49 b(T)-8 -b(urns)630 2296 y(on)37 b(extended)g(debugging)g(mo)s(de)g(\(see)h -(Section)g(4.3.2)g([The)f(Shopt)g(Builtin],)i(page)f(63)630 -2405 y(for)30 b(a)h(description)f(of)h(the)f Fs(extdebug)f -Ft(option)h(to)h(the)g Fs(shopt)e Ft(builtin\).)150 2561 -y Fs(--dump-po-strings)630 2670 y Ft(A)37 b(list)g(of)f(all)i -(double-quoted)e(strings)g(preceded)g(b)m(y)h(`)p Fs($)p -Ft(')f(is)h(prin)m(ted)f(on)g(the)h(standard)630 2780 -y(output)24 b(in)h(the)g Fl(gnu)f Fs(gettext)f Ft(PO)i(\(p)s(ortable)g -(ob)5 b(ject\))26 b(\014le)f(format.)39 b(Equiv)-5 b(alen)m(t)26 -b(to)f(`)p Fs(-D)p Ft(')630 2890 y(except)31 b(for)f(the)h(output)f -(format.)150 3045 y Fs(--dump-strings)630 3155 y Ft(Equiv)-5 -b(alen)m(t)31 b(to)g(`)p Fs(-D)p Ft('.)150 3310 y Fs(--help)192 -b Ft(Displa)m(y)32 b(a)e(usage)h(message)h(on)e(standard)g(output)g -(and)f(exit)j(successfully)-8 b(.)150 3466 y Fs(--init-file)27 -b Fi(filename)150 3576 y Fs(--rcfile)h Fi(filename)630 -3685 y Ft(Execute)42 b(commands)f(from)f Fq(\014lename)47 -b Ft(\(instead)42 b(of)f(`)p Fs(~/.bashrc)p Ft('\))e(in)i(an)g(in)m -(teractiv)m(e)630 3795 y(shell.)150 3950 y Fs(--login)144 -b Ft(Equiv)-5 b(alen)m(t)31 b(to)g(`)p Fs(-l)p Ft('.)150 -4106 y Fs(--noediting)630 4216 y Ft(Do)h(not)e(use)h(the)g -Fl(gnu)f Ft(Readline)i(library)e(\(see)h(Chapter)g(8)g([Command)f(Line) -g(Editing],)630 4325 y(page)h(102\))h(to)f(read)g(command)f(lines)g -(when)g(the)g(shell)h(is)f(in)m(teractiv)m(e.)150 4481 -y Fs(--noprofile)630 4590 y Ft(Don't)i(load)f(the)g(system-wide)g -(startup)f(\014le)g(`)p Fs(/etc/profile)p Ft(')e(or)j(an)m(y)g(of)g -(the)f(p)s(ersonal)630 4700 y(initialization)g(\014les)d(`)p -Fs(~/.bash_profile)p Ft(',)e(`)p Fs(~/.bash_login)p Ft(',)g(or)i(`)p -Fs(~/.profile)p Ft(')e(when)630 4810 y(Bash)31 b(is)f(in)m(v)m(ok)m(ed) -i(as)e(a)h(login)g(shell.)150 4965 y Fs(--norc)192 b -Ft(Don't)31 b(read)g(the)f(`)p Fs(~/.bashrc)p Ft(')f(initialization)k -(\014le)d(in)g(an)h(in)m(teractiv)m(e)i(shell.)41 b(This)30 -b(is)g(on)630 5075 y(b)m(y)g(default)h(if)f(the)h(shell)f(is)h(in)m(v)m -(ok)m(ed)h(as)e Fs(sh)p Ft(.)150 5230 y Fs(--posix)144 -b Ft(Change)24 b(the)h(b)s(eha)m(vior)f(of)g(Bash)h(where)e(the)i -(default)f(op)s(eration)h(di\013ers)f(from)f(the)i Fl(posix)630 -5340 y Ft(standard)35 b(to)h(matc)m(h)g(the)g(standard.)55 +b(urns)630 2257 y(on)37 b(extended)g(debugging)g(mo)s(de)g(\(see)h +(Section)g(4.3.2)g([The)f(Shopt)g(Builtin],)i(page)f(62)630 +2366 y(for)30 b(a)h(description)f(of)h(the)f Ft(extdebug)f +Fu(option)h(to)h(the)g Ft(shopt)e Fu(builtin\).)150 2514 +y Ft(--dump-po-strings)630 2623 y Fu(A)37 b(list)g(of)f(all)i +(double-quoted)e(strings)g(preceded)g(b)m(y)h(`)p Ft($)p +Fu(')f(is)h(prin)m(ted)f(on)g(the)h(standard)630 2733 +y(output)29 b(in)g(the)g Fm(gnu)g Ft(gettext)f Fu(PO)g(\(p)s(ortable)i +(ob)5 b(ject\))30 b(\014le)g(format.)40 b(Equiv)-5 b(alen)m(t)31 +b(to)f Ft(-D)630 2843 y Fu(except)h(for)f(the)h(output)f(format.)150 +2990 y Ft(--dump-strings)630 3100 y Fu(Equiv)-5 b(alen)m(t)31 +b(to)g Ft(-D)p Fu(.)150 3248 y Ft(--help)192 b Fu(Displa)m(y)32 +b(a)e(usage)h(message)h(on)e(standard)g(output)g(and)f(exit)j +(successfully)-8 b(.)150 3396 y Ft(--init-file)27 b Fj(filename)150 +3505 y Ft(--rcfile)h Fj(filename)630 3615 y Fu(Execute)23 +b(commands)e(from)g Fr(\014lename)28 b Fu(\(instead)22 +b(of)g Ft(~/.bashrc)p Fu(\))e(in)h(an)h(in)m(teractiv)m(e)i(shell.)150 +3763 y Ft(--login)144 b Fu(Equiv)-5 b(alen)m(t)31 b(to)g +Ft(-l)p Fu(.)150 3910 y Ft(--noediting)630 4020 y Fu(Do)h(not)e(use)h +(the)g Fm(gnu)f Fu(Readline)i(library)e(\(see)h(Chapter)g(8)g([Command) +f(Line)g(Editing],)630 4130 y(page)h(101\))h(to)f(read)g(command)f +(lines)g(when)g(the)g(shell)h(is)f(in)m(teractiv)m(e.)150 +4277 y Ft(--noprofile)630 4387 y Fu(Don't)22 b(load)g(the)g +(system-wide)f(startup)g(\014le)h Ft(/etc/profile)c Fu(or)j(an)m(y)h +(of)f(the)h(p)s(ersonal)f(ini-)630 4496 y(tialization)34 +b(\014les)e Ft(~/.bash_profile)p Fu(,)c Ft(~/.bash_login)p +Fu(,)g(or)k Ft(~/.profile)c Fu(when)j(Bash)630 4606 y(is)f(in)m(v)m(ok) +m(ed)i(as)f(a)g(login)g(shell.)150 4754 y Ft(--norc)192 +b Fu(Don't)35 b(read)f(the)g Ft(~/.bashrc)e Fu(initialization)k(\014le) +f(in)e(an)h(in)m(teractiv)m(e)j(shell.)52 b(This)33 b(is)h(on)630 +4863 y(b)m(y)c(default)h(if)f(the)h(shell)f(is)h(in)m(v)m(ok)m(ed)h(as) +e Ft(sh)p Fu(.)150 5011 y Ft(--posix)144 b Fu(Change)24 +b(the)h(b)s(eha)m(vior)f(of)g(Bash)h(where)e(the)i(default)f(op)s +(eration)h(di\013ers)f(from)f(the)i Fm(posix)630 5121 +y Fu(standard)35 b(to)h(matc)m(h)g(the)g(standard.)55 b(This)35 b(is)h(in)m(tended)f(to)h(mak)m(e)h(Bash)f(b)s(eha)m(v)m(e)g -(as)g(a)p eop end +(as)g(a)630 5230 y(strict)26 b(sup)s(erset)e(of)h(that)g(standard.)38 +b(See)26 b(Section)f(6.11)i([Bash)e(POSIX)f(Mo)s(de],)j(page)f(94,)630 +5340 y(for)k(a)h(description)f(of)h(the)f(Bash)h Fm(posix)f +Fu(mo)s(de.)p eop end %%Page: 81 87 -TeXDict begin 81 86 bop 150 -116 a Ft(Chapter)30 b(6:)41 -b(Bash)30 b(F)-8 b(eatures)2484 b(81)630 299 y(strict)26 -b(sup)s(erset)e(of)h(that)g(standard.)38 b(See)26 b(Section)f(6.11)i -([Bash)e(POSIX)f(Mo)s(de],)j(page)f(94,)630 408 y(for)k(a)h -(description)f(of)h(the)f(Bash)h Fl(posix)f Ft(mo)s(de.)150 -572 y Fs(--restricted)630 682 y Ft(Mak)m(e)54 b(the)e(shell)g(a)h -(restricted)g(shell)f(\(see)h(Section)g(6.10)h([The)d(Restricted)j -(Shell],)630 792 y(page)31 b(93\).)150 956 y Fs(--verbose)630 -1065 y Ft(Equiv)-5 b(alen)m(t)31 b(to)g(`)p Fs(-v)p Ft('.)41 -b(Prin)m(t)30 b(shell)h(input)e(lines)i(as)g(they're)f(read.)150 -1229 y Fs(--version)630 1339 y Ft(Sho)m(w)e(v)m(ersion)g(information)g -(for)g(this)g(instance)h(of)f(Bash)g(on)g(the)g(standard)f(output)h -(and)630 1448 y(exit)j(successfully)-8 b(.)275 1615 y(There)28 -b(are)i(sev)m(eral)g(single-c)m(haracter)i(options)d(that)h(ma)m(y)g(b) -s(e)e(supplied)g(at)i(in)m(v)m(o)s(cation)h(whic)m(h)e(are)150 -1724 y(not)i(a)m(v)-5 b(ailable)32 b(with)e(the)h Fs(set)e -Ft(builtin.)150 1891 y Fs(-c)384 b Ft(Read)44 b(and)e(execute)j -(commands)e(from)g(the)g(\014rst)g(non-option)h Fq(argumen)m(t)h -Ft(after)f(pro-)630 2000 y(cessing)37 b(the)g(options,)i(then)d(exit.) -61 b(An)m(y)37 b(remaining)f(argumen)m(ts)h(are)g(assigned)g(to)h(the) -630 2110 y(p)s(ositional)31 b(parameters,)g(starting)g(with)f -Fs($0)p Ft(.)150 2274 y Fs(-i)384 b Ft(F)-8 b(orce)22 +TeXDict begin 81 86 bop 150 -116 a Fu(Chapter)30 b(6:)41 +b(Bash)30 b(F)-8 b(eatures)2484 b(81)150 299 y Ft(--restricted)630 +408 y Fu(Mak)m(e)54 b(the)e(shell)g(a)h(restricted)g(shell)f(\(see)h +(Section)g(6.10)h([The)d(Restricted)j(Shell],)630 518 +y(page)31 b(93\).)150 682 y Ft(--verbose)630 791 y Fu(Equiv)-5 +b(alen)m(t)31 b(to)g Ft(-v)p Fu(.)41 b(Prin)m(t)30 b(shell)g(input)g +(lines)g(as)h(they're)g(read.)150 955 y Ft(--version)630 +1065 y Fu(Sho)m(w)d(v)m(ersion)g(information)g(for)g(this)g(instance)h +(of)f(Bash)g(on)g(the)g(standard)f(output)h(and)630 1174 +y(exit)j(successfully)-8 b(.)275 1341 y(There)28 b(are)i(sev)m(eral)g +(single-c)m(haracter)i(options)d(that)h(ma)m(y)g(b)s(e)e(supplied)g(at) +i(in)m(v)m(o)s(cation)h(whic)m(h)e(are)150 1450 y(not)i(a)m(v)-5 +b(ailable)32 b(with)e(the)h Ft(set)e Fu(builtin.)150 +1616 y Ft(-c)384 b Fu(Read)44 b(and)e(execute)j(commands)e(from)g(the)g +(\014rst)g(non-option)h Fr(argumen)m(t)h Fu(after)f(pro-)630 +1726 y(cessing)37 b(the)g(options,)i(then)d(exit.)61 +b(An)m(y)37 b(remaining)f(argumen)m(ts)h(are)g(assigned)g(to)h(the)630 +1835 y(p)s(ositional)31 b(parameters,)g(starting)g(with)f +Ft($0)p Fu(.)150 1999 y Ft(-i)384 b Fu(F)-8 b(orce)22 b(the)g(shell)f(to)g(run)f(in)m(teractiv)m(ely)-8 b(.)41 b(In)m(teractiv)m(e)23 b(shells)e(are)h(describ)s(ed)d(in)i(Section)h -(6.3)630 2383 y([In)m(teractiv)m(e)33 b(Shells],)e(page)g(83.)150 -2547 y Fs(-l)384 b Ft(Mak)m(e)33 b(this)e(shell)h(act)g(as)g(if)f(it)h +(6.3)630 2109 y([In)m(teractiv)m(e)33 b(Shells],)e(page)g(83.)150 +2273 y Ft(-l)384 b Fu(Mak)m(e)33 b(this)e(shell)h(act)g(as)g(if)f(it)h (had)f(b)s(een)f(directly)i(in)m(v)m(ok)m(ed)h(b)m(y)f(login.)44 -b(When)31 b(the)h(shell)630 2657 y(is)37 b(in)m(teractiv)m(e,)43 +b(When)31 b(the)h(shell)630 2382 y(is)37 b(in)m(teractiv)m(e,)43 b(this)37 b(is)g(equiv)-5 b(alen)m(t)39 b(to)f(starting)h(a)e(login)i -(shell)e(with)g(`)p Fs(exec)30 b(-l)g(bash)p Ft('.)630 -2767 y(When)h(the)g(shell)h(is)f(not)g(in)m(teractiv)m(e,)k(the)c +(shell)e(with)g(`)p Ft(exec)30 b(-l)g(bash)p Fu('.)630 +2492 y(When)h(the)g(shell)h(is)f(not)g(in)m(teractiv)m(e,)k(the)c (login)h(shell)g(startup)f(\014les)g(will)g(b)s(e)g(executed.)630 -2876 y(`)p Fs(exec)e(bash)h(-l)p Ft(')43 b(or)h(`)p Fs(exec)29 -b(bash)g(--login)p Ft(')42 b(will)i(replace)h(the)f(curren)m(t)f(shell) -h(with)g(a)630 2986 y(Bash)26 b(login)g(shell.)39 b(See)26 +2601 y(`)p Ft(exec)e(bash)h(-l)p Fu(')43 b(or)h(`)p Ft(exec)29 +b(bash)g(--login)p Fu(')42 b(will)i(replace)h(the)f(curren)m(t)f(shell) +h(with)g(a)630 2711 y(Bash)26 b(login)g(shell.)39 b(See)26 b(Section)g(6.2)h([Bash)e(Startup)g(Files],)j(page)e(82,)i(for)d(a)h -(description)630 3095 y(of)31 b(the)f(sp)s(ecial)h(b)s(eha)m(vior)g(of) -f(a)h(login)g(shell.)150 3259 y Fs(-r)384 b Ft(Mak)m(e)54 +(description)630 2821 y(of)31 b(the)f(sp)s(ecial)h(b)s(eha)m(vior)g(of) +f(a)h(login)g(shell.)150 2984 y Ft(-r)384 b Fu(Mak)m(e)54 b(the)e(shell)g(a)h(restricted)g(shell)f(\(see)h(Section)g(6.10)h([The) -d(Restricted)j(Shell],)630 3369 y(page)31 b(93\).)150 -3533 y Fs(-s)384 b Ft(If)24 b(this)h(option)h(is)f(presen)m(t,)h(or)f +d(Restricted)j(Shell],)630 3094 y(page)31 b(93\).)150 +3258 y Ft(-s)384 b Fu(If)24 b(this)h(option)h(is)f(presen)m(t,)h(or)f (if)g(no)f(argumen)m(ts)i(remain)e(after)i(option)f(pro)s(cessing,)h -(then)630 3642 y(commands)i(are)h(read)g(from)f(the)h(standard)f +(then)630 3367 y(commands)i(are)h(read)g(from)f(the)h(standard)f (input.)39 b(This)28 b(option)h(allo)m(ws)h(the)f(p)s(ositional)630 -3752 y(parameters)i(to)g(b)s(e)f(set)g(when)g(in)m(v)m(oking)h(an)g(in) -m(teractiv)m(e)i(shell.)150 3916 y Fs(-D)384 b Ft(A)37 +3477 y(parameters)i(to)g(b)s(e)f(set)g(when)g(in)m(v)m(oking)h(an)g(in) +m(teractiv)m(e)i(shell.)150 3641 y Ft(-D)384 b Fu(A)37 b(list)g(of)f(all)i(double-quoted)e(strings)g(preceded)g(b)m(y)h(`)p -Fs($)p Ft(')f(is)h(prin)m(ted)f(on)g(the)h(standard)630 -4026 y(output.)63 b(These)38 b(are)g(the)g(strings)g(that)h(are)f(sub)5 -b(ject)38 b(to)h(language)g(translation)g(when)630 4135 -y(the)e(curren)m(t)g(lo)s(cale)h(is)f(not)g Fs(C)g Ft(or)f -Fs(POSIX)g Ft(\(see)h(Section)h(3.1.2.5)h([Lo)s(cale)g(T)-8 -b(ranslation],)630 4245 y(page)31 b(7\).)42 b(This)29 -b(implies)i(the)f(`)p Fs(-n)p Ft(')h(option;)g(no)f(commands)g(will)h -(b)s(e)e(executed.)150 4409 y Fs([-+]O)g([)p Fi(shopt_option)11 -b Fs(])630 4518 y Fq(shopt)p 854 4518 28 4 v 40 w(option)44 -b Ft(is)g(one)h(of)f(the)g(shell)h(options)f(accepted)h(b)m(y)f(the)h -Fs(shopt)d Ft(builtin)i(\(see)630 4628 y(Section)28 b(4.3.2)g([The)f -(Shopt)f(Builtin],)i(page)f(63\).)41 b(If)26 b Fq(shopt)p -2690 4628 V 40 w(option)h Ft(is)g(presen)m(t,)h(`)p Fs(-O)p -Ft(')f(sets)630 4738 y(the)40 b(v)-5 b(alue)40 b(of)f(that)h(option;)45 -b(`)p Fs(+O)p Ft(')40 b(unsets)e(it.)69 b(If)39 b Fq(shopt)p -2631 4738 V 40 w(option)h Ft(is)f(not)h(supplied,)h(the)630 -4847 y(names)e(and)g(v)-5 b(alues)40 b(of)g(the)g(shell)f(options)h -(accepted)h(b)m(y)e Fs(shopt)f Ft(are)i(prin)m(ted)f(on)h(the)630 -4957 y(standard)33 b(output.)50 b(If)33 b(the)h(in)m(v)m(o)s(cation)i -(option)e(is)g(`)p Fs(+O)p Ft(',)g(the)g(output)f(is)h(displa)m(y)m(ed) -g(in)g(a)630 5066 y(format)d(that)g(ma)m(y)g(b)s(e)e(reused)h(as)h -(input.)150 5230 y Fs(--)384 b Ft(A)38 b Fs(--)g Ft(signals)g(the)h -(end)e(of)i(options)f(and)g(disables)g(further)f(option)h(pro)s -(cessing.)64 b(An)m(y)630 5340 y(argumen)m(ts)31 b(after)g(the)f -Fs(--)g Ft(are)h(treated)g(as)g(\014lenames)f(and)g(argumen)m(ts.)p -eop end +Ft($)p Fu(')f(is)h(prin)m(ted)f(on)g(the)h(standard)630 +3750 y(output.)63 b(These)38 b(are)g(the)g(strings)g(that)h(are)f(sub)5 +b(ject)38 b(to)h(language)g(translation)g(when)630 3860 +y(the)e(curren)m(t)g(lo)s(cale)h(is)f(not)g Ft(C)g Fu(or)f +Ft(POSIX)g Fu(\(see)h(Section)h(3.1.2.5)h([Lo)s(cale)g(T)-8 +b(ranslation],)630 3970 y(page)31 b(7\).)42 b(This)29 +b(implies)i(the)f Ft(-n)g Fu(option;)h(no)f(commands)g(will)h(b)s(e)f +(executed.)150 4133 y Ft([-+]O)f([)p Fj(shopt_option)p +Ft(])630 4243 y Fr(shopt)p 854 4243 28 4 v 40 w(option)44 +b Fu(is)g(one)h(of)f(the)g(shell)h(options)f(accepted)h(b)m(y)f(the)h +Ft(shopt)d Fu(builtin)i(\(see)630 4353 y(Section)32 b(4.3.2)h([The)e +(Shopt)f(Builtin],)i(page)g(62\).)44 b(If)31 b Fr(shopt)p +2724 4353 V 40 w(option)g Fu(is)g(presen)m(t,)h Ft(-O)f +Fu(sets)630 4462 y(the)24 b(v)-5 b(alue)24 b(of)g(that)h(option;)h +Ft(+O)e Fu(unsets)f(it.)39 b(If)23 b Fr(shopt)p 2423 +4462 V 40 w(option)h Fu(is)g(not)g(supplied,)g(the)g(names)630 +4572 y(and)31 b(v)-5 b(alues)32 b(of)g(the)g(shell)g(options)g +(accepted)h(b)m(y)f Ft(shopt)e Fu(are)i(prin)m(ted)f(on)h(the)g +(standard)630 4681 y(output.)40 b(If)29 b(the)h(in)m(v)m(o)s(cation)h +(option)f(is)f Ft(+O)p Fu(,)h(the)f(output)g(is)h(displa)m(y)m(ed)g(in) +f(a)h(format)f(that)630 4791 y(ma)m(y)i(b)s(e)f(reused)f(as)i(input.) +150 4955 y Ft(--)384 b Fu(A)38 b Ft(--)g Fu(signals)g(the)h(end)e(of)i +(options)f(and)g(disables)g(further)f(option)h(pro)s(cessing.)64 +b(An)m(y)630 5064 y(argumen)m(ts)31 b(after)g(the)f Ft(--)g +Fu(are)h(treated)g(as)g(\014lenames)f(and)g(argumen)m(ts.)275 +5230 y(A)d Fl(lo)-5 b(gin)35 b Fu(shell)27 b(is)g(one)h(whose)f +(\014rst)f(c)m(haracter)j(of)e(argumen)m(t)h(zero)f(is)h(`)p +Ft(-)p Fu(',)g(or)f(one)g(in)m(v)m(ok)m(ed)i(with)e(the)150 +5340 y Ft(--login)h Fu(option.)p eop end %%Page: 82 88 -TeXDict begin 82 87 bop 150 -116 a Ft(Chapter)30 b(6:)41 -b(Bash)30 b(F)-8 b(eatures)2484 b(82)275 299 y(A)27 b -Fk(lo)-5 b(gin)35 b Ft(shell)27 b(is)g(one)h(whose)f(\014rst)f(c)m -(haracter)j(of)e(argumen)m(t)h(zero)f(is)h(`)p Fs(-)p -Ft(',)g(or)f(one)g(in)m(v)m(ok)m(ed)i(with)e(the)150 -408 y(`)p Fs(--login)p Ft(')i(option.)275 546 y(An)24 -b Fk(inter)-5 b(active)33 b Ft(shell)25 b(is)g(one)g(started)g(without) -g(non-option)h(argumen)m(ts,)g(unless)f(`)p Fs(-s)p Ft(')f(is)h(sp)s -(eci\014ed,)150 656 y(without)43 b(sp)s(ecifying)f(the)i(`)p -Fs(-c)p Ft(')e(option,)47 b(and)42 b(whose)h(input)f(and)g(output)g -(are)h(b)s(oth)g(connected)g(to)150 766 y(terminals)22 -b(\(as)h(determined)f(b)m(y)g Fs(isatty\(3\))p Ft(\),)f(or)i(one)f -(started)g(with)g(the)g(`)p Fs(-i)p Ft(')g(option.)39 -b(See)22 b(Section)h(6.3)150 875 y([In)m(teractiv)m(e)33 -b(Shells],)e(page)g(83,)g(for)f(more)h(information.)275 -1013 y(If)38 b(argumen)m(ts)h(remain)g(after)g(option)h(pro)s(cessing,) -h(and)d(neither)h(the)g(`)p Fs(-c)p Ft(')f(nor)h(the)g(`)p -Fs(-s)p Ft(')f(option)150 1123 y(has)33 b(b)s(een)g(supplied,)h(the)g -(\014rst)e(argumen)m(t)j(is)e(assumed)g(to)h(b)s(e)f(the)h(name)g(of)g -(a)g(\014le)g(con)m(taining)h(shell)150 1232 y(commands)30 +TeXDict begin 82 87 bop 150 -116 a Fu(Chapter)30 b(6:)41 +b(Bash)30 b(F)-8 b(eatures)2484 b(82)275 299 y(An)28 +b Fl(inter)-5 b(active)37 b Fu(shell)30 b(is)f(one)g(started)h(without) +f(non-option)h(argumen)m(ts,)g(unless)e Ft(-s)h Fu(is)g(sp)s +(eci\014ed,)150 408 y(without)k(sp)s(ecifying)h(the)f +Ft(-c)g Fu(option,)i(and)e(whose)g(input)g(and)f(output)h(are)h(b)s +(oth)f(connected)h(to)g(ter-)150 518 y(minals)g(\(as)g(determined)f(b)m +(y)h Ft(isatty\(3\))p Fu(\),)e(or)i(one)g(started)g(with)f(the)h +Ft(-i)f Fu(option.)51 b(See)33 b(Section)i(6.3)150 628 +y([In)m(teractiv)m(e)e(Shells],)e(page)g(83,)g(for)f(more)h +(information.)275 763 y(If)i(argumen)m(ts)h(remain)g(after)h(option)f +(pro)s(cessing,)h(and)e(neither)h(the)g Ft(-c)g Fu(nor)f(the)h +Ft(-s)g Fu(option)g(has)150 873 y(b)s(een)44 b(supplied,)j(the)d +(\014rst)g(argumen)m(t)h(is)g(assumed)e(to)j(b)s(e)d(the)i(name)g(of)f +(a)h(\014le)g(con)m(taining)h(shell)150 982 y(commands)30 b(\(see)g(Section)h(3.8)g([Shell)f(Scripts],)g(page)h(39\).)41 b(When)30 b(Bash)g(is)g(in)m(v)m(ok)m(ed)i(in)d(this)h(fashion,)150 -1342 y Fs($0)37 b Ft(is)g(set)h(to)h(the)e(name)h(of)f(the)h(\014le,)i +1092 y Ft($0)37 b Fu(is)g(set)h(to)h(the)e(name)h(of)f(the)h(\014le,)i (and)c(the)i(p)s(ositional)g(parameters)g(are)g(set)g(to)g(the)g -(remaining)150 1451 y(argumen)m(ts.)h(Bash)26 b(reads)f(and)g(executes) +(remaining)150 1202 y(argumen)m(ts.)h(Bash)26 b(reads)f(and)g(executes) h(commands)f(from)g(this)g(\014le,)i(then)e(exits.)40 -b(Bash's)25 b(exit)i(status)150 1561 y(is)f(the)h(exit)h(status)e(of)h +b(Bash's)25 b(exit)i(status)150 1311 y(is)f(the)h(exit)h(status)e(of)h (the)g(last)g(command)f(executed)h(in)g(the)f(script.)40 -b(If)26 b(no)g(commands)g(are)h(executed,)150 1671 y(the)k(exit)g -(status)g(is)f(0.)150 1908 y Fr(6.2)68 b(Bash)45 b(Startup)g(Files)150 -2068 y Ft(This)23 b(section)j(describ)s(es)d(ho)m(w)i(Bash)f(executes)h +b(If)26 b(no)g(commands)g(are)h(executed,)150 1421 y(the)k(exit)g +(status)g(is)f(0.)150 1655 y Fs(6.2)68 b(Bash)45 b(Startup)g(Files)150 +1814 y Fu(This)23 b(section)j(describ)s(es)d(ho)m(w)i(Bash)f(executes)h (its)g(startup)f(\014les.)38 b(If)24 b(an)m(y)h(of)f(the)h(\014les)f -(exist)h(but)e(cannot)150 2177 y(b)s(e)29 b(read,)i(Bash)f(rep)s(orts)f +(exist)h(but)e(cannot)150 1924 y(b)s(e)29 b(read,)i(Bash)f(rep)s(orts)f (an)h(error.)40 b(Tildes)30 b(are)g(expanded)f(in)h(\014lenames)g(as)g -(describ)s(ed)f(ab)s(o)m(v)m(e)i(under)150 2287 y(Tilde)f(Expansion)g +(describ)s(ed)f(ab)s(o)m(v)m(e)i(under)150 2034 y(Tilde)f(Expansion)g (\(see)h(Section)h(3.5.2)g([Tilde)e(Expansion],)h(page)g(22\).)275 -2425 y(In)m(teractiv)m(e)h(shells)f(are)g(describ)s(ed)e(in)h(Section)h +2169 y(In)m(teractiv)m(e)h(shells)f(are)g(describ)s(ed)e(in)h(Section)h (6.3)h([In)m(teractiv)m(e)h(Shells],)d(page)h(83.)150 -2627 y Fj(In)m(v)m(ok)m(ed)40 b(as)h(an)f(in)m(teractiv)m(e)f(login)j -(shell,)g(or)g(with)e(`)p Fh(--login)p Fj(')150 2774 -y Ft(When)c(Bash)f(is)h(in)m(v)m(ok)m(ed)h(as)f(an)g(in)m(teractiv)m(e) -j(login)d(shell,)i(or)e(as)g(a)g(non-in)m(teractiv)m(e)i(shell)e(with)g -(the)150 2884 y(`)p Fs(--login)p Ft(')j(option,)k(it)e(\014rst)e(reads) -h(and)g(executes)h(commands)f(from)f(the)i(\014le)f(`)p -Fs(/etc/profile)p Ft(',)g(if)150 2993 y(that)35 b(\014le)g(exists.)55 -b(After)35 b(reading)g(that)g(\014le,)h(it)g(lo)s(oks)f(for)f(`)p -Fs(~/.bash_profile)p Ft(',)f(`)p Fs(~/.bash_login)p Ft(',)150 -3103 y(and)28 b(`)p Fs(~/.profile)p Ft(',)f(in)i(that)g(order,)g(and)f -(reads)g(and)h(executes)h(commands)e(from)g(the)h(\014rst)f(one)h(that) -150 3213 y(exists)i(and)e(is)h(readable.)41 b(The)30 -b(`)p Fs(--noprofile)p Ft(')d(option)k(ma)m(y)f(b)s(e)g(used)f(when)g -(the)h(shell)h(is)f(started)g(to)150 3322 y(inhibit)g(this)g(b)s(eha)m -(vior.)275 3460 y(When)72 b(a)i(login)g(shell)f(exits,)85 -b(Bash)73 b(reads)g(and)g(executes)h(commands)f(from)g(the)g(\014le)150 -3570 y(`)p Fs(~/.bash_logout)p Ft(',)27 b(if)k(it)f(exists.)150 -3772 y Fj(In)m(v)m(ok)m(ed)40 b(as)h(an)f(in)m(teractiv)m(e)f -(non-login)k(shell)150 3919 y Ft(When)g(an)h(in)m(teractiv)m(e)i(shell) -e(that)g(is)f(not)h(a)g(login)g(shell)g(is)f(started,)48 -b(Bash)c(reads)f(and)g(executes)150 4029 y(commands)24 -b(from)f(`)p Fs(~/.bashrc)p Ft(',)h(if)g(that)g(\014le)g(exists.)40 -b(This)23 b(ma)m(y)i(b)s(e)e(inhibited)g(b)m(y)h(using)g(the)g(`)p -Fs(--norc)p Ft(')150 4138 y(option.)52 b(The)33 b(`)p -Fs(--rcfile)28 b Fi(file)11 b Ft(')33 b(option)h(will)g(force)h(Bash)f -(to)h(read)e(and)h(execute)h(commands)e(from)150 4248 -y Fq(\014le)j Ft(instead)30 b(of)h(`)p Fs(~/.bashrc)p -Ft('.)275 4386 y(So,)f(t)m(ypically)-8 b(,)33 b(y)m(our)d(`)p -Fs(~/.bash_profile)p Ft(')d(con)m(tains)32 b(the)e(line)390 -4524 y Fs(if)47 b([)h(-f)f(~/.bashrc)e(];)i(then)g(.)g(~/.bashrc;)e(fi) -150 4662 y Ft(after)31 b(\(or)g(b)s(efore\))f(an)m(y)h(login-sp)s -(eci\014c)g(initializations.)150 4864 y Fj(In)m(v)m(ok)m(ed)40 -b(non-in)m(teractiv)m(ely)150 5011 y Ft(When)33 b(Bash)g(is)g(started)h -(non-in)m(teractiv)m(ely)-8 b(,)37 b(to)d(run)e(a)h(shell)h(script,)g -(for)f(example,)i(it)e(lo)s(oks)h(for)f(the)150 5121 -y(v)-5 b(ariable)35 b Fs(BASH_ENV)d Ft(in)i(the)h(en)m(vironmen)m(t,)h -(expands)e(its)g(v)-5 b(alue)35 b(if)g(it)g(app)s(ears)e(there,)j(and)e -(uses)g(the)150 5230 y(expanded)c(v)-5 b(alue)30 b(as)h(the)g(name)f -(of)h(a)f(\014le)h(to)g(read)f(and)g(execute.)42 b(Bash)31 -b(b)s(eha)m(v)m(es)g(as)g(if)f(the)g(follo)m(wing)150 -5340 y(command)g(w)m(ere)h(executed:)p eop end -%%Page: 83 89 -TeXDict begin 83 88 bop 150 -116 a Ft(Chapter)30 b(6:)41 -b(Bash)30 b(F)-8 b(eatures)2484 b(83)390 299 y Fs(if)47 +2370 y Fk(In)m(v)m(ok)m(ed)40 b(as)h(an)f(in)m(teractiv)m(e)f(login)j +(shell,)g(or)g(with)e Fh(--login)150 2516 y Fu(When)c(Bash)f(is)h(in)m +(v)m(ok)m(ed)h(as)f(an)g(in)m(teractiv)m(e)j(login)d(shell,)i(or)e(as)g +(a)g(non-in)m(teractiv)m(e)i(shell)e(with)g(the)150 2626 +y Ft(--login)30 b Fu(option,)k(it)f(\014rst)e(reads)h(and)g(executes)i +(commands)e(from)f(the)i(\014le)f Ft(/etc/profile)p Fu(,)e(if)i(that) +150 2736 y(\014le)44 b(exists.)80 b(After)44 b(reading)g(that)g +(\014le,)j(it)d(lo)s(oks)g(for)f Ft(~/.bash_profile)p +Fu(,)g Ft(~/.bash_login)p Fu(,)h(and)150 2845 y Ft(~/.profile)p +Fu(,)25 b(in)i(that)g(order,)h(and)e(reads)h(and)f(executes)j(commands) +d(from)h(the)g(\014rst)f(one)i(that)f(exists)150 2955 +y(and)j(is)h(readable.)42 b(The)30 b Ft(--noprofile)d +Fu(option)k(ma)m(y)g(b)s(e)f(used)g(when)g(the)h(shell)f(is)h(started)g +(to)g(inhibit)150 3064 y(this)f(b)s(eha)m(vior.)275 3200 +y(When)38 b(a)h(login)h(shell)f(exits,)j(Bash)d(reads)f(and)h(executes) +h(commands)e(from)g(the)h(\014le)g Ft(~/.bash_)150 3310 +y(logout)p Fu(,)29 b(if)h(it)h(exists.)150 3510 y Fk(In)m(v)m(ok)m(ed) +40 b(as)h(an)f(in)m(teractiv)m(e)f(non-login)k(shell)150 +3657 y Fu(When)g(an)h(in)m(teractiv)m(e)i(shell)e(that)g(is)f(not)h(a)g +(login)g(shell)g(is)f(started,)48 b(Bash)c(reads)f(and)g(executes)150 +3767 y(commands)31 b(from)g Ft(~/.bashrc)p Fu(,)f(if)h(that)h(\014le)g +(exists.)44 b(This)31 b(ma)m(y)h(b)s(e)f(inhibited)g(b)m(y)g(using)g +(the)h Ft(--norc)150 3876 y Fu(option.)40 b(The)27 b +Ft(--rcfile)h Fj(file)e Fu(option)h(will)g(force)h(Bash)f(to)h(read)f +(and)f(execute)j(commands)d(from)h Fr(\014le)150 3986 +y Fu(instead)k(of)f Ft(~/.bashrc)p Fu(.)275 4121 y(So,)g(t)m(ypically) +-8 b(,)33 b(y)m(our)d Ft(~/.bash_profile)c Fu(con)m(tains)32 +b(the)f(line)390 4257 y Ft(if)47 b([)h(-f)f(~/.bashrc)e(];)i(then)g(.)g +(~/.bashrc;)e(fi)150 4393 y Fu(after)31 b(\(or)g(b)s(efore\))f(an)m(y)h +(login-sp)s(eci\014c)g(initializations.)150 4593 y Fk(In)m(v)m(ok)m(ed) +40 b(non-in)m(teractiv)m(ely)150 4740 y Fu(When)33 b(Bash)g(is)g +(started)h(non-in)m(teractiv)m(ely)-8 b(,)37 b(to)d(run)e(a)h(shell)h +(script,)g(for)f(example,)i(it)e(lo)s(oks)h(for)f(the)150 +4850 y(v)-5 b(ariable)35 b Ft(BASH_ENV)d Fu(in)i(the)h(en)m(vironmen)m +(t,)h(expands)e(its)g(v)-5 b(alue)35 b(if)g(it)g(app)s(ears)e(there,)j +(and)e(uses)g(the)150 4959 y(expanded)c(v)-5 b(alue)30 +b(as)h(the)g(name)f(of)h(a)f(\014le)h(to)g(read)f(and)g(execute.)42 +b(Bash)31 b(b)s(eha)m(v)m(es)g(as)g(if)f(the)g(follo)m(wing)150 +5069 y(command)g(w)m(ere)h(executed:)390 5204 y Ft(if)47 b([)h(-n)f("$BASH_ENV")e(];)i(then)f(.)i("$BASH_ENV";)c(fi)150 -461 y Ft(but)30 b(the)g(v)-5 b(alue)31 b(of)g(the)f Fs(PATH)f -Ft(v)-5 b(ariable)32 b(is)e(not)h(used)e(to)i(searc)m(h)g(for)f(the)h -(\014lename.)275 622 y(As)38 b(noted)h(ab)s(o)m(v)m(e,)j(if)c(a)h -(non-in)m(teractiv)m(e)i(shell)e(is)g(in)m(v)m(ok)m(ed)h(with)e(the)g -(`)p Fs(--login)p Ft(')g(option,)j(Bash)150 732 y(attempts)31 -b(to)g(read)g(and)e(execute)j(commands)e(from)g(the)h(login)g(shell)g -(startup)e(\014les.)150 958 y Fj(In)m(v)m(ok)m(ed)40 -b(with)g(name)h Fh(sh)150 1105 y Ft(If)c(Bash)g(is)g(in)m(v)m(ok)m(ed)i -(with)e(the)g(name)g Fs(sh)p Ft(,)i(it)f(tries)f(to)h(mimic)g(the)f -(startup)g(b)s(eha)m(vior)g(of)h(historical)150 1215 -y(v)m(ersions)31 b(of)f Fs(sh)g Ft(as)h(closely)h(as)e(p)s(ossible,)g -(while)h(conforming)f(to)h(the)g Fl(posix)e Ft(standard)h(as)h(w)m -(ell.)275 1376 y(When)50 b(in)m(v)m(ok)m(ed)j(as)f(an)f(in)m(teractiv)m -(e)j(login)e(shell,)57 b(or)51 b(as)g(a)h(non-in)m(teractiv)m(e)h -(shell)f(with)f(the)150 1486 y(`)p Fs(--login)p Ft(')39 -b(option,)k(it)e(\014rst)e(attempts)i(to)g(read)f(and)g(execute)h -(commands)f(from)g(`)p Fs(/etc/profile)p Ft(')150 1596 -y(and)d(`)p Fs(~/.profile)p Ft(',)g(in)g(that)h(order.)62 -b(The)37 b(`)p Fs(--noprofile)p Ft(')e(option)j(ma)m(y)g(b)s(e)f(used)g -(to)h(inhibit)f(this)150 1705 y(b)s(eha)m(vior.)82 b(When)44 -b(in)m(v)m(ok)m(ed)h(as)g(an)f(in)m(teractiv)m(e)j(shell)d(with)g(the)g -(name)g Fs(sh)p Ft(,)j(Bash)d(lo)s(oks)h(for)f(the)150 -1815 y(v)-5 b(ariable)37 b Fs(ENV)p Ft(,)g(expands)e(its)i(v)-5 -b(alue)36 b(if)g(it)h(is)f(de\014ned,)h(and)e(uses)h(the)g(expanded)g -(v)-5 b(alue)36 b(as)h(the)f(name)150 1924 y(of)i(a)h(\014le)g(to)g -(read)f(and)g(execute.)66 b(Since)38 b(a)h(shell)f(in)m(v)m(ok)m(ed)i -(as)f Fs(sh)e Ft(do)s(es)h(not)h(attempt)g(to)g(read)g(and)150 -2034 y(execute)i(commands)e(from)g(an)m(y)h(other)g(startup)f(\014les,) -j(the)e(`)p Fs(--rcfile)p Ft(')d(option)j(has)g(no)f(e\013ect.)70 -b(A)150 2143 y(non-in)m(teractiv)m(e)32 b(shell)d(in)m(v)m(ok)m(ed)h -(with)f(the)g(name)g Fs(sh)f Ft(do)s(es)g(not)i(attempt)g(to)f(read)g -(an)m(y)g(other)g(startup)150 2253 y(\014les.)275 2415 -y(When)h(in)m(v)m(ok)m(ed)h(as)g Fs(sh)p Ft(,)f(Bash)h(en)m(ters)g -Fl(posix)e Ft(mo)s(de)h(after)h(the)g(startup)f(\014les)g(are)h(read.) -150 2641 y Fj(In)m(v)m(ok)m(ed)40 b(in)h Fg(posix)g Fj(mo)s(de)150 -2788 y Ft(When)25 b(Bash)g(is)h(started)f(in)g Fl(posix)g -Ft(mo)s(de,)h(as)f(with)g(the)h(`)p Fs(--posix)p Ft(')d(command)i(line) -h(option,)h(it)f(follo)m(ws)150 2898 y(the)e Fl(posix)f -Ft(standard)h(for)f(startup)h(\014les.)38 b(In)24 b(this)g(mo)s(de,)h -(in)m(teractiv)m(e)i(shells)d(expand)f(the)h Fs(ENV)f -Ft(v)-5 b(ariable)150 3007 y(and)30 b(commands)g(are)g(read)h(and)e +5340 y Fu(but)30 b(the)g(v)-5 b(alue)31 b(of)g(the)f +Ft(PATH)f Fu(v)-5 b(ariable)32 b(is)e(not)h(used)e(to)i(searc)m(h)g +(for)f(the)h(\014lename.)p eop end +%%Page: 83 89 +TeXDict begin 83 88 bop 150 -116 a Fu(Chapter)30 b(6:)41 +b(Bash)30 b(F)-8 b(eatures)2484 b(83)275 299 y(As)42 +b(noted)g(ab)s(o)m(v)m(e,)47 b(if)42 b(a)h(non-in)m(teractiv)m(e)i +(shell)d(is)g(in)m(v)m(ok)m(ed)i(with)e(the)h Ft(--login)d +Fu(option,)46 b(Bash)150 408 y(attempts)31 b(to)g(read)g(and)e(execute) +j(commands)e(from)g(the)h(login)g(shell)g(startup)e(\014les.)150 +614 y Fk(In)m(v)m(ok)m(ed)40 b(with)g(name)h Fh(sh)150 +761 y Fu(If)c(Bash)g(is)g(in)m(v)m(ok)m(ed)i(with)e(the)g(name)g +Ft(sh)p Fu(,)i(it)f(tries)f(to)h(mimic)g(the)f(startup)g(b)s(eha)m +(vior)g(of)h(historical)150 870 y(v)m(ersions)31 b(of)f +Ft(sh)g Fu(as)h(closely)h(as)e(p)s(ossible,)g(while)h(conforming)f(to)h +(the)g Fm(posix)e Fu(standard)h(as)h(w)m(ell.)275 1010 +y(When)50 b(in)m(v)m(ok)m(ed)j(as)f(an)f(in)m(teractiv)m(e)j(login)e +(shell,)57 b(or)51 b(as)g(a)h(non-in)m(teractiv)m(e)h(shell)f(with)f +(the)150 1120 y Ft(--login)31 b Fu(option,)k(it)e(\014rst)g(attempts)h +(to)g(read)f(and)g(execute)h(commands)f(from)g Ft(/etc/profile)d +Fu(and)150 1230 y Ft(~/.profile)p Fu(,)d(in)i(that)i(order.)39 +b(The)30 b Ft(--noprofile)c Fu(option)k(ma)m(y)g(b)s(e)f(used)g(to)h +(inhibit)f(this)h(b)s(eha)m(vior.)150 1339 y(When)36 +b(in)m(v)m(ok)m(ed)i(as)e(an)g(in)m(teractiv)m(e)j(shell)e(with)f(the)g +(name)h Ft(sh)p Fu(,)g(Bash)f(lo)s(oks)h(for)f(the)h(v)-5 +b(ariable)37 b Ft(ENV)p Fu(,)150 1449 y(expands)29 b(its)i(v)-5 +b(alue)30 b(if)h(it)f(is)g(de\014ned,)g(and)f(uses)h(the)g(expanded)g +(v)-5 b(alue)30 b(as)h(the)f(name)g(of)g(a)h(\014le)f(to)h(read)150 +1558 y(and)g(execute.)46 b(Since)32 b(a)g(shell)g(in)m(v)m(ok)m(ed)h +(as)f Ft(sh)f Fu(do)s(es)g(not)h(attempt)h(to)g(read)e(and)g(execute)i +(commands)150 1668 y(from)39 b(an)m(y)g(other)h(startup)e(\014les,)k +(the)d Ft(--rcfile)e Fu(option)j(has)f(no)g(e\013ect.)69 +b(A)39 b(non-in)m(teractiv)m(e)j(shell)150 1778 y(in)m(v)m(ok)m(ed)32 +b(with)e(the)g(name)h Ft(sh)f Fu(do)s(es)g(not)g(attempt)i(to)f(read)f +(an)m(y)h(other)g(startup)e(\014les.)275 1918 y(When)h(in)m(v)m(ok)m +(ed)h(as)g Ft(sh)p Fu(,)f(Bash)h(en)m(ters)g Fm(posix)e +Fu(mo)s(de)h(after)h(the)g(startup)f(\014les)g(are)h(read.)150 +2123 y Fk(In)m(v)m(ok)m(ed)40 b(in)h Fg(posix)g Fk(mo)s(de)150 +2270 y Fu(When)28 b(Bash)h(is)g(started)g(in)g Fm(posix)f +Fu(mo)s(de,)g(as)h(with)g(the)g Ft(--posix)d Fu(command)j(line)g +(option,)h(it)f(follo)m(ws)150 2380 y(the)24 b Fm(posix)f +Fu(standard)h(for)f(startup)h(\014les.)38 b(In)24 b(this)g(mo)s(de,)h +(in)m(teractiv)m(e)i(shells)d(expand)f(the)h Ft(ENV)f +Fu(v)-5 b(ariable)150 2489 y(and)30 b(commands)g(are)g(read)h(and)e (executed)j(from)d(the)i(\014le)f(whose)g(name)h(is)f(the)h(expanded)e -(v)-5 b(alue.)41 b(No)150 3117 y(other)31 b(startup)f(\014les)g(are)h -(read.)150 3343 y Fj(In)m(v)m(ok)m(ed)40 b(b)m(y)g(remote)h(shell)h -(daemon)150 3490 y Ft(Bash)36 b(attempts)h(to)g(determine)f(when)f(it)i +(v)-5 b(alue.)41 b(No)150 2599 y(other)31 b(startup)f(\014les)g(are)h +(read.)150 2804 y Fk(In)m(v)m(ok)m(ed)40 b(b)m(y)g(remote)h(shell)h +(daemon)150 2951 y Fu(Bash)36 b(attempts)h(to)g(determine)f(when)f(it)i (is)f(b)s(eing)g(run)e(with)i(its)g(standard)g(input)f(connected)i(to)g -(a)150 3600 y(net)m(w)m(ork)h(connection,)j(as)c(when)g(executed)h(b)m -(y)f(the)h(remote)g(shell)g(daemon,)h(usually)e Fs(rshd)p -Ft(,)h(or)g(the)150 3709 y(secure)c(shell)f(daemon)h -Fs(sshd)p Ft(.)49 b(If)33 b(Bash)g(determines)h(it)g(is)f(b)s(eing)g -(run)f(in)i(this)f(fashion,)h(it)g(reads)g(and)150 3819 -y(executes)42 b(commands)e(from)g(`)p Fs(~/.bashrc)p -Ft(',)h(if)g(that)g(\014le)f(exists)i(and)e(is)g(readable.)72 -b(It)40 b(will)h(not)g(do)150 3929 y(this)35 b(if)g(in)m(v)m(ok)m(ed)i -(as)f Fs(sh)p Ft(.)55 b(The)34 b(`)p Fs(--norc)p Ft(')g(option)i(ma)m -(y)g(b)s(e)f(used)f(to)i(inhibit)f(this)g(b)s(eha)m(vior,)i(and)e(the) -150 4038 y(`)p Fs(--rcfile)p Ft(')29 b(option)i(ma)m(y)g(b)s(e)f(used)g -(to)h(force)g(another)g(\014le)g(to)g(b)s(e)f(read,)h(but)f(neither)h -Fs(rshd)e Ft(nor)h Fs(sshd)150 4148 y Ft(generally)i(in)m(v)m(ok)m(e)g -(the)e(shell)h(with)f(those)h(options)g(or)f(allo)m(w)i(them)e(to)h(b)s -(e)f(sp)s(eci\014ed.)150 4374 y Fj(In)m(v)m(ok)m(ed)40 -b(with)g(unequal)h(e\013ectiv)m(e)e(and)i(real)g Fg(uid/gid)p -Fj(s)150 4521 y Ft(If)24 b(Bash)h(is)f(started)h(with)f(the)h -(e\013ectiv)m(e)i(user)d(\(group\))h(id)f(not)g(equal)h(to)h(the)e -(real)h(user)f(\(group\))h(id,)h(and)150 4631 y(the)35 -b(`)p Fs(-p)p Ft(')g(option)h(is)f(not)g(supplied,)h(no)f(startup)f -(\014les)h(are)h(read,)g(shell)g(functions)e(are)i(not)f(inherited)150 -4740 y(from)41 b(the)g(en)m(vironmen)m(t,)j(the)d Fs(SHELLOPTS)p -Ft(,)h Fs(BASHOPTS)p Ft(,)g Fs(CDPATH)p Ft(,)g(and)e -Fs(GLOBIGNORE)e Ft(v)-5 b(ariables,)45 b(if)150 4850 -y(they)28 b(app)s(ear)f(in)h(the)g(en)m(vironmen)m(t,)i(are)e(ignored,) -h(and)e(the)h(e\013ectiv)m(e)j(user)c(id)h(is)g(set)g(to)h(the)f(real)h -(user)150 4959 y(id.)54 b(If)35 b(the)g(`)p Fs(-p)p Ft(')g(option)g(is) -g(supplied)f(at)h(in)m(v)m(o)s(cation,)k(the)c(startup)g(b)s(eha)m -(vior)g(is)g(the)g(same,)h(but)f(the)150 5069 y(e\013ectiv)m(e)e(user)d -(id)g(is)g(not)h(reset.)150 5342 y Fr(6.3)68 b(In)l(teractiv)l(e)47 -b(Shells)p eop end +(a)150 3060 y(net)m(w)m(ork)h(connection,)j(as)c(when)g(executed)h(b)m +(y)f(the)h(remote)g(shell)g(daemon,)h(usually)e Ft(rshd)p +Fu(,)h(or)g(the)150 3170 y(secure)c(shell)f(daemon)h +Ft(sshd)p Fu(.)49 b(If)33 b(Bash)g(determines)h(it)g(is)f(b)s(eing)g +(run)f(in)i(this)f(fashion,)h(it)g(reads)g(and)150 3280 +y(executes)29 b(commands)e(from)g Ft(~/.bashrc)p Fu(,)e(if)j(that)g +(\014le)f(exists)h(and)f(is)g(readable.)41 b(It)27 b(will)h(not)f(do)h +(this)f(if)150 3389 y(in)m(v)m(ok)m(ed)k(as)f Ft(sh)p +Fu(.)40 b(The)29 b Ft(--norc)f Fu(option)i(ma)m(y)g(b)s(e)f(used)f(to)j +(inhibit)e(this)g(b)s(eha)m(vior,)h(and)f(the)h Ft(--rcfile)150 +3499 y Fu(option)36 b(ma)m(y)g(b)s(e)e(used)h(to)h(force)g(another)f +(\014le)h(to)g(b)s(e)e(read,)j(but)d(neither)i Ft(rshd)e +Fu(nor)h Ft(sshd)f Fu(generally)150 3608 y(in)m(v)m(ok)m(e)e(the)f +(shell)f(with)h(those)f(options)h(or)f(allo)m(w)i(them)f(to)g(b)s(e)e +(sp)s(eci\014ed.)150 3814 y Fk(In)m(v)m(ok)m(ed)40 b(with)g(unequal)h +(e\013ectiv)m(e)e(and)i(real)g Fg(uid/gid)p Fk(s)150 +3960 y Fu(If)34 b(Bash)h(is)g(started)g(with)f(the)h(e\013ectiv)m(e)i +(user)d(\(group\))h(id)f(not)h(equal)g(to)g(the)g(real)g(user)f +(\(group\))h(id,)150 4070 y(and)26 b(the)i Ft(-p)e Fu(option)h(is)g +(not)h(supplied,)e(no)h(startup)g(\014les)g(are)g(read,)h(shell)f +(functions)g(are)g(not)g(inherited)150 4180 y(from)41 +b(the)g(en)m(vironmen)m(t,)j(the)d Ft(SHELLOPTS)p Fu(,)h +Ft(BASHOPTS)p Fu(,)g Ft(CDPATH)p Fu(,)g(and)e Ft(GLOBIGNORE)e +Fu(v)-5 b(ariables,)45 b(if)150 4289 y(they)28 b(app)s(ear)f(in)h(the)g +(en)m(vironmen)m(t,)i(are)e(ignored,)h(and)e(the)h(e\013ectiv)m(e)j +(user)c(id)h(is)g(set)g(to)h(the)f(real)h(user)150 4399 +y(id.)62 b(If)38 b(the)f Ft(-p)h Fu(option)g(is)f(supplied)g(at)h(in)m +(v)m(o)s(cation,)k(the)c(startup)f(b)s(eha)m(vior)h(is)g(the)g(same,)i +(but)d(the)150 4508 y(e\013ectiv)m(e)c(user)d(id)g(is)g(not)h(reset.) +150 4750 y Fs(6.3)68 b(In)l(teractiv)l(e)47 b(Shells)150 +4974 y Fk(6.3.1)63 b(What)40 b(is)h(an)g(In)m(teractiv)m(e)e(Shell?)150 +5121 y Fu(An)g(in)m(teractiv)m(e)k(shell)d(is)g(one)g(started)g +(without)g(non-option)g(argumen)m(ts,)j(unless)c Ft(-s)h +Fu(is)f(sp)s(eci\014ed,)150 5230 y(without)30 b(sp)s(ecifying)g(the)g +Ft(-c)f Fu(option,)h(and)g(whose)f(input)g(and)g(error)h(output)f(are)h +(b)s(oth)f(connected)i(to)150 5340 y(terminals)g(\(as)g(determined)f(b) +m(y)g Ft(isatty\(3\))p Fu(\),)e(or)j(one)f(started)h(with)f(the)h +Ft(-i)f Fu(option.)p eop end %%Page: 84 90 -TeXDict begin 84 89 bop 150 -116 a Ft(Chapter)30 b(6:)41 -b(Bash)30 b(F)-8 b(eatures)2484 b(84)150 299 y Fj(6.3.1)63 -b(What)40 b(is)h(an)g(In)m(teractiv)m(e)e(Shell?)150 -446 y Ft(An)c(in)m(teractiv)m(e)k(shell)d(is)g(one)g(started)g(without) -f(non-option)h(argumen)m(ts,)i(unless)d(`)p Fs(-s)p Ft(')h(is)f(sp)s -(eci\014ed,)150 555 y(without)f(sp)s(ecifying)h(the)f(`)p -Fs(-c)p Ft(')g(option,)j(and)c(whose)h(input)g(and)g(error)g(output)g -(are)g(b)s(oth)g(connected)150 665 y(to)d(terminals)g(\(as)g -(determined)f(b)m(y)g Fs(isatty\(3\))p Ft(\),)f(or)h(one)h(started)f -(with)g(the)h(`)p Fs(-i)p Ft(')f(option.)275 797 y(An)g(in)m(teractiv)m -(e)j(shell)d(generally)i(reads)e(from)g(and)g(writes)g(to)h(a)g(user's) -f(terminal.)275 929 y(The)e(`)p Fs(-s)p Ft(')i(in)m(v)m(o)s(cation)h -(option)f(ma)m(y)g(b)s(e)f(used)f(to)i(set)g(the)g(p)s(ositional)g -(parameters)f(when)g(an)g(in)m(ter-)150 1038 y(activ)m(e)k(shell)d(is)h -(started.)150 1232 y Fj(6.3.2)63 b(Is)41 b(this)g(Shell)g(In)m -(teractiv)m(e?)150 1379 y Ft(T)-8 b(o)30 b(determine)g(within)f(a)h -(startup)g(script)f(whether)g(or)h(not)g(Bash)g(is)g(running)e(in)m -(teractiv)m(ely)-8 b(,)33 b(test)e(the)150 1489 y(v)-5 -b(alue)30 b(of)g(the)f(`)p Fs(-)p Ft(')h(sp)s(ecial)g(parameter.)41 -b(It)29 b(con)m(tains)i Fs(i)e Ft(when)g(the)g(shell)h(is)f(in)m -(teractiv)m(e.)44 b(F)-8 b(or)30 b(example:)390 1621 -y Fs(case)47 b("$-")f(in)390 1730 y(*i*\))h(echo)f(This)h(shell)f(is)h -(interactive)e(;;)390 1840 y(*\))i(echo)g(This)f(shell)h(is)g(not)g -(interactive)e(;;)390 1949 y(esac)275 2081 y Ft(Alternativ)m(ely)-8 -b(,)28 b(startup)23 b(scripts)h(ma)m(y)g(examine)g(the)g(v)-5 -b(ariable)25 b Fs(PS1)p Ft(;)g(it)g(is)e(unset)h(in)f(non-in)m -(teractiv)m(e)150 2191 y(shells,)31 b(and)e(set)i(in)f(in)m(teractiv)m -(e)k(shells.)40 b(Th)m(us:)390 2323 y Fs(if)47 b([)h(-z)f("$PS1")f(];)h -(then)772 2432 y(echo)f(This)h(shell)f(is)i(not)f(interactive)390 -2542 y(else)772 2651 y(echo)f(This)h(shell)f(is)i(interactive)390 -2761 y(fi)150 2955 y Fj(6.3.3)63 b(In)m(teractiv)m(e)38 -b(Shell)k(Beha)m(vior)150 3102 y Ft(When)30 b(the)h(shell)f(is)h +TeXDict begin 84 89 bop 150 -116 a Fu(Chapter)30 b(6:)41 +b(Bash)30 b(F)-8 b(eatures)2484 b(84)275 299 y(An)30 +b(in)m(teractiv)m(e)j(shell)d(generally)i(reads)e(from)g(and)g(writes)g +(to)h(a)g(user's)f(terminal.)275 430 y(The)i Ft(-s)g +Fu(in)m(v)m(o)s(cation)j(option)f(ma)m(y)f(b)s(e)g(used)f(to)i(set)f +(the)g(p)s(ositional)h(parameters)f(when)f(an)h(in)m(ter-)150 +540 y(activ)m(e)g(shell)d(is)h(started.)150 733 y Fk(6.3.2)63 +b(Is)41 b(this)g(Shell)g(In)m(teractiv)m(e?)150 880 y +Fu(T)-8 b(o)30 b(determine)g(within)f(a)h(startup)g(script)f(whether)g +(or)h(not)g(Bash)g(is)g(running)e(in)m(teractiv)m(ely)-8 +b(,)33 b(test)e(the)150 990 y(v)-5 b(alue)30 b(of)g(the)f(`)p +Ft(-)p Fu(')h(sp)s(ecial)g(parameter.)41 b(It)29 b(con)m(tains)i +Ft(i)e Fu(when)g(the)g(shell)h(is)f(in)m(teractiv)m(e.)44 +b(F)-8 b(or)30 b(example:)390 1121 y Ft(case)47 b("$-")f(in)390 +1231 y(*i*\))h(echo)f(This)h(shell)f(is)h(interactive)e(;;)390 +1340 y(*\))i(echo)g(This)f(shell)h(is)g(not)g(interactive)e(;;)390 +1450 y(esac)275 1581 y Fu(Alternativ)m(ely)-8 b(,)28 +b(startup)23 b(scripts)h(ma)m(y)g(examine)g(the)g(v)-5 +b(ariable)25 b Ft(PS1)p Fu(;)g(it)g(is)e(unset)h(in)f(non-in)m +(teractiv)m(e)150 1691 y(shells,)31 b(and)e(set)i(in)f(in)m(teractiv)m +(e)k(shells.)40 b(Th)m(us:)390 1822 y Ft(if)47 b([)h(-z)f("$PS1")f(];)h +(then)772 1932 y(echo)f(This)h(shell)f(is)i(not)f(interactive)390 +2042 y(else)772 2151 y(echo)f(This)h(shell)f(is)i(interactive)390 +2261 y(fi)150 2454 y Fk(6.3.3)63 b(In)m(teractiv)m(e)38 +b(Shell)k(Beha)m(vior)150 2601 y Fu(When)30 b(the)h(shell)f(is)h (running)d(in)m(teractiv)m(ely)-8 b(,)34 b(it)d(c)m(hanges)h(its)f(b)s -(eha)m(vior)f(in)g(sev)m(eral)i(w)m(a)m(ys.)199 3234 +(eha)m(vior)f(in)g(sev)m(eral)i(w)m(a)m(ys.)199 2732 y(1.)61 b(Startup)37 b(\014les)g(are)h(read)f(and)g(executed)h(as)f (describ)s(ed)g(in)g(Section)h(6.2)g([Bash)g(Startup)e(Files],)330 -3343 y(page)31 b(82.)199 3475 y(2.)61 b(Job)35 b(Con)m(trol)g(\(see)h -(Chapter)f(7)g([Job)g(Con)m(trol],)i(page)f(98\))g(is)f(enabled)g(b)m -(y)g(default.)55 b(When)34 b(job)330 3585 y(con)m(trol)h(is)f(in)f +2842 y(page)31 b(82.)199 2973 y(2.)61 b(Job)35 b(Con)m(trol)g(\(see)h +(Chapter)f(7)g([Job)g(Con)m(trol],)i(page)f(97\))g(is)f(enabled)g(b)m +(y)g(default.)55 b(When)34 b(job)330 3083 y(con)m(trol)h(is)f(in)f (e\013ect,)k(Bash)d(ignores)g(the)g(k)m(eyb)s(oard-generated)h(job)e -(con)m(trol)i(signals)g Fs(SIGTTIN)p Ft(,)330 3694 y -Fs(SIGTTOU)p Ft(,)29 b(and)g Fs(SIGTSTP)p Ft(.)199 3826 -y(3.)61 b(Bash)39 b(expands)f(and)g(displa)m(ys)h Fs(PS1)f -Ft(b)s(efore)h(reading)g(the)g(\014rst)f(line)h(of)g(a)g(command,)i -(and)d(ex-)330 3936 y(pands)30 b(and)g(displa)m(ys)h -Fs(PS2)e Ft(b)s(efore)i(reading)g(the)g(second)f(and)h(subsequen)m(t)f -(lines)h(of)g(a)g(m)m(ulti-line)330 4045 y(command.)199 -4177 y(4.)61 b(Bash)26 b(executes)i(the)e(v)-5 b(alue)27 -b(of)f(the)h Fs(PROMPT_COMMAND)22 b Ft(v)-5 b(ariable)27 -b(as)g(a)f(command)g(b)s(efore)g(prin)m(ting)330 4287 -y(the)31 b(primary)e(prompt,)h Fs($PS1)f Ft(\(see)i(Section)g(5.2)h -([Bash)f(V)-8 b(ariables],)32 b(page)f(69\).)199 4419 +(con)m(trol)i(signals)g Ft(SIGTTIN)p Fu(,)330 3192 y +Ft(SIGTTOU)p Fu(,)29 b(and)g Ft(SIGTSTP)p Fu(.)199 3324 +y(3.)61 b(Bash)39 b(expands)f(and)g(displa)m(ys)h Ft(PS1)f +Fu(b)s(efore)h(reading)g(the)g(\014rst)f(line)h(of)g(a)g(command,)i +(and)d(ex-)330 3434 y(pands)30 b(and)g(displa)m(ys)h +Ft(PS2)e Fu(b)s(efore)i(reading)g(the)g(second)f(and)h(subsequen)m(t)f +(lines)h(of)g(a)g(m)m(ulti-line)330 3543 y(command.)199 +3675 y(4.)61 b(Bash)26 b(executes)i(the)e(v)-5 b(alue)27 +b(of)f(the)h Ft(PROMPT_COMMAND)22 b Fu(v)-5 b(ariable)27 +b(as)g(a)f(command)g(b)s(efore)g(prin)m(ting)330 3784 +y(the)31 b(primary)e(prompt,)h Ft($PS1)f Fu(\(see)i(Section)g(5.2)h +([Bash)f(V)-8 b(ariables],)32 b(page)f(69\).)199 3916 y(5.)61 b(Readline)27 b(\(see)g(Chapter)e(8)h([Command)g(Line)g -(Editing],)h(page)g(102\))g(is)f(used)g(to)g(read)g(commands)330 -4528 y(from)k(the)g(user's)g(terminal.)199 4660 y(6.)61 +(Editing],)h(page)g(101\))g(is)f(used)g(to)g(read)g(commands)330 +4025 y(from)k(the)g(user's)g(terminal.)199 4157 y(6.)61 b(Bash)36 b(insp)s(ects)g(the)h(v)-5 b(alue)37 b(of)f(the)g -Fs(ignoreeof)e Ft(option)j(to)g Fs(set)29 b(-o)36 b Ft(instead)h(of)f -(exiting)i(imme-)330 4770 y(diately)f(when)e(it)i(receiv)m(es)h(an)e -Fs(EOF)f Ft(on)h(its)g(standard)f(input)g(when)h(reading)g(a)g(command) -g(\(see)330 4879 y(Section)31 b(4.3.1)h([The)e(Set)h(Builtin],)g(page)g -(59\).)199 5011 y(7.)61 b(Command)43 b(history)h(\(see)h(Section)g(9.1) -g([Bash)f(History)h(F)-8 b(acilities],)51 b(page)45 b(134\))h(and)d -(history)330 5121 y(expansion)h(\(see)i(Section)f(9.3)h([History)g(In)m -(teraction],)k(page)45 b(136\))h(are)f(enabled)g(b)m(y)f(default.)330 -5230 y(Bash)28 b(will)g(sa)m(v)m(e)h(the)f(command)f(history)h(to)g -(the)g(\014le)g(named)f(b)m(y)h Fs($HISTFILE)d Ft(when)h(a)i(shell)g -(with)330 5340 y(history)i(enabled)h(exits.)p eop end +Ft(ignoreeof)e Fu(option)j(to)g Ft(set)29 b(-o)36 b Fu(instead)h(of)f +(exiting)i(imme-)330 4266 y(diately)f(when)e(it)i(receiv)m(es)h(an)e +Ft(EOF)f Fu(on)h(its)g(standard)f(input)g(when)h(reading)g(a)g(command) +g(\(see)330 4376 y(Section)31 b(4.3.1)h([The)e(Set)h(Builtin],)g(page)g +(58\).)199 4507 y(7.)61 b(Command)43 b(history)h(\(see)h(Section)g(9.1) +g([Bash)f(History)h(F)-8 b(acilities],)51 b(page)45 b(133\))h(and)d +(history)330 4617 y(expansion)h(\(see)i(Section)f(9.3)h([History)g(In)m +(teraction],)k(page)45 b(135\))h(are)f(enabled)g(b)m(y)f(default.)330 +4726 y(Bash)28 b(will)g(sa)m(v)m(e)h(the)f(command)f(history)h(to)g +(the)g(\014le)g(named)f(b)m(y)h Ft($HISTFILE)d Fu(when)h(a)i(shell)g +(with)330 4836 y(history)i(enabled)h(exits.)199 4967 +y(8.)61 b(Alias)31 b(expansion)g(\(see)g(Section)g(6.6)g([Aliases],)i +(page)e(88\))h(is)e(p)s(erformed)f(b)m(y)h(default.)199 +5099 y(9.)61 b(In)24 b(the)g(absence)h(of)f(an)m(y)h(traps,)g(Bash)g +(ignores)f Ft(SIGTERM)f Fu(\(see)i(Section)g(3.7.6)h([Signals],)g(page) +f(38\).)154 5230 y(10.)61 b(In)26 b(the)h(absence)h(of)f(an)m(y)g +(traps,)g Ft(SIGINT)e Fu(is)i(caugh)m(t)h(and)f(handled)e(\(\(see)k +(Section)e(3.7.6)i([Signals],)330 5340 y(page)i(38\).)42 +b Ft(SIGINT)29 b Fu(will)h(in)m(terrupt)g(some)h(shell)g(builtins.)p +eop end %%Page: 85 91 -TeXDict begin 85 90 bop 150 -116 a Ft(Chapter)30 b(6:)41 -b(Bash)30 b(F)-8 b(eatures)2484 b(85)199 299 y(8.)61 -b(Alias)31 b(expansion)g(\(see)g(Section)g(6.6)g([Aliases],)i(page)e -(88\))h(is)e(p)s(erformed)f(b)m(y)h(default.)199 431 -y(9.)61 b(In)24 b(the)g(absence)h(of)f(an)m(y)h(traps,)g(Bash)g -(ignores)f Fs(SIGTERM)f Ft(\(see)i(Section)g(3.7.6)h([Signals],)g(page) -f(38\).)154 563 y(10.)61 b(In)26 b(the)h(absence)h(of)f(an)m(y)g -(traps,)g Fs(SIGINT)e Ft(is)i(caugh)m(t)h(and)f(handled)e(\(\(see)k -(Section)e(3.7.6)i([Signals],)330 672 y(page)i(38\).)42 -b Fs(SIGINT)29 b Ft(will)h(in)m(terrupt)g(some)h(shell)g(builtins.)154 -804 y(11.)61 b(An)40 b(in)m(teractiv)m(e)j(login)e(shell)g(sends)e(a)i -Fs(SIGHUP)d Ft(to)j(all)g(jobs)f(on)g(exit)h(if)g(the)f -Fs(huponexit)e Ft(shell)330 914 y(option)31 b(has)f(b)s(een)g(enabled)g +TeXDict begin 85 90 bop 150 -116 a Fu(Chapter)30 b(6:)41 +b(Bash)30 b(F)-8 b(eatures)2484 b(85)154 299 y(11.)61 +b(An)40 b(in)m(teractiv)m(e)j(login)e(shell)g(sends)e(a)i +Ft(SIGHUP)d Fu(to)j(all)g(jobs)f(on)g(exit)h(if)g(the)f +Ft(huponexit)e Fu(shell)330 408 y(option)31 b(has)f(b)s(een)g(enabled)g (\(see)h(Section)g(3.7.6)i([Signals],)e(page)g(38\).)154 -1046 y(12.)61 b(The)26 b(`)p Fs(-n)p Ft(')f(in)m(v)m(o)s(cation)k -(option)d(is)g(ignored,)h(and)f(`)p Fs(set)k(-n)p Ft(')25 -b(has)h(no)g(e\013ect)i(\(see)e(Section)h(4.3.1)h([The)330 -1155 y(Set)j(Builtin],)g(page)g(59\).)154 1287 y(13.)61 -b(Bash)32 b(will)g(c)m(hec)m(k)i(for)e(mail)g(p)s(erio)s(dically)-8 -b(,)34 b(dep)s(ending)c(on)i(the)g(v)-5 b(alues)32 b(of)g(the)h -Fs(MAIL)p Ft(,)e Fs(MAILPATH)p Ft(,)330 1397 y(and)f -Fs(MAILCHECK)e Ft(shell)i(v)-5 b(ariables)31 b(\(see)h(Section)f(5.2)g -([Bash)g(V)-8 b(ariables],)32 b(page)f(69\).)154 1528 -y(14.)61 b(Expansion)32 b(errors)h(due)f(to)i(references)f(to)h(un)m(b) -s(ound)c(shell)j(v)-5 b(ariables)34 b(after)g(`)p Fs(set)29 -b(-u)p Ft(')k(has)g(b)s(een)330 1638 y(enabled)d(will)h(not)g(cause)g -(the)f(shell)h(to)g(exit)g(\(see)g(Section)h(4.3.1)g([The)e(Set)h -(Builtin],)g(page)g(59\).)154 1770 y(15.)61 b(The)48 -b(shell)h(will)f(not)h(exit)g(on)g(expansion)f(errors)g(caused)g(b)m(y) -h Fq(v)-5 b(ar)54 b Ft(b)s(eing)48 b(unset)g(or)h(n)m(ull)f(in)330 -1879 y Fs(${)p Fi(var)11 b Fs(:?)p Fi(word)g Fs(})26 -b Ft(expansions)k(\(see)h(Section)h(3.5.3)g([Shell)e(P)m(arameter)i -(Expansion],)e(page)h(23\).)154 2011 y(16.)61 b(Redirection)31 -b(errors)f(encoun)m(tered)h(b)m(y)f(shell)h(builtins)f(will)g(not)h -(cause)g(the)f(shell)h(to)g(exit.)154 2143 y(17.)61 b(When)26 -b(running)f(in)i Fl(posix)e Ft(mo)s(de,)j(a)f(sp)s(ecial)g(builtin)f -(returning)g(an)g(error)h(status)g(will)g(not)f(cause)330 -2253 y(the)31 b(shell)f(to)h(exit)h(\(see)f(Section)g(6.11)h([Bash)f -(POSIX)e(Mo)s(de],)i(page)g(94\).)154 2385 y(18.)61 b(A)34 -b(failed)g Fs(exec)f Ft(will)h(not)g(cause)g(the)g(shell)g(to)g(exit)h -(\(see)f(Section)h(4.1)g([Bourne)f(Shell)f(Builtins],)330 -2494 y(page)e(41\).)154 2626 y(19.)61 b(P)m(arser)31 +542 y(12.)61 b(The)29 b Ft(-n)g Fu(in)m(v)m(o)s(cation)j(option)e(is)g +(ignored,)g(and)f(`)p Ft(set)h(-n)p Fu(')f(has)h(no)f(e\013ect)j(\(see) +e(Section)h(4.3.1)g([The)330 652 y(Set)g(Builtin],)g(page)g(58\).)154 +785 y(13.)61 b(Bash)32 b(will)g(c)m(hec)m(k)i(for)e(mail)g(p)s(erio)s +(dically)-8 b(,)34 b(dep)s(ending)c(on)i(the)g(v)-5 b(alues)32 +b(of)g(the)h Ft(MAIL)p Fu(,)e Ft(MAILPATH)p Fu(,)330 +895 y(and)f Ft(MAILCHECK)e Fu(shell)i(v)-5 b(ariables)31 +b(\(see)h(Section)f(5.2)g([Bash)g(V)-8 b(ariables],)32 +b(page)f(69\).)154 1028 y(14.)61 b(Expansion)32 b(errors)h(due)f(to)i +(references)f(to)h(un)m(b)s(ound)c(shell)j(v)-5 b(ariables)34 +b(after)g(`)p Ft(set)29 b(-u)p Fu(')k(has)g(b)s(een)330 +1138 y(enabled)d(will)h(not)g(cause)g(the)f(shell)h(to)g(exit)g(\(see)g +(Section)h(4.3.1)g([The)e(Set)h(Builtin],)g(page)g(58\).)154 +1271 y(15.)61 b(The)48 b(shell)h(will)f(not)h(exit)g(on)g(expansion)f +(errors)g(caused)g(b)m(y)h Fr(v)-5 b(ar)54 b Fu(b)s(eing)48 +b(unset)g(or)h(n)m(ull)f(in)330 1381 y Ft(${)p Fj(var)p +Ft(:?)p Fj(word)p Ft(})27 b Fu(expansions)j(\(see)h(Section)h(3.5.3)g +([Shell)e(P)m(arameter)i(Expansion],)e(page)h(23\).)154 +1514 y(16.)61 b(Redirection)31 b(errors)f(encoun)m(tered)h(b)m(y)f +(shell)h(builtins)f(will)g(not)h(cause)g(the)f(shell)h(to)g(exit.)154 +1648 y(17.)61 b(When)26 b(running)f(in)i Fm(posix)e Fu(mo)s(de,)j(a)f +(sp)s(ecial)g(builtin)f(returning)g(an)g(error)h(status)g(will)g(not)f +(cause)330 1757 y(the)31 b(shell)f(to)h(exit)h(\(see)f(Section)g(6.11)h +([Bash)f(POSIX)e(Mo)s(de],)i(page)g(94\).)154 1891 y(18.)61 +b(A)34 b(failed)g Ft(exec)f Fu(will)h(not)g(cause)g(the)g(shell)g(to)g +(exit)h(\(see)f(Section)h(4.1)g([Bourne)f(Shell)f(Builtins],)330 +2000 y(page)e(41\).)154 2134 y(19.)61 b(P)m(arser)31 b(syn)m(tax)f(errors)g(will)h(not)g(cause)g(the)f(shell)h(to)g(exit.) -154 2758 y(20.)61 b(Simple)21 b(sp)s(elling)h(correction)g(for)g -(directory)g(argumen)m(ts)f(to)i(the)e Fs(cd)g Ft(builtin)g(is)h -(enabled)f(b)m(y)h(default)330 2868 y(\(see)35 b(the)g(description)f -(of)h(the)f Fs(cdspell)f Ft(option)h(to)i(the)e Fs(shopt)f -Ft(builtin)h(in)g(Section)h(4.3.2)h([The)330 2977 y(Shopt)30 -b(Builtin],)h(page)g(63\).)154 3109 y(21.)61 b(The)42 +154 2267 y(20.)61 b(Simple)21 b(sp)s(elling)h(correction)g(for)g +(directory)g(argumen)m(ts)f(to)i(the)e Ft(cd)g Fu(builtin)g(is)h +(enabled)f(b)m(y)h(default)330 2377 y(\(see)35 b(the)g(description)f +(of)h(the)f Ft(cdspell)f Fu(option)h(to)i(the)e Ft(shopt)f +Fu(builtin)h(in)g(Section)h(4.3.2)h([The)330 2486 y(Shopt)30 +b(Builtin],)h(page)g(62\).)154 2620 y(21.)61 b(The)42 b(shell)h(will)g(c)m(hec)m(k)h(the)f(v)-5 b(alue)43 b(of)f(the)h -Fs(TMOUT)e Ft(v)-5 b(ariable)44 b(and)e(exit)h(if)g(a)g(command)f(is)h -(not)330 3219 y(read)30 b(within)g(the)g(sp)s(eci\014ed)f(n)m(um)m(b)s -(er)g(of)i(seconds)f(after)g(prin)m(ting)g Fs($PS1)f -Ft(\(see)i(Section)g(5.2)h([Bash)330 3328 y(V)-8 b(ariables],)32 -b(page)f(69\).)150 3555 y Fr(6.4)68 b(Bash)45 b(Conditional)h -(Expressions)150 3715 y Ft(Conditional)26 b(expressions)g(are)g(used)f -(b)m(y)g(the)h Fs([[)f Ft(comp)s(ound)g(command)g(and)g(the)h -Fs(test)f Ft(and)g Fs([)g Ft(builtin)150 3824 y(commands.)275 -3956 y(Expressions)32 b(ma)m(y)h(b)s(e)g(unary)f(or)h(binary)-8 +Ft(TMOUT)e Fu(v)-5 b(ariable)44 b(and)e(exit)h(if)g(a)g(command)f(is)h +(not)330 2729 y(read)30 b(within)g(the)g(sp)s(eci\014ed)f(n)m(um)m(b)s +(er)g(of)i(seconds)f(after)g(prin)m(ting)g Ft($PS1)f +Fu(\(see)i(Section)g(5.2)h([Bash)330 2839 y(V)-8 b(ariables],)32 +b(page)f(69\).)150 3069 y Fs(6.4)68 b(Bash)45 b(Conditional)h +(Expressions)150 3229 y Fu(Conditional)26 b(expressions)g(are)g(used)f +(b)m(y)g(the)h Ft([[)f Fu(comp)s(ound)g(command)g(and)g(the)h +Ft(test)f Fu(and)g Ft([)g Fu(builtin)150 3338 y(commands.)275 +3472 y(Expressions)32 b(ma)m(y)h(b)s(e)g(unary)f(or)h(binary)-8 b(.)48 b(Unary)33 b(expressions)f(are)i(often)f(used)f(to)i(examine)g -(the)150 4066 y(status)26 b(of)g(a)h(\014le.)39 b(There)26 -b(are)g(string)g(op)s(erators)g(and)g(n)m(umeric)f(comparison)i(op)s -(erators)f(as)g(w)m(ell.)40 b(If)26 b(the)150 4175 y -Fq(\014le)38 b Ft(argumen)m(t)c(to)f(one)h(of)f(the)g(primaries)g(is)g -(of)g(the)g(form)g(`)p Fs(/dev/fd/)p Fi(N)11 b Ft(',)31 -b(then)i(\014le)g(descriptor)g Fq(N)43 b Ft(is)150 4285 -y(c)m(hec)m(k)m(ed.)e(If)26 b(the)g Fq(\014le)31 b Ft(argumen)m(t)26 -b(to)h(one)f(of)g(the)h(primaries)e(is)h(one)g(of)g(`)p -Fs(/dev/stdin)p Ft(',)f(`)p Fs(/dev/stdout)p Ft(',)150 -4395 y(or)30 b(`)p Fs(/dev/stderr)p Ft(',)e(\014le)j(descriptor)f(0,)h -(1,)g(or)g(2,)g(resp)s(ectiv)m(ely)-8 b(,)32 b(is)e(c)m(hec)m(k)m(ed.) -275 4526 y(When)37 b(used)g(with)g Fs([[)p Ft(,)i(the)f(`)p -Fs(<)p Ft(')g(and)f(`)p Fs(>)p Ft(')h(op)s(erators)g(sort)g -(lexicographically)i(using)d(the)h(curren)m(t)150 4636 -y(lo)s(cale.)k(The)30 b Fs(test)f Ft(command)i(uses)f(ASCI)s(I)e -(ordering.)275 4768 y(Unless)44 b(otherwise)h(sp)s(eci\014ed,)j +(the)150 3581 y(status)i(of)g(a)g(\014le.)57 b(There)35 +b(are)h(string)g(op)s(erators)g(and)f(n)m(umeric)h(comparison)g(op)s +(erators)g(as)g(w)m(ell.)57 b(If)150 3691 y(the)27 b +Fr(\014le)33 b Fu(argumen)m(t)28 b(to)g(one)f(of)g(the)h(primaries)f +(is)g(of)g(the)h(form)f Ft(/dev/fd/)p Fj(N)p Fu(,)e(then)i(\014le)h +(descriptor)f Fr(N)37 b Fu(is)150 3800 y(c)m(hec)m(k)m(ed.)51 +b(If)32 b(the)h Fr(\014le)39 b Fu(argumen)m(t)33 b(to)h(one)f(of)g(the) +g(primaries)g(is)g(one)g(of)h Ft(/dev/stdin)p Fu(,)d +Ft(/dev/stdout)p Fu(,)150 3910 y(or)f Ft(/dev/stderr)p +Fu(,)e(\014le)i(descriptor)h(0,)g(1,)g(or)f(2,)h(resp)s(ectiv)m(ely)-8 +b(,)32 b(is)f(c)m(hec)m(k)m(ed.)275 4043 y(When)37 b(used)g(with)g +Ft([[)p Fu(,)i(the)f(`)p Ft(<)p Fu(')g(and)f(`)p Ft(>)p +Fu(')h(op)s(erators)g(sort)g(lexicographically)i(using)d(the)h(curren)m +(t)150 4153 y(lo)s(cale.)k(The)30 b Ft(test)f Fu(command)i(uses)f(ASCI) +s(I)e(ordering.)275 4287 y(Unless)44 b(otherwise)h(sp)s(eci\014ed,)j (primaries)c(that)h(op)s(erate)g(on)g(\014les)f(follo)m(w)i(sym)m(b)s -(olic)f(links)g(and)150 4878 y(op)s(erate)31 b(on)f(the)h(target)h(of)e +(olic)f(links)g(and)150 4396 y(op)s(erate)31 b(on)f(the)h(target)h(of)e (the)h(link,)f(rather)h(than)f(the)g(link)h(itself.)150 -5032 y Fs(-a)f Fi(file)162 b Ft(T)-8 b(rue)30 b(if)g -Fq(\014le)36 b Ft(exists.)150 5186 y Fs(-b)30 b Fi(file)162 -b Ft(T)-8 b(rue)30 b(if)g Fq(\014le)36 b Ft(exists)31 +4553 y Ft(-a)f Fj(file)162 b Fu(T)-8 b(rue)30 b(if)g +Fr(\014le)36 b Fu(exists.)150 4711 y Ft(-b)30 b Fj(file)162 +b Fu(T)-8 b(rue)30 b(if)g Fr(\014le)36 b Fu(exists)31 b(and)f(is)g(a)h(blo)s(c)m(k)g(sp)s(ecial)g(\014le.)150 -5340 y Fs(-c)f Fi(file)162 b Ft(T)-8 b(rue)30 b(if)g -Fq(\014le)36 b Ft(exists)31 b(and)f(is)g(a)h(c)m(haracter)h(sp)s(ecial) -f(\014le.)p eop end +4868 y Ft(-c)f Fj(file)162 b Fu(T)-8 b(rue)30 b(if)g +Fr(\014le)36 b Fu(exists)31 b(and)f(is)g(a)h(c)m(haracter)h(sp)s(ecial) +f(\014le.)150 5025 y Ft(-d)f Fj(file)162 b Fu(T)-8 b(rue)30 +b(if)g Fr(\014le)36 b Fu(exists)31 b(and)f(is)g(a)h(directory)-8 +b(.)150 5183 y Ft(-e)30 b Fj(file)162 b Fu(T)-8 b(rue)30 +b(if)g Fr(\014le)36 b Fu(exists.)150 5340 y Ft(-f)30 +b Fj(file)162 b Fu(T)-8 b(rue)30 b(if)g Fr(\014le)36 +b Fu(exists)31 b(and)f(is)g(a)h(regular)f(\014le.)p eop +end %%Page: 86 92 -TeXDict begin 86 91 bop 150 -116 a Ft(Chapter)30 b(6:)41 -b(Bash)30 b(F)-8 b(eatures)2484 b(86)150 299 y Fs(-d)30 -b Fi(file)162 b Ft(T)-8 b(rue)30 b(if)g Fq(\014le)36 -b Ft(exists)31 b(and)f(is)g(a)h(directory)-8 b(.)150 -463 y Fs(-e)30 b Fi(file)162 b Ft(T)-8 b(rue)30 b(if)g -Fq(\014le)36 b Ft(exists.)150 628 y Fs(-f)30 b Fi(file)162 -b Ft(T)-8 b(rue)30 b(if)g Fq(\014le)36 b Ft(exists)31 -b(and)f(is)g(a)h(regular)f(\014le.)150 792 y Fs(-g)g -Fi(file)162 b Ft(T)-8 b(rue)30 b(if)g Fq(\014le)36 b -Ft(exists)31 b(and)f(its)g(set-group-id)h(bit)g(is)f(set.)150 -956 y Fs(-h)g Fi(file)162 b Ft(T)-8 b(rue)30 b(if)g Fq(\014le)36 -b Ft(exists)31 b(and)f(is)g(a)h(sym)m(b)s(olic)g(link.)150 -1121 y Fs(-k)f Fi(file)162 b Ft(T)-8 b(rue)30 b(if)g -Fq(\014le)36 b Ft(exists)31 b(and)f(its)g Fs(")p Ft(stic)m(ky)p -Fs(")h Ft(bit)g(is)f(set.)150 1285 y Fs(-p)g Fi(file)162 -b Ft(T)-8 b(rue)30 b(if)g Fq(\014le)36 b Ft(exists)31 -b(and)f(is)g(a)h(named)f(pip)s(e)f(\(FIF)m(O\).)150 1450 -y Fs(-r)h Fi(file)162 b Ft(T)-8 b(rue)30 b(if)g Fq(\014le)36 -b Ft(exists)31 b(and)f(is)g(readable.)150 1614 y Fs(-s)g -Fi(file)162 b Ft(T)-8 b(rue)30 b(if)g Fq(\014le)36 b -Ft(exists)31 b(and)f(has)g(a)g(size)i(greater)f(than)f(zero.)150 -1778 y Fs(-t)g Fi(fd)258 b Ft(T)-8 b(rue)30 b(if)g(\014le)h(descriptor) -f Fq(fd)j Ft(is)e(op)s(en)e(and)h(refers)g(to)h(a)g(terminal.)150 -1943 y Fs(-u)f Fi(file)162 b Ft(T)-8 b(rue)30 b(if)g -Fq(\014le)36 b Ft(exists)31 b(and)f(its)g(set-user-id)h(bit)f(is)h -(set.)150 2107 y Fs(-w)f Fi(file)162 b Ft(T)-8 b(rue)30 -b(if)g Fq(\014le)36 b Ft(exists)31 b(and)f(is)g(writable.)150 -2271 y Fs(-x)g Fi(file)162 b Ft(T)-8 b(rue)30 b(if)g -Fq(\014le)36 b Ft(exists)31 b(and)f(is)g(executable.)150 -2436 y Fs(-G)g Fi(file)162 b Ft(T)-8 b(rue)30 b(if)g -Fq(\014le)36 b Ft(exists)31 b(and)f(is)g(o)m(wned)g(b)m(y)h(the)f -(e\013ectiv)m(e)j(group)d(id.)150 2600 y Fs(-L)g Fi(file)162 -b Ft(T)-8 b(rue)30 b(if)g Fq(\014le)36 b Ft(exists)31 -b(and)f(is)g(a)h(sym)m(b)s(olic)g(link.)150 2765 y Fs(-N)f -Fi(file)162 b Ft(T)-8 b(rue)30 b(if)g Fq(\014le)36 b -Ft(exists)31 b(and)f(has)g(b)s(een)f(mo)s(di\014ed)h(since)g(it)h(w)m -(as)g(last)g(read.)150 2929 y Fs(-O)f Fi(file)162 b Ft(T)-8 -b(rue)30 b(if)g Fq(\014le)36 b Ft(exists)31 b(and)f(is)g(o)m(wned)g(b)m -(y)h(the)f(e\013ectiv)m(e)j(user)d(id.)150 3093 y Fs(-S)g -Fi(file)162 b Ft(T)-8 b(rue)30 b(if)g Fq(\014le)36 b -Ft(exists)31 b(and)f(is)g(a)h(so)s(c)m(k)m(et.)150 3258 -y Fi(file1)39 b Fs(-ef)30 b Fi(file2)630 3367 y Ft(T)-8 -b(rue)30 b(if)g Fq(\014le1)38 b Ft(and)30 b Fq(\014le2)38 -b Ft(refer)30 b(to)i(the)e(same)h(device)g(and)f(ino)s(de)g(n)m(um)m(b) -s(ers.)150 3532 y Fi(file1)39 b Fs(-nt)30 b Fi(file2)630 -3641 y Ft(T)-8 b(rue)23 b(if)g Fq(\014le1)31 b Ft(is)24 -b(new)m(er)f(\(according)i(to)f(mo)s(di\014cation)g(date\))g(than)g -Fq(\014le2)7 b Ft(,)25 b(or)f(if)f Fq(\014le1)31 b Ft(exists)630 -3751 y(and)f Fq(\014le2)38 b Ft(do)s(es)30 b(not.)150 -3915 y Fi(file1)39 b Fs(-ot)30 b Fi(file2)630 4025 y -Ft(T)-8 b(rue)30 b(if)g Fq(\014le1)38 b Ft(is)31 b(older)f(than)g -Fq(\014le2)7 b Ft(,)32 b(or)e(if)h Fq(\014le2)38 b Ft(exists)31 -b(and)e Fq(\014le1)39 b Ft(do)s(es)30 b(not.)150 4189 -y Fs(-o)g Fi(optname)630 4299 y Ft(T)-8 b(rue)41 b(if)g(the)g(shell)h -(option)f Fq(optname)47 b Ft(is)41 b(enabled.)73 b(The)41 -b(list)h(of)f(options)h(app)s(ears)e(in)630 4408 y(the)30 -b(description)f(of)h(the)g(`)p Fs(-o)p Ft(')f(option)h(to)h(the)e -Fs(set)g Ft(builtin)g(\(see)i(Section)f(4.3.1)h([The)f(Set)630 -4518 y(Builtin],)h(page)g(59\).)150 4682 y Fs(-v)f Fi(varname)630 -4792 y Ft(T)-8 b(rue)30 b(if)g(the)h(shell)f(v)-5 b(ariable)32 -b Fq(v)-5 b(arname)35 b Ft(is)30 b(set)h(\(has)g(b)s(een)e(assigned)i -(a)g(v)-5 b(alue\).)150 4956 y Fs(-R)30 b Fi(varname)630 -5066 y Ft(T)-8 b(rue)30 b(if)g(the)h(shell)f(v)-5 b(ariable)32 -b Fq(v)-5 b(arname)35 b Ft(is)30 b(set)h(and)f(is)h(a)f(name)h -(reference.)150 5230 y Fs(-z)f Fi(string)630 5340 y Ft(T)-8 -b(rue)30 b(if)g(the)h(length)g(of)f Fq(string)38 b Ft(is)31 -b(zero.)p eop end +TeXDict begin 86 91 bop 150 -116 a Fu(Chapter)30 b(6:)41 +b(Bash)30 b(F)-8 b(eatures)2484 b(86)150 299 y Ft(-g)30 +b Fj(file)162 b Fu(T)-8 b(rue)30 b(if)g Fr(\014le)36 +b Fu(exists)31 b(and)f(its)g(set-group-id)h(bit)g(is)f(set.)150 +446 y Ft(-h)g Fj(file)162 b Fu(T)-8 b(rue)30 b(if)g Fr(\014le)36 +b Fu(exists)31 b(and)f(is)g(a)h(sym)m(b)s(olic)g(link.)150 +593 y Ft(-k)f Fj(file)162 b Fu(T)-8 b(rue)30 b(if)g Fr(\014le)36 +b Fu(exists)31 b(and)f(its)g Ft(")p Fu(stic)m(ky)p Ft(")h +Fu(bit)g(is)f(set.)150 740 y Ft(-p)g Fj(file)162 b Fu(T)-8 +b(rue)30 b(if)g Fr(\014le)36 b Fu(exists)31 b(and)f(is)g(a)h(named)f +(pip)s(e)f(\(FIF)m(O\).)150 886 y Ft(-r)h Fj(file)162 +b Fu(T)-8 b(rue)30 b(if)g Fr(\014le)36 b Fu(exists)31 +b(and)f(is)g(readable.)150 1033 y Ft(-s)g Fj(file)162 +b Fu(T)-8 b(rue)30 b(if)g Fr(\014le)36 b Fu(exists)31 +b(and)f(has)g(a)g(size)i(greater)f(than)f(zero.)150 1180 +y Ft(-t)g Fj(fd)258 b Fu(T)-8 b(rue)30 b(if)g(\014le)h(descriptor)f +Fr(fd)j Fu(is)e(op)s(en)e(and)h(refers)g(to)h(a)g(terminal.)150 +1327 y Ft(-u)f Fj(file)162 b Fu(T)-8 b(rue)30 b(if)g +Fr(\014le)36 b Fu(exists)31 b(and)f(its)g(set-user-id)h(bit)f(is)h +(set.)150 1474 y Ft(-w)f Fj(file)162 b Fu(T)-8 b(rue)30 +b(if)g Fr(\014le)36 b Fu(exists)31 b(and)f(is)g(writable.)150 +1621 y Ft(-x)g Fj(file)162 b Fu(T)-8 b(rue)30 b(if)g +Fr(\014le)36 b Fu(exists)31 b(and)f(is)g(executable.)150 +1768 y Ft(-G)g Fj(file)162 b Fu(T)-8 b(rue)30 b(if)g +Fr(\014le)36 b Fu(exists)31 b(and)f(is)g(o)m(wned)g(b)m(y)h(the)f +(e\013ectiv)m(e)j(group)d(id.)150 1915 y Ft(-L)g Fj(file)162 +b Fu(T)-8 b(rue)30 b(if)g Fr(\014le)36 b Fu(exists)31 +b(and)f(is)g(a)h(sym)m(b)s(olic)g(link.)150 2062 y Ft(-N)f +Fj(file)162 b Fu(T)-8 b(rue)30 b(if)g Fr(\014le)36 b +Fu(exists)31 b(and)f(has)g(b)s(een)f(mo)s(di\014ed)h(since)g(it)h(w)m +(as)g(last)g(read.)150 2209 y Ft(-O)f Fj(file)162 b Fu(T)-8 +b(rue)30 b(if)g Fr(\014le)36 b Fu(exists)31 b(and)f(is)g(o)m(wned)g(b)m +(y)h(the)f(e\013ectiv)m(e)j(user)d(id.)150 2355 y Ft(-S)g +Fj(file)162 b Fu(T)-8 b(rue)30 b(if)g Fr(\014le)36 b +Fu(exists)31 b(and)f(is)g(a)h(so)s(c)m(k)m(et.)150 2502 +y Fj(file1)e Ft(-ef)g Fj(file2)630 2612 y Fu(T)-8 b(rue)30 +b(if)g Fr(\014le1)38 b Fu(and)30 b Fr(\014le2)38 b Fu(refer)30 +b(to)i(the)e(same)h(device)g(and)f(ino)s(de)g(n)m(um)m(b)s(ers.)150 +2759 y Fj(file1)f Ft(-nt)g Fj(file2)630 2868 y Fu(T)-8 +b(rue)23 b(if)h Fr(\014le1)32 b Fu(is)24 b(new)m(er)g(\(according)h(to) +g(mo)s(di\014cation)f(date\))h(than)f Fr(\014le2)p Fu(,)i(or)e(if)g +Fr(\014le1)31 b Fu(exists)630 2978 y(and)f Fr(\014le2)38 +b Fu(do)s(es)30 b(not.)150 3125 y Fj(file1)f Ft(-ot)g +Fj(file2)630 3234 y Fu(T)-8 b(rue)30 b(if)g Fr(\014le1)38 +b Fu(is)31 b(older)f(than)g Fr(\014le2)p Fu(,)i(or)e(if)g +Fr(\014le2)38 b Fu(exists)31 b(and)f Fr(\014le1)38 b +Fu(do)s(es)30 b(not.)150 3381 y Ft(-o)g Fj(optname)630 +3491 y Fu(T)-8 b(rue)41 b(if)g(the)g(shell)h(option)f +Fr(optname)47 b Fu(is)41 b(enabled.)73 b(The)41 b(list)h(of)f(options)h +(app)s(ears)e(in)630 3601 y(the)33 b(description)h(of)f(the)g +Ft(-o)g Fu(option)g(to)h(the)g Ft(set)e Fu(builtin)h(\(see)h(Section)g +(4.3.1)h([The)e(Set)630 3710 y(Builtin],)e(page)g(58\).)150 +3857 y Ft(-v)f Fj(varname)630 3967 y Fu(T)-8 b(rue)30 +b(if)g(the)h(shell)f(v)-5 b(ariable)32 b Fr(v)-5 b(arname)35 +b Fu(is)30 b(set)h(\(has)g(b)s(een)e(assigned)i(a)g(v)-5 +b(alue\).)150 4114 y Ft(-R)30 b Fj(varname)630 4223 y +Fu(T)-8 b(rue)30 b(if)g(the)h(shell)f(v)-5 b(ariable)32 +b Fr(v)-5 b(arname)35 b Fu(is)30 b(set)h(and)f(is)h(a)f(name)h +(reference.)150 4370 y Ft(-z)f Fj(string)66 b Fu(T)-8 +b(rue)30 b(if)g(the)h(length)g(of)f Fr(string)38 b Fu(is)31 +b(zero.)150 4517 y Ft(-n)f Fj(string)150 4626 y(string)192 +b Fu(T)-8 b(rue)30 b(if)g(the)h(length)g(of)f Fr(string)38 +b Fu(is)31 b(non-zero.)150 4773 y Fj(string1)d Ft(==)i +Fj(string2)150 4883 y(string1)e Ft(=)i Fj(string2)630 +4993 y Fu(T)-8 b(rue)43 b(if)h(the)g(strings)g(are)g(equal.)82 +b(When)44 b(used)f(with)g(the)h Ft([[)g Fu(command,)j(this)d(p)s(er-) +630 5102 y(forms)d(pattern)g(matc)m(hing)i(as)f(describ)s(ed)e(ab)s(o)m +(v)m(e)j(\(see)f(Section)g(3.2.4.2)i([Conditional)630 +5212 y(Constructs],)30 b(page)h(10\).)630 5340 y(`)p +Ft(=)p Fu(')g(should)e(b)s(e)h(used)f(with)h(the)h Ft(test)e +Fu(command)h(for)g Fm(posix)g Fu(conformance.)p eop end %%Page: 87 93 -TeXDict begin 87 92 bop 150 -116 a Ft(Chapter)30 b(6:)41 -b(Bash)30 b(F)-8 b(eatures)2484 b(87)150 299 y Fs(-n)30 -b Fi(string)150 408 y(string)192 b Ft(T)-8 b(rue)30 b(if)g(the)h -(length)g(of)f Fq(string)38 b Ft(is)31 b(non-zero.)150 -569 y Fi(string1)39 b Fs(==)30 b Fi(string2)150 678 y(string1)39 -b Fs(=)30 b Fi(string2)630 788 y Ft(T)-8 b(rue)43 b(if)h(the)g(strings) -g(are)g(equal.)82 b(When)44 b(used)f(with)g(the)h Fs([[)g -Ft(command,)j(this)d(p)s(er-)630 898 y(forms)d(pattern)g(matc)m(hing)i -(as)f(describ)s(ed)e(ab)s(o)m(v)m(e)j(\(see)f(Section)g(3.2.4.2)i -([Conditional)630 1007 y(Constructs],)30 b(page)h(10\).)630 -1142 y(`)p Fs(=)p Ft(')g(should)e(b)s(e)h(used)f(with)h(the)h -Fs(test)e Ft(command)h(for)g Fl(posix)g Ft(conformance.)150 -1302 y Fi(string1)39 b Fs(!=)30 b Fi(string2)630 1412 -y Ft(T)-8 b(rue)30 b(if)g(the)h(strings)f(are)h(not)f(equal.)150 -1572 y Fi(string1)39 b Fs(<)30 b Fi(string2)630 1682 -y Ft(T)-8 b(rue)30 b(if)g Fq(string1)38 b Ft(sorts)31 -b(b)s(efore)f Fq(string2)38 b Ft(lexicographically)-8 -b(.)150 1842 y Fi(string1)39 b Fs(>)30 b Fi(string2)630 -1952 y Ft(T)-8 b(rue)30 b(if)g Fq(string1)38 b Ft(sorts)31 -b(after)g Fq(string2)38 b Ft(lexicographically)-8 b(.)150 -2112 y Fi(arg1)40 b Fs(OP)29 b Fi(arg2)630 2222 y Fs(OP)k -Ft(is)h(one)g(of)h(`)p Fs(-eq)p Ft(',)f(`)p Fs(-ne)p -Ft(',)h(`)p Fs(-lt)p Ft(',)g(`)p Fs(-le)p Ft(',)f(`)p -Fs(-gt)p Ft(',)h(or)f(`)p Fs(-ge)p Ft('.)51 b(These)34 -b(arithmetic)h(binary)630 2331 y(op)s(erators)h(return)e(true)i(if)f -Fq(arg1)44 b Ft(is)36 b(equal)g(to,)i(not)e(equal)g(to,)i(less)e(than,) -h(less)f(than)f(or)630 2441 y(equal)28 b(to,)h(greater)g(than,)f(or)f -(greater)i(than)e(or)h(equal)g(to)g Fq(arg2)7 b Ft(,)30 -b(resp)s(ectiv)m(ely)-8 b(.)41 b Fq(Arg1)36 b Ft(and)630 -2550 y Fq(arg2)j Ft(ma)m(y)30 b(b)s(e)g(p)s(ositiv)m(e)i(or)e(negativ)m -(e)j(in)m(tegers.)150 2784 y Fr(6.5)68 b(Shell)45 b(Arithmetic)150 -2944 y Ft(The)35 b(shell)g(allo)m(ws)i(arithmetic)f(expressions)f(to)h +TeXDict begin 87 92 bop 150 -116 a Fu(Chapter)30 b(6:)41 +b(Bash)30 b(F)-8 b(eatures)2484 b(87)150 299 y Fj(string1)28 +b Ft(!=)i Fj(string2)630 408 y Fu(T)-8 b(rue)30 b(if)g(the)h(strings)f +(are)h(not)f(equal.)150 563 y Fj(string1)e Ft(<)i Fj(string2)630 +673 y Fu(T)-8 b(rue)30 b(if)g Fr(string1)38 b Fu(sorts)31 +b(b)s(efore)f Fr(string2)38 b Fu(lexicographically)-8 +b(.)150 828 y Fj(string1)28 b Ft(>)i Fj(string2)630 937 +y Fu(T)-8 b(rue)30 b(if)g Fr(string1)38 b Fu(sorts)31 +b(after)g Fr(string2)38 b Fu(lexicographically)-8 b(.)150 +1092 y Fj(arg1)29 b Ft(OP)h Fj(arg2)630 1202 y Ft(OP)j +Fu(is)h(one)g(of)h(`)p Ft(-eq)p Fu(',)f(`)p Ft(-ne)p +Fu(',)h(`)p Ft(-lt)p Fu(',)g(`)p Ft(-le)p Fu(',)f(`)p +Ft(-gt)p Fu(',)h(or)f(`)p Ft(-ge)p Fu('.)51 b(These)34 +b(arithmetic)h(binary)630 1311 y(op)s(erators)h(return)e(true)i(if)f +Fr(arg1)44 b Fu(is)36 b(equal)g(to,)i(not)e(equal)g(to,)i(less)e(than,) +h(less)f(than)f(or)630 1421 y(equal)29 b(to,)g(greater)h(than,)e(or)g +(greater)i(than)d(or)i(equal)f(to)h Fr(arg2)p Fu(,)h(resp)s(ectiv)m +(ely)-8 b(.)42 b Fr(Arg1)36 b Fu(and)630 1531 y Fr(arg2)j +Fu(ma)m(y)30 b(b)s(e)g(p)s(ositiv)m(e)i(or)e(negativ)m(e)j(in)m +(tegers.)150 1758 y Fs(6.5)68 b(Shell)45 b(Arithmetic)150 +1918 y Fu(The)35 b(shell)g(allo)m(ws)i(arithmetic)f(expressions)f(to)h (b)s(e)f(ev)-5 b(aluated,)38 b(as)d(one)h(of)f(the)h(shell)f -(expansions)g(or)150 3053 y(b)m(y)30 b(the)h Fs(let)e -Ft(and)h(the)h(`)p Fs(-i)p Ft(')f(option)h(to)g(the)f -Fs(declare)f Ft(builtins.)275 3189 y(Ev)-5 b(aluation)27 -b(is)g(done)f(in)g(\014xed-width)g(in)m(tegers)i(with)e(no)h(c)m(hec)m -(k)h(for)e(o)m(v)m(er\015o)m(w,)j(though)d(division)h(b)m(y)150 -3298 y(0)g(is)g(trapp)s(ed)f(and)h(\015agged)g(as)h(an)f(error.)39 -b(The)26 b(op)s(erators)h(and)g(their)g(precedence,)h(asso)s(ciativit)m -(y)-8 b(,)32 b(and)150 3408 y(v)-5 b(alues)35 b(are)h(the)f(same)g(as)h -(in)e(the)h(C)g(language.)56 b(The)35 b(follo)m(wing)h(list)g(of)f(op)s -(erators)g(is)g(group)s(ed)f(in)m(to)150 3517 y(lev)m(els)27 +(expansions)g(or)150 2027 y(b)m(y)30 b(the)h Ft(let)e +Fu(and)h(the)h Ft(-i)e Fu(option)i(to)g(the)g Ft(declare)d +Fu(builtins.)275 2160 y(Ev)-5 b(aluation)27 b(is)g(done)f(in)g +(\014xed-width)g(in)m(tegers)i(with)e(no)h(c)m(hec)m(k)h(for)e(o)m(v)m +(er\015o)m(w,)j(though)d(division)h(b)m(y)150 2269 y(0)g(is)g(trapp)s +(ed)f(and)h(\015agged)g(as)h(an)f(error.)39 b(The)26 +b(op)s(erators)h(and)g(their)g(precedence,)h(asso)s(ciativit)m(y)-8 +b(,)32 b(and)150 2379 y(v)-5 b(alues)35 b(are)h(the)f(same)g(as)h(in)e +(the)h(C)g(language.)56 b(The)35 b(follo)m(wing)h(list)g(of)f(op)s +(erators)g(is)g(group)s(ed)f(in)m(to)150 2488 y(lev)m(els)27 b(of)f(equal-precedence)i(op)s(erators.)39 b(The)25 b(lev)m(els)j(are)e (listed)h(in)e(order)h(of)g(decreasing)g(precedence.)150 -3678 y Fi(id)11 b Fs(++)29 b Fi(id)11 b Fs(--)630 3788 -y Ft(v)-5 b(ariable)31 b(p)s(ost-incremen)m(t)g(and)f(p)s(ost-decremen) -m(t)150 3948 y Fs(++)p Fi(id)40 b Fs(--)p Fi(id)630 4058 -y Ft(v)-5 b(ariable)31 b(pre-incremen)m(t)g(and)f(pre-decremen)m(t)150 -4218 y Fs(-)g(+)354 b Ft(unary)29 b(min)m(us)h(and)g(plus)150 -4378 y Fs(!)g(~)354 b Ft(logical)33 b(and)d(bit)m(wise)h(negation)150 -4538 y Fs(**)384 b Ft(exp)s(onen)m(tiation)150 4699 y -Fs(*)30 b(/)g(\045)276 b Ft(m)m(ultiplication,)33 b(division,)d -(remainder)150 4859 y Fs(+)g(-)354 b Ft(addition,)31 -b(subtraction)150 5019 y Fs(<<)f(>>)258 b Ft(left)31 -b(and)f(righ)m(t)h(bit)m(wise)g(shifts)150 5180 y Fs(<=)f(>=)g(<)g(>) -102 b Ft(comparison)150 5340 y Fs(==)30 b(!=)258 b Ft(equalit)m(y)32 -b(and)e(inequalit)m(y)p eop end +2643 y Fj(id)p Ft(++)j Fj(id)p Ft(--)67 b Fu(v)-5 b(ariable)31 +b(p)s(ost-incremen)m(t)g(and)f(p)s(ost-decremen)m(t)150 +2798 y Ft(++)p Fj(id)f Ft(--)p Fj(id)67 b Fu(v)-5 b(ariable)31 +b(pre-incremen)m(t)g(and)f(pre-decremen)m(t)150 2953 +y Ft(-)g(+)354 b Fu(unary)29 b(min)m(us)h(and)g(plus)150 +3108 y Ft(!)g(~)354 b Fu(logical)33 b(and)d(bit)m(wise)h(negation)150 +3263 y Ft(**)384 b Fu(exp)s(onen)m(tiation)150 3417 y +Ft(*)30 b(/)g(\045)276 b Fu(m)m(ultiplication,)33 b(division,)d +(remainder)150 3572 y Ft(+)g(-)354 b Fu(addition,)31 +b(subtraction)150 3727 y Ft(<<)f(>>)258 b Fu(left)31 +b(and)f(righ)m(t)h(bit)m(wise)g(shifts)150 3882 y Ft(<=)f(>=)g(<)g(>) +102 b Fu(comparison)150 4037 y Ft(==)30 b(!=)258 b Fu(equalit)m(y)32 +b(and)e(inequalit)m(y)150 4192 y Ft(&)432 b Fu(bit)m(wise)31 +b(AND)150 4347 y Ft(^)432 b Fu(bit)m(wise)31 b(exclusiv)m(e)h(OR)150 +4501 y Ft(|)432 b Fu(bit)m(wise)31 b(OR)150 4656 y Ft(&&)384 +b Fu(logical)33 b(AND)150 4811 y Ft(||)384 b Fu(logical)33 +b(OR)150 4966 y Ft(expr)c(?)h(expr)f(:)h(expr)630 5076 +y Fu(conditional)i(op)s(erator)150 5230 y Ft(=)e(*=)g(/=)g(\045=)f(+=)h +(-=)g(<<=)f(>>=)h(&=)g(^=)f(|=)630 5340 y Fu(assignmen)m(t)p +eop end %%Page: 88 94 -TeXDict begin 88 93 bop 150 -116 a Ft(Chapter)30 b(6:)41 -b(Bash)30 b(F)-8 b(eatures)2484 b(88)150 299 y Fs(&)432 -b Ft(bit)m(wise)31 b(AND)150 459 y Fs(^)432 b Ft(bit)m(wise)31 -b(exclusiv)m(e)h(OR)150 619 y Fs(|)432 b Ft(bit)m(wise)31 -b(OR)150 780 y Fs(&&)384 b Ft(logical)33 b(AND)150 940 -y Fs(||)384 b Ft(logical)33 b(OR)150 1100 y Fs(expr)c(?)h(expr)f(:)h -(expr)630 1210 y Ft(conditional)i(op)s(erator)150 1370 -y Fs(=)e(*=)g(/=)g(\045=)f(+=)h(-=)g(<<=)f(>>=)h(&=)g(^=)f(|=)630 -1480 y Ft(assignmen)m(t)150 1640 y Fs(expr1)g(,)h(expr2)630 -1750 y Ft(comma)275 1910 y(Shell)38 b(v)-5 b(ariables)39 -b(are)g(allo)m(w)m(ed)i(as)e(op)s(erands;)i(parameter)e(expansion)g(is) -f(p)s(erformed)g(b)s(efore)g(the)150 2020 y(expression)g(is)g(ev)-5 -b(aluated.)66 b(Within)38 b(an)h(expression,)h(shell)e(v)-5 -b(ariables)39 b(ma)m(y)g(also)g(b)s(e)f(referenced)g(b)m(y)150 -2130 y(name)31 b(without)f(using)g(the)h(parameter)g(expansion)f(syn)m -(tax.)42 b(A)31 b(shell)f(v)-5 b(ariable)32 b(that)f(is)f(n)m(ull)h(or) -f(unset)150 2239 y(ev)-5 b(aluates)41 b(to)f(0)g(when)e(referenced)h(b) -m(y)g(name)h(without)f(using)g(the)g(parameter)h(expansion)f(syn)m -(tax.)150 2349 y(The)c(v)-5 b(alue)37 b(of)f(a)h(v)-5 -b(ariable)36 b(is)g(ev)-5 b(aluated)38 b(as)e(an)g(arithmetic)h -(expression)f(when)f(it)h(is)g(referenced,)i(or)150 2458 -y(when)31 b(a)i(v)-5 b(ariable)33 b(whic)m(h)f(has)g(b)s(een)f(giv)m -(en)j(the)e Fq(in)m(teger)40 b Ft(attribute)33 b(using)f(`)p -Fs(declare)d(-i)p Ft(')i(is)i(assigned)150 2568 y(a)j(v)-5 -b(alue.)58 b(A)36 b(n)m(ull)f(v)-5 b(alue)37 b(ev)-5 -b(aluates)37 b(to)g(0.)57 b(A)36 b(shell)g(v)-5 b(ariable)37 -b(need)e(not)h(ha)m(v)m(e)h(its)f Fq(in)m(teger)44 b -Ft(attribute)150 2678 y(turned)29 b(on)h(to)i(b)s(e)d(used)h(in)g(an)g -(expression.)275 2813 y(Constan)m(ts)41 b(with)g(a)h(leading)f(0)h(are) -g(in)m(terpreted)f(as)g(o)s(ctal)i(n)m(um)m(b)s(ers.)72 -b(A)41 b(leading)h(`)p Fs(0x)p Ft(')f(or)g(`)p Fs(0X)p -Ft(')150 2923 y(denotes)31 b(hexadecimal.)42 b(Otherwise,)30 -b(n)m(um)m(b)s(ers)f(tak)m(e)j(the)f(form)f([)p Fq(base)5 -b Fs(#)p Ft(])p Fq(n)p Ft(,)31 b(where)f(the)g(optional)i -Fq(base)150 3032 y Ft(is)d(a)h(decimal)g(n)m(um)m(b)s(er)e(b)s(et)m(w)m -(een)h(2)h(and)e(64)i(represen)m(ting)g(the)f(arithmetic)i(base,)e(and) -g Fq(n)g Ft(is)g(a)g(n)m(um)m(b)s(er)150 3142 y(in)e(that)h(base.)40 -b(If)26 b Fq(base)5 b Fs(#)27 b Ft(is)h(omitted,)h(then)e(base)g(10)h -(is)f(used.)39 b(When)27 b(sp)s(ecifying)g Fq(n)p Ft(,)h(he)f(digits)h -(greater)150 3251 y(than)33 b(9)h(are)g(represen)m(ted)g(b)m(y)f(the)h -(lo)m(w)m(ercase)i(letters,)g(the)d(upp)s(ercase)g(letters,)j(`)p -Fs(@)p Ft(',)e(and)f(`)p Fs(_)p Ft(',)i(in)e(that)150 -3361 y(order.)69 b(If)39 b Fq(base)45 b Ft(is)40 b(less)g(than)g(or)f +TeXDict begin 88 93 bop 150 -116 a Fu(Chapter)30 b(6:)41 +b(Bash)30 b(F)-8 b(eatures)2484 b(88)150 299 y Ft(expr1)29 +b(,)h(expr2)630 408 y Fu(comma)275 574 y(Shell)38 b(v)-5 +b(ariables)39 b(are)g(allo)m(w)m(ed)i(as)e(op)s(erands;)i(parameter)e +(expansion)g(is)f(p)s(erformed)g(b)s(efore)g(the)150 +684 y(expression)g(is)g(ev)-5 b(aluated.)66 b(Within)38 +b(an)h(expression,)h(shell)e(v)-5 b(ariables)39 b(ma)m(y)g(also)g(b)s +(e)f(referenced)g(b)m(y)150 793 y(name)31 b(without)f(using)g(the)h +(parameter)g(expansion)f(syn)m(tax.)42 b(A)31 b(shell)f(v)-5 +b(ariable)32 b(that)f(is)f(n)m(ull)h(or)f(unset)150 903 +y(ev)-5 b(aluates)41 b(to)f(0)g(when)e(referenced)h(b)m(y)g(name)h +(without)f(using)g(the)g(parameter)h(expansion)f(syn)m(tax.)150 +1012 y(The)c(v)-5 b(alue)37 b(of)f(a)h(v)-5 b(ariable)36 +b(is)g(ev)-5 b(aluated)38 b(as)e(an)g(arithmetic)h(expression)f(when)f +(it)h(is)g(referenced,)i(or)150 1122 y(when)31 b(a)i(v)-5 +b(ariable)33 b(whic)m(h)f(has)g(b)s(een)f(giv)m(en)j(the)e +Fr(in)m(teger)40 b Fu(attribute)33 b(using)f(`)p Ft(declare)d(-i)p +Fu(')i(is)i(assigned)150 1232 y(a)j(v)-5 b(alue.)58 b(A)36 +b(n)m(ull)f(v)-5 b(alue)37 b(ev)-5 b(aluates)37 b(to)g(0.)57 +b(A)36 b(shell)g(v)-5 b(ariable)37 b(need)e(not)h(ha)m(v)m(e)h(its)f +Fr(in)m(teger)44 b Fu(attribute)150 1341 y(turned)29 +b(on)h(to)i(b)s(e)d(used)h(in)g(an)g(expression.)275 +1480 y(Constan)m(ts)41 b(with)g(a)h(leading)f(0)h(are)g(in)m(terpreted) +f(as)g(o)s(ctal)i(n)m(um)m(b)s(ers.)72 b(A)41 b(leading)h(`)p +Ft(0x)p Fu(')f(or)g(`)p Ft(0X)p Fu(')150 1589 y(denotes)30 +b(hexadecimal.)42 b(Otherwise,)30 b(n)m(um)m(b)s(ers)f(tak)m(e)i(the)f +(form)g([)p Fr(base)5 b Ft(#)p Fu(])p Fr(n)p Fu(,)30 +b(where)f(the)i(optional)g Fr(base)150 1699 y Fu(is)e(a)h(decimal)g(n)m +(um)m(b)s(er)e(b)s(et)m(w)m(een)h(2)h(and)e(64)i(represen)m(ting)g(the) +f(arithmetic)i(base,)e(and)g Fr(n)g Fu(is)g(a)g(n)m(um)m(b)s(er)150 +1809 y(in)e(that)h(base.)40 b(If)26 b Fr(base)5 b Ft(#)27 +b Fu(is)h(omitted,)h(then)e(base)g(10)h(is)f(used.)39 +b(When)27 b(sp)s(ecifying)g Fr(n)p Fu(,)h(he)f(digits)h(greater)150 +1918 y(than)33 b(9)h(are)g(represen)m(ted)g(b)m(y)f(the)h(lo)m(w)m +(ercase)i(letters,)g(the)d(upp)s(ercase)g(letters,)j(`)p +Ft(@)p Fu(',)e(and)f(`)p Ft(_)p Fu(',)i(in)e(that)150 +2028 y(order.)69 b(If)39 b Fr(base)45 b Fu(is)40 b(less)g(than)g(or)f (equal)i(to)f(36,)k(lo)m(w)m(ercase)e(and)d(upp)s(ercase)g(letters)i -(ma)m(y)g(b)s(e)e(used)150 3471 y(in)m(terc)m(hangeably)32 +(ma)m(y)g(b)s(e)e(used)150 2137 y(in)m(terc)m(hangeably)32 b(to)f(represen)m(t)g(n)m(um)m(b)s(ers)e(b)s(et)m(w)m(een)i(10)g(and)f -(35.)275 3606 y(Op)s(erators)44 b(are)h(ev)-5 b(aluated)46 +(35.)275 2276 y(Op)s(erators)44 b(are)h(ev)-5 b(aluated)46 b(in)f(order)f(of)h(precedence.)85 b(Sub-expressions)44 -b(in)g(paren)m(theses)i(are)150 3715 y(ev)-5 b(aluated)32 +b(in)g(paren)m(theses)i(are)150 2386 y(ev)-5 b(aluated)32 b(\014rst)d(and)h(ma)m(y)h(o)m(v)m(erride)g(the)g(precedence)g(rules)f -(ab)s(o)m(v)m(e.)150 3949 y Fr(6.6)68 b(Aliases)150 4109 -y Fq(Aliases)41 b Ft(allo)m(w)d(a)f(string)f(to)h(b)s(e)f(substituted)g +(ab)s(o)m(v)m(e.)150 2624 y Fs(6.6)68 b(Aliases)150 2784 +y Fr(Aliases)41 b Fu(allo)m(w)d(a)f(string)f(to)h(b)s(e)f(substituted)g (for)g(a)g(w)m(ord)g(when)g(it)h(is)f(used)f(as)i(the)g(\014rst)e(w)m -(ord)h(of)h(a)150 4218 y(simple)32 b(command.)45 b(The)31 +(ord)h(of)h(a)150 2893 y(simple)32 b(command.)45 b(The)31 b(shell)i(main)m(tains)f(a)h(list)f(of)g(aliases)i(that)e(ma)m(y)h(b)s -(e)e(set)h(and)g(unset)f(with)h(the)150 4328 y Fs(alias)d -Ft(and)h Fs(unalias)e Ft(builtin)i(commands.)275 4463 +(e)e(set)h(and)g(unset)f(with)h(the)150 3003 y Ft(alias)d +Fu(and)h Ft(unalias)e Fu(builtin)i(commands.)275 3142 y(The)f(\014rst)f(w)m(ord)i(of)f(eac)m(h)i(simple)f(command,)g(if)f (unquoted,)g(is)h(c)m(hec)m(k)m(ed)h(to)g(see)f(if)g(it)g(has)f(an)g -(alias.)150 4573 y(If)24 b(so,)i(that)g(w)m(ord)e(is)h(replaced)g(b)m +(alias.)150 3251 y(If)24 b(so,)i(that)g(w)m(ord)e(is)h(replaced)g(b)m (y)f(the)h(text)h(of)e(the)h(alias.)40 b(The)24 b(c)m(haracters)i(`)p -Fs(/)p Ft(',)h(`)p Fs($)p Ft(',)f(`)p Fs(`)p Ft(',)g(`)p -Fs(=)p Ft(')f(and)f(an)m(y)h(of)150 4682 y(the)e(shell)g(metac)m +Ft(/)p Fu(',)h(`)p Ft($)p Fu(',)f(`)p Ft(`)p Fu(',)g(`)p +Ft(=)p Fu(')f(and)f(an)m(y)h(of)150 3361 y(the)e(shell)g(metac)m (haracters)i(or)e(quoting)g(c)m(haracters)h(listed)g(ab)s(o)m(v)m(e)g (ma)m(y)f(not)g(app)s(ear)f(in)h(an)g(alias)h(name.)150 -4792 y(The)e(replacemen)m(t)h(text)g(ma)m(y)g(con)m(tain)h(an)m(y)e(v) +3470 y(The)e(replacemen)m(t)h(text)g(ma)m(y)g(con)m(tain)h(an)m(y)e(v) -5 b(alid)23 b(shell)f(input,)h(including)f(shell)g(metac)m(haracters.) -40 b(The)150 4902 y(\014rst)35 b(w)m(ord)g(of)h(the)g(replacemen)m(t)i +40 b(The)150 3580 y(\014rst)35 b(w)m(ord)g(of)h(the)g(replacemen)m(t)i (text)e(is)g(tested)h(for)e(aliases,)k(but)c(a)h(w)m(ord)g(that)g(is)g -(iden)m(tical)i(to)e(an)150 5011 y(alias)c(b)s(eing)f(expanded)f(is)h +(iden)m(tical)i(to)e(an)150 3689 y(alias)c(b)s(eing)f(expanded)f(is)h (not)g(expanded)f(a)h(second)g(time.)43 b(This)30 b(means)h(that)g(one) -g(ma)m(y)h(alias)g Fs(ls)e Ft(to)150 5121 y Fs("ls)f(-F")p -Ft(,)f(for)f(instance,)i(and)d(Bash)i(do)s(es)f(not)h(try)f(to)h +g(ma)m(y)h(alias)g Ft(ls)e Fu(to)150 3799 y Ft("ls)f(-F")p +Fu(,)f(for)f(instance,)i(and)d(Bash)i(do)s(es)f(not)h(try)f(to)h (recursiv)m(ely)g(expand)e(the)i(replacemen)m(t)h(text.)40 -b(If)150 5230 y(the)31 b(last)h(c)m(haracter)g(of)f(the)g(alias)h(v)-5 -b(alue)31 b(is)g(a)g Fq(blank)6 b Ft(,)30 b(then)h(the)g(next)g -(command)f(w)m(ord)h(follo)m(wing)h(the)150 5340 y(alias)g(is)e(also)h -(c)m(hec)m(k)m(ed)i(for)d(alias)h(expansion.)p eop end +b(If)150 3909 y(the)31 b(last)h(c)m(haracter)h(of)e(the)h(alias)g(v)-5 +b(alue)31 b(is)h(a)f Fr(blank)p Fu(,)g(then)g(the)g(next)h(command)e(w) +m(ord)h(follo)m(wing)i(the)150 4018 y(alias)f(is)e(also)h(c)m(hec)m(k)m +(ed)i(for)d(alias)h(expansion.)275 4157 y(Aliases)e(are)f(created)i +(and)d(listed)i(with)f(the)g Ft(alias)f Fu(command,)h(and)g(remo)m(v)m +(ed)h(with)f(the)g Ft(unalias)150 4267 y Fu(command.)275 +4405 y(There)44 b(is)h(no)g(mec)m(hanism)g(for)f(using)h(argumen)m(ts)g +(in)f(the)h(replacemen)m(t)i(text,)i(as)d(in)e Ft(csh)p +Fu(.)83 b(If)150 4515 y(argumen)m(ts)37 b(are)h(needed,)g(a)g(shell)f +(function)f(should)g(b)s(e)h(used)f(\(see)i(Section)g(3.3)g([Shell)f(F) +-8 b(unctions],)150 4624 y(page)31 b(17\).)275 4763 y(Aliases)i(are)h +(not)e(expanded)g(when)g(the)h(shell)g(is)g(not)g(in)m(teractiv)m(e,)j +(unless)c(the)h Ft(expand_aliases)150 4873 y Fu(shell)e(option)f(is)h +(set)g(using)f Ft(shopt)f Fu(\(see)i(Section)g(4.3.2)h([The)e(Shopt)g +(Builtin],)h(page)g(62\).)275 5011 y(The)38 b(rules)h(concerning)h(the) +f(de\014nition)g(and)g(use)g(of)g(aliases)i(are)e(somewhat)h +(confusing.)67 b(Bash)150 5121 y(alw)m(a)m(ys)42 b(reads)f(at)h(least)g +(one)f(complete)i(line)e(of)g(input)f(b)s(efore)h(executing)h(an)m(y)f +(of)g(the)g(commands)150 5230 y(on)h(that)h(line.)77 +b(Aliases)44 b(are)e(expanded)g(when)f(a)i(command)f(is)g(read,)k(not)c +(when)g(it)g(is)h(executed.)150 5340 y(Therefore,)f(an)e(alias)h +(de\014nition)e(app)s(earing)h(on)f(the)h(same)h(line)f(as)g(another)g +(command)f(do)s(es)h(not)p eop end %%Page: 89 95 -TeXDict begin 89 94 bop 150 -116 a Ft(Chapter)30 b(6:)41 -b(Bash)30 b(F)-8 b(eatures)2484 b(89)275 299 y(Aliases)29 -b(are)f(created)i(and)d(listed)i(with)f(the)g Fs(alias)f -Ft(command,)h(and)g(remo)m(v)m(ed)h(with)f(the)g Fs(unalias)150 -408 y Ft(command.)275 556 y(There)44 b(is)h(no)g(mec)m(hanism)g(for)f -(using)h(argumen)m(ts)g(in)f(the)h(replacemen)m(t)i(text,)i(as)d(in)e -Fs(csh)p Ft(.)83 b(If)150 666 y(argumen)m(ts)37 b(are)h(needed,)g(a)g -(shell)f(function)f(should)g(b)s(e)h(used)f(\(see)i(Section)g(3.3)g -([Shell)f(F)-8 b(unctions],)150 776 y(page)31 b(17\).)275 -923 y(Aliases)i(are)h(not)e(expanded)g(when)g(the)h(shell)g(is)g(not)g -(in)m(teractiv)m(e,)j(unless)c(the)h Fs(expand_aliases)150 -1033 y Ft(shell)e(option)f(is)h(set)g(using)f Fs(shopt)f -Ft(\(see)i(Section)g(4.3.2)h([The)e(Shopt)g(Builtin],)h(page)g(63\).) -275 1181 y(The)38 b(rules)h(concerning)h(the)f(de\014nition)g(and)g -(use)g(of)g(aliases)i(are)e(somewhat)h(confusing.)67 -b(Bash)150 1290 y(alw)m(a)m(ys)42 b(reads)f(at)h(least)g(one)f -(complete)i(line)e(of)g(input)f(b)s(efore)h(executing)h(an)m(y)f(of)g -(the)g(commands)150 1400 y(on)h(that)h(line.)77 b(Aliases)44 -b(are)e(expanded)g(when)f(a)i(command)f(is)g(read,)k(not)c(when)g(it)g -(is)h(executed.)150 1510 y(Therefore,)f(an)e(alias)h(de\014nition)e -(app)s(earing)h(on)f(the)h(same)h(line)f(as)g(another)g(command)f(do)s -(es)h(not)150 1619 y(tak)m(e)31 b(e\013ect)f(un)m(til)g(the)f(next)g -(line)h(of)f(input)f(is)h(read.)41 b(The)28 b(commands)h(follo)m(wing)i -(the)e(alias)h(de\014nition)150 1729 y(on)d(that)h(line)f(are)h(not)f -(a\013ected)i(b)m(y)e(the)g(new)g(alias.)41 b(This)26 -b(b)s(eha)m(vior)h(is)g(also)h(an)f(issue)g(when)f(functions)150 -1838 y(are)d(executed.)39 b(Aliases)24 b(are)f(expanded)f(when)f(a)i -(function)g(de\014nition)f(is)h(read,)h(not)f(when)e(the)i(function)150 -1948 y(is)i(executed,)j(b)s(ecause)d(a)h(function)f(de\014nition)f(is)i -(itself)g(a)f(comp)s(ound)f(command.)39 b(As)25 b(a)h(consequence,)150 -2058 y(aliases)36 b(de\014ned)d(in)h(a)g(function)g(are)h(not)f(a)m(v) --5 b(ailable)37 b(un)m(til)d(after)h(that)g(function)f(is)g(executed.) -53 b(T)-8 b(o)35 b(b)s(e)150 2167 y(safe,)41 b(alw)m(a)m(ys)f(put)d -(alias)j(de\014nitions)e(on)g(a)h(separate)g(line,)i(and)d(do)g(not)g -(use)g Fs(alias)f Ft(in)h(comp)s(ound)150 2277 y(commands.)275 -2425 y(F)-8 b(or)31 b(almost)g(ev)m(ery)g(purp)s(ose,)e(shell)i -(functions)f(are)g(preferred)g(o)m(v)m(er)h(aliases.)150 -2677 y Fr(6.7)68 b(Arra)l(ys)150 2837 y Ft(Bash)33 b(pro)m(vides)g -(one-dimensional)g(indexed)f(and)h(asso)s(ciativ)m(e)i(arra)m(y)e(v)-5 +TeXDict begin 89 94 bop 150 -116 a Fu(Chapter)30 b(6:)41 +b(Bash)30 b(F)-8 b(eatures)2484 b(89)150 299 y(tak)m(e)31 +b(e\013ect)f(un)m(til)g(the)f(next)g(line)h(of)f(input)f(is)h(read.)41 +b(The)28 b(commands)h(follo)m(wing)i(the)e(alias)h(de\014nition)150 +408 y(on)d(that)h(line)f(are)h(not)f(a\013ected)i(b)m(y)e(the)g(new)g +(alias.)41 b(This)26 b(b)s(eha)m(vior)h(is)g(also)h(an)f(issue)g(when)f +(functions)150 518 y(are)d(executed.)39 b(Aliases)24 +b(are)f(expanded)f(when)f(a)i(function)g(de\014nition)f(is)h(read,)h +(not)f(when)e(the)i(function)150 628 y(is)i(executed,)j(b)s(ecause)d(a) +h(function)f(de\014nition)f(is)i(itself)g(a)f(comp)s(ound)f(command.)39 +b(As)25 b(a)h(consequence,)150 737 y(aliases)36 b(de\014ned)d(in)h(a)g +(function)g(are)h(not)f(a)m(v)-5 b(ailable)37 b(un)m(til)d(after)h +(that)g(function)f(is)g(executed.)53 b(T)-8 b(o)35 b(b)s(e)150 +847 y(safe,)41 b(alw)m(a)m(ys)f(put)d(alias)j(de\014nitions)e(on)g(a)h +(separate)g(line,)i(and)d(do)g(not)g(use)g Ft(alias)f +Fu(in)h(comp)s(ound)150 956 y(commands.)275 1094 y(F)-8 +b(or)31 b(almost)g(ev)m(ery)g(purp)s(ose,)e(shell)i(functions)f(are)g +(preferred)g(o)m(v)m(er)h(aliases.)150 1332 y Fs(6.7)68 +b(Arra)l(ys)150 1491 y Fu(Bash)33 b(pro)m(vides)g(one-dimensional)g +(indexed)f(and)h(asso)s(ciativ)m(e)i(arra)m(y)e(v)-5 b(ariables.)49 b(An)m(y)33 b(v)-5 b(ariable)33 b(ma)m(y)150 -2946 y(b)s(e)e(used)h(as)g(an)g(indexed)f(arra)m(y;)j(the)e -Fs(declare)e Ft(builtin)h(will)i(explicitly)g(declare)g(an)f(arra)m(y) --8 b(.)46 b(There)32 b(is)150 3056 y(no)h(maxim)m(um)g(limit)h(on)f +1601 y(b)s(e)e(used)h(as)g(an)g(indexed)f(arra)m(y;)j(the)e +Ft(declare)e Fu(builtin)h(will)i(explicitly)g(declare)g(an)f(arra)m(y) +-8 b(.)46 b(There)32 b(is)150 1710 y(no)h(maxim)m(um)g(limit)h(on)f (the)g(size)h(of)g(an)f(arra)m(y)-8 b(,)35 b(nor)d(an)m(y)i(requiremen) -m(t)f(that)h(mem)m(b)s(ers)e(b)s(e)g(indexed)150 3165 +m(t)f(that)h(mem)m(b)s(ers)e(b)s(e)g(indexed)150 1820 y(or)26 b(assigned)h(con)m(tiguously)-8 b(.)41 b(Indexed)25 b(arra)m(ys)i(are)f(referenced)g(using)g(in)m(tegers)i(\(including)e -(arithmetic)150 3275 y(expressions)38 b(\(see)h(Section)g(6.5)h([Shell) +(arithmetic)150 1929 y(expressions)38 b(\(see)h(Section)g(6.5)h([Shell) e(Arithmetic],)k(page)d(87\)\))h(and)d(are)i(zero-based;)k(asso)s -(ciativ)m(e)150 3385 y(arra)m(ys)37 b(use)f(arbitrary)g(strings.)59 +(ciativ)m(e)150 2039 y(arra)m(ys)37 b(use)f(arbitrary)g(strings.)59 b(Unless)36 b(otherwise)h(noted,)h(indexed)e(arra)m(y)h(indices)f(m)m -(ust)g(b)s(e)g(non-)150 3494 y(negativ)m(e)d(in)m(tegers.)275 -3642 y(An)26 b(indexed)h(arra)m(y)h(is)f(created)h(automatically)j(if)c +(ust)g(b)s(e)g(non-)150 2149 y(negativ)m(e)d(in)m(tegers.)275 +2286 y(An)26 b(indexed)h(arra)m(y)h(is)f(created)h(automatically)j(if)c (an)m(y)g(v)-5 b(ariable)28 b(is)g(assigned)f(to)h(using)f(the)g(syn)m -(tax)390 3790 y Fi(name)11 b Fs([)p Fi(subscript)g Fs(]=)p -Fi(value)150 3938 y Ft(The)34 b Fq(subscript)h Ft(is)g(treated)g(as)g +(tax)390 2424 y Fj(name)p Ft([)p Fj(subscript)p Ft(]=)p +Fj(value)150 2562 y Fu(The)34 b Fr(subscript)h Fu(is)g(treated)g(as)g (an)f(arithmetic)i(expression)e(that)h(m)m(ust)g(ev)-5 b(aluate)36 b(to)f(a)g(n)m(um)m(b)s(er.)51 b(T)-8 b(o)150 -4047 y(explicitly)32 b(declare)f(an)g(arra)m(y)-8 b(,)31 -b(use)390 4195 y Fs(declare)46 b(-a)h Fi(name)150 4343 -y Ft(The)30 b(syn)m(tax)390 4491 y Fs(declare)46 b(-a)h -Fi(name)11 b Fs([)p Fi(subscript)g Fs(])150 4639 y Ft(is)30 -b(also)i(accepted;)g(the)e Fq(subscript)h Ft(is)g(ignored.)150 -4787 y(Asso)s(ciativ)m(e)i(arra)m(ys)d(are)h(created)h(using)390 -4935 y Fs(declare)46 b(-A)h Fi(name)11 b Fs(.)275 5083 -y Ft(A)m(ttributes)46 b(ma)m(y)h(b)s(e)e(sp)s(eci\014ed)g(for)h(an)g -(arra)m(y)g(v)-5 b(ariable)47 b(using)e(the)h Fs(declare)e -Ft(and)h Fs(readonly)150 5192 y Ft(builtins.)40 b(Eac)m(h)31 -b(attribute)g(applies)g(to)g(all)g(mem)m(b)s(ers)f(of)g(an)h(arra)m(y) --8 b(.)275 5340 y(Arra)m(ys)30 b(are)h(assigned)f(to)h(using)f(comp)s -(ound)f(assignmen)m(ts)i(of)g(the)f(form)p eop end -%%Page: 90 96 -TeXDict begin 90 95 bop 150 -116 a Ft(Chapter)30 b(6:)41 -b(Bash)30 b(F)-8 b(eatures)2484 b(90)390 299 y Fi(name)11 -b Fs(=\()p Fi(value1)54 b(value2)j Fs(...)47 b(\))150 -445 y Ft(where)37 b(eac)m(h)i Fq(v)-5 b(alue)42 b Ft(is)c(of)g(the)f -(form)g Fs([)p Fi(subscript)11 b Fs(]=)p Fq(string)d -Ft(.)58 b(Indexed)36 b(arra)m(y)i(assignmen)m(ts)g(do)g(not)150 -555 y(require)30 b(an)m(ything)h(but)f Fq(string)8 b -Ft(.)41 b(When)30 b(assigning)h(to)g(indexed)f(arra)m(ys,)h(if)f(the)h -(optional)h(subscript)d(is)150 664 y(supplied,)j(that)h(index)f(is)h +2672 y(explicitly)32 b(declare)f(an)g(arra)m(y)-8 b(,)31 +b(use)390 2809 y Ft(declare)46 b(-a)h Fj(name)150 2947 +y Fu(The)30 b(syn)m(tax)390 3085 y Ft(declare)46 b(-a)h +Fj(name)p Ft([)p Fj(subscript)p Ft(])150 3223 y Fu(is)30 +b(also)i(accepted;)g(the)e Fr(subscript)h Fu(is)g(ignored.)150 +3361 y(Asso)s(ciativ)m(e)i(arra)m(ys)d(are)h(created)h(using)390 +3499 y Ft(declare)46 b(-A)h Fj(name)p Ft(.)275 3636 y +Fu(A)m(ttributes)f(ma)m(y)h(b)s(e)e(sp)s(eci\014ed)g(for)h(an)g(arra)m +(y)g(v)-5 b(ariable)47 b(using)e(the)h Ft(declare)e Fu(and)h +Ft(readonly)150 3746 y Fu(builtins.)40 b(Eac)m(h)31 b(attribute)g +(applies)g(to)g(all)g(mem)m(b)s(ers)f(of)g(an)h(arra)m(y)-8 +b(.)275 3884 y(Arra)m(ys)30 b(are)h(assigned)f(to)h(using)f(comp)s +(ound)f(assignmen)m(ts)i(of)g(the)f(form)390 4022 y Fj(name)p +Ft(=\()p Fj(value1)44 b(value2)j Ft(...)f(\))150 4159 +y Fu(where)38 b(eac)m(h)i Fr(v)-5 b(alue)44 b Fu(is)39 +b(of)g(the)g(form)f Ft([)p Fj(subscript)p Ft(]=)p Fr(string)p +Fu(.)63 b(Indexed)37 b(arra)m(y)j(assignmen)m(ts)f(do)g(not)150 +4269 y(require)31 b(an)m(ything)g(but)f Fr(string)p Fu(.)43 +b(When)31 b(assigning)g(to)h(indexed)e(arra)m(ys,)i(if)f(the)g +(optional)h(subscript)e(is)150 4379 y(supplied,)i(that)h(index)f(is)h (assigned)g(to;)h(otherwise)f(the)g(index)f(of)h(the)g(elemen)m(t)h -(assigned)f(is)f(the)h(last)150 774 y(index)d(assigned)h(to)g(b)m(y)f +(assigned)f(is)f(the)h(last)150 4488 y(index)d(assigned)h(to)g(b)m(y)f (the)g(statemen)m(t)j(plus)c(one.)41 b(Indexing)30 b(starts)h(at)g -(zero.)275 920 y(When)f(assigning)h(to)g(an)f(asso)s(ciativ)m(e)j(arra) -m(y)-8 b(,)32 b(the)e(subscript)f(is)i(required.)275 -1066 y(This)f(syn)m(tax)j(is)e(also)i(accepted)g(b)m(y)f(the)f -Fs(declare)f Ft(builtin.)44 b(Individual)31 b(arra)m(y)h(elemen)m(ts)h -(ma)m(y)g(b)s(e)150 1176 y(assigned)e(to)g(using)f(the)g -Fi(name)11 b Fs([)p Fi(subscript)g Fs(]=)p Fi(value)34 -b Ft(syn)m(tax)d(in)m(tro)s(duced)f(ab)s(o)m(v)m(e.)275 -1322 y(When)g(assigning)h(to)h(an)e(indexed)g(arra)m(y)-8 -b(,)32 b(if)f Fq(name)36 b Ft(is)31 b(subscripted)e(b)m(y)i(a)g -(negativ)m(e)i(n)m(um)m(b)s(er,)c(that)150 1431 y(n)m(um)m(b)s(er)43 -b(is)h(in)m(terpreted)g(as)g(relativ)m(e)i(to)f(one)f(greater)h(than)f -(the)g(maxim)m(um)f(index)h(of)g Fq(name)5 b Ft(,)48 -b(so)150 1541 y(negativ)m(e)30 b(indices)d(coun)m(t)h(bac)m(k)g(from)f -(the)g(end)g(of)g(the)h(arra)m(y)-8 b(,)29 b(and)e(an)g(index)g(of)g -(-1)h(references)g(the)f(last)150 1650 y(elemen)m(t.)275 -1797 y(An)m(y)f(elemen)m(t)i(of)e(an)g(arra)m(y)h(ma)m(y)g(b)s(e)f -(referenced)g(using)g Fs(${)p Fi(name)11 b Fs([)p Fi(subscript)g -Fs(]})p Ft(.)33 b(The)26 b(braces)h(are)150 1906 y(required)h(to)j(a)m -(v)m(oid)f(con\015icts)g(with)f(the)h(shell's)f(\014lename)h(expansion) -f(op)s(erators.)41 b(If)28 b(the)i Fq(subscript)g Ft(is)150 -2016 y(`)p Fs(@)p Ft(')f(or)g(`)p Fs(*)p Ft(',)g(the)g(w)m(ord)g -(expands)f(to)i(all)f(mem)m(b)s(ers)f(of)h(the)g(arra)m(y)h -Fq(name)5 b Ft(.)40 b(These)29 b(subscripts)e(di\013er)i(only)150 -2125 y(when)35 b(the)h(w)m(ord)f(app)s(ears)g(within)g(double)h -(quotes.)57 b(If)36 b(the)g(w)m(ord)f(is)h(double-quoted,)h -Fs(${)p Fi(name)11 b Fs([*]})150 2235 y Ft(expands)25 -b(to)h(a)g(single)h(w)m(ord)e(with)g(the)h(v)-5 b(alue)26 -b(of)g(eac)m(h)h(arra)m(y)f(mem)m(b)s(er)f(separated)h(b)m(y)g(the)f -(\014rst)g(c)m(harac-)150 2345 y(ter)j(of)f(the)h Fs(IFS)e -Ft(v)-5 b(ariable,)29 b(and)e Fs(${)p Fi(name)11 b Fs([@]})24 -b Ft(expands)i(eac)m(h)i(elemen)m(t)h(of)f Fq(name)k -Ft(to)c(a)g(separate)g(w)m(ord.)150 2454 y(When)j(there)h(are)g(no)f -(arra)m(y)h(mem)m(b)s(ers,)g Fs(${)p Fi(name)11 b Fs([@]})28 -b Ft(expands)j(to)h(nothing.)44 b(If)31 b(the)h(double-quoted)150 -2564 y(expansion)39 b(o)s(ccurs)h(within)f(a)h(w)m(ord,)i(the)d -(expansion)h(of)g(the)f(\014rst)g(parameter)h(is)g(joined)f(with)h(the) -150 2673 y(b)s(eginning)29 b(part)g(of)h(the)f(original)i(w)m(ord,)e -(and)g(the)h(expansion)f(of)h(the)f(last)i(parameter)e(is)h(joined)f -(with)150 2783 y(the)g(last)h(part)f(of)g(the)g(original)h(w)m(ord.)40 +(zero.)275 4626 y(When)f(assigning)h(to)g(an)f(asso)s(ciativ)m(e)j +(arra)m(y)-8 b(,)32 b(the)e(subscript)f(is)i(required.)275 +4764 y(This)f(syn)m(tax)j(is)e(also)i(accepted)g(b)m(y)f(the)f +Ft(declare)f Fu(builtin.)44 b(Individual)31 b(arra)m(y)h(elemen)m(ts)h +(ma)m(y)g(b)s(e)150 4873 y(assigned)e(to)g(using)f(the)g +Fj(name)p Ft([)p Fj(subscript)p Ft(]=)p Fj(value)25 b +Fu(syn)m(tax)31 b(in)m(tro)s(duced)e(ab)s(o)m(v)m(e.)275 +5011 y(When)h(assigning)h(to)h(an)e(indexed)g(arra)m(y)-8 +b(,)32 b(if)f Fr(name)36 b Fu(is)31 b(subscripted)e(b)m(y)i(a)g +(negativ)m(e)i(n)m(um)m(b)s(er,)c(that)150 5121 y(n)m(um)m(b)s(er)43 +b(is)h(in)m(terpreted)h(as)f(relativ)m(e)j(to)e(one)f(greater)i(than)e +(the)g(maxim)m(um)g(index)g(of)h Fr(name)p Fu(,)j(so)150 +5230 y(negativ)m(e)30 b(indices)d(coun)m(t)h(bac)m(k)g(from)f(the)g +(end)g(of)g(the)h(arra)m(y)-8 b(,)29 b(and)e(an)g(index)g(of)g(-1)h +(references)g(the)f(last)150 5340 y(elemen)m(t.)p eop +end +%%Page: 90 96 +TeXDict begin 90 95 bop 150 -116 a Fu(Chapter)30 b(6:)41 +b(Bash)30 b(F)-8 b(eatures)2484 b(90)275 299 y(An)m(y)28 +b(elemen)m(t)h(of)g(an)f(arra)m(y)g(ma)m(y)h(b)s(e)f(referenced)g +(using)g Ft(${)p Fj(name)p Ft([)p Fj(subscript)p Ft(]})p +Fu(.)35 b(The)27 b(braces)i(are)150 408 y(required)f(to)j(a)m(v)m(oid)f +(con\015icts)g(with)f(the)h(shell's)f(\014lename)h(expansion)f(op)s +(erators.)41 b(If)28 b(the)i Fr(subscript)g Fu(is)150 +518 y(`)p Ft(@)p Fu(')f(or)h(`)p Ft(*)p Fu(',)f(the)h(w)m(ord)f +(expands)f(to)i(all)g(mem)m(b)s(ers)e(of)i(the)f(arra)m(y)h +Fr(name)p Fu(.)40 b(These)29 b(subscripts)f(di\013er)h(only)150 +628 y(when)36 b(the)g(w)m(ord)g(app)s(ears)g(within)g(double)g(quotes.) +60 b(If)36 b(the)h(w)m(ord)f(is)g(double-quoted,)j Ft(${)p +Fj(name)p Ft([*]})150 737 y Fu(expands)25 b(to)h(a)g(single)h(w)m(ord)e +(with)g(the)h(v)-5 b(alue)26 b(of)g(eac)m(h)h(arra)m(y)f(mem)m(b)s(er)f +(separated)h(b)m(y)g(the)f(\014rst)g(c)m(harac-)150 847 +y(ter)j(of)g(the)h Ft(IFS)e Fu(v)-5 b(ariable,)29 b(and)f +Ft(${)p Fj(name)p Ft([@]})d Fu(expands)i(eac)m(h)i(elemen)m(t)h(of)e +Fr(name)33 b Fu(to)c(a)f(separate)h(w)m(ord.)150 956 +y(When)j(there)h(are)f(no)g(arra)m(y)h(mem)m(b)s(ers,)f +Ft(${)p Fj(name)p Ft([@]})e Fu(expands)h(to)i(nothing.)47 +b(If)31 b(the)i(double-quoted)150 1066 y(expansion)39 +b(o)s(ccurs)h(within)f(a)h(w)m(ord,)i(the)d(expansion)h(of)g(the)f +(\014rst)g(parameter)h(is)g(joined)f(with)h(the)150 1176 +y(b)s(eginning)29 b(part)g(of)h(the)f(original)i(w)m(ord,)e(and)g(the)h +(expansion)f(of)h(the)f(last)i(parameter)e(is)h(joined)f(with)150 +1285 y(the)g(last)h(part)f(of)g(the)g(original)h(w)m(ord.)40 b(This)28 b(is)h(analogous)h(to)f(the)h(expansion)e(of)h(the)g(sp)s -(ecial)h(param-)150 2892 y(eters)35 b(`)p Fs(@)p Ft(')g(and)e(`)p -Fs(*)p Ft('.)54 b Fs(${#)p Fi(name)11 b Fs([)p Fi(subscript)g -Fs(]})28 b Ft(expands)33 b(to)j(the)e(length)h(of)g Fs(${)p -Fi(name)11 b Fs([)p Fi(subscript)g Fs(]})p Ft(.)150 3002 -y(If)30 b Fq(subscript)i Ft(is)f(`)p Fs(@)p Ft(')f(or)h(`)p -Fs(*)p Ft(',)g(the)g(expansion)g(is)g(the)g(n)m(um)m(b)s(er)e(of)i -(elemen)m(ts)h(in)f(the)g(arra)m(y)-8 b(.)42 b(Referencing)150 -3112 y(an)33 b(arra)m(y)g(v)-5 b(ariable)34 b(without)f(a)h(subscript)e -(is)h(equiv)-5 b(alen)m(t)34 b(to)g(referencing)f(with)g(a)g(subscript) -f(of)h(0.)49 b(If)150 3221 y(the)33 b Fq(subscript)h -Ft(used)e(to)h(reference)h(an)f(elemen)m(t)h(of)f(an)g(indexed)f(arra)m -(y)i(ev)-5 b(aluates)34 b(to)g(a)f(n)m(um)m(b)s(er)f(less)150 -3331 y(than)d(zero,)h(it)f(is)g(in)m(terpreted)g(as)g(relativ)m(e)i(to) -f(one)f(greater)h(than)f(the)g(maxim)m(um)f(index)h(of)g(the)g(arra)m -(y)-8 b(,)150 3440 y(so)34 b(negativ)m(e)j(indices)d(coun)m(t)h(bac)m -(k)g(from)f(the)g(end)f(of)i(the)f(arra)m(y)-8 b(,)36 -b(and)e(an)g(index)g(of)g(-1)h(refers)f(to)h(the)150 -3550 y(last)c(elemen)m(t.)275 3696 y(An)k(arra)m(y)i(v)-5 -b(ariable)37 b(is)g(considered)f(set)h(if)f(a)h(subscript)e(has)h(b)s -(een)g(assigned)g(a)h(v)-5 b(alue.)59 b(The)36 b(n)m(ull)150 -3806 y(string)30 b(is)h(a)g(v)-5 b(alid)30 b(v)-5 b(alue.)275 -3952 y(It)30 b(is)h(p)s(ossible)f(to)h(obtain)h(the)e(k)m(eys)i -(\(indices\))f(of)g(an)f(arra)m(y)h(as)g(w)m(ell)h(as)f(the)g(v)-5 -b(alues.)41 b($)p Fs({)p Ft(!)p Fq(name)5 b Ft([)p Fs(@)p -Ft(])p Fs(})150 4061 y Ft(and)39 b($)p Fs({)p Ft(!)p -Fq(name)5 b Ft([*])p Fs(})40 b Ft(expand)f(to)h(the)g(indices)f -(assigned)h(in)f(arra)m(y)h(v)-5 b(ariable)40 b Fq(name)5 -b Ft(.)67 b(The)39 b(treatmen)m(t)150 4171 y(when)i(in)g(double)g -(quotes)h(is)f(similar)h(to)h(the)e(expansion)h(of)f(the)h(sp)s(ecial)g -(parameters)g(`)p Fs(@)p Ft(')g(and)f(`)p Fs(*)p Ft(')150 -4281 y(within)30 b(double)g(quotes.)275 4427 y(The)44 -b Fs(unset)f Ft(builtin)h(is)h(used)f(to)h(destro)m(y)g(arra)m(ys.)84 -b Fs(unset)29 b Fi(name)11 b Fs([)p Fi(subscript)g Fs(])40 -b Ft(destro)m(ys)45 b(the)150 4536 y(arra)m(y)32 b(elemen)m(t)h(at)g -(index)e Fq(subscript)r Ft(.)44 b(Negativ)m(e)34 b(subscripts)d(to)h -(indexed)f(arra)m(ys)i(are)f(in)m(terpreted)g(as)150 -4646 y(describ)s(ed)37 b(ab)s(o)m(v)m(e.)67 b(Care)38 -b(m)m(ust)h(b)s(e)f(tak)m(en)h(to)h(a)m(v)m(oid)g(un)m(w)m(an)m(ted)e -(side)h(e\013ects)h(caused)e(b)m(y)h(\014lename)150 4756 -y(expansion.)49 b Fs(unset)29 b Fi(name)11 b Ft(,)32 -b(where)g Fq(name)39 b Ft(is)33 b(an)g(arra)m(y)-8 b(,)35 -b(remo)m(v)m(es)f(the)f(en)m(tire)h(arra)m(y)-8 b(.)50 -b(A)33 b(subscript)f(of)150 4865 y(`)p Fs(*)p Ft(')f(or)f(`)p -Fs(@)p Ft(')g(also)i(remo)m(v)m(es)f(the)g(en)m(tire)g(arra)m(y)-8 -b(.)275 5011 y(The)41 b Fs(declare)p Ft(,)i Fs(local)p -Ft(,)h(and)d Fs(readonly)f Ft(builtins)h(eac)m(h)j(accept)f(a)f(`)p -Fs(-a)p Ft(')g(option)h(to)f(sp)s(ecify)g(an)150 5121 -y(indexed)25 b(arra)m(y)h(and)e(a)i(`)p Fs(-A)p Ft(')f(option)h(to)g -(sp)s(ecify)f(an)g(asso)s(ciativ)m(e)j(arra)m(y)-8 b(.)40 -b(If)25 b(b)s(oth)g(options)g(are)h(supplied,)150 5230 -y(`)p Fs(-A)p Ft(')k(tak)m(es)i(precedence.)41 b(The)30 -b Fs(read)f Ft(builtin)g(accepts)j(a)e(`)p Fs(-a)p Ft(')g(option)h(to)g -(assign)g(a)f(list)h(of)f(w)m(ords)g(read)150 5340 y(from)40 -b(the)g(standard)f(input)h(to)h(an)f(arra)m(y)-8 b(,)44 -b(and)39 b(can)i(read)f(v)-5 b(alues)40 b(from)g(the)g(standard)g -(input)f(in)m(to)p eop end -%%Page: 91 97 -TeXDict begin 91 96 bop 150 -116 a Ft(Chapter)30 b(6:)41 -b(Bash)30 b(F)-8 b(eatures)2484 b(91)150 299 y(individual)26 -b(arra)m(y)h(elemen)m(ts.)41 b(The)26 b Fs(set)f Ft(and)h -Fs(declare)f Ft(builtins)g(displa)m(y)i(arra)m(y)g(v)-5 -b(alues)27 b(in)f(a)h(w)m(a)m(y)g(that)150 408 y(allo)m(ws)32 -b(them)e(to)h(b)s(e)f(reused)f(as)i(input.)150 645 y -Fr(6.8)68 b(The)45 b(Directory)g(Stac)l(k)150 804 y Ft(The)21 -b(directory)h(stac)m(k)h(is)e(a)h(list)g(of)f(recen)m(tly-visited)j -(directories.)39 b(The)20 b Fs(pushd)g Ft(builtin)h(adds)g(directories) -150 914 y(to)42 b(the)f(stac)m(k)i(as)e(it)h(c)m(hanges)g(the)f(curren) -m(t)g(directory)-8 b(,)45 b(and)40 b(the)i Fs(popd)e -Ft(builtin)g(remo)m(v)m(es)j(sp)s(eci\014ed)150 1023 -y(directories)29 b(from)f(the)h(stac)m(k)h(and)d(c)m(hanges)j(the)e -(curren)m(t)g(directory)h(to)g(the)g(directory)f(remo)m(v)m(ed.)41 -b(The)150 1133 y Fs(dirs)29 b Ft(builtin)h(displa)m(ys)h(the)f(con)m -(ten)m(ts)i(of)f(the)f(directory)h(stac)m(k.)275 1270 +(ecial)h(param-)150 1395 y(eters)g(`)p Ft(@)p Fu(')f(and)g(`)p +Ft(*)p Fu('.)41 b Ft(${#)p Fj(name)p Ft([)p Fj(subscript)p +Ft(]})24 b Fu(expands)k(to)i(the)g(length)g(of)f Ft(${)p +Fj(name)p Ft([)p Fj(subscript)p Ft(]})p Fu(.)35 b(If)150 +1504 y Fr(subscript)29 b Fu(is)g(`)p Ft(@)p Fu(')f(or)h(`)p +Ft(*)p Fu(',)g(the)g(expansion)f(is)h(the)f(n)m(um)m(b)s(er)g(of)g +(elemen)m(ts)i(in)e(the)h(arra)m(y)-8 b(.)41 b(Referencing)29 +b(an)150 1614 y(arra)m(y)j(v)-5 b(ariable)32 b(without)f(a)h(subscript) +e(is)h(equiv)-5 b(alen)m(t)33 b(to)f(referencing)f(with)g(a)h +(subscript)e(of)h(0.)44 b(If)31 b(the)150 1724 y Fr(subscript)f +Fu(used)e(to)i(reference)g(an)f(elemen)m(t)i(of)e(an)g(indexed)g(arra)m +(y)h(ev)-5 b(aluates)30 b(to)g(a)g(n)m(um)m(b)s(er)e(less)h(than)150 +1833 y(zero,)37 b(it)f(is)f(in)m(terpreted)g(as)g(relativ)m(e)i(to)f +(one)f(greater)i(than)d(the)i(maxim)m(um)e(index)h(of)g(the)g(arra)m(y) +-8 b(,)38 b(so)150 1943 y(negativ)m(e)33 b(indices)e(coun)m(t)h(bac)m +(k)f(from)g(the)g(end)f(of)h(the)g(arra)m(y)-8 b(,)32 +b(and)e(an)h(index)f(of)h(-1)h(refers)e(to)i(the)f(last)150 +2052 y(elemen)m(t.)275 2186 y(An)k(arra)m(y)i(v)-5 b(ariable)37 +b(is)g(considered)f(set)h(if)f(a)h(subscript)e(has)h(b)s(een)g +(assigned)g(a)h(v)-5 b(alue.)59 b(The)36 b(n)m(ull)150 +2295 y(string)30 b(is)h(a)g(v)-5 b(alid)30 b(v)-5 b(alue.)275 +2429 y(It)29 b(is)h(p)s(ossible)f(to)h(obtain)g(the)f(k)m(eys)i +(\(indices\))f(of)f(an)h(arra)m(y)g(as)f(w)m(ell)i(as)f(the)f(v)-5 +b(alues.)41 b($)p Fi({)p Fu(!)p Fr(name)5 b Fu([@])p +Fi(})150 2538 y Fu(and)39 b($)p Fi({)p Fu(!)p Fr(name)5 +b Fu([*])p Fi(})43 b Fu(expand)c(to)i(the)f(indices)h(assigned)f(in)g +(arra)m(y)g(v)-5 b(ariable)41 b Fr(name)p Fu(.)70 b(The)39 +b(treatmen)m(t)150 2648 y(when)i(in)g(double)g(quotes)h(is)f(similar)h +(to)h(the)e(expansion)h(of)f(the)h(sp)s(ecial)g(parameters)g(`)p +Ft(@)p Fu(')g(and)f(`)p Ft(*)p Fu(')150 2757 y(within)30 +b(double)g(quotes.)275 2891 y(The)j Ft(unset)g Fu(builtin)h(is)g(used)g +(to)h(destro)m(y)g(arra)m(ys.)52 b Ft(unset)29 b Fj(name)p +Ft([)p Fj(subscript)p Ft(])h Fu(destro)m(ys)35 b(the)g(ar-)150 +3000 y(ra)m(y)j(elemen)m(t)h(at)g(index)e Fr(subscript)p +Fu(.)61 b(Negativ)m(e)41 b(subscripts)36 b(to)i(indexed)g(arra)m(ys)g +(are)g(in)m(terpreted)g(as)150 3110 y(describ)s(ed)f(ab)s(o)m(v)m(e.)67 +b(Care)38 b(m)m(ust)h(b)s(e)f(tak)m(en)h(to)h(a)m(v)m(oid)g(un)m(w)m +(an)m(ted)e(side)h(e\013ects)h(caused)e(b)m(y)h(\014lename)150 +3220 y(expansion.)50 b Ft(unset)29 b Fj(name)p Fu(,)34 +b(where)f Fr(name)39 b Fu(is)34 b(an)f(arra)m(y)-8 b(,)36 +b(remo)m(v)m(es)f(the)f(en)m(tire)g(arra)m(y)-8 b(.)52 +b(A)33 b(subscript)g(of)150 3329 y(`)p Ft(*)p Fu(')e(or)f(`)p +Ft(@)p Fu(')g(also)i(remo)m(v)m(es)f(the)g(en)m(tire)g(arra)m(y)-8 +b(.)275 3463 y(The)20 b Ft(declare)p Fu(,)h Ft(local)p +Fu(,)h(and)e Ft(readonly)f Fu(builtins)h(eac)m(h)i(accept)g(a)g +Ft(-a)e Fu(option)h(to)h(sp)s(ecify)f(an)f(indexed)150 +3572 y(arra)m(y)28 b(and)f(a)h Ft(-A)e Fu(option)i(to)g(sp)s(ecify)f +(an)h(asso)s(ciativ)m(e)i(arra)m(y)-8 b(.)40 b(If)27 +b(b)s(oth)g(options)h(are)g(supplied,)f Ft(-A)f Fu(tak)m(es)150 +3682 y(precedence.)55 b(The)35 b Ft(read)f Fu(builtin)h(accepts)h(a)g +Ft(-a)e Fu(option)i(to)g(assign)f(a)g(list)h(of)f(w)m(ords)g(read)g +(from)g(the)150 3791 y(standard)h(input)g(to)i(an)f(arra)m(y)-8 +b(,)40 b(and)c(can)h(read)g(v)-5 b(alues)38 b(from)e(the)h(standard)g +(input)f(in)m(to)i(individual)150 3901 y(arra)m(y)f(elemen)m(ts.)62 +b(The)36 b Ft(set)g Fu(and)h Ft(declare)d Fu(builtins)j(displa)m(y)g +(arra)m(y)g(v)-5 b(alues)37 b(in)g(a)g(w)m(a)m(y)h(that)g(allo)m(ws)150 +4011 y(them)30 b(to)h(b)s(e)f(reused)g(as)g(input.)150 +4241 y Fs(6.8)68 b(The)45 b(Directory)g(Stac)l(k)150 +4400 y Fu(The)21 b(directory)h(stac)m(k)h(is)e(a)h(list)g(of)f(recen)m +(tly-visited)j(directories.)39 b(The)20 b Ft(pushd)g +Fu(builtin)h(adds)g(directories)150 4510 y(to)42 b(the)f(stac)m(k)i(as) +e(it)h(c)m(hanges)g(the)f(curren)m(t)g(directory)-8 b(,)45 +b(and)40 b(the)i Ft(popd)e Fu(builtin)g(remo)m(v)m(es)j(sp)s(eci\014ed) +150 4620 y(directories)29 b(from)f(the)h(stac)m(k)h(and)d(c)m(hanges)j +(the)e(curren)m(t)g(directory)h(to)g(the)g(directory)f(remo)m(v)m(ed.) +41 b(The)150 4729 y Ft(dirs)29 b Fu(builtin)h(displa)m(ys)h(the)f(con)m +(ten)m(ts)i(of)f(the)f(directory)h(stac)m(k.)275 4863 y(The)k(con)m(ten)m(ts)i(of)f(the)h(directory)f(stac)m(k)h(are)f(also)h -(visible)g(as)f(the)g(v)-5 b(alue)36 b(of)g(the)g Fs(DIRSTACK)e -Ft(shell)150 1379 y(v)-5 b(ariable.)150 1581 y Fj(6.8.1)63 -b(Directory)40 b(Stac)m(k)g(Builtins)150 1754 y Fs(dirs)870 -1890 y(dirs)47 b([-clpv])e([+)p Fi(N)58 b Fs(|)47 b(-)p -Fi(N)11 b Fs(])630 2025 y Ft(Displa)m(y)35 b(the)f(list)g(of)g(curren)m -(tly)g(remem)m(b)s(ered)f(directories.)51 b(Directories)36 -b(are)e(added)f(to)630 2135 y(the)28 b(list)h(with)f(the)g -Fs(pushd)f Ft(command;)i(the)f Fs(popd)f Ft(command)h(remo)m(v)m(es)h -(directories)g(from)630 2245 y(the)i(list.)630 2406 y -Fs(-c)384 b Ft(Clears)31 b(the)f(directory)h(stac)m(k)h(b)m(y)e -(deleting)h(all)h(of)e(the)h(elemen)m(ts.)630 2568 y -Fs(-l)384 b Ft(Pro)s(duces)31 b(a)h(listing)h(using)e(full)h -(pathnames;)h(the)f(default)g(listing)h(format)1110 2678 -y(uses)d(a)h(tilde)g(to)g(denote)g(the)f(home)h(directory)-8 -b(.)630 2840 y Fs(-p)384 b Ft(Causes)30 b Fs(dirs)f Ft(to)i(prin)m(t)f -(the)h(directory)g(stac)m(k)h(with)e(one)g(en)m(try)h(p)s(er)e(line.) -630 3002 y Fs(-v)384 b Ft(Causes)36 b Fs(dirs)f Ft(to)i(prin)m(t)f(the) -g(directory)h(stac)m(k)h(with)e(one)h(en)m(try)f(p)s(er)f(line,)1110 -3111 y(pre\014xing)30 b(eac)m(h)h(en)m(try)g(with)f(its)h(index)e(in)i -(the)f(stac)m(k.)630 3273 y Fs(+)p Fi(N)384 b Ft(Displa)m(ys)23 -b(the)f Fq(N)10 b Ft(th)21 b(directory)h(\(coun)m(ting)h(from)e(the)h -(left)g(of)g(the)g(list)g(prin)m(ted)1110 3383 y(b)m(y)30 -b Fs(dirs)f Ft(when)h(in)m(v)m(ok)m(ed)i(without)e(options\),)h -(starting)g(with)g(zero.)630 3544 y Fs(-)p Fi(N)384 b -Ft(Displa)m(ys)47 b(the)g Fq(N)10 b Ft(th)46 b(directory)h(\(coun)m -(ting)g(from)f(the)g(righ)m(t)h(of)g(the)f(list)1110 -3654 y(prin)m(ted)25 b(b)m(y)g Fs(dirs)g Ft(when)f(in)m(v)m(ok)m(ed)j -(without)f(options\),)h(starting)g(with)e(zero.)150 3816 -y Fs(popd)870 3952 y(popd)47 b([-n])f([+)p Fi(N)58 b -Fs(|)47 b(-)p Fi(N)11 b Fs(])630 4087 y Ft(Remo)m(v)m(e)26 +(visible)g(as)f(the)g(v)-5 b(alue)36 b(of)g(the)g Ft(DIRSTACK)e +Fu(shell)150 4972 y(v)-5 b(ariable.)150 5169 y Fk(6.8.1)63 +b(Directory)40 b(Stac)m(k)g(Builtins)150 5340 y Ft(dirs)p +eop end +%%Page: 91 97 +TeXDict begin 91 96 bop 150 -116 a Fu(Chapter)30 b(6:)41 +b(Bash)30 b(F)-8 b(eatures)2484 b(91)870 299 y Ft(dirs)47 +b([-clpv])e([+)p Fj(N)i Ft(|)h(-)p Fj(N)p Ft(])630 435 +y Fu(Displa)m(y)35 b(the)f(list)g(of)g(curren)m(tly)g(remem)m(b)s(ered) +f(directories.)51 b(Directories)36 b(are)e(added)f(to)630 +545 y(the)28 b(list)h(with)f(the)g Ft(pushd)f Fu(command;)i(the)f +Ft(popd)f Fu(command)h(remo)m(v)m(es)h(directories)g(from)630 +654 y(the)i(list.)630 817 y Ft(-c)384 b Fu(Clears)31 +b(the)f(directory)h(stac)m(k)h(b)m(y)e(deleting)h(all)h(of)e(the)h +(elemen)m(ts.)630 980 y Ft(-l)384 b Fu(Pro)s(duces)31 +b(a)h(listing)h(using)e(full)h(pathnames;)h(the)f(default)g(listing)h +(format)1110 1089 y(uses)d(a)h(tilde)g(to)g(denote)g(the)f(home)h +(directory)-8 b(.)630 1252 y Ft(-p)384 b Fu(Causes)30 +b Ft(dirs)f Fu(to)i(prin)m(t)f(the)h(directory)g(stac)m(k)h(with)e(one) +g(en)m(try)h(p)s(er)e(line.)630 1415 y Ft(-v)384 b Fu(Causes)36 +b Ft(dirs)f Fu(to)i(prin)m(t)f(the)g(directory)h(stac)m(k)h(with)e(one) +h(en)m(try)f(p)s(er)f(line,)1110 1524 y(pre\014xing)30 +b(eac)m(h)h(en)m(try)g(with)f(its)h(index)e(in)i(the)f(stac)m(k.)630 +1687 y Ft(+)p Fj(N)384 b Fu(Displa)m(ys)23 b(the)f Fr(N)10 +b Fu(th)21 b(directory)h(\(coun)m(ting)h(from)e(the)h(left)g(of)g(the)g +(list)g(prin)m(ted)1110 1797 y(b)m(y)30 b Ft(dirs)f Fu(when)h(in)m(v)m +(ok)m(ed)i(without)e(options\),)h(starting)g(with)g(zero.)630 +1959 y Ft(-)p Fj(N)384 b Fu(Displa)m(ys)47 b(the)g Fr(N)10 +b Fu(th)46 b(directory)h(\(coun)m(ting)g(from)f(the)g(righ)m(t)h(of)g +(the)f(list)1110 2069 y(prin)m(ted)25 b(b)m(y)g Ft(dirs)g +Fu(when)f(in)m(v)m(ok)m(ed)j(without)f(options\),)h(starting)g(with)e +(zero.)150 2232 y Ft(popd)870 2368 y(popd)47 b([-n])f([+)p +Fj(N)h Ft(|)h(-)p Fj(N)p Ft(])630 2504 y Fu(Remo)m(v)m(e)26 b(the)e(top)g(en)m(try)h(from)e(the)h(directory)h(stac)m(k,)i(and)c -Fs(cd)h Ft(to)h(the)f(new)f(top)i(directory)-8 b(.)630 -4197 y(When)32 b(no)g(argumen)m(ts)h(are)g(giv)m(en,)h -Fs(popd)d Ft(remo)m(v)m(es)j(the)f(top)f(directory)h(from)f(the)g(stac) -m(k)630 4307 y(and)f(p)s(erforms)e(a)j Fs(cd)f Ft(to)h(the)f(new)g(top) +Ft(cd)h Fu(to)h(the)f(new)f(top)i(directory)-8 b(.)630 +2614 y(When)32 b(no)g(argumen)m(ts)h(are)g(giv)m(en,)h +Ft(popd)d Fu(remo)m(v)m(es)j(the)f(top)f(directory)h(from)f(the)g(stac) +m(k)630 2723 y(and)f(p)s(erforms)e(a)j Ft(cd)f Fu(to)h(the)f(new)g(top) h(directory)-8 b(.)44 b(The)31 b(elemen)m(ts)i(are)e(n)m(um)m(b)s(ered) -f(from)630 4416 y(0)j(starting)g(at)g(the)f(\014rst)g(directory)g -(listed)h(with)f Fs(dirs)p Ft(;)g(that)h(is,)g Fs(popd)e -Ft(is)i(equiv)-5 b(alen)m(t)33 b(to)630 4526 y Fs(popd)c(+0)p -Ft(.)630 4688 y Fs(-n)384 b Ft(Suppresses)27 b(the)j(normal)g(c)m +f(from)630 2833 y(0)j(starting)g(at)g(the)f(\014rst)g(directory)g +(listed)h(with)f Ft(dirs)p Fu(;)g(that)h(is,)g Ft(popd)e +Fu(is)i(equiv)-5 b(alen)m(t)33 b(to)630 2942 y Ft(popd)c(+0)p +Fu(.)630 3105 y Ft(-n)384 b Fu(Suppresses)27 b(the)j(normal)g(c)m (hange)g(of)g(directory)g(when)e(remo)m(ving)j(directo-)1110 -4797 y(ries)f(from)g(the)h(stac)m(k,)h(so)f(that)g(only)f(the)h(stac)m -(k)g(is)g(manipulated.)630 4959 y Fs(+)p Fi(N)384 b Ft(Remo)m(v)m(es)22 -b(the)f Fq(N)10 b Ft(th)20 b(directory)g(\(coun)m(ting)i(from)e(the)g -(left)h(of)g(the)f(list)h(prin)m(ted)1110 5069 y(b)m(y)30 -b Fs(dirs)p Ft(\),)g(starting)h(with)f(zero.)630 5230 -y Fs(-)p Fi(N)384 b Ft(Remo)m(v)m(es)46 b(the)g Fq(N)10 -b Ft(th)44 b(directory)h(\(coun)m(ting)h(from)f(the)g(righ)m(t)g(of)g -(the)g(list)1110 5340 y(prin)m(ted)30 b(b)m(y)g Fs(dirs)p -Ft(\),)g(starting)h(with)f(zero.)p eop end -%%Page: 92 98 -TeXDict begin 92 97 bop 150 -116 a Ft(Chapter)30 b(6:)41 -b(Bash)30 b(F)-8 b(eatures)2484 b(92)150 299 y Fs(pushd)870 -433 y(pushd)46 b([-n])h([+)p Fi(N)57 b Fs(|)48 b Fi(-N)58 -b Fs(|)47 b Fi(dir)11 b Fs(])630 568 y Ft(Sa)m(v)m(e)29 -b(the)f(curren)m(t)g(directory)g(on)g(the)g(top)g(of)g(the)g(directory) -h(stac)m(k)g(and)e(then)h Fs(cd)f Ft(to)i Fq(dir)7 b -Ft(.)630 678 y(With)31 b(no)f(argumen)m(ts,)h Fs(pushd)e -Ft(exc)m(hanges)j(the)e(top)h(t)m(w)m(o)h(directories.)630 -837 y Fs(-n)384 b Ft(Suppresses)26 b(the)i(normal)h(c)m(hange)g(of)f -(directory)h(when)e(adding)h(directories)1110 947 y(to)j(the)g(stac)m -(k,)h(so)e(that)h(only)g(the)f(stac)m(k)i(is)f(manipulated.)630 -1106 y Fs(+)p Fi(N)384 b Ft(Brings)29 b(the)f Fq(N)10 -b Ft(th)29 b(directory)g(\(coun)m(ting)h(from)e(the)g(left)i(of)e(the)h -(list)g(prin)m(ted)1110 1216 y(b)m(y)34 b Fs(dirs)p Ft(,)g(starting)h -(with)f(zero\))i(to)f(the)f(top)g(of)h(the)f(list)h(b)m(y)f(rotating)i -(the)1110 1325 y(stac)m(k.)630 1485 y Fs(-)p Fi(N)384 -b Ft(Brings)23 b(the)g Fq(N)10 b Ft(th)23 b(directory)h(\(coun)m(ting)g -(from)e(the)i(righ)m(t)f(of)g(the)h(list)f(prin)m(ted)1110 -1594 y(b)m(y)34 b Fs(dirs)p Ft(,)g(starting)h(with)f(zero\))i(to)f(the) +3215 y(ries)f(from)g(the)h(stac)m(k,)h(so)f(that)g(only)f(the)h(stac)m +(k)g(is)g(manipulated.)630 3377 y Ft(+)p Fj(N)384 b Fu(Remo)m(v)m(es)22 +b(the)f Fr(N)10 b Fu(th)20 b(directory)g(\(coun)m(ting)i(from)e(the)g +(left)h(of)g(the)f(list)h(prin)m(ted)1110 3487 y(b)m(y)30 +b Ft(dirs)p Fu(\),)g(starting)h(with)f(zero.)630 3650 +y Ft(-)p Fj(N)384 b Fu(Remo)m(v)m(es)46 b(the)g Fr(N)10 +b Fu(th)44 b(directory)h(\(coun)m(ting)h(from)f(the)g(righ)m(t)g(of)g +(the)g(list)1110 3759 y(prin)m(ted)30 b(b)m(y)g Ft(dirs)p +Fu(\),)g(starting)h(with)f(zero.)150 3922 y Ft(pushd)870 +4058 y(pushd)46 b([-n])h([+)p Fj(N)g Ft(|)g Fj(-N)h Ft(|)f +Fj(dir)p Ft(])630 4194 y Fu(Sa)m(v)m(e)30 b(the)e(curren)m(t)g +(directory)h(on)f(the)h(top)f(of)h(the)f(directory)h(stac)m(k)h(and)e +(then)g Ft(cd)f Fu(to)i Fr(dir)p Fu(.)630 4304 y(With)i(no)f(argumen)m +(ts,)h Ft(pushd)e Fu(exc)m(hanges)j(the)e(top)h(t)m(w)m(o)h +(directories.)630 4467 y Ft(-n)384 b Fu(Suppresses)26 +b(the)i(normal)h(c)m(hange)g(of)f(directory)h(when)e(adding)h +(directories)1110 4576 y(to)j(the)g(stac)m(k,)h(so)e(that)h(only)g(the) +f(stac)m(k)i(is)f(manipulated.)630 4739 y Ft(+)p Fj(N)384 +b Fu(Brings)29 b(the)f Fr(N)10 b Fu(th)29 b(directory)g(\(coun)m(ting)h +(from)e(the)g(left)i(of)e(the)h(list)g(prin)m(ted)1110 +4848 y(b)m(y)34 b Ft(dirs)p Fu(,)g(starting)h(with)f(zero\))i(to)f(the) f(top)g(of)h(the)f(list)h(b)m(y)f(rotating)i(the)1110 -1704 y(stac)m(k.)630 1863 y Fi(dir)336 b Ft(Mak)m(es)31 -b(the)g(curren)m(t)f(w)m(orking)g(directory)g(b)s(e)g(the)g(top)g(of)g -(the)h(stac)m(k,)h(mak-)1110 1973 y(ing)39 b(it)g(the)g(new)f(curren)m -(t)g(directory)h(as)g(if)g(it)g(had)f(b)s(een)g(supplied)f(as)i(an)1110 -2083 y(argumen)m(t)31 b(to)g(the)f Fs(cd)g Ft(builtin.)150 -2315 y Fr(6.9)68 b(Con)l(trolling)47 b(the)e(Prompt)150 -2475 y Ft(The)24 b(v)-5 b(alue)24 b(of)h(the)f(v)-5 b(ariable)25 -b Fs(PROMPT_COMMAND)20 b Ft(is)25 b(examined)f(just)g(b)s(efore)f(Bash) -i(prin)m(ts)e(eac)m(h)j(primary)150 2584 y(prompt.)39 -b(If)28 b Fs(PROMPT_COMMAND)d Ft(is)j(set)h(and)f(has)g(a)h(non-n)m -(ull)f(v)-5 b(alue,)29 b(then)f(the)h(v)-5 b(alue)29 -b(is)f(executed)i(just)150 2694 y(as)h(if)f(it)h(had)f(b)s(een)f(t)m -(yp)s(ed)h(on)h(the)f(command)g(line.)275 2828 y(In)d(addition,)j(the)f +4958 y(stac)m(k.)630 5121 y Ft(-)p Fj(N)384 b Fu(Brings)23 +b(the)g Fr(N)10 b Fu(th)23 b(directory)h(\(coun)m(ting)g(from)e(the)i +(righ)m(t)f(of)g(the)h(list)f(prin)m(ted)1110 5230 y(b)m(y)34 +b Ft(dirs)p Fu(,)g(starting)h(with)f(zero\))i(to)f(the)f(top)g(of)h +(the)f(list)h(b)m(y)f(rotating)i(the)1110 5340 y(stac)m(k.)p +eop end +%%Page: 92 98 +TeXDict begin 92 97 bop 150 -116 a Fu(Chapter)30 b(6:)41 +b(Bash)30 b(F)-8 b(eatures)2484 b(92)630 299 y Fj(dir)336 +b Fu(Mak)m(es)31 b(the)g(curren)m(t)f(w)m(orking)g(directory)g(b)s(e)g +(the)g(top)g(of)g(the)h(stac)m(k,)h(mak-)1110 408 y(ing)39 +b(it)g(the)g(new)f(curren)m(t)g(directory)h(as)g(if)g(it)g(had)f(b)s +(een)g(supplied)f(as)i(an)1110 518 y(argumen)m(t)31 b(to)g(the)f +Ft(cd)g Fu(builtin.)150 752 y Fs(6.9)68 b(Con)l(trolling)47 +b(the)e(Prompt)150 911 y Fu(The)24 b(v)-5 b(alue)24 b(of)h(the)f(v)-5 +b(ariable)25 b Ft(PROMPT_COMMAND)20 b Fu(is)25 b(examined)f(just)g(b)s +(efore)f(Bash)i(prin)m(ts)e(eac)m(h)j(primary)150 1021 +y(prompt.)39 b(If)28 b Ft(PROMPT_COMMAND)d Fu(is)j(set)h(and)f(has)g(a) +h(non-n)m(ull)f(v)-5 b(alue,)29 b(then)f(the)h(v)-5 b(alue)29 +b(is)f(executed)i(just)150 1130 y(as)h(if)f(it)h(had)f(b)s(een)f(t)m +(yp)s(ed)h(on)h(the)f(command)g(line.)275 1266 y(In)d(addition,)j(the)f (follo)m(wing)h(table)f(describ)s(es)f(the)h(sp)s(ecial)g(c)m (haracters)h(whic)m(h)f(can)f(app)s(ear)g(in)h(the)150 -2938 y(prompt)g(v)-5 b(ariables)32 b Fs(PS1)d Ft(to)i -Fs(PS4)p Ft(:)150 3097 y Fs(\\a)384 b Ft(A)30 b(b)s(ell)h(c)m -(haracter.)150 3257 y Fs(\\d)384 b Ft(The)30 b(date,)h(in)f -Fs(")p Ft(W)-8 b(eekda)m(y)32 b(Mon)m(th)f(Date)p Fs(")h -Ft(format)f(\(e.g.,)h Fs(")p Ft(T)-8 b(ue)30 b(Ma)m(y)h(26)p -Fs(")p Ft(\).)150 3416 y Fs(\\D{)p Fi(format)11 b Fs(})630 -3526 y Ft(The)27 b Fq(format)i Ft(is)f(passed)e(to)i -Fs(strftime)p Ft(\(3\))f(and)f(the)i(result)f(is)g(inserted)g(in)m(to)h -(the)g(prompt)630 3636 y(string;)42 b(an)d(empt)m(y)f -Fq(format)j Ft(results)d(in)g(a)h(lo)s(cale-sp)s(eci\014c)h(time)f -(represen)m(tation.)65 b(The)630 3745 y(braces)31 b(are)f(required.)150 -3905 y Fs(\\e)384 b Ft(An)30 b(escap)s(e)h(c)m(haracter.)150 -4064 y Fs(\\h)384 b Ft(The)30 b(hostname,)h(up)e(to)i(the)g(\014rst)e -(`.'.)150 4224 y Fs(\\H)384 b Ft(The)30 b(hostname.)150 -4383 y Fs(\\j)384 b Ft(The)30 b(n)m(um)m(b)s(er)f(of)h(jobs)g(curren)m -(tly)h(managed)g(b)m(y)f(the)g(shell.)150 4543 y Fs(\\l)384 -b Ft(The)30 b(basename)h(of)f(the)h(shell's)f(terminal)h(device)g -(name.)150 4702 y Fs(\\n)384 b Ft(A)30 b(newline.)150 -4862 y Fs(\\r)384 b Ft(A)30 b(carriage)i(return.)150 -5021 y Fs(\\s)384 b Ft(The)22 b(name)g(of)h(the)f(shell,)i(the)f -(basename)f(of)h Fs($0)f Ft(\(the)g(p)s(ortion)g(follo)m(wing)i(the)f -(\014nal)e(slash\).)150 5180 y Fs(\\t)384 b Ft(The)30 -b(time,)h(in)f(24-hour)h(HH:MM:SS)g(format.)150 5340 -y Fs(\\T)384 b Ft(The)30 b(time,)h(in)f(12-hour)h(HH:MM:SS)g(format.)p -eop end +1375 y(prompt)g(v)-5 b(ariables)32 b Ft(PS1)d Fu(to)i +Ft(PS4)p Fu(:)150 1536 y Ft(\\a)384 b Fu(A)30 b(b)s(ell)h(c)m +(haracter.)150 1696 y Ft(\\d)384 b Fu(The)30 b(date,)h(in)f +Ft(")p Fu(W)-8 b(eekda)m(y)32 b(Mon)m(th)f(Date)p Ft(")h +Fu(format)f(\(e.g.,)h Ft(")p Fu(T)-8 b(ue)30 b(Ma)m(y)h(26)p +Ft(")p Fu(\).)150 1857 y Ft(\\D{)p Fj(format)p Ft(})630 +1966 y Fu(The)c Fr(format)i Fu(is)f(passed)e(to)i Ft(strftime)p +Fu(\(3\))f(and)f(the)i(result)f(is)g(inserted)g(in)m(to)h(the)g(prompt) +630 2076 y(string;)42 b(an)d(empt)m(y)f Fr(format)j Fu(results)d(in)g +(a)h(lo)s(cale-sp)s(eci\014c)h(time)f(represen)m(tation.)65 +b(The)630 2185 y(braces)31 b(are)f(required.)150 2346 +y Ft(\\e)384 b Fu(An)30 b(escap)s(e)h(c)m(haracter.)150 +2506 y Ft(\\h)384 b Fu(The)30 b(hostname,)h(up)e(to)i(the)g(\014rst)e +(`.'.)150 2666 y Ft(\\H)384 b Fu(The)30 b(hostname.)150 +2826 y Ft(\\j)384 b Fu(The)30 b(n)m(um)m(b)s(er)f(of)h(jobs)g(curren)m +(tly)h(managed)g(b)m(y)f(the)g(shell.)150 2987 y Ft(\\l)384 +b Fu(The)30 b(basename)h(of)f(the)h(shell's)f(terminal)h(device)g +(name.)150 3147 y Ft(\\n)384 b Fu(A)30 b(newline.)150 +3307 y Ft(\\r)384 b Fu(A)30 b(carriage)i(return.)150 +3467 y Ft(\\s)384 b Fu(The)22 b(name)g(of)h(the)f(shell,)i(the)f +(basename)f(of)h Ft($0)f Fu(\(the)g(p)s(ortion)g(follo)m(wing)i(the)f +(\014nal)e(slash\).)150 3628 y Ft(\\t)384 b Fu(The)30 +b(time,)h(in)f(24-hour)h(HH:MM:SS)g(format.)150 3788 +y Ft(\\T)384 b Fu(The)30 b(time,)h(in)f(12-hour)h(HH:MM:SS)g(format.) +150 3948 y Ft(\\@)384 b Fu(The)30 b(time,)h(in)f(12-hour)h(am/pm)f +(format.)150 4109 y Ft(\\A)384 b Fu(The)30 b(time,)h(in)f(24-hour)h +(HH:MM)g(format.)150 4269 y Ft(\\u)384 b Fu(The)30 b(username)g(of)g +(the)h(curren)m(t)f(user.)150 4429 y Ft(\\v)384 b Fu(The)30 +b(v)m(ersion)h(of)f(Bash)h(\(e.g.,)h(2.00\))150 4589 +y Ft(\\V)384 b Fu(The)30 b(release)i(of)e(Bash,)h(v)m(ersion)g +Ft(+)f Fu(patc)m(hlev)m(el)i(\(e.g.,)h(2.00.0\))150 4750 +y Ft(\\w)384 b Fu(The)34 b(curren)m(t)h(w)m(orking)g(directory)-8 +b(,)37 b(with)e Ft($HOME)e Fu(abbreviated)j(with)e(a)h(tilde)h(\(uses)f +(the)630 4859 y Ft($PROMPT_DIRTRIM)26 b Fu(v)-5 b(ariable\).)150 +5019 y Ft(\\W)384 b Fu(The)30 b(basename)h(of)f Ft($PWD)p +Fu(,)g(with)g Ft($HOME)f Fu(abbreviated)h(with)g(a)h(tilde.)150 +5180 y Ft(\\!)384 b Fu(The)30 b(history)g(n)m(um)m(b)s(er)f(of)i(this)f +(command.)150 5340 y Ft(\\#)384 b Fu(The)30 b(command)g(n)m(um)m(b)s +(er)f(of)i(this)f(command.)p eop end %%Page: 93 99 -TeXDict begin 93 98 bop 150 -116 a Ft(Chapter)30 b(6:)41 -b(Bash)30 b(F)-8 b(eatures)2484 b(93)150 299 y Fs(\\@)384 -b Ft(The)30 b(time,)h(in)f(12-hour)h(am/pm)f(format.)150 -460 y Fs(\\A)384 b Ft(The)30 b(time,)h(in)f(24-hour)h(HH:MM)g(format.) -150 620 y Fs(\\u)384 b Ft(The)30 b(username)g(of)g(the)h(curren)m(t)f -(user.)150 781 y Fs(\\v)384 b Ft(The)30 b(v)m(ersion)h(of)f(Bash)h -(\(e.g.,)h(2.00\))150 942 y Fs(\\V)384 b Ft(The)30 b(release)i(of)e -(Bash,)h(v)m(ersion)g Fs(+)f Ft(patc)m(hlev)m(el)i(\(e.g.,)h(2.00.0\)) -150 1102 y Fs(\\w)384 b Ft(The)34 b(curren)m(t)h(w)m(orking)g -(directory)-8 b(,)37 b(with)e Fs($HOME)e Ft(abbreviated)j(with)e(a)h -(tilde)h(\(uses)f(the)630 1212 y Fs($PROMPT_DIRTRIM)26 -b Ft(v)-5 b(ariable\).)150 1372 y Fs(\\W)384 b Ft(The)30 -b(basename)h(of)f Fs($PWD)p Ft(,)g(with)g Fs($HOME)f -Ft(abbreviated)h(with)g(a)h(tilde.)150 1533 y Fs(\\!)384 -b Ft(The)30 b(history)g(n)m(um)m(b)s(er)f(of)i(this)f(command.)150 -1694 y Fs(\\#)384 b Ft(The)30 b(command)g(n)m(um)m(b)s(er)f(of)i(this)f -(command.)150 1854 y Fs(\\$)384 b Ft(If)30 b(the)g(e\013ectiv)m(e)j -(uid)d(is)g(0,)h Fs(#)p Ft(,)g(otherwise)g Fs($)p Ft(.)150 -2015 y Fs(\\)p Fi(nnn)288 b Ft(The)30 b(c)m(haracter)i(whose)e(ASCI)s -(I)f(co)s(de)h(is)h(the)f(o)s(ctal)i(v)-5 b(alue)31 b -Fq(nnn)p Ft(.)150 2176 y Fs(\\\\)384 b Ft(A)30 b(bac)m(kslash.)150 -2336 y Fs(\\[)384 b Ft(Begin)38 b(a)f(sequence)g(of)g(non-prin)m(ting)g -(c)m(haracters.)61 b(This)36 b(could)h(b)s(e)g(used)f(to)h(em)m(b)s(ed) -g(a)630 2446 y(terminal)31 b(con)m(trol)h(sequence)e(in)m(to)i(the)e -(prompt.)150 2607 y Fs(\\])384 b Ft(End)29 b(a)i(sequence)g(of)f -(non-prin)m(ting)g(c)m(haracters.)275 2768 y(The)25 b(command)h(n)m(um) -m(b)s(er)f(and)h(the)g(history)g(n)m(um)m(b)s(er)f(are)i(usually)f -(di\013eren)m(t:)39 b(the)26 b(history)g(n)m(um)m(b)s(er)150 -2878 y(of)h(a)f(command)h(is)f(its)h(p)s(osition)f(in)g(the)h(history)f -(list,)i(whic)m(h)f(ma)m(y)g(include)f(commands)g(restored)g(from)150 -2987 y(the)39 b(history)h(\014le)f(\(see)h(Section)g(9.1)h([Bash)e -(History)h(F)-8 b(acilities],)45 b(page)40 b(134\),)j(while)d(the)f -(command)150 3097 y(n)m(um)m(b)s(er)j(is)h(the)h(p)s(osition)f(in)g -(the)g(sequence)h(of)f(commands)g(executed)h(during)e(the)i(curren)m(t) -f(shell)150 3206 y(session.)275 3342 y(After)35 b(the)g(string)g(is)g -(deco)s(ded,)h(it)f(is)g(expanded)f(via)i(parameter)f(expansion,)i -(command)d(substi-)150 3452 y(tution,)k(arithmetic)f(expansion,)g(and)e -(quote)h(remo)m(v)-5 b(al,)39 b(sub)5 b(ject)35 b(to)i(the)f(v)-5 -b(alue)36 b(of)g(the)g Fs(promptvars)150 3561 y Ft(shell)31 -b(option)f(\(see)i(Section)f(4.2)g([Bash)g(Builtins],)g(page)g(48\).) -150 3796 y Fr(6.10)68 b(The)45 b(Restricted)h(Shell)150 -3955 y Ft(If)27 b(Bash)h(is)g(started)g(with)g(the)g(name)g -Fs(rbash)p Ft(,)f(or)g(the)h(`)p Fs(--restricted)p Ft(')d(or)j(`)p -Fs(-r)p Ft(')g(option)g(is)g(supplied)e(at)150 4065 y(in)m(v)m(o)s -(cation,)k(the)d(shell)g(b)s(ecomes)h(restricted.)40 -b(A)27 b(restricted)h(shell)f(is)g(used)f(to)i(set)f(up)f(an)h(en)m -(vironmen)m(t)150 4174 y(more)g(con)m(trolled)i(than)e(the)g(standard)g -(shell.)40 b(A)27 b(restricted)h(shell)f(b)s(eha)m(v)m(es)h(iden)m -(tically)h(to)f Fs(bash)e Ft(with)150 4284 y(the)31 b(exception)g(that) -g(the)g(follo)m(wing)h(are)e(disallo)m(w)m(ed)i(or)e(not)h(p)s -(erformed:)225 4420 y Fp(\017)60 b Ft(Changing)30 b(directories)h(with) -g(the)f Fs(cd)g Ft(builtin.)225 4555 y Fp(\017)60 b Ft(Setting)31 +TeXDict begin 93 98 bop 150 -116 a Fu(Chapter)30 b(6:)41 +b(Bash)30 b(F)-8 b(eatures)2484 b(93)150 299 y Ft(\\$)384 +b Fu(If)30 b(the)g(e\013ectiv)m(e)j(uid)d(is)g(0,)h Ft(#)p +Fu(,)g(otherwise)g Ft($)p Fu(.)150 479 y Ft(\\)p Fj(nnn)288 +b Fu(The)30 b(c)m(haracter)i(whose)e(ASCI)s(I)f(co)s(de)h(is)h(the)f(o) +s(ctal)i(v)-5 b(alue)31 b Fr(nnn)p Fu(.)150 659 y Ft(\\\\)384 +b Fu(A)30 b(bac)m(kslash.)150 839 y Ft(\\[)384 b Fu(Begin)38 +b(a)f(sequence)g(of)g(non-prin)m(ting)g(c)m(haracters.)61 +b(This)36 b(could)h(b)s(e)g(used)f(to)h(em)m(b)s(ed)g(a)630 +948 y(terminal)31 b(con)m(trol)h(sequence)e(in)m(to)i(the)e(prompt.)150 +1128 y Ft(\\])384 b Fu(End)29 b(a)i(sequence)g(of)f(non-prin)m(ting)g +(c)m(haracters.)275 1319 y(The)25 b(command)h(n)m(um)m(b)s(er)f(and)h +(the)g(history)g(n)m(um)m(b)s(er)f(are)i(usually)f(di\013eren)m(t:)39 +b(the)26 b(history)g(n)m(um)m(b)s(er)150 1428 y(of)h(a)f(command)h(is)f +(its)h(p)s(osition)f(in)g(the)h(history)f(list,)i(whic)m(h)f(ma)m(y)g +(include)f(commands)g(restored)g(from)150 1538 y(the)39 +b(history)h(\014le)f(\(see)h(Section)g(9.1)h([Bash)e(History)h(F)-8 +b(acilities],)45 b(page)40 b(133\),)j(while)d(the)f(command)150 +1647 y(n)m(um)m(b)s(er)j(is)h(the)h(p)s(osition)f(in)g(the)g(sequence)h +(of)f(commands)g(executed)h(during)e(the)i(curren)m(t)f(shell)150 +1757 y(session.)275 1912 y(After)35 b(the)g(string)g(is)g(deco)s(ded,)h +(it)f(is)g(expanded)f(via)i(parameter)f(expansion,)i(command)d(substi-) +150 2022 y(tution,)k(arithmetic)f(expansion,)g(and)e(quote)h(remo)m(v) +-5 b(al,)39 b(sub)5 b(ject)35 b(to)i(the)f(v)-5 b(alue)36 +b(of)g(the)g Ft(promptvars)150 2131 y Fu(shell)31 b(option)f(\(see)i +(Section)f(4.2)g([Bash)g(Builtins],)g(page)g(48\).)150 +2395 y Fs(6.10)68 b(The)45 b(Restricted)h(Shell)150 2554 +y Fu(If)34 b(Bash)g(is)g(started)g(with)g(the)g(name)h +Ft(rbash)p Fu(,)e(or)h(the)h Ft(--restricted)30 b Fu(or)k +Ft(-r)g Fu(option)g(is)g(supplied)f(at)150 2664 y(in)m(v)m(o)s(cation,) +d(the)d(shell)g(b)s(ecomes)h(restricted.)40 b(A)27 b(restricted)h +(shell)f(is)g(used)f(to)i(set)f(up)f(an)h(en)m(vironmen)m(t)150 +2773 y(more)g(con)m(trolled)i(than)e(the)g(standard)g(shell.)40 +b(A)27 b(restricted)h(shell)f(b)s(eha)m(v)m(es)h(iden)m(tically)h(to)f +Ft(bash)e Fu(with)150 2883 y(the)31 b(exception)g(that)g(the)g(follo)m +(wing)h(are)e(disallo)m(w)m(ed)i(or)e(not)h(p)s(erformed:)225 +3038 y Fq(\017)60 b Fu(Changing)30 b(directories)h(with)g(the)f +Ft(cd)g Fu(builtin.)225 3183 y Fq(\017)60 b Fu(Setting)31 b(or)f(unsetting)h(the)g(v)-5 b(alues)30 b(of)h(the)f -Fs(SHELL)p Ft(,)g Fs(PATH)p Ft(,)f Fs(ENV)p Ft(,)h(or)g -Fs(BASH_ENV)e Ft(v)-5 b(ariables.)225 4690 y Fp(\017)60 -b Ft(Sp)s(ecifying)30 b(command)g(names)g(con)m(taining)i(slashes.)225 -4825 y Fp(\017)60 b Ft(Sp)s(ecifying)30 b(a)h(\014lename)f(con)m +Ft(SHELL)p Fu(,)g Ft(PATH)p Fu(,)f Ft(ENV)p Fu(,)h(or)g +Ft(BASH_ENV)e Fu(v)-5 b(ariables.)225 3328 y Fq(\017)60 +b Fu(Sp)s(ecifying)30 b(command)g(names)g(con)m(taining)i(slashes.)225 +3472 y Fq(\017)60 b Fu(Sp)s(ecifying)30 b(a)h(\014lename)f(con)m (taining)i(a)f(slash)f(as)h(an)f(argumen)m(t)h(to)g(the)f -Fs(.)h Ft(builtin)e(command.)225 4960 y Fp(\017)60 b -Ft(Sp)s(ecifying)28 b(a)i(\014lename)f(con)m(taining)h(a)g(slash)e(as)h -(an)g(argumen)m(t)h(to)f(the)g(`)p Fs(-p)p Ft(')g(option)g(to)h(the)f -Fs(hash)330 5070 y Ft(builtin)h(command.)225 5205 y Fp(\017)60 -b Ft(Imp)s(orting)30 b(function)g(de\014nitions)g(from)f(the)i(shell)g -(en)m(vironmen)m(t)g(at)g(startup.)225 5340 y Fp(\017)60 -b Ft(P)m(arsing)31 b(the)f(v)-5 b(alue)31 b(of)g Fs(SHELLOPTS)d -Ft(from)h(the)i(shell)g(en)m(vironmen)m(t)g(at)g(startup.)p +Ft(.)h Fu(builtin)e(command.)225 3617 y Fq(\017)60 b +Fu(Sp)s(ecifying)32 b(a)g(\014lename)h(con)m(taining)h(a)e(slash)g(as)h +(an)f(argumen)m(t)h(to)g(the)f Ft(-p)g Fu(option)h(to)g(the)f +Ft(hash)330 3727 y Fu(builtin)e(command.)225 3871 y Fq(\017)60 +b Fu(Imp)s(orting)30 b(function)g(de\014nitions)g(from)f(the)i(shell)g +(en)m(vironmen)m(t)g(at)g(startup.)225 4016 y Fq(\017)60 +b Fu(P)m(arsing)31 b(the)f(v)-5 b(alue)31 b(of)g Ft(SHELLOPTS)d +Fu(from)h(the)i(shell)g(en)m(vironmen)m(t)g(at)g(startup.)225 +4161 y Fq(\017)60 b Fu(Redirecting)31 b(output)f(using)g(the)h(`)p +Ft(>)p Fu(',)g(`)p Ft(>|)p Fu(',)f(`)p Ft(<>)p Fu(',)h(`)p +Ft(>&)p Fu(',)f(`)p Ft(&>)p Fu(',)h(and)e(`)p Ft(>>)p +Fu(')i(redirection)g(op)s(erators.)225 4306 y Fq(\017)60 +b Fu(Using)31 b(the)f Ft(exec)f Fu(builtin)h(to)h(replace)h(the)e +(shell)h(with)f(another)h(command.)225 4451 y Fq(\017)60 +b Fu(Adding)24 b(or)g(deleting)i(builtin)e(commands)g(with)h(the)f +Ft(-f)g Fu(and)g Ft(-d)g Fu(options)h(to)h(the)e Ft(enable)f +Fu(builtin.)225 4595 y Fq(\017)60 b Fu(Using)31 b(the)f +Ft(enable)f Fu(builtin)h(command)g(to)h(enable)g(disabled)f(shell)g +(builtins.)225 4740 y Fq(\017)60 b Fu(Sp)s(ecifying)30 +b(the)g Ft(-p)g Fu(option)h(to)g(the)g Ft(command)d Fu(builtin.)225 +4885 y Fq(\017)60 b Fu(T)-8 b(urning)29 b(o\013)i(restricted)g(mo)s(de) +f(with)g(`)p Ft(set)g(+r)p Fu(')g(or)g(`)p Ft(set)g(+o)g(restricted)p +Fu('.)275 5075 y(These)g(restrictions)h(are)g(enforced)f(after)h(an)m +(y)g(startup)f(\014les)g(are)h(read.)275 5230 y(When)j(a)i(command)e +(that)i(is)f(found)f(to)h(b)s(e)g(a)g(shell)g(script)g(is)g(executed)h +(\(see)g(Section)g(3.8)g([Shell)150 5340 y(Scripts],)25 +b(page)e(39\),)j Ft(rbash)c Fu(turns)g(o\013)i(an)m(y)f(restrictions)h +(in)f(the)g(shell)h(spa)m(wned)e(to)i(execute)g(the)g(script.)p eop end %%Page: 94 100 -TeXDict begin 94 99 bop 150 -116 a Ft(Chapter)30 b(6:)41 -b(Bash)30 b(F)-8 b(eatures)2484 b(94)225 299 y Fp(\017)60 -b Ft(Redirecting)31 b(output)f(using)g(the)h(`)p Fs(>)p -Ft(',)g(`)p Fs(>|)p Ft(',)f(`)p Fs(<>)p Ft(',)h(`)p Fs(>&)p -Ft(',)f(`)p Fs(&>)p Ft(',)h(and)e(`)p Fs(>>)p Ft(')i(redirection)g(op)s -(erators.)225 435 y Fp(\017)60 b Ft(Using)31 b(the)f -Fs(exec)f Ft(builtin)h(to)h(replace)h(the)e(shell)h(with)f(another)h -(command.)225 571 y Fp(\017)60 b Ft(Adding)40 b(or)h(deleting)h -(builtin)e(commands)h(with)f(the)h(`)p Fs(-f)p Ft(')g(and)f(`)p -Fs(-d)p Ft(')h(options)g(to)h(the)f Fs(enable)330 681 -y Ft(builtin.)225 817 y Fp(\017)60 b Ft(Using)31 b(the)f -Fs(enable)f Ft(builtin)h(command)g(to)h(enable)g(disabled)f(shell)g -(builtins.)225 953 y Fp(\017)60 b Ft(Sp)s(ecifying)30 -b(the)g(`)p Fs(-p)p Ft(')h(option)g(to)g(the)f Fs(command)f -Ft(builtin.)225 1089 y Fp(\017)60 b Ft(T)-8 b(urning)29 -b(o\013)i(restricted)g(mo)s(de)f(with)g(`)p Fs(set)g(+r)p -Ft(')g(or)g(`)p Fs(set)g(+o)g(restricted)p Ft('.)275 -1253 y(These)g(restrictions)h(are)g(enforced)f(after)h(an)m(y)g -(startup)f(\014les)g(are)h(read.)275 1390 y(When)j(a)i(command)e(that)i -(is)f(found)f(to)h(b)s(e)g(a)g(shell)g(script)g(is)g(executed)h(\(see)g -(Section)g(3.8)g([Shell)150 1500 y(Scripts],)25 b(page)e(39\),)j -Fs(rbash)c Ft(turns)g(o\013)i(an)m(y)f(restrictions)h(in)f(the)g(shell) -h(spa)m(wned)e(to)i(execute)g(the)g(script.)150 1737 -y Fr(6.11)68 b(Bash)45 b(POSIX)f(Mo)t(de)150 1896 y Ft(Starting)34 -b(Bash)f(with)g(the)g(`)p Fs(--posix)p Ft(')f(command-line)i(option)g -(or)f(executing)h(`)p Fs(set)c(-o)g(posix)p Ft(')i(while)150 -2006 y(Bash)26 b(is)g(running)e(will)j(cause)f(Bash)g(to)h(conform)f -(more)g(closely)h(to)g(the)f Fl(posix)f Ft(standard)g(b)m(y)h(c)m -(hanging)150 2116 y(the)31 b(b)s(eha)m(vior)f(to)h(matc)m(h)g(that)g -(sp)s(eci\014ed)f(b)m(y)g Fl(posix)g Ft(in)g(areas)h(where)f(the)h -(Bash)f(default)h(di\013ers.)275 2253 y(When)f(in)m(v)m(ok)m(ed)h(as)g -Fs(sh)p Ft(,)f(Bash)h(en)m(ters)g Fl(posix)e Ft(mo)s(de)h(after)h -(reading)g(the)f(startup)g(\014les.)275 2391 y(The)f(follo)m(wing)j -(list)f(is)g(what's)f(c)m(hanged)h(when)e(`)p Fl(posix)h -Ft(mo)s(de')h(is)f(in)g(e\013ect:)199 2528 y(1.)61 b(When)28 +TeXDict begin 94 99 bop 150 -116 a Fu(Chapter)30 b(6:)41 +b(Bash)30 b(F)-8 b(eatures)2484 b(94)150 299 y Fs(6.11)68 +b(Bash)45 b(POSIX)f(Mo)t(de)150 458 y Fu(Starting)39 +b(Bash)f(with)g(the)h Ft(--posix)d Fu(command-line)j(option)g(or)f +(executing)h(`)p Ft(set)30 b(-o)g(posix)p Fu(')37 b(while)150 +568 y(Bash)26 b(is)g(running)e(will)j(cause)f(Bash)g(to)h(conform)f +(more)g(closely)h(to)g(the)f Fm(posix)f Fu(standard)g(b)m(y)h(c)m +(hanging)150 677 y(the)31 b(b)s(eha)m(vior)f(to)h(matc)m(h)g(that)g(sp) +s(eci\014ed)f(b)m(y)g Fm(posix)g Fu(in)g(areas)h(where)f(the)h(Bash)f +(default)h(di\013ers.)275 811 y(When)f(in)m(v)m(ok)m(ed)h(as)g +Ft(sh)p Fu(,)f(Bash)h(en)m(ters)g Fm(posix)e Fu(mo)s(de)h(after)h +(reading)g(the)f(startup)g(\014les.)275 944 y(The)f(follo)m(wing)j +(list)f(is)g(what's)f(c)m(hanged)h(when)e(`)p Fm(posix)h +Fu(mo)s(de')h(is)f(in)g(e\013ect:)199 1077 y(1.)61 b(When)28 b(a)i(command)e(in)g(the)h(hash)f(table)i(no)e(longer)h(exists,)h(Bash) -f(will)g(re-searc)m(h)h Fs($PATH)d Ft(to)i(\014nd)330 -2638 y(the)i(new)e(lo)s(cation.)43 b(This)29 b(is)i(also)g(a)m(v)-5 -b(ailable)33 b(with)d(`)p Fs(shopt)f(-s)h(checkhash)p -Ft('.)199 2774 y(2.)61 b(The)42 b(message)h(prin)m(ted)e(b)m(y)h(the)g +f(will)g(re-searc)m(h)h Ft($PATH)d Fu(to)i(\014nd)330 +1187 y(the)i(new)e(lo)s(cation.)43 b(This)29 b(is)i(also)g(a)m(v)-5 +b(ailable)33 b(with)d(`)p Ft(shopt)f(-s)h(checkhash)p +Fu('.)199 1320 y(2.)61 b(The)42 b(message)h(prin)m(ted)e(b)m(y)h(the)g (job)g(con)m(trol)i(co)s(de)e(and)f(builtins)h(when)f(a)h(job)g(exits)h -(with)f(a)330 2884 y(non-zero)31 b(status)g(is)f(`Done\(status\)'.)199 -3020 y(3.)61 b(The)40 b(message)h(prin)m(ted)f(b)m(y)g(the)h(job)f(con) +(with)f(a)330 1430 y(non-zero)31 b(status)g(is)f(`Done\(status\)'.)199 +1563 y(3.)61 b(The)40 b(message)h(prin)m(ted)f(b)m(y)g(the)h(job)f(con) m(trol)h(co)s(de)g(and)f(builtins)f(when)h(a)g(job)g(is)h(stopp)s(ed)e -(is)330 3129 y(`Stopp)s(ed\()p Fq(signame)5 b Ft(\)',)31 -b(where)f Fq(signame)36 b Ft(is,)31 b(for)f(example,)h -Fs(SIGTSTP)p Ft(.)199 3265 y(4.)61 b(The)27 b Fs(bg)g -Ft(builtin)g(uses)g(the)h(required)f(format)h(to)g(describ)s(e)f(eac)m -(h)i(job)e(placed)h(in)f(the)h(bac)m(kground,)330 3375 +(is)330 1673 y(`Stopp)s(ed\()p Fr(signame)5 b Fu(\)',)31 +b(where)f Fr(signame)36 b Fu(is,)31 b(for)f(example,)h +Ft(SIGTSTP)p Fu(.)199 1806 y(4.)61 b(The)27 b Ft(bg)g +Fu(builtin)g(uses)g(the)h(required)f(format)h(to)g(describ)s(e)f(eac)m +(h)i(job)e(placed)h(in)f(the)h(bac)m(kground,)330 1916 y(whic)m(h)h(do)s(es)g(not)g(include)g(an)g(indication)h(of)f(whether)f (the)h(job)g(is)g(the)h(curren)m(t)e(or)h(previous)g(job.)199 -3511 y(5.)61 b(Reserv)m(ed)40 b(w)m(ords)g(app)s(earing)f(in)h(a)g(con) +2049 y(5.)61 b(Reserv)m(ed)40 b(w)m(ords)g(app)s(earing)f(in)h(a)g(con) m(text)i(where)d(reserv)m(ed)h(w)m(ords)f(are)i(recognized)g(do)f(not) -330 3621 y(undergo)30 b(alias)h(expansion.)199 3757 y(6.)61 -b(The)38 b Fl(posix)h Fs(PS1)f Ft(and)g Fs(PS2)g Ft(expansions)g(of)i -(`)p Fs(!)p Ft(')f(to)g(the)g(history)g(n)m(um)m(b)s(er)f(and)g(`)p -Fs(!!)p Ft(')h(to)g(`)p Fs(!)p Ft(')h(are)330 3866 y(enabled,)26 +330 2159 y(undergo)30 b(alias)h(expansion.)199 2292 y(6.)61 +b(The)38 b Fm(posix)h Ft(PS1)f Fu(and)g Ft(PS2)g Fu(expansions)g(of)i +(`)p Ft(!)p Fu(')f(to)g(the)g(history)g(n)m(um)m(b)s(er)f(and)g(`)p +Ft(!!)p Fu(')h(to)g(`)p Ft(!)p Fu(')h(are)330 2401 y(enabled,)26 b(and)f(parameter)g(expansion)g(is)g(p)s(erformed)e(on)i(the)g(v)-5 -b(alues)25 b(of)g Fs(PS1)f Ft(and)h Fs(PS2)f Ft(regardless)330 -3976 y(of)31 b(the)f(setting)i(of)e(the)h Fs(promptvars)c -Ft(option.)199 4112 y(7.)61 b(The)30 b Fl(posix)g Ft(startup)f(\014les) -i(are)g(executed)g(\()p Fs($ENV)p Ft(\))f(rather)g(than)g(the)h(normal) -f(Bash)g(\014les.)199 4248 y(8.)61 b(Tilde)30 b(expansion)g(is)f(only)h +b(alues)25 b(of)g Ft(PS1)f Fu(and)h Ft(PS2)f Fu(regardless)330 +2511 y(of)31 b(the)f(setting)i(of)e(the)h Ft(promptvars)c +Fu(option.)199 2644 y(7.)61 b(The)30 b Fm(posix)g Fu(startup)f(\014les) +i(are)g(executed)g(\()p Ft($ENV)p Fu(\))f(rather)g(than)g(the)h(normal) +f(Bash)g(\014les.)199 2778 y(8.)61 b(Tilde)30 b(expansion)g(is)f(only)h (p)s(erformed)f(on)h(assignmen)m(ts)g(preceding)g(a)g(command)g(name,)g -(rather)330 4357 y(than)g(on)g(all)i(assignmen)m(t)f(statemen)m(ts)h -(on)e(the)h(line.)199 4493 y(9.)61 b(The)31 b Fs(command)e -Ft(builtin)i(do)s(es)g(not)h(prev)m(en)m(t)f(builtins)g(that)h(tak)m(e) -h(assignmen)m(t)f(statemen)m(ts)h(as)f(ar-)330 4603 y(gumen)m(ts)40 +(rather)330 2887 y(than)g(on)g(all)i(assignmen)m(t)f(statemen)m(ts)h +(on)e(the)h(line.)199 3021 y(9.)61 b(The)31 b Ft(command)e +Fu(builtin)i(do)s(es)g(not)h(prev)m(en)m(t)f(builtins)g(that)h(tak)m(e) +h(assignmen)m(t)f(statemen)m(ts)h(as)f(ar-)330 3130 y(gumen)m(ts)40 b(from)e(expanding)h(them)g(as)h(assignmen)m(t)g(statemen)m(ts;)46 -b(when)38 b(not)i(in)f Fl(posix)f Ft(mo)s(de,)330 4713 +b(when)38 b(not)i(in)f Fm(posix)f Fu(mo)s(de,)330 3240 y(assignmen)m(t)k(builtins)e(lose)h(their)g(assignmen)m(t)h(statemen)m -(t)h(expansion)d(prop)s(erties)g(when)g(pre-)330 4822 -y(ceded)31 b(b)m(y)f Fs(command)p Ft(.)154 4958 y(10.)61 -b(The)30 b(default)g(history)h(\014le)f(is)h(`)p Fs(~/.sh_history)p -Ft(')c(\(this)k(is)f(the)g(default)h(v)-5 b(alue)31 b(of)f -Fs($HISTFILE)p Ft(\).)154 5094 y(11.)61 b(The)23 b(output)f(of)i(`)p -Fs(kill)29 b(-l)p Ft(')23 b(prin)m(ts)f(all)i(the)g(signal)f(names)g -(on)g(a)h(single)g(line,)h(separated)e(b)m(y)g(spaces,)330 -5204 y(without)30 b(the)h(`)p Fs(SIG)p Ft(')f(pre\014x.)154 -5340 y(12.)61 b(The)30 b Fs(kill)f Ft(builtin)h(do)s(es)g(not)h(accept) -h(signal)f(names)f(with)g(a)h(`)p Fs(SIG)p Ft(')f(pre\014x.)p -eop end -%%Page: 95 101 -TeXDict begin 95 100 bop 150 -116 a Ft(Chapter)30 b(6:)41 -b(Bash)30 b(F)-8 b(eatures)2484 b(95)154 299 y(13.)61 -b(Non-in)m(teractiv)m(e)34 b(shells)c(exit)h(if)g Fq(\014lename)k -Ft(in)30 b Fs(.)g Fq(\014lename)36 b Ft(is)31 b(not)f(found.)154 -432 y(14.)61 b(Non-in)m(teractiv)m(e)41 b(shells)d(exit)h(if)f(a)g(syn) -m(tax)g(error)g(in)f(an)h(arithmetic)h(expansion)f(results)f(in)h(an) -330 541 y(in)m(v)-5 b(alid)31 b(expression.)154 674 y(15.)61 -b(Non-in)m(teractiv)m(e)27 b(shells)c(exit)i(if)e(there)h(is)f(a)h(syn) -m(tax)g(error)f(in)g(a)h(script)f(read)g(with)h(the)f -Fs(.)g Ft(or)h Fs(source)330 783 y Ft(builtins,)30 b(or)g(in)g(a)h -(string)g(pro)s(cessed)e(b)m(y)i(the)f Fs(eval)f Ft(builtin.)154 -916 y(16.)61 b(Redirection)25 b(op)s(erators)f(do)g(not)g(p)s(erform)f -(\014lename)h(expansion)g(on)g(the)g(w)m(ord)f(in)h(the)g(redirection) -330 1026 y(unless)30 b(the)g(shell)h(is)f(in)m(teractiv)m(e.)154 -1158 y(17.)61 b(Redirection)31 b(op)s(erators)g(do)f(not)h(p)s(erform)e -(w)m(ord)h(splitting)h(on)f(the)h(w)m(ord)f(in)g(the)g(redirection.)154 -1291 y(18.)61 b(F)-8 b(unction)35 b(names)g(m)m(ust)f(b)s(e)g(v)-5 -b(alid)35 b(shell)f Fs(name)p Ft(s.)52 b(That)34 b(is,)i(they)f(ma)m(y) -g(not)g(con)m(tain)g(c)m(haracters)330 1401 y(other)e(than)g(letters,)h +(t)h(expansion)d(prop)s(erties)g(when)g(pre-)330 3349 +y(ceded)31 b(b)m(y)f Ft(command)p Fu(.)154 3483 y(10.)61 +b(The)30 b(default)g(history)h(\014le)f(is)h Ft(~/.sh_history)26 +b Fu(\(this)31 b(is)f(the)h(default)g(v)-5 b(alue)30 +b(of)h Ft($HISTFILE)p Fu(\).)154 3616 y(11.)61 b(The)23 +b(output)f(of)i(`)p Ft(kill)29 b(-l)p Fu(')23 b(prin)m(ts)f(all)i(the)g +(signal)f(names)g(on)g(a)h(single)g(line,)h(separated)e(b)m(y)g +(spaces,)330 3726 y(without)30 b(the)h(`)p Ft(SIG)p Fu(')f(pre\014x.) +154 3859 y(12.)61 b(The)30 b Ft(kill)f Fu(builtin)h(do)s(es)g(not)h +(accept)h(signal)f(names)f(with)g(a)h(`)p Ft(SIG)p Fu(')f(pre\014x.)154 +3992 y(13.)61 b(Non-in)m(teractiv)m(e)34 b(shells)c(exit)h(if)g +Fr(\014lename)k Fu(in)30 b Ft(.)g Fr(\014lename)36 b +Fu(is)31 b(not)f(found.)154 4125 y(14.)61 b(Non-in)m(teractiv)m(e)41 +b(shells)d(exit)h(if)f(a)g(syn)m(tax)g(error)g(in)f(an)h(arithmetic)h +(expansion)f(results)f(in)h(an)330 4235 y(in)m(v)-5 b(alid)31 +b(expression.)154 4368 y(15.)61 b(Non-in)m(teractiv)m(e)27 +b(shells)c(exit)i(if)e(there)h(is)f(a)h(syn)m(tax)g(error)f(in)g(a)h +(script)f(read)g(with)h(the)f Ft(.)g Fu(or)h Ft(source)330 +4478 y Fu(builtins,)30 b(or)g(in)g(a)h(string)g(pro)s(cessed)e(b)m(y)i +(the)f Ft(eval)f Fu(builtin.)154 4611 y(16.)61 b(Redirection)25 +b(op)s(erators)f(do)g(not)g(p)s(erform)f(\014lename)h(expansion)g(on)g +(the)g(w)m(ord)f(in)h(the)g(redirection)330 4721 y(unless)30 +b(the)g(shell)h(is)f(in)m(teractiv)m(e.)154 4854 y(17.)61 +b(Redirection)31 b(op)s(erators)g(do)f(not)h(p)s(erform)e(w)m(ord)h +(splitting)h(on)f(the)h(w)m(ord)f(in)g(the)g(redirection.)154 +4987 y(18.)61 b(F)-8 b(unction)35 b(names)g(m)m(ust)f(b)s(e)g(v)-5 +b(alid)35 b(shell)f Ft(name)p Fu(s.)52 b(That)34 b(is,)i(they)f(ma)m(y) +g(not)g(con)m(tain)g(c)m(haracters)330 5097 y(other)e(than)g(letters,)h (digits,)h(and)d(underscores,)h(and)f(ma)m(y)h(not)g(start)h(with)e(a)h -(digit.)49 b(Declaring)330 1510 y(a)31 b(function)f(with)g(an)g(in)m(v) +(digit.)49 b(Declaring)330 5207 y(a)31 b(function)f(with)g(an)g(in)m(v) -5 b(alid)31 b(name)g(causes)f(a)h(fatal)h(syn)m(tax)f(error)f(in)g -(non-in)m(teractiv)m(e)j(shells.)154 1643 y(19.)61 b(F)-8 +(non-in)m(teractiv)m(e)j(shells.)154 5340 y(19.)61 b(F)-8 b(unction)31 b(names)f(ma)m(y)h(not)g(b)s(e)f(the)g(same)h(as)g(one)f -(of)h(the)f Fl(posix)g Ft(sp)s(ecial)h(builtins.)154 -1775 y(20.)61 b Fl(posix)30 b Ft(sp)s(ecial)h(builtins)e(are)i(found)e -(b)s(efore)h(shell)h(functions)f(during)f(command)h(lo)s(okup.)154 -1908 y(21.)61 b(The)29 b Fs(time)g Ft(reserv)m(ed)h(w)m(ord)g(ma)m(y)g +(of)h(the)f Fm(posix)g Fu(sp)s(ecial)h(builtins.)p eop +end +%%Page: 95 101 +TeXDict begin 95 100 bop 150 -116 a Fu(Chapter)30 b(6:)41 +b(Bash)30 b(F)-8 b(eatures)2484 b(95)154 299 y(20.)61 +b Fm(posix)30 b Fu(sp)s(ecial)h(builtins)e(are)i(found)e(b)s(efore)h +(shell)h(functions)f(during)f(command)h(lo)s(okup.)154 +427 y(21.)61 b(The)29 b Ft(time)g Fu(reserv)m(ed)h(w)m(ord)g(ma)m(y)g (b)s(e)g(used)f(b)m(y)h(itself)g(as)g(a)h(command.)40 -b(When)30 b(used)f(in)g(this)h(w)m(a)m(y)-8 b(,)330 2018 +b(When)30 b(used)f(in)g(this)h(w)m(a)m(y)-8 b(,)330 536 y(it)33 b(displa)m(ys)g(timing)g(statistics)h(for)e(the)h(shell)g(and)f -(its)g(completed)i(c)m(hildren.)47 b(The)32 b Fs(TIMEFORMAT)330 -2127 y Ft(v)-5 b(ariable)31 b(con)m(trols)h(the)e(format)h(of)g(the)f -(timing)h(information.)154 2260 y(22.)61 b(When)33 b(parsing)f(and)g -(expanding)g(a)i($)p Fs({)6 b Ft(.)22 b(.)g(.)11 b Fs(})33 -b Ft(expansion)f(that)i(app)s(ears)e(within)g(double)g(quotes,)330 -2370 y(single)42 b(quotes)g(are)g(no)g(longer)g(sp)s(ecial)g(and)f +(its)g(completed)i(c)m(hildren.)47 b(The)32 b Ft(TIMEFORMAT)330 +646 y Fu(v)-5 b(ariable)31 b(con)m(trols)h(the)e(format)h(of)g(the)f +(timing)h(information.)154 774 y(22.)61 b(When)33 b(parsing)g(and)f +(expanding)h(a)h($)p Fi({)6 b Fu(.)22 b(.)h(.)11 b Fi(})33 +b Fu(expansion)g(that)h(app)s(ears)f(within)f(double)h(quotes,)330 +883 y(single)42 b(quotes)g(are)g(no)g(longer)g(sp)s(ecial)g(and)f (cannot)i(b)s(e)e(used)g(to)h(quote)g(a)g(closing)h(brace)f(or)330 -2479 y(other)31 b(sp)s(ecial)h(c)m(haracter,)i(unless)c(the)i(op)s +993 y(other)31 b(sp)s(ecial)h(c)m(haracter,)i(unless)c(the)i(op)s (erator)f(is)g(one)h(of)f(those)h(de\014ned)e(to)i(p)s(erform)e -(pattern)330 2589 y(remo)m(v)-5 b(al.)42 b(In)30 b(this)g(case,)i(they) +(pattern)330 1103 y(remo)m(v)-5 b(al.)42 b(In)30 b(this)g(case,)i(they) e(do)g(not)h(ha)m(v)m(e)h(to)f(app)s(ear)e(as)i(matc)m(hed)g(pairs.)154 -2721 y(23.)61 b(The)29 b(parser)g(do)s(es)g(not)h(recognize)h -Fs(time)d Ft(as)i(a)g(reserv)m(ed)f(w)m(ord)g(if)h(the)f(next)h(tok)m -(en)h(b)s(egins)d(with)i(a)330 2831 y(`)p Fs(-)p Ft('.)154 -2964 y(24.)61 b(If)24 b(a)g Fl(posix)g Ft(sp)s(ecial)h(builtin)f +1230 y(23.)61 b(The)29 b(parser)g(do)s(es)g(not)h(recognize)h +Ft(time)d Fu(as)i(a)g(reserv)m(ed)f(w)m(ord)g(if)h(the)f(next)h(tok)m +(en)h(b)s(egins)d(with)i(a)330 1340 y(`)p Ft(-)p Fu('.)154 +1468 y(24.)61 b(If)24 b(a)g Fm(posix)g Fu(sp)s(ecial)h(builtin)f (returns)f(an)h(error)g(status,)i(a)e(non-in)m(teractiv)m(e)j(shell)e -(exits.)39 b(The)24 b(fatal)330 3073 y(errors)30 b(are)h(those)f -(listed)h(in)f(the)h Fl(posix)e Ft(standard,)h(and)g(include)g(things)g -(lik)m(e)i(passing)e(incorrect)330 3183 y(options,)43 +(exits.)39 b(The)24 b(fatal)330 1577 y(errors)30 b(are)h(those)f +(listed)h(in)f(the)h Fm(posix)e Fu(standard,)h(and)g(include)g(things)g +(lik)m(e)i(passing)e(incorrect)330 1687 y(options,)43 b(redirection)d(errors,)i(v)-5 b(ariable)41 b(assignmen)m(t)g(errors)e -(for)g(assignmen)m(ts)i(preceding)f(the)330 3292 y(command)30 -b(name,)h(and)f(so)g(on.)154 3425 y(25.)61 b(A)31 b(non-in)m(teractiv)m +(for)g(assignmen)m(ts)i(preceding)f(the)330 1797 y(command)30 +b(name,)h(and)f(so)g(on.)154 1924 y(25.)61 b(A)31 b(non-in)m(teractiv)m (e)j(shell)d(exits)h(with)e(an)h(error)g(status)g(if)g(a)g(v)-5 b(ariable)32 b(assignmen)m(t)g(error)e(o)s(ccurs)330 -3535 y(when)38 b(no)h(command)g(name)g(follo)m(ws)i(the)e(assignmen)m +2034 y(when)38 b(no)h(command)g(name)g(follo)m(ws)i(the)e(assignmen)m (t)h(statemen)m(ts.)69 b(A)39 b(v)-5 b(ariable)40 b(assignmen)m(t)330 -3644 y(error)30 b(o)s(ccurs,)g(for)g(example,)i(when)d(trying)i(to)g +2144 y(error)30 b(o)s(ccurs,)g(for)g(example,)i(when)d(trying)i(to)g (assign)f(a)h(v)-5 b(alue)31 b(to)g(a)g(readonly)f(v)-5 -b(ariable.)154 3777 y(26.)61 b(A)28 b(non-in)m(teractiv)m(e)j(shell)e +b(ariable.)154 2271 y(26.)61 b(A)28 b(non-in)m(teractiv)m(e)j(shell)e (exists)f(with)g(an)g(error)g(status)h(if)f(a)g(v)-5 b(ariable)29 b(assignmen)m(t)g(error)f(o)s(ccurs)330 -3886 y(in)i(an)g(assignmen)m(t)i(statemen)m(t)g(preceding)e(a)h(sp)s +2381 y(in)i(an)g(assignmen)m(t)i(statemen)m(t)g(preceding)e(a)h(sp)s (ecial)g(builtin,)f(but)g(not)g(with)h(an)m(y)f(other)h(simple)330 -3996 y(command.)154 4129 y(27.)61 b(A)43 b(non-in)m(teractiv)m(e)i +2491 y(command.)154 2619 y(27.)61 b(A)43 b(non-in)m(teractiv)m(e)i (shell)e(exits)h(with)f(an)f(error)h(status)g(if)g(the)g(iteration)h(v) --5 b(ariable)44 b(in)f(a)g Fs(for)330 4238 y Ft(statemen)m(t)32 +-5 b(ariable)44 b(in)f(a)g Ft(for)330 2728 y Fu(statemen)m(t)32 b(or)f(the)f(selection)i(v)-5 b(ariable)32 b(in)e(a)g -Fs(select)f Ft(statemen)m(t)j(is)f(a)f(readonly)h(v)-5 -b(ariable.)154 4371 y(28.)61 b(Pro)s(cess)30 b(substitution)g(is)h(not) -f(a)m(v)-5 b(ailable.)154 4504 y(29.)61 b(While)32 b(v)-5 +Ft(select)f Fu(statemen)m(t)j(is)f(a)f(readonly)h(v)-5 +b(ariable.)154 2856 y(28.)61 b(Pro)s(cess)30 b(substitution)g(is)h(not) +f(a)m(v)-5 b(ailable.)154 2984 y(29.)61 b(While)32 b(v)-5 b(ariable)32 b(indirection)f(is)g(a)m(v)-5 b(ailable,)34 b(it)d(ma)m(y)h(not)f(b)s(e)g(applied)g(to)g(the)h(`)p -Fs(#)p Ft(')f(and)f(`)p Fs(?)p Ft(')h(sp)s(ecial)330 -4613 y(parameters.)154 4746 y(30.)61 b(Assignmen)m(t)23 -b(statemen)m(ts)h(preceding)e Fl(posix)f Ft(sp)s(ecial)i(builtins)f(p)s -(ersist)g(in)f(the)i(shell)f(en)m(vironmen)m(t)330 4855 -y(after)31 b(the)f(builtin)g(completes.)154 4988 y(31.)61 +Ft(#)p Fu(')f(and)f(`)p Ft(?)p Fu(')h(sp)s(ecial)330 +3093 y(parameters.)154 3221 y(30.)61 b(Assignmen)m(t)23 +b(statemen)m(ts)h(preceding)e Fm(posix)f Fu(sp)s(ecial)i(builtins)f(p)s +(ersist)g(in)f(the)i(shell)f(en)m(vironmen)m(t)330 3331 +y(after)31 b(the)f(builtin)g(completes.)154 3459 y(31.)61 b(Assignmen)m(t)35 b(statemen)m(ts)h(preceding)f(shell)f(function)g (calls)i(p)s(ersist)e(in)g(the)h(shell)f(en)m(vironmen)m(t)330 -5098 y(after)d(the)f(function)h(returns,)e(as)i(if)f(a)h -Fl(posix)e Ft(sp)s(ecial)i(builtin)f(command)g(had)g(b)s(een)g -(executed.)154 5230 y(32.)61 b(The)38 b Fs(export)f Ft(and)g -Fs(readonly)f Ft(builtin)i(commands)g(displa)m(y)h(their)f(output)g(in) -g(the)h(format)g(re-)330 5340 y(quired)30 b(b)m(y)g Fl(posix)p -Ft(.)p eop end -%%Page: 96 102 -TeXDict begin 96 101 bop 150 -116 a Ft(Chapter)30 b(6:)41 -b(Bash)30 b(F)-8 b(eatures)2484 b(96)154 299 y(33.)61 -b(The)30 b Fs(trap)f Ft(builtin)h(displa)m(ys)g(signal)i(names)e -(without)g(the)h(leading)g Fs(SIG)p Ft(.)154 432 y(34.)61 -b(The)39 b Fs(trap)e Ft(builtin)i(do)s(esn't)g(c)m(hec)m(k)h(the)g -(\014rst)e(argumen)m(t)i(for)e(a)i(p)s(ossible)e(signal)i(sp)s -(eci\014cation)330 541 y(and)30 b(rev)m(ert)i(the)e(signal)i(handling)e -(to)h(the)g(original)h(disp)s(osition)e(if)h(it)g(is,)g(unless)f(that)h -(argumen)m(t)330 651 y(consists)e(solely)g(of)g(digits)g(and)f(is)g(a)h -(v)-5 b(alid)29 b(signal)g(n)m(um)m(b)s(er.)38 b(If)28 -b(users)g(w)m(an)m(t)h(to)g(reset)g(the)g(handler)330 -760 y(for)h(a)g(giv)m(en)h(signal)g(to)f(the)h(original)g(disp)s -(osition,)f(they)g(should)f(use)h(`)p Fs(-)p Ft(')g(as)g(the)g(\014rst) -f(argumen)m(t.)154 893 y(35.)61 b(The)21 b Fs(.)h Ft(and)f -Fs(source)f Ft(builtins)h(do)g(not)h(searc)m(h)h(the)f(curren)m(t)f +3568 y(after)d(the)f(function)h(returns,)e(as)i(if)f(a)h +Fm(posix)e Fu(sp)s(ecial)i(builtin)f(command)g(had)g(b)s(een)g +(executed.)154 3696 y(32.)61 b(The)38 b Ft(export)f Fu(and)g +Ft(readonly)f Fu(builtin)i(commands)g(displa)m(y)h(their)f(output)g(in) +g(the)h(format)g(re-)330 3806 y(quired)30 b(b)m(y)g Fm(posix)p +Fu(.)154 3934 y(33.)61 b(The)30 b Ft(trap)f Fu(builtin)h(displa)m(ys)g +(signal)i(names)e(without)g(the)h(leading)g Ft(SIG)p +Fu(.)154 4061 y(34.)61 b(The)39 b Ft(trap)e Fu(builtin)i(do)s(esn't)g +(c)m(hec)m(k)h(the)g(\014rst)e(argumen)m(t)i(for)e(a)i(p)s(ossible)e +(signal)i(sp)s(eci\014cation)330 4171 y(and)30 b(rev)m(ert)i(the)e +(signal)i(handling)e(to)h(the)g(original)h(disp)s(osition)e(if)h(it)g +(is,)g(unless)f(that)h(argumen)m(t)330 4281 y(consists)e(solely)g(of)g +(digits)g(and)f(is)g(a)h(v)-5 b(alid)29 b(signal)g(n)m(um)m(b)s(er.)38 +b(If)28 b(users)g(w)m(an)m(t)h(to)g(reset)g(the)g(handler)330 +4390 y(for)h(a)g(giv)m(en)h(signal)g(to)f(the)h(original)g(disp)s +(osition,)f(they)g(should)f(use)h(`)p Ft(-)p Fu(')g(as)g(the)g(\014rst) +f(argumen)m(t.)154 4518 y(35.)61 b(The)21 b Ft(.)h Fu(and)f +Ft(source)f Fu(builtins)h(do)g(not)h(searc)m(h)h(the)f(curren)m(t)f (directory)h(for)g(the)g(\014lename)f(argumen)m(t)330 -1003 y(if)30 b(it)h(is)g(not)f(found)f(b)m(y)i(searc)m(hing)g -Fs(PATH)p Ft(.)154 1135 y(36.)61 b(Subshells)20 b(spa)m(wned)h(to)h -(execute)g(command)g(substitutions)f(inherit)g(the)g(v)-5 -b(alue)22 b(of)g(the)f(`)p Fs(-e)p Ft(')g(option)330 -1245 y(from)34 b(the)h(paren)m(t)g(shell.)55 b(When)34 -b(not)i(in)e Fl(posix)g Ft(mo)s(de,)i(Bash)f(clears)h(the)f(`)p -Fs(-e)p Ft(')f(option)i(in)e(suc)m(h)330 1354 y(subshells.)154 -1487 y(37.)61 b(Alias)31 b(expansion)g(is)f(alw)m(a)m(ys)i(enabled,)e -(ev)m(en)i(in)e(non-in)m(teractiv)m(e)j(shells.)154 1620 -y(38.)61 b(When)43 b(the)g Fs(alias)f Ft(builtin)g(displa)m(ys)i(alias) -g(de\014nitions,)i(it)d(do)s(es)g(not)g(displa)m(y)h(them)f(with)g(a) -330 1729 y(leading)31 b(`)p Fs(alias)e Ft(')i(unless)f(the)g(`)p -Fs(-p)p Ft(')g(option)h(is)g(supplied.)154 1862 y(39.)61 -b(When)40 b(the)g Fs(set)f Ft(builtin)h(is)g(in)m(v)m(ok)m(ed)h +4628 y(if)30 b(it)h(is)g(not)f(found)f(b)m(y)i(searc)m(hing)g +Ft(PATH)p Fu(.)154 4756 y(36.)61 b(Subshells)24 b(spa)m(wned)h(to)h +(execute)h(command)f(substitutions)f(inherit)g(the)h(v)-5 +b(alue)26 b(of)g(the)g Ft(-e)e Fu(option)330 4865 y(from)37 +b(the)h(paren)m(t)g(shell.)63 b(When)38 b(not)g(in)f +Fm(posix)g Fu(mo)s(de,)j(Bash)e(clears)g(the)g Ft(-e)g +Fu(option)g(in)f(suc)m(h)330 4975 y(subshells.)154 5103 +y(37.)61 b(Alias)31 b(expansion)g(is)f(alw)m(a)m(ys)i(enabled,)e(ev)m +(en)i(in)e(non-in)m(teractiv)m(e)j(shells.)154 5230 y(38.)61 +b(When)43 b(the)g Ft(alias)f Fu(builtin)g(displa)m(ys)i(alias)g +(de\014nitions,)i(it)d(do)s(es)g(not)g(displa)m(y)h(them)f(with)g(a)330 +5340 y(leading)31 b(`)p Ft(alias)e Fu(')i(unless)f(the)g +Ft(-p)g Fu(option)h(is)f(supplied.)p eop end +%%Page: 96 102 +TeXDict begin 96 101 bop 150 -116 a Fu(Chapter)30 b(6:)41 +b(Bash)30 b(F)-8 b(eatures)2484 b(96)154 299 y(39.)61 +b(When)40 b(the)g Ft(set)f Fu(builtin)h(is)g(in)m(v)m(ok)m(ed)h (without)f(options,)j(it)e(do)s(es)f(not)g(displa)m(y)g(shell)g -(function)330 1972 y(names)30 b(and)g(de\014nitions.)154 -2104 y(40.)61 b(When)36 b(the)g Fs(set)g Ft(builtin)g(is)g(in)m(v)m(ok) -m(ed)i(without)e(options,)i(it)f(displa)m(ys)f(v)-5 b(ariable)37 -b(v)-5 b(alues)37 b(without)330 2214 y(quotes,)26 b(unless)d(they)i -(con)m(tain)g(shell)f(metac)m(haracters,)k(ev)m(en)d(if)f(the)g(result) -g(con)m(tains)i(nonprin)m(ting)330 2323 y(c)m(haracters.)154 -2456 y(41.)61 b(When)35 b(the)g Fs(cd)f Ft(builtin)h(is)g(in)m(v)m(ok)m -(ed)i(in)d Fq(logical)41 b Ft(mo)s(de,)36 b(and)f(the)g(pathname)g -(constructed)g(from)330 2566 y Fs($PWD)i Ft(and)h(the)h(directory)f +(function)330 408 y(names)30 b(and)g(de\014nitions.)154 +543 y(40.)61 b(When)36 b(the)g Ft(set)g Fu(builtin)g(is)g(in)m(v)m(ok)m +(ed)i(without)e(options,)i(it)f(displa)m(ys)f(v)-5 b(ariable)37 +b(v)-5 b(alues)37 b(without)330 653 y(quotes,)26 b(unless)d(they)i(con) +m(tain)g(shell)f(metac)m(haracters,)k(ev)m(en)d(if)f(the)g(result)g +(con)m(tains)i(nonprin)m(ting)330 762 y(c)m(haracters.)154 +897 y(41.)61 b(When)35 b(the)g Ft(cd)f Fu(builtin)h(is)g(in)m(v)m(ok)m +(ed)i(in)d Fr(logical)41 b Fu(mo)s(de,)36 b(and)f(the)g(pathname)g +(constructed)g(from)330 1006 y Ft($PWD)i Fu(and)h(the)h(directory)f (name)h(supplied)e(as)i(an)f(argumen)m(t)h(do)s(es)f(not)g(refer)h(to)g -(an)f(existing)330 2675 y(directory)-8 b(,)32 b Fs(cd)d -Ft(will)i(fail)g(instead)g(of)f(falling)h(bac)m(k)h(to)f -Fq(ph)m(ysical)j Ft(mo)s(de.)154 2808 y(42.)61 b(The)36 -b Fs(pwd)f Ft(builtin)h(v)m(eri\014es)h(that)g(the)f(v)-5 +(an)f(existing)330 1116 y(directory)-8 b(,)32 b Ft(cd)d +Fu(will)i(fail)g(instead)g(of)f(falling)h(bac)m(k)h(to)f +Fr(ph)m(ysical)j Fu(mo)s(de.)154 1250 y(42.)61 b(The)36 +b Ft(pwd)f Fu(builtin)h(v)m(eri\014es)h(that)g(the)f(v)-5 b(alue)37 b(it)g(prin)m(ts)e(is)i(the)f(same)h(as)f(the)h(curren)m(t)f -(directory)-8 b(,)330 2917 y(ev)m(en)31 b(if)f(it)h(is)g(not)f(ask)m -(ed)h(to)g(c)m(hec)m(k)h(the)f(\014le)f(system)h(with)f(the)h(`)p -Fs(-P)p Ft(')f(option.)154 3050 y(43.)61 b(When)35 b(listing)g(the)g -(history)-8 b(,)36 b(the)f Fs(fc)g Ft(builtin)f(do)s(es)g(not)h -(include)g(an)f(indication)i(of)f(whether)f(or)330 3160 +(directory)-8 b(,)330 1360 y(ev)m(en)31 b(if)f(it)h(is)g(not)f(ask)m +(ed)h(to)g(c)m(hec)m(k)h(the)f(\014le)f(system)h(with)f(the)h +Ft(-P)e Fu(option.)154 1494 y(43.)61 b(When)35 b(listing)g(the)g +(history)-8 b(,)36 b(the)f Ft(fc)g Fu(builtin)f(do)s(es)g(not)h +(include)g(an)f(indication)i(of)f(whether)f(or)330 1604 y(not)d(a)f(history)h(en)m(try)f(has)g(b)s(een)g(mo)s(di\014ed.)154 -3292 y(44.)61 b(The)30 b(default)g(editor)h(used)f(b)m(y)g -Fs(fc)g Ft(is)g Fs(ed)p Ft(.)154 3425 y(45.)61 b(The)37 -b Fs(type)g Ft(and)g Fs(command)f Ft(builtins)i(will)g(not)g(rep)s(ort) +1738 y(44.)61 b(The)30 b(default)g(editor)h(used)f(b)m(y)g +Ft(fc)g Fu(is)g Ft(ed)p Fu(.)154 1873 y(45.)61 b(The)37 +b Ft(type)g Fu(and)g Ft(command)f Fu(builtins)i(will)g(not)g(rep)s(ort) f(a)i(non-executable)g(\014le)f(as)g(ha)m(ving)h(b)s(een)330 -3535 y(found,)26 b(though)h(the)g(shell)g(will)g(attempt)h(to)g +1983 y(found,)26 b(though)h(the)g(shell)g(will)g(attempt)h(to)g (execute)g(suc)m(h)f(a)g(\014le)g(if)g(it)g(is)g(the)g(only)g(so-named) -g(\014le)330 3644 y(found)i(in)h Fs($PATH)p Ft(.)154 -3777 y(46.)61 b(The)33 b Fs(vi)f Ft(editing)i(mo)s(de)f(will)g(in)m(v)m -(ok)m(e)i(the)e Fs(vi)g Ft(editor)h(directly)f(when)f(the)i(`)p -Fs(v)p Ft(')f(command)g(is)g(run,)330 3886 y(instead)e(of)f(c)m(hec)m -(king)i Fs($VISUAL)d Ft(and)g Fs($EDITOR)p Ft(.)154 4019 -y(47.)61 b(When)41 b(the)g Fs(xpg_echo)e Ft(option)i(is)g(enabled,)j +g(\014le)330 2092 y(found)i(in)h Ft($PATH)p Fu(.)154 +2227 y(46.)61 b(The)33 b Ft(vi)f Fu(editing)i(mo)s(de)f(will)g(in)m(v)m +(ok)m(e)i(the)e Ft(vi)g Fu(editor)h(directly)f(when)f(the)i(`)p +Ft(v)p Fu(')f(command)g(is)g(run,)330 2336 y(instead)e(of)f(c)m(hec)m +(king)i Ft($VISUAL)d Fu(and)g Ft($EDITOR)p Fu(.)154 2471 +y(47.)61 b(When)41 b(the)g Ft(xpg_echo)e Fu(option)i(is)g(enabled,)j (Bash)d(do)s(es)g(not)g(attempt)h(to)g(in)m(terpret)f(an)m(y)h(ar-)330 -4129 y(gumen)m(ts)35 b(to)g Fs(echo)e Ft(as)i(options.)54 +2580 y(gumen)m(ts)35 b(to)g Ft(echo)e Fu(as)i(options.)54 b(Eac)m(h)35 b(argumen)m(t)g(is)f(displa)m(y)m(ed,)j(after)e(escap)s(e) -g(c)m(haracters)h(are)330 4238 y(con)m(v)m(erted.)154 -4371 y(48.)61 b(The)30 b Fs(ulimit)f Ft(builtin)g(uses)h(a)h(blo)s(c)m -(k)g(size)g(of)g(512)g(b)m(ytes)g(for)f(the)h(`)p Fs(-c)p -Ft(')f(and)g(`)p Fs(-f)p Ft(')g(options.)154 4504 y(49.)61 -b(The)39 b(arriv)-5 b(al)41 b(of)f Fs(SIGCHLD)e Ft(when)h(a)h(trap)g -(is)g(set)h(on)f Fs(SIGCHLD)e Ft(do)s(es)h(not)h(in)m(terrupt)g(the)g -Fs(wait)330 4613 y Ft(builtin)c(and)h(cause)g(it)h(to)f(return)f +g(c)m(haracters)h(are)330 2690 y(con)m(v)m(erted.)154 +2824 y(48.)61 b(The)30 b Ft(ulimit)f Fu(builtin)g(uses)h(a)h(blo)s(c)m +(k)g(size)g(of)g(512)g(b)m(ytes)g(for)f(the)h Ft(-c)f +Fu(and)g Ft(-f)f Fu(options.)154 2959 y(49.)61 b(The)39 +b(arriv)-5 b(al)41 b(of)f Ft(SIGCHLD)e Fu(when)h(a)h(trap)g(is)g(set)h +(on)f Ft(SIGCHLD)e Fu(do)s(es)h(not)h(in)m(terrupt)g(the)g +Ft(wait)330 3068 y Fu(builtin)c(and)h(cause)g(it)h(to)f(return)f (immediately)-8 b(.)62 b(The)37 b(trap)f(command)h(is)g(run)e(once)j -(for)f(eac)m(h)330 4723 y(c)m(hild)31 b(that)g(exits.)154 -4855 y(50.)61 b(The)27 b Fs(read)f Ft(builtin)g(ma)m(y)i(b)s(e)e(in)m +(for)f(eac)m(h)330 3178 y(c)m(hild)31 b(that)g(exits.)154 +3313 y(50.)61 b(The)27 b Ft(read)f Fu(builtin)g(ma)m(y)i(b)s(e)e(in)m (terrupted)h(b)m(y)g(a)h(signal)f(for)g(whic)m(h)g(a)h(trap)f(has)g(b)s -(een)f(set.)40 b(If)27 b(Bash)330 4965 y(receiv)m(es)41 -b(a)f(trapp)s(ed)e(signal)i(while)f(executing)h Fs(read)p -Ft(,)h(the)e(trap)h(handler)e(executes)i(and)f Fs(read)330 -5075 y Ft(returns)29 b(an)h(exit)i(status)e(greater)i(than)e(128.)275 -5230 y(There)k(is)g(other)h Fl(posix)f Ft(b)s(eha)m(vior)h(that)g(Bash) +(een)f(set.)40 b(If)27 b(Bash)330 3422 y(receiv)m(es)41 +b(a)f(trapp)s(ed)e(signal)i(while)f(executing)h Ft(read)p +Fu(,)h(the)e(trap)h(handler)e(executes)i(and)f Ft(read)330 +3532 y Fu(returns)29 b(an)h(exit)i(status)e(greater)i(than)e(128.)275 +3691 y(There)k(is)g(other)h Fm(posix)f Fu(b)s(eha)m(vior)h(that)g(Bash) g(do)s(es)f(not)h(implemen)m(t)g(b)m(y)g(default)f(ev)m(en)i(when)d(in) -150 5340 y Fl(posix)d Ft(mo)s(de.)40 b(Sp)s(eci\014cally:)p +150 3801 y Fm(posix)d Fu(mo)s(de.)40 b(Sp)s(eci\014cally:)199 +3935 y(1.)61 b(The)30 b Ft(fc)f Fu(builtin)h(c)m(hec)m(ks)i +Ft($EDITOR)c Fu(as)j(a)f(program)g(to)h(edit)g(history)f(en)m(tries)h +(if)f Ft(FCEDIT)f Fu(is)h(unset,)330 4045 y(rather)g(than)g(defaulting) +h(directly)g(to)g Ft(ed)p Fu(.)40 b Ft(fc)30 b Fu(uses)g +Ft(ed)g Fu(if)g Ft(EDITOR)f Fu(is)h(unset.)199 4179 y(2.)61 +b(As)29 b(noted)g(ab)s(o)m(v)m(e,)i(Bash)e(requires)g(the)g +Ft(xpg_echo)e Fu(option)j(to)g(b)s(e)e(enabled)h(for)g(the)g +Ft(echo)f Fu(builtin)330 4289 y(to)j(b)s(e)f(fully)g(conforman)m(t.)275 +4448 y(Bash)c(can)g(b)s(e)f(con\014gured)h(to)g(b)s(e)g +Fm(posix)p Fu(-conforman)m(t)g(b)m(y)g(default,)h(b)m(y)f(sp)s +(ecifying)g(the)g Ft(--enable-)150 4558 y(strict-posix-default)c +Fu(to)27 b Ft(configure)e Fu(when)h(building)h(\(see)h(Section)g(10.8)g +([Optional)g(F)-8 b(eatures],)150 4667 y(page)31 b(140\).)p eop end %%Page: 97 103 -TeXDict begin 97 102 bop 150 -116 a Ft(Chapter)30 b(6:)41 -b(Bash)30 b(F)-8 b(eatures)2484 b(97)199 299 y(1.)61 -b(The)30 b Fs(fc)f Ft(builtin)h(c)m(hec)m(ks)i Fs($EDITOR)c -Ft(as)j(a)f(program)g(to)h(edit)g(history)f(en)m(tries)h(if)f -Fs(FCEDIT)f Ft(is)h(unset,)330 408 y(rather)g(than)g(defaulting)h -(directly)g(to)g Fs(ed)p Ft(.)40 b Fs(fc)30 b Ft(uses)g -Fs(ed)g Ft(if)g Fs(EDITOR)f Ft(is)h(unset.)199 543 y(2.)61 -b(As)29 b(noted)g(ab)s(o)m(v)m(e,)i(Bash)e(requires)g(the)g -Fs(xpg_echo)e Ft(option)j(to)g(b)s(e)e(enabled)h(for)g(the)g -Fs(echo)f Ft(builtin)330 653 y(to)j(b)s(e)f(fully)g(conforman)m(t.)275 -812 y(Bash)66 b(can)h(b)s(e)f(con\014gured)g(to)i(b)s(e)e -Fl(posix)p Ft(-conforman)m(t)h(b)m(y)f(default,)77 b(b)m(y)66 -b(sp)s(ecifying)h(the)150 922 y(`)p Fs(--enable-strict-posix-def)o -(ault)o Ft(')i(to)76 b Fs(configure)c Ft(when)i(building)g(\(see)i -(Section)f(10.8)150 1031 y([Optional)31 b(F)-8 b(eatures],)32 -b(page)f(141\).)p eop end -%%Page: 98 104 -TeXDict begin 98 103 bop 150 -116 a Ft(Chapter)30 b(7:)41 -b(Job)30 b(Con)m(trol)2571 b(98)150 299 y Fo(7)80 b(Job)54 -b(Con)l(trol)150 521 y Ft(This)25 b(c)m(hapter)i(discusses)f(what)g +TeXDict begin 97 102 bop 150 -116 a Fu(Chapter)30 b(7:)41 +b(Job)30 b(Con)m(trol)2571 b(97)150 299 y Fp(7)80 b(Job)54 +b(Con)l(trol)150 521 y Fu(This)25 b(c)m(hapter)i(discusses)f(what)g (job)f(con)m(trol)j(is,)f(ho)m(w)f(it)h(w)m(orks,)g(and)f(ho)m(w)g (Bash)g(allo)m(ws)h(y)m(ou)g(to)g(access)150 631 y(its)k(facilities.) -150 858 y Fr(7.1)68 b(Job)45 b(Con)l(trol)h(Basics)150 -1018 y Ft(Job)27 b(con)m(trol)i(refers)e(to)h(the)g(abilit)m(y)h(to)f +150 858 y Fs(7.1)68 b(Job)45 b(Con)l(trol)h(Basics)150 +1018 y Fu(Job)27 b(con)m(trol)i(refers)e(to)h(the)g(abilit)m(y)h(to)f (selectiv)m(ely)j(stop)c(\(susp)s(end\))f(the)i(execution)h(of)e(pro)s (cesses)h(and)150 1127 y(con)m(tin)m(ue)38 b(\(resume\))g(their)f (execution)h(at)g(a)g(later)g(p)s(oin)m(t.)61 b(A)37 @@ -14481,252 +14984,249 @@ b(user)g(t)m(ypically)i(emplo)m(ys)f(this)f(facilit)m(y)150 1237 y(via)27 b(an)e(in)m(teractiv)m(e)k(in)m(terface)f(supplied)d (join)m(tly)h(b)m(y)g(the)h(op)s(erating)f(system)g(k)m(ernel's)h (terminal)f(driv)m(er)150 1347 y(and)k(Bash.)275 1479 -y(The)23 b(shell)i(asso)s(ciates)h(a)f Fq(job)h Ft(with)e(eac)m(h)i +y(The)23 b(shell)i(asso)s(ciates)h(a)f Fr(job)h Fu(with)e(eac)m(h)i (pip)s(eline.)38 b(It)25 b(k)m(eeps)f(a)h(table)h(of)e(curren)m(tly)h (executing)g(jobs,)150 1588 y(whic)m(h)33 b(ma)m(y)i(b)s(e)e(listed)h -(with)f(the)h Fs(jobs)f Ft(command.)50 b(When)33 b(Bash)h(starts)g(a)g +(with)f(the)h Ft(jobs)f Fu(command.)50 b(When)33 b(Bash)h(starts)g(a)g (job)g(async)m(hronously)-8 b(,)34 b(it)150 1698 y(prin)m(ts)c(a)h -(line)f(that)h(lo)s(oks)g(lik)m(e:)390 1830 y Fs([1])47 -b(25647)150 1962 y Ft(indicating)34 b(that)g(this)f(job)g(is)g(job)g(n) -m(um)m(b)s(er)f(1)i(and)f(that)g(the)h(pro)s(cess)f Fl(id)g -Ft(of)g(the)h(last)g(pro)s(cess)f(in)g(the)150 2072 y(pip)s(eline)42 +(line)f(that)h(lo)s(oks)g(lik)m(e:)390 1830 y Ft([1])47 +b(25647)150 1962 y Fu(indicating)34 b(that)g(this)f(job)g(is)g(job)g(n) +m(um)m(b)s(er)f(1)i(and)f(that)g(the)h(pro)s(cess)f Fm(id)g +Fu(of)g(the)h(last)g(pro)s(cess)f(in)g(the)150 2072 y(pip)s(eline)42 b(asso)s(ciated)i(with)e(this)g(job)g(is)h(25647.)78 b(All)43 b(of)g(the)g(pro)s(cesses)f(in)g(a)h(single)g(pip)s(eline)f (are)150 2181 y(mem)m(b)s(ers)30 b(of)g(the)h(same)f(job.)41 -b(Bash)30 b(uses)g(the)h Fq(job)h Ft(abstraction)f(as)g(the)g(basis)f +b(Bash)30 b(uses)g(the)h Fr(job)h Fu(abstraction)f(as)g(the)g(basis)f (for)g(job)g(con)m(trol.)275 2313 y(T)-8 b(o)23 b(facilitate)j(the)d (implemen)m(tation)i(of)f(the)f(user)f(in)m(terface)j(to)f(job)f(con)m (trol,)j(the)d(op)s(erating)h(system)150 2423 y(main)m(tains)j(the)f (notion)h(of)f(a)g(curren)m(t)g(terminal)g(pro)s(cess)g(group)g -Fl(id)p Ft(.)39 b(Mem)m(b)s(ers)26 b(of)g(this)g(pro)s(cess)f(group)150 +Fm(id)p Fu(.)39 b(Mem)m(b)s(ers)26 b(of)g(this)g(pro)s(cess)f(group)150 2533 y(\(pro)s(cesses)h(whose)g(pro)s(cess)g(group)g -Fl(id)g Ft(is)h(equal)g(to)g(the)f(curren)m(t)g(terminal)h(pro)s(cess)f -(group)f Fl(id)p Ft(\))i(receiv)m(e)150 2642 y(k)m(eyb)s -(oard-generated)22 b(signals)g(suc)m(h)e(as)h Fs(SIGINT)p -Ft(.)36 b(These)21 b(pro)s(cesses)g(are)g(said)g(to)g(b)s(e)g(in)f(the) +Fm(id)g Fu(is)h(equal)g(to)g(the)f(curren)m(t)g(terminal)h(pro)s(cess)f +(group)f Fm(id)p Fu(\))i(receiv)m(e)150 2642 y(k)m(eyb)s +(oard-generated)22 b(signals)g(suc)m(h)e(as)h Ft(SIGINT)p +Fu(.)36 b(These)21 b(pro)s(cesses)g(are)g(said)g(to)g(b)s(e)g(in)f(the) h(foreground.)150 2752 y(Bac)m(kground)38 b(pro)s(cesses)f(are)h(those) -g(whose)f(pro)s(cess)g(group)g Fl(id)h Ft(di\013ers)f(from)g(the)g +g(whose)f(pro)s(cess)g(group)g Fm(id)h Fu(di\013ers)f(from)g(the)g (terminal's;)42 b(suc)m(h)150 2861 y(pro)s(cesses)24 b(are)g(imm)m(une)g(to)g(k)m(eyb)s(oard-generated)h(signals.)40 b(Only)23 b(foreground)g(pro)s(cesses)h(are)g(allo)m(w)m(ed)150 2971 y(to)g(read)e(from)h(or,)h(if)f(the)g(user)f(so)i(sp)s(eci\014es)e -(with)h Fs(stty)29 b(tostop)p Ft(,)23 b(write)g(to)g(the)h(terminal.)38 +(with)h Ft(stty)29 b(tostop)p Fu(,)23 b(write)g(to)g(the)h(terminal.)38 b(Bac)m(kground)150 3081 y(pro)s(cesses)27 b(whic)m(h)g(attempt)h(to)f -(read)g(from)g(\(write)g(to)h(when)e Fs(stty)j(tostop)d -Ft(is)h(in)f(e\013ect\))j(the)e(terminal)150 3190 y(are)32 -b(sen)m(t)g(a)g Fs(SIGTTIN)e Ft(\()p Fs(SIGTTOU)p Ft(\))g(signal)i(b)m +(read)g(from)g(\(write)g(to)h(when)e Ft(stty)j(tostop)d +Fu(is)h(in)f(e\013ect\))j(the)e(terminal)150 3190 y(are)32 +b(sen)m(t)g(a)g Ft(SIGTTIN)e Fu(\()p Ft(SIGTTOU)p Fu(\))g(signal)i(b)m (y)g(the)g(k)m(ernel's)g(terminal)g(driv)m(er,)g(whic)m(h,)g(unless)f (caugh)m(t,)150 3300 y(susp)s(ends)d(the)i(pro)s(cess.)275 3432 y(If)k(the)i(op)s(erating)g(system)f(on)h(whic)m(h)f(Bash)g(is)h (running)d(supp)s(orts)h(job)h(con)m(trol,)j(Bash)e(con)m(tains)150 3541 y(facilities)30 b(to)f(use)f(it.)40 b(T)m(yping)28 -b(the)g Fq(susp)s(end)h Ft(c)m(haracter)h(\(t)m(ypically)g(`)p -Fs(^Z)p Ft(',)f(Con)m(trol-Z\))g(while)f(a)g(pro)s(cess)150 +b(the)g Fr(susp)s(end)h Fu(c)m(haracter)h(\(t)m(ypically)g(`)p +Ft(^Z)p Fu(',)f(Con)m(trol-Z\))g(while)f(a)g(pro)s(cess)150 3651 y(is)42 b(running)f(causes)i(that)g(pro)s(cess)f(to)h(b)s(e)f (stopp)s(ed)f(and)h(returns)f(con)m(trol)j(to)f(Bash.)77 -b(T)m(yping)42 b(the)150 3761 y Fq(dela)m(y)m(ed)k(susp)s(end)f -Ft(c)m(haracter)h(\(t)m(ypically)g(`)p Fs(^Y)p Ft(',)i(Con)m(trol-Y\))e +b(T)m(yping)42 b(the)150 3761 y Fr(dela)m(y)m(ed)k(susp)s(end)f +Fu(c)m(haracter)h(\(t)m(ypically)g(`)p Ft(^Y)p Fu(',)i(Con)m(trol-Y\))e (causes)e(the)h(pro)s(cess)e(to)i(b)s(e)f(stopp)s(ed)150 3870 y(when)26 b(it)i(attempts)h(to)f(read)f(input)g(from)f(the)i (terminal,)h(and)e(con)m(trol)h(to)g(b)s(e)f(returned)f(to)j(Bash.)39 b(The)150 3980 y(user)e(then)g(manipulates)h(the)g(state)h(of)f(this)f -(job,)j(using)d(the)h Fs(bg)f Ft(command)g(to)h(con)m(tin)m(ue)h(it)f -(in)g(the)150 4089 y(bac)m(kground,)g(the)f Fs(fg)g Ft(command)f(to)i +(job,)j(using)d(the)h Ft(bg)f Fu(command)g(to)h(con)m(tin)m(ue)h(it)f +(in)g(the)150 4089 y(bac)m(kground,)g(the)f Ft(fg)g Fu(command)f(to)i (con)m(tin)m(ue)g(it)f(in)f(the)h(foreground,)h(or)f(the)g -Fs(kill)f Ft(command)g(to)150 4199 y(kill)27 b(it.)40 -b(A)27 b(`)p Fs(^Z)p Ft(')g(tak)m(es)h(e\013ect)g(immediately)-8 +Ft(kill)f Fu(command)g(to)150 4199 y(kill)27 b(it.)40 +b(A)27 b(`)p Ft(^Z)p Fu(')g(tak)m(es)h(e\013ect)g(immediately)-8 b(,)29 b(and)d(has)h(the)f(additional)i(side)e(e\013ect)j(of)d(causing) h(p)s(ending)150 4309 y(output)j(and)g(t)m(yp)s(eahead)h(to)g(b)s(e)e (discarded.)275 4441 y(There)j(are)g(a)h(n)m(um)m(b)s(er)e(of)i(w)m(a)m (ys)g(to)h(refer)e(to)h(a)g(job)f(in)g(the)h(shell.)47 -b(The)32 b(c)m(haracter)i(`)p Fs(\045)p Ft(')f(in)m(tro)s(duces)150 -4550 y(a)e(job)f(sp)s(eci\014cation)h(\()p Fq(jobsp)s(ec)6 -b Ft(\).)275 4682 y(Job)31 b(n)m(um)m(b)s(er)f Fs(n)h -Ft(ma)m(y)h(b)s(e)f(referred)g(to)h(as)g(`)p Fs(\045n)p -Ft('.)44 b(The)31 b(sym)m(b)s(ols)g(`)p Fs(\045\045)p -Ft(')h(and)f(`)p Fs(\045+)p Ft(')g(refer)h(to)g(the)g(shell's)150 +b(The)32 b(c)m(haracter)i(`)p Ft(\045)p Fu(')f(in)m(tro)s(duces)150 +4550 y(a)e(job)f(sp)s(eci\014cation)h(\()p Fr(jobsp)s(ec)6 +b Fu(\).)275 4682 y(Job)31 b(n)m(um)m(b)s(er)f Ft(n)h +Fu(ma)m(y)h(b)s(e)f(referred)g(to)h(as)g(`)p Ft(\045n)p +Fu('.)44 b(The)31 b(sym)m(b)s(ols)g(`)p Ft(\045\045)p +Fu(')h(and)f(`)p Ft(\045+)p Fu(')g(refer)h(to)g(the)g(shell's)150 4792 y(notion)k(of)f(the)g(curren)m(t)g(job,)h(whic)m(h)f(is)g(the)g (last)h(job)f(stopp)s(ed)f(while)h(it)h(w)m(as)g(in)e(the)i(foreground) e(or)150 4902 y(started)27 b(in)g(the)g(bac)m(kground.)40 -b(A)27 b(single)g(`)p Fs(\045)p Ft(')g(\(with)g(no)g(accompan)m(ying)i +b(A)27 b(single)g(`)p Ft(\045)p Fu(')g(\(with)g(no)g(accompan)m(ying)i (job)d(sp)s(eci\014cation\))i(also)g(refers)150 5011 y(to)k(the)e(curren)m(t)h(job.)42 b(The)30 b(previous)g(job)h(ma)m(y)g -(b)s(e)f(referenced)h(using)f(`)p Fs(\045-)p Ft('.)42 +(b)s(e)f(referenced)h(using)f(`)p Ft(\045-)p Fu('.)42 b(If)30 b(there)h(is)g(only)g(a)g(single)150 5121 y(job,)g(`)p -Fs(\045+)p Ft(')g(and)f(`)p Fs(\045-)p Ft(')h(can)h(b)s(oth)e(b)s(e)g +Ft(\045+)p Fu(')g(and)f(`)p Ft(\045-)p Fu(')h(can)h(b)s(oth)e(b)s(e)g (used)h(to)g(refer)g(to)h(that)g(job.)42 b(In)30 b(output)h(p)s (ertaining)g(to)g(jobs)g(\(e.g.,)150 5230 y(the)39 b(output)f(of)g(the) -h Fs(jobs)e Ft(command\),)k(the)d(curren)m(t)h(job)f(is)g(alw)m(a)m(ys) -i(\015agged)f(with)f(a)h(`)p Fs(+)p Ft(',)i(and)d(the)150 -5340 y(previous)30 b(job)g(with)g(a)h(`)p Fs(-)p Ft('.)p +h Ft(jobs)e Fu(command\),)k(the)d(curren)m(t)h(job)f(is)g(alw)m(a)m(ys) +i(\015agged)f(with)f(a)h(`)p Ft(+)p Fu(',)i(and)d(the)150 +5340 y(previous)30 b(job)g(with)g(a)h(`)p Ft(-)p Fu('.)p eop end -%%Page: 99 105 -TeXDict begin 99 104 bop 150 -116 a Ft(Chapter)30 b(7:)41 -b(Job)30 b(Con)m(trol)2571 b(99)275 299 y(A)38 b(job)g(ma)m(y)h(also)g +%%Page: 98 104 +TeXDict begin 98 103 bop 150 -116 a Fu(Chapter)30 b(7:)41 +b(Job)30 b(Con)m(trol)2571 b(98)275 299 y(A)38 b(job)g(ma)m(y)h(also)g (b)s(e)f(referred)f(to)j(using)d(a)i(pre\014x)e(of)i(the)f(name)h(used) e(to)i(start)g(it,)i(or)e(using)f(a)150 408 y(substring)29 b(that)i(app)s(ears)f(in)g(its)h(command)f(line.)41 b(F)-8 -b(or)31 b(example,)g(`)p Fs(\045ce)p Ft(')f(refers)g(to)h(a)g(stopp)s -(ed)e Fs(ce)h Ft(job.)150 518 y(Using)d(`)p Fs(\045?ce)p -Ft(',)g(on)f(the)h(other)g(hand,)g(refers)f(to)h(an)m(y)g(job)g(con)m -(taining)h(the)f(string)f(`)p Fs(ce)p Ft(')h(in)f(its)h(command)150 +b(or)31 b(example,)g(`)p Ft(\045ce)p Fu(')f(refers)g(to)h(a)g(stopp)s +(ed)e Ft(ce)h Fu(job.)150 518 y(Using)d(`)p Ft(\045?ce)p +Fu(',)g(on)f(the)h(other)g(hand,)g(refers)f(to)h(an)m(y)g(job)g(con)m +(taining)h(the)f(string)f(`)p Ft(ce)p Fu(')h(in)f(its)h(command)150 628 y(line.)41 b(If)30 b(the)h(pre\014x)e(or)h(substring)f(matc)m(hes)j (more)e(than)h(one)f(job,)h(Bash)f(rep)s(orts)g(an)g(error.)275 762 y(Simply)g(naming)h(a)g(job)g(can)g(b)s(e)f(used)h(to)g(bring)f(it) -i(in)m(to)g(the)f(foreground:)41 b(`)p Fs(\0451)p Ft(')31 -b(is)g(a)h(synon)m(ym)e(for)150 871 y(`)p Fs(fg)g(\0451)p -Ft(',)i(bringing)f(job)g(1)g(from)g(the)h(bac)m(kground)f(in)m(to)i -(the)e(foreground.)44 b(Similarly)-8 b(,)32 b(`)p Fs(\0451)e(&)p -Ft(')i(resumes)150 981 y(job)e(1)h(in)f(the)g(bac)m(kground,)h(equiv)-5 -b(alen)m(t)32 b(to)f(`)p Fs(bg)f(\0451)p Ft(')275 1115 +i(in)m(to)g(the)f(foreground:)41 b(`)p Ft(\0451)p Fu(')31 +b(is)g(a)h(synon)m(ym)e(for)150 871 y(`)p Ft(fg)g(\0451)p +Fu(',)i(bringing)f(job)g(1)g(from)g(the)h(bac)m(kground)f(in)m(to)i +(the)e(foreground.)44 b(Similarly)-8 b(,)32 b(`)p Ft(\0451)e(&)p +Fu(')i(resumes)150 981 y(job)e(1)h(in)f(the)g(bac)m(kground,)h(equiv)-5 +b(alen)m(t)32 b(to)f(`)p Ft(bg)f(\0451)p Fu(')275 1115 y(The)g(shell)i(learns)f(immediately)i(whenev)m(er)e(a)h(job)f(c)m (hanges)h(state.)45 b(Normally)-8 b(,)33 b(Bash)e(w)m(aits)i(un)m(til) 150 1224 y(it)25 b(is)g(ab)s(out)f(to)i(prin)m(t)e(a)h(prompt)f(b)s (efore)g(rep)s(orting)h(c)m(hanges)g(in)g(a)g(job's)f(status)h(so)g(as) -g(to)g(not)g(in)m(terrupt)150 1334 y(an)m(y)g(other)g(output.)39 -b(If)24 b(the)i(`)p Fs(-b)p Ft(')e(option)i(to)f(the)g -Fs(set)f Ft(builtin)h(is)g(enabled,)h(Bash)f(rep)s(orts)f(suc)m(h)h(c)m -(hanges)150 1443 y(immediately)g(\(see)g(Section)g(4.3.1)g([The)f(Set)g -(Builtin],)i(page)f(59\).)40 b(An)m(y)24 b(trap)f(on)h -Fs(SIGCHLD)e Ft(is)i(executed)150 1553 y(for)30 b(eac)m(h)i(c)m(hild)e +g(to)g(not)g(in)m(terrupt)150 1334 y(an)m(y)k(other)f(output.)40 +b(If)28 b(the)g Ft(-b)g Fu(option)g(to)h(the)g Ft(set)e +Fu(builtin)h(is)g(enabled,)h(Bash)g(rep)s(orts)e(suc)m(h)h(c)m(hanges) +150 1443 y(immediately)d(\(see)g(Section)g(4.3.1)g([The)f(Set)g +(Builtin],)i(page)f(58\).)40 b(An)m(y)24 b(trap)f(on)h +Ft(SIGCHLD)e Fu(is)i(executed)150 1553 y(for)30 b(eac)m(h)i(c)m(hild)e (pro)s(cess)g(that)h(exits.)275 1687 y(If)25 b(an)h(attempt)h(to)g (exit)g(Bash)f(is)h(made)f(while)g(jobs)f(are)i(stopp)s(ed,)f(\(or)h -(running,)e(if)h(the)g Fs(checkjobs)150 1796 y Ft(option)e(is)f +(running,)e(if)h(the)g Ft(checkjobs)150 1796 y Fu(option)e(is)f (enabled)h({)g(see)g(Section)g(4.3.2)h([The)e(Shopt)g(Builtin],)j(page) -e(63\),)i(the)e(shell)f(prin)m(ts)g(a)h(w)m(arning)150 -1906 y(message,)k(and)c(if)i(the)f Fs(checkjobs)e Ft(option)j(is)f +e(62\),)i(the)e(shell)f(prin)m(ts)g(a)h(w)m(arning)150 +1906 y(message,)k(and)c(if)i(the)f Ft(checkjobs)e Fu(option)j(is)f (enabled,)i(lists)e(the)h(jobs)f(and)f(their)i(statuses.)39 -b(The)25 b Fs(jobs)150 2016 y Ft(command)36 b(ma)m(y)h(then)f(b)s(e)f +b(The)25 b Ft(jobs)150 2016 y Fu(command)36 b(ma)m(y)h(then)f(b)s(e)f (used)g(to)i(insp)s(ect)f(their)g(status.)59 b(If)36 b(a)g(second)g(attempt)i(to)f(exit)g(is)f(made)150 2125 y(without)e(an)f(in)m(terv)m(ening)i(command,)f(Bash)g(do)s(es)f(not)h (prin)m(t)g(another)f(w)m(arning,)i(and)e(an)m(y)h(stopp)s(ed)150 -2235 y(jobs)c(are)h(terminated.)150 2466 y Fr(7.2)68 -b(Job)45 b(Con)l(trol)h(Builtins)150 2650 y Fs(bg)870 -2784 y(bg)h([)p Fi(jobspec)56 b Fs(...)o(])630 2918 y -Ft(Resume)24 b(eac)m(h)h(susp)s(ended)d(job)i Fq(jobsp)s(ec)29 -b Ft(in)24 b(the)g(bac)m(kground,)h(as)g(if)f(it)h(had)e(b)s(een)g -(started)630 3027 y(with)32 b(`)p Fs(&)p Ft('.)45 b(If)31 -b Fq(jobsp)s(ec)37 b Ft(is)32 b(not)g(supplied,)f(the)h(curren)m(t)g -(job)f(is)h(used.)45 b(The)31 b(return)g(status)630 3137 -y(is)i(zero)g(unless)f(it)h(is)g(run)e(when)h(job)g(con)m(trol)i(is)f -(not)g(enabled,)h(or,)f(when)f(run)f(with)h(job)630 3246 -y(con)m(trol)h(enabled,)g(an)m(y)f Fq(jobsp)s(ec)37 b -Ft(w)m(as)32 b(not)g(found)f(or)g(sp)s(eci\014es)h(a)g(job)g(that)g(w)m -(as)g(started)630 3356 y(without)e(job)g(con)m(trol.)150 -3514 y Fs(fg)870 3648 y(fg)47 b([)p Fi(jobspec)11 b Fs(])630 -3782 y Ft(Resume)43 b(the)g(job)g Fq(jobsp)s(ec)48 b -Ft(in)43 b(the)g(foreground)g(and)f(mak)m(e)j(it)e(the)h(curren)m(t)f -(job.)78 b(If)630 3891 y Fq(jobsp)s(ec)41 b Ft(is)c(not)f(supplied,)h +2235 y(jobs)c(are)h(terminated.)150 2466 y Fs(7.2)68 +b(Job)45 b(Con)l(trol)h(Builtins)150 2650 y Ft(bg)870 +2784 y(bg)h([)p Fj(jobspec)f Ft(...)o(])630 2918 y Fu(Resume)24 +b(eac)m(h)h(susp)s(ended)d(job)i Fr(jobsp)s(ec)29 b Fu(in)24 +b(the)g(bac)m(kground,)h(as)g(if)f(it)h(had)e(b)s(een)g(started)630 +3027 y(with)32 b(`)p Ft(&)p Fu('.)45 b(If)31 b Fr(jobsp)s(ec)37 +b Fu(is)32 b(not)g(supplied,)f(the)h(curren)m(t)g(job)f(is)h(used.)45 +b(The)31 b(return)g(status)630 3137 y(is)i(zero)g(unless)f(it)h(is)g +(run)e(when)h(job)g(con)m(trol)i(is)f(not)g(enabled,)h(or,)f(when)f +(run)f(with)h(job)630 3246 y(con)m(trol)h(enabled,)g(an)m(y)f +Fr(jobsp)s(ec)37 b Fu(w)m(as)32 b(not)g(found)f(or)g(sp)s(eci\014es)h +(a)g(job)g(that)g(w)m(as)g(started)630 3356 y(without)e(job)g(con)m +(trol.)150 3514 y Ft(fg)870 3648 y(fg)47 b([)p Fj(jobspec)p +Ft(])630 3782 y Fu(Resume)c(the)g(job)g Fr(jobsp)s(ec)48 +b Fu(in)43 b(the)g(foreground)g(and)f(mak)m(e)j(it)e(the)h(curren)m(t)f +(job.)78 b(If)630 3891 y Fr(jobsp)s(ec)41 b Fu(is)c(not)f(supplied,)h (the)f(curren)m(t)h(job)f(is)g(used.)58 b(The)36 b(return)f(status)h (is)h(that)g(of)630 4001 y(the)d(command)g(placed)h(in)m(to)g(the)f (foreground,)g(or)g(non-zero)h(if)f(run)f(when)g(job)g(con)m(trol)630 4111 y(is)i(disabled)g(or,)i(when)d(run)g(with)h(job)g(con)m(trol)h -(enabled,)h Fq(jobsp)s(ec)j Ft(do)s(es)35 b(not)h(sp)s(ecify)f(a)630 -4220 y(v)-5 b(alid)31 b(job)f(or)g Fq(jobsp)s(ec)35 b -Ft(sp)s(eci\014es)30 b(a)h(job)f(that)h(w)m(as)g(started)g(without)f -(job)g(con)m(trol.)150 4378 y Fs(jobs)870 4512 y(jobs)47 -b([-lnprs])e([)p Fi(jobspec)11 b Fs(])870 4622 y(jobs)47 -b(-x)g Fi(command)56 b Fs([)p Fi(arguments)11 b Fs(])630 -4756 y Ft(The)30 b(\014rst)f(form)h(lists)h(the)g(activ)m(e)h(jobs.)41 +(enabled,)h Fr(jobsp)s(ec)j Fu(do)s(es)35 b(not)h(sp)s(ecify)f(a)630 +4220 y(v)-5 b(alid)31 b(job)f(or)g Fr(jobsp)s(ec)35 b +Fu(sp)s(eci\014es)30 b(a)h(job)f(that)h(w)m(as)g(started)g(without)f +(job)g(con)m(trol.)150 4378 y Ft(jobs)870 4512 y(jobs)47 +b([-lnprs])e([)p Fj(jobspec)p Ft(])870 4622 y(jobs)i(-x)g +Fj(command)f Ft([)p Fj(arguments)p Ft(])630 4756 y Fu(The)30 +b(\014rst)f(form)h(lists)h(the)g(activ)m(e)h(jobs.)41 b(The)30 b(options)g(ha)m(v)m(e)i(the)e(follo)m(wing)i(meanings:)630 -4914 y Fs(-l)384 b Ft(List)31 b(pro)s(cess)f Fl(id)p -Ft(s)g(in)g(addition)h(to)g(the)f(normal)h(information.)630 -5072 y Fs(-n)384 b Ft(Displa)m(y)26 b(information)f(only)h(ab)s(out)e +4914 y Ft(-l)384 b Fu(List)31 b(pro)s(cess)f Fm(id)p +Fu(s)g(in)g(addition)h(to)g(the)f(normal)h(information.)630 +5072 y Ft(-n)384 b Fu(Displa)m(y)26 b(information)f(only)h(ab)s(out)e (jobs)h(that)g(ha)m(v)m(e)i(c)m(hanged)e(status)h(since)1110 5182 y(the)31 b(user)e(w)m(as)i(last)g(noti\014ed)f(of)h(their)f -(status.)630 5340 y Fs(-p)384 b Ft(List)31 b(only)f(the)h(pro)s(cess)f -Fl(id)g Ft(of)h(the)f(job's)g(pro)s(cess)g(group)g(leader.)p +(status.)630 5340 y Ft(-p)384 b Fu(List)31 b(only)f(the)h(pro)s(cess)f +Fm(id)g Fu(of)h(the)f(job's)g(pro)s(cess)g(group)g(leader.)p eop end -%%Page: 100 106 -TeXDict begin 100 105 bop 150 -116 a Ft(Chapter)30 b(7:)41 -b(Job)30 b(Con)m(trol)2526 b(100)630 299 y Fs(-r)384 -b Ft(Displa)m(y)32 b(only)e(running)f(jobs.)630 450 y -Fs(-s)384 b Ft(Displa)m(y)32 b(only)e(stopp)s(ed)f(jobs.)630 -602 y(If)23 b Fq(jobsp)s(ec)28 b Ft(is)c(giv)m(en,)i(output)d(is)h -(restricted)g(to)g(information)g(ab)s(out)f(that)h(job.)39 -b(If)23 b Fq(jobsp)s(ec)630 711 y Ft(is)30 b(not)h(supplied,)e(the)i -(status)g(of)f(all)h(jobs)f(is)h(listed.)630 842 y(If)g(the)g(`)p -Fs(-x)p Ft(')g(option)h(is)f(supplied,)g Fs(jobs)f Ft(replaces)i(an)m -(y)f Fq(jobsp)s(ec)37 b Ft(found)29 b(in)i Fq(command)k -Ft(or)630 951 y Fq(argumen)m(ts)41 b Ft(with)36 b(the)i(corresp)s -(onding)d(pro)s(cess)i(group)f Fl(id)p Ft(,)j(and)d(executes)i -Fq(command)t Ft(,)630 1061 y(passing)30 b(it)h Fq(argumen)m(t)r -Ft(s,)g(returning)f(its)g(exit)i(status.)150 1212 y Fs(kill)870 -1343 y(kill)47 b([-s)g Fi(sigspec)11 b Fs(])45 b([-n)i -Fi(signum)11 b Fs(])45 b([-)p Fi(sigspec)11 b Fs(])44 -b Fi(jobspec)57 b Fs(or)47 b Fi(pid)870 1452 y Fs(kill)g(-l)g([)p -Fi(exit_status)11 b Fs(])630 1583 y Ft(Send)22 b(a)i(signal)g(sp)s -(eci\014ed)f(b)m(y)g Fq(sigsp)s(ec)29 b Ft(or)24 b Fq(sign)m(um)f -Ft(to)h(the)g(pro)s(cess)f(named)g(b)m(y)g(job)g(sp)s(eci\014-)630 -1692 y(cation)j Fq(jobsp)s(ec)k Ft(or)25 b(pro)s(cess)g -Fl(id)g Fq(pid)t Ft(.)38 b Fq(sigsp)s(ec)31 b Ft(is)25 -b(either)g(a)h(case-insensitiv)m(e)h(signal)f(name)630 -1802 y(suc)m(h)k(as)h Fs(SIGINT)d Ft(\(with)j(or)f(without)h(the)f -Fs(SIG)g Ft(pre\014x\))f(or)i(a)f(signal)h(n)m(um)m(b)s(er;)f -Fq(sign)m(um)g Ft(is)630 1911 y(a)i(signal)g(n)m(um)m(b)s(er.)43 -b(If)31 b Fq(sigsp)s(ec)37 b Ft(and)31 b Fq(sign)m(um)g -Ft(are)h(not)f(presen)m(t,)h Fs(SIGTERM)e Ft(is)h(used.)43 -b(The)630 2021 y(`)p Fs(-l)p Ft(')34 b(option)g(lists)h(the)f(signal)h -(names.)51 b(If)33 b(an)m(y)i(argumen)m(ts)f(are)g(supplied)f(when)g(`) -p Fs(-l)p Ft(')h(is)630 2131 y(giv)m(en,)e(the)g(names)e(of)i(the)f +%%Page: 99 105 +TeXDict begin 99 104 bop 150 -116 a Fu(Chapter)30 b(7:)41 +b(Job)30 b(Con)m(trol)2571 b(99)630 299 y Ft(-r)384 b +Fu(Displa)m(y)32 b(only)e(running)f(jobs.)630 461 y Ft(-s)384 +b Fu(Displa)m(y)32 b(only)e(stopp)s(ed)f(jobs.)630 622 +y(If)23 b Fr(jobsp)s(ec)28 b Fu(is)23 b(giv)m(en,)i(output)e(is)g +(restricted)h(to)g(information)f(ab)s(out)g(that)h(job.)37 +b(If)23 b Fr(jobsp)s(ec)630 732 y Fu(is)30 b(not)h(supplied,)e(the)i +(status)g(of)f(all)h(jobs)f(is)h(listed.)630 868 y(If)k(the)g +Ft(-x)f Fu(option)i(is)f(supplied,)g Ft(jobs)f Fu(replaces)i(an)m(y)f +Fr(jobsp)s(ec)40 b Fu(found)34 b(in)h Fr(command)j Fu(or)630 +977 y Fr(argumen)m(ts)j Fu(with)c(the)h(corresp)s(onding)e(pro)s(cess)h +(group)f Fm(id)p Fu(,)k(and)c(executes)j Fr(command)p +Fu(,)630 1087 y(passing)30 b(it)h Fr(argumen)m(t)r Fu(s,)g(returning)f +(its)g(exit)i(status.)150 1249 y Ft(kill)870 1384 y(kill)47 +b([-s)g Fj(sigspec)p Ft(])e([-n)i Fj(signum)p Ft(])f([-)p +Fj(sigspec)p Ft(])f Fj(jobspec)h Ft(or)h Fj(pid)870 1494 +y Ft(kill)g(-l)g([)p Fj(exit_status)p Ft(])630 1630 y +Fu(Send)22 b(a)i(signal)g(sp)s(eci\014ed)f(b)m(y)g Fr(sigsp)s(ec)29 +b Fu(or)24 b Fr(sign)m(um)f Fu(to)h(the)g(pro)s(cess)f(named)g(b)m(y)g +(job)g(sp)s(eci\014-)630 1739 y(cation)k Fr(jobsp)s(ec)j +Fu(or)25 b(pro)s(cess)g Fm(id)h Fr(pid)p Fu(.)38 b Fr(sigsp)s(ec)31 +b Fu(is)25 b(either)h(a)g(case-insensitiv)m(e)i(signal)e(name)630 +1849 y(suc)m(h)37 b(as)g Ft(SIGINT)f Fu(\(with)h(or)g(without)g(the)g +Ft(SIG)g Fu(pre\014x\))f(or)h(a)h(signal)g(n)m(um)m(b)s(er;)h +Fr(sign)m(um)630 1958 y Fu(is)g(a)f(signal)i(n)m(um)m(b)s(er.)63 +b(If)39 b Fr(sigsp)s(ec)44 b Fu(and)38 b Fr(sign)m(um)g +Fu(are)h(not)g(presen)m(t,)h Ft(SIGTERM)d Fu(is)h(used.)630 +2068 y(The)27 b Ft(-l)h Fu(option)g(lists)h(the)f(signal)h(names.)39 +b(If)28 b(an)m(y)g(argumen)m(ts)h(are)f(supplied)f(when)g +Ft(-l)g Fu(is)630 2178 y(giv)m(en,)32 b(the)g(names)e(of)i(the)f (signals)g(corresp)s(onding)f(to)i(the)f(argumen)m(ts)g(are)h(listed,)g -(and)630 2240 y(the)c(return)f(status)h(is)g(zero.)41 -b Fq(exit)p 1796 2240 28 4 v 41 w(status)32 b Ft(is)c(a)g(n)m(um)m(b)s +(and)630 2287 y(the)c(return)f(status)h(is)g(zero.)41 +b Fr(exit)p 1796 2287 28 4 v 41 w(status)32 b Fu(is)c(a)g(n)m(um)m(b)s (er)f(sp)s(ecifying)g(a)i(signal)f(n)m(um)m(b)s(er)f(or)630 -2350 y(the)35 b(exit)h(status)f(of)g(a)g(pro)s(cess)g(terminated)g(b)m +2397 y(the)35 b(exit)h(status)f(of)g(a)g(pro)s(cess)g(terminated)g(b)m (y)g(a)g(signal.)55 b(The)34 b(return)g(status)h(is)g(zero)630 -2459 y(if)c(at)h(least)g(one)g(signal)f(w)m(as)h(successfully)f(sen)m +2506 y(if)c(at)h(least)g(one)g(signal)f(w)m(as)h(successfully)f(sen)m (t,)h(or)f(non-zero)h(if)f(an)g(error)f(o)s(ccurs)h(or)g(an)630 -2569 y(in)m(v)-5 b(alid)31 b(option)g(is)f(encoun)m(tered.)150 -2720 y Fs(wait)870 2851 y(wait)47 b([-n])f([)p Fi(jobspec)56 -b Fs(or)48 b Fi(pid)57 b Fs(...)o(])630 2981 y Ft(W)-8 -b(ait)28 b(un)m(til)f(the)f(c)m(hild)h(pro)s(cess)f(sp)s(eci\014ed)g(b) -m(y)g(eac)m(h)h(pro)s(cess)f Fl(id)h Fq(pid)i Ft(or)d(job)g(sp)s -(eci\014cation)630 3091 y Fq(jobsp)s(ec)j Ft(exits)c(and)f(return)g +2616 y(in)m(v)-5 b(alid)31 b(option)g(is)f(encoun)m(tered.)150 +2778 y Ft(wait)870 2913 y(wait)47 b([-n])f([)p Fj(jobspec)g +Ft(or)h Fj(pid)g Ft(...)o(])630 3049 y Fu(W)-8 b(ait)28 +b(un)m(til)f(the)f(c)m(hild)h(pro)s(cess)f(sp)s(eci\014ed)g(b)m(y)g +(eac)m(h)h(pro)s(cess)f Fm(id)h Fr(pid)i Fu(or)d(job)g(sp)s +(eci\014cation)630 3159 y Fr(jobsp)s(ec)j Fu(exits)c(and)f(return)g (the)g(exit)h(status)g(of)g(the)f(last)h(command)g(w)m(aited)g(for.)39 -b(If)23 b(a)i(job)630 3200 y(sp)s(ec)j(is)g(giv)m(en,)i(all)f(pro)s +b(If)23 b(a)i(job)630 3268 y(sp)s(ec)j(is)g(giv)m(en,)i(all)f(pro)s (cesses)f(in)g(the)g(job)g(are)h(w)m(aited)g(for.)40 -b(If)27 b(no)i(argumen)m(ts)f(are)h(giv)m(en,)630 3310 +b(If)27 b(no)i(argumen)m(ts)f(are)h(giv)m(en,)630 3378 y(all)f(curren)m(tly)g(activ)m(e)i(c)m(hild)e(pro)s(cesses)f(are)h(w)m (aited)g(for,)g(and)f(the)h(return)e(status)i(is)g(zero.)630 -3420 y(If)k(the)h(`)p Fs(-n)p Ft(')f(option)h(is)g(supplied,)f -Fs(wait)f Ft(w)m(aits)i(for)g(an)m(y)f(job)h(to)g(terminate)g(and)f -(returns)630 3529 y(its)27 b(exit)h(status.)40 b(If)26 -b(neither)h Fq(jobsp)s(ec)k Ft(nor)c Fq(pid)i Ft(sp)s(eci\014es)e(an)f -(activ)m(e)j(c)m(hild)e(pro)s(cess)g(of)g(the)630 3639 -y(shell,)k(the)f(return)g(status)g(is)h(127.)150 3790 -y Fs(disown)870 3921 y(disown)46 b([-ar])g([-h])h([)p -Fi(jobspec)56 b Fs(...)o(])630 4051 y Ft(Without)30 b(options,)f(remo)m -(v)m(e)i(eac)m(h)f Fq(jobsp)s(ec)k Ft(from)28 b(the)h(table)h(of)f -(activ)m(e)i(jobs.)40 b(If)28 b(the)h(`)p Fs(-h)p Ft(')630 -4161 y(option)36 b(is)f(giv)m(en,)i(the)f(job)f(is)g(not)g(remo)m(v)m -(ed)h(from)f(the)g(table,)j(but)c(is)i(mark)m(ed)f(so)g(that)630 -4270 y Fs(SIGHUP)e Ft(is)j(not)f(sen)m(t)h(to)g(the)f(job)g(if)g(the)g -(shell)h(receiv)m(es)h(a)e Fs(SIGHUP)p Ft(.)54 b(If)34 -b Fq(jobsp)s(ec)40 b Ft(is)c(not)630 4380 y(presen)m(t,)c(and)f -(neither)h(the)g(`)p Fs(-a)p Ft(')g(nor)f(the)h(`)p Fs(-r)p -Ft(')f(option)h(is)g(supplied,)f(the)h(curren)m(t)g(job)f(is)630 -4489 y(used.)58 b(If)36 b(no)g Fq(jobsp)s(ec)41 b Ft(is)36 -b(supplied,)h(the)g(`)p Fs(-a)p Ft(')f(option)h(means)f(to)h(remo)m(v)m -(e)h(or)e(mark)g(all)630 4599 y(jobs;)28 b(the)f(`)p -Fs(-r)p Ft(')g(option)g(without)g(a)g Fq(jobsp)s(ec)32 -b Ft(argumen)m(t)27 b(restricts)h(op)s(eration)f(to)h(running)630 -4709 y(jobs.)150 4860 y Fs(suspend)870 4990 y(suspend)46 -b([-f])630 5121 y Ft(Susp)s(end)31 b(the)i(execution)h(of)g(this)f -(shell)g(un)m(til)h(it)g(receiv)m(es)h(a)e Fs(SIGCONT)f -Ft(signal.)50 b(A)33 b(login)630 5230 y(shell)24 b(cannot)h(b)s(e)e -(susp)s(ended;)h(the)g(`)p Fs(-f)p Ft(')g(option)g(can)h(b)s(e)e(used)g -(to)i(o)m(v)m(erride)g(this)f(and)f(force)630 5340 y(the)31 -b(susp)s(ension.)p eop end -%%Page: 101 107 -TeXDict begin 101 106 bop 150 -116 a Ft(Chapter)30 b(7:)41 -b(Job)30 b(Con)m(trol)2526 b(101)275 299 y(When)30 b(job)f(con)m(trol)j -(is)e(not)h(activ)m(e,)i(the)d Fs(kill)f Ft(and)h Fs(wait)f -Ft(builtins)g(do)h(not)h(accept)h Fq(jobsp)s(ec)j Ft(argu-)150 +3487 y(If)f(the)g Ft(-n)g Fu(option)h(is)f(supplied,)g +Ft(wait)f Fu(w)m(aits)i(for)f(an)m(y)h(job)f(to)h(terminate)g(and)f +(returns)f(its)630 3597 y(exit)37 b(status.)56 b(If)36 +b(neither)f Fr(jobsp)s(ec)41 b Fu(nor)35 b Fr(pid)j Fu(sp)s(eci\014es)d +(an)h(activ)m(e)i(c)m(hild)e(pro)s(cess)f(of)h(the)630 +3707 y(shell,)31 b(the)f(return)g(status)g(is)h(127.)150 +3868 y Ft(disown)870 4004 y(disown)46 b([-ar])g([-h])h([)p +Fj(jobspec)f Ft(...)o(])630 4140 y Fu(Without)33 b(options,)h(remo)m(v) +m(e)g(eac)m(h)f Fr(jobsp)s(ec)38 b Fu(from)32 b(the)h(table)g(of)g +(activ)m(e)h(jobs.)47 b(If)32 b(the)h Ft(-h)630 4249 +y Fu(option)j(is)f(giv)m(en,)i(the)f(job)f(is)g(not)g(remo)m(v)m(ed)h +(from)f(the)g(table,)j(but)c(is)i(mark)m(ed)f(so)g(that)630 +4359 y Ft(SIGHUP)e Fu(is)j(not)f(sen)m(t)h(to)g(the)f(job)g(if)g(the)g +(shell)h(receiv)m(es)h(a)e Ft(SIGHUP)p Fu(.)54 b(If)34 +b Fr(jobsp)s(ec)40 b Fu(is)c(not)630 4468 y(presen)m(t,)41 +b(and)d(neither)h(the)g Ft(-a)f Fu(nor)g(the)h Ft(-r)f +Fu(option)h(is)g(supplied,)g(the)g(curren)m(t)g(job)f(is)630 +4578 y(used.)g(If)25 b(no)h Fr(jobsp)s(ec)k Fu(is)c(supplied,)f(the)h +Ft(-a)f Fu(option)h(means)g(to)g(remo)m(v)m(e)h(or)e(mark)h(all)g +(jobs;)630 4688 y(the)31 b Ft(-r)e Fu(option)i(without)g(a)f +Fr(jobsp)s(ec)36 b Fu(argumen)m(t)30 b(restricts)h(op)s(eration)g(to)g +(running)e(jobs.)150 4849 y Ft(suspend)870 4985 y(suspend)46 +b([-f])630 5121 y Fu(Susp)s(end)31 b(the)i(execution)h(of)g(this)f +(shell)g(un)m(til)h(it)g(receiv)m(es)h(a)e Ft(SIGCONT)f +Fu(signal.)50 b(A)33 b(login)630 5230 y(shell)28 b(cannot)g(b)s(e)f +(susp)s(ended;)g(the)g Ft(-f)g Fu(option)i(can)f(b)s(e)f(used)g(to)h(o) +m(v)m(erride)h(this)e(and)g(force)630 5340 y(the)k(susp)s(ension.)p +eop end +%%Page: 100 106 +TeXDict begin 100 105 bop 150 -116 a Fu(Chapter)30 b(7:)41 +b(Job)30 b(Con)m(trol)2526 b(100)275 299 y(When)30 b(job)f(con)m(trol)j +(is)e(not)h(activ)m(e,)i(the)d Ft(kill)f Fu(and)h Ft(wait)f +Fu(builtins)g(do)h(not)h(accept)h Fr(jobsp)s(ec)j Fu(argu-)150 408 y(men)m(ts.)41 b(They)30 b(m)m(ust)g(b)s(e)g(supplied)f(pro)s(cess) -h Fl(id)p Ft(s.)150 641 y Fr(7.3)68 b(Job)45 b(Con)l(trol)h(V)-11 -b(ariables)150 825 y Fs(auto_resume)630 935 y Ft(This)31 +h Fm(id)p Fu(s.)150 641 y Fs(7.3)68 b(Job)45 b(Con)l(trol)h(V)-11 +b(ariables)150 825 y Ft(auto_resume)630 935 y Fu(This)31 b(v)-5 b(ariable)32 b(con)m(trols)g(ho)m(w)g(the)f(shell)h(in)m (teracts)h(with)e(the)h(user)e(and)h(job)g(con)m(trol.)45 b(If)630 1044 y(this)28 b(v)-5 b(ariable)30 b(exists)f(then)f(single)h @@ -14739,89 +15239,89 @@ b(If)630 1044 y(this)28 b(v)-5 b(ariable)30 b(exists)f(then)f(single)h 42 b(The)29 b(name)g(of)h(a)g(stopp)s(ed)e(job,)i(in)f(this)630 1483 y(con)m(text,)h(is)e(the)g(command)g(line)g(used)f(to)h(start)g (it.)41 b(If)27 b(this)h(v)-5 b(ariable)28 b(is)g(set)g(to)h(the)e(v)-5 -b(alue)630 1592 y(`)p Fs(exact)p Ft(',)33 b(the)g(string)g(supplied)f +b(alue)630 1592 y(`)p Ft(exact)p Fu(',)33 b(the)g(string)g(supplied)f (m)m(ust)h(matc)m(h)g(the)h(name)f(of)g(a)g(stopp)s(ed)f(job)h -(exactly;)j(if)630 1702 y(set)29 b(to)h(`)p Fs(substring)p -Ft(',)d(the)i(string)g(supplied)e(needs)i(to)g(matc)m(h)h(a)f +(exactly;)j(if)630 1702 y(set)29 b(to)h(`)p Ft(substring)p +Fu(',)d(the)i(string)g(supplied)e(needs)i(to)g(matc)m(h)h(a)f (substring)f(of)h(the)g(name)630 1812 y(of)38 b(a)f(stopp)s(ed)g(job.) -62 b(The)37 b(`)p Fs(substring)p Ft(')e(v)-5 b(alue)38 +62 b(The)37 b(`)p Ft(substring)p Fu(')e(v)-5 b(alue)38 b(pro)m(vides)f(functionalit)m(y)i(analogous)g(to)630 -1921 y(the)f(`)p Fs(\045?)p Ft(')f(job)h Fl(id)f Ft(\(see)i(Section)f -(7.1)h([Job)f(Con)m(trol)g(Basics],)j(page)d(98\).)64 +1921 y(the)f(`)p Ft(\045?)p Fu(')f(job)h Fm(id)f Fu(\(see)i(Section)f +(7.1)h([Job)f(Con)m(trol)g(Basics],)j(page)d(97\).)64 b(If)37 b(set)h(to)h(an)m(y)630 2031 y(other)32 b(v)-5 b(alue,)32 b(the)g(supplied)e(string)i(m)m(ust)f(b)s(e)g(a)h(pre\014x)f (of)h(a)g(stopp)s(ed)e(job's)i(name;)g(this)630 2140 y(pro)m(vides)e(functionalit)m(y)i(analogous)g(to)f(the)g(`)p -Fs(\045)p Ft(')f(job)g Fl(id)p Ft(.)p eop end -%%Page: 102 108 -TeXDict begin 102 107 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(102)150 299 y Fo(8)80 -b(Command)54 b(Line)f(Editing)150 640 y Ft(This)28 b(c)m(hapter)i -(describ)s(es)e(the)h(basic)g(features)h(of)f(the)g Fl(gnu)f -Ft(command)h(line)g(editing)h(in)m(terface.)42 b(Com-)150 +Ft(\045)p Fu(')f(job)g Fm(id)p Fu(.)p eop end +%%Page: 101 107 +TeXDict begin 101 106 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(101)150 299 y Fp(8)80 +b(Command)54 b(Line)f(Editing)150 640 y Fu(This)28 b(c)m(hapter)i +(describ)s(es)e(the)h(basic)g(features)h(of)f(the)g Fm(gnu)f +Fu(command)h(line)g(editing)h(in)m(terface.)42 b(Com-)150 749 y(mand)c(line)i(editing)f(is)g(pro)m(vided)g(b)m(y)g(the)g (Readline)h(library)-8 b(,)41 b(whic)m(h)e(is)g(used)f(b)m(y)h(sev)m (eral)h(di\013eren)m(t)150 859 y(programs,)34 b(including)e(Bash.)49 b(Command)32 b(line)i(editing)f(is)g(enabled)g(b)m(y)g(default)g(when)f -(using)h(an)g(in-)150 969 y(teractiv)m(e)c(shell,)f(unless)e(the)h(`)p -Fs(--noediting)p Ft(')d(option)k(is)e(supplied)g(at)h(shell)g(in)m(v)m -(o)s(cation.)42 b(Line)26 b(editing)150 1078 y(is)i(also)h(used)e(when) -h(using)f(the)h(`)p Fs(-e)p Ft(')g(option)h(to)g(the)f -Fs(read)f Ft(builtin)h(command)f(\(see)i(Section)g(4.2)h([Bash)150 -1188 y(Builtins],)36 b(page)f(48\).)52 b(By)35 b(default,)g(the)f(line) -h(editing)f(commands)g(are)h(similar)f(to)h(those)f(of)g(Emacs.)150 +(using)h(an)g(in-)150 969 y(teractiv)m(e)h(shell,)d(unless)g(the)g +Ft(--noediting)d Fu(option)k(is)f(supplied)e(at)j(shell)f(in)m(v)m(o)s +(cation.)45 b(Line)31 b(editing)150 1078 y(is)g(also)h(used)f(when)f +(using)h(the)g Ft(-e)g Fu(option)h(to)g(the)f Ft(read)f +Fu(builtin)h(command)g(\(see)h(Section)g(4.2)h([Bash)150 +1188 y(Builtins],)j(page)f(48\).)52 b(By)35 b(default,)g(the)f(line)h +(editing)f(commands)g(are)h(similar)f(to)h(those)f(of)g(Emacs.)150 1297 y(A)h(vi-st)m(yle)h(line)f(editing)g(in)m(terface)h(is)e(also)i(a) m(v)-5 b(ailable.)55 b(Line)34 b(editing)h(can)g(b)s(e)f(enabled)g(at)h -(an)m(y)g(time)150 1407 y(using)28 b(the)i(`)p Fs(-o)g(emacs)p -Ft(')d(or)i(`)p Fs(-o)h(vi)p Ft(')f(options)g(to)h(the)f -Fs(set)f Ft(builtin)h(command)g(\(see)h(Section)f(4.3.1)i([The)150 -1517 y(Set)g(Builtin],)g(page)g(59\),)h(or)e(disabled)g(using)g(the)h -(`)p Fs(+o)f(emacs)p Ft(')f(or)h(`)p Fs(+o)g(vi)p Ft(')g(options)h(to)g -Fs(set)p Ft(.)150 1802 y Fr(8.1)68 b(In)l(tro)t(duction)45 -b(to)g(Line)h(Editing)150 1962 y Ft(The)30 b(follo)m(wing)i(paragraphs) +(an)m(y)g(time)150 1407 y(using)h(the)g Ft(-o)30 b(emacs)35 +b Fu(or)h Ft(-o)30 b(vi)35 b Fu(options)i(to)g(the)f +Ft(set)f Fu(builtin)h(command)g(\(see)h(Section)g(4.3.1)h([The)150 +1517 y(Set)31 b(Builtin],)g(page)g(58\),)h(or)e(disabled)g(using)g(the) +h Ft(+o)e(emacs)g Fu(or)i Ft(+o)e(vi)h Fu(options)h(to)g +Ft(set)p Fu(.)150 1802 y Fs(8.1)68 b(In)l(tro)t(duction)45 +b(to)g(Line)h(Editing)150 1962 y Fu(The)30 b(follo)m(wing)i(paragraphs) d(describ)s(e)h(the)h(notation)g(used)f(to)h(represen)m(t)f(k)m -(eystrok)m(es.)275 2132 y(The)35 b(text)i Fi(C-k)f Ft(is)g(read)g(as)h +(eystrok)m(es.)275 2132 y(The)35 b(text)i Fj(C-k)f Fu(is)g(read)g(as)h (`Con)m(trol-K')g(and)f(describ)s(es)f(the)h(c)m(haracter)i(pro)s -(duced)d(when)g(the)h Fs(k)150 2242 y Ft(k)m(ey)31 b(is)g(pressed)e +(duced)d(when)g(the)h Ft(k)150 2242 y Fu(k)m(ey)31 b(is)g(pressed)e (while)h(the)h(Con)m(trol)g(k)m(ey)g(is)g(depressed.)275 -2412 y(The)g(text)i Fi(M-k)e Ft(is)h(read)f(as)i(`Meta-K')g(and)f +2412 y(The)g(text)i Fj(M-k)e Fu(is)h(read)f(as)i(`Meta-K')g(and)f (describ)s(es)f(the)h(c)m(haracter)h(pro)s(duced)e(when)f(the)i(Meta) 150 2521 y(k)m(ey)i(\(if)f(y)m(ou)h(ha)m(v)m(e)g(one\))g(is)f -(depressed,)g(and)f(the)h Fs(k)g Ft(k)m(ey)h(is)f(pressed.)48 -b(The)32 b(Meta)j(k)m(ey)e(is)h(lab)s(eled)f Fs(ALT)150 -2631 y Ft(on)c(man)m(y)h(k)m(eyb)s(oards.)40 b(On)29 +(depressed,)g(and)f(the)h Ft(k)g Fu(k)m(ey)h(is)f(pressed.)48 +b(The)32 b(Meta)j(k)m(ey)e(is)h(lab)s(eled)f Ft(ALT)150 +2631 y Fu(on)c(man)m(y)h(k)m(eyb)s(oards.)40 b(On)29 b(k)m(eyb)s(oards)g(with)h(t)m(w)m(o)h(k)m(eys)f(lab)s(eled)g -Fs(ALT)e Ft(\(usually)i(to)g(either)g(side)g(of)g(the)150 -2740 y(space)h(bar\),)f(the)g Fs(ALT)f Ft(on)h(the)g(left)h(side)f(is)g +Ft(ALT)e Fu(\(usually)i(to)g(either)g(side)g(of)g(the)150 +2740 y(space)h(bar\),)f(the)g Ft(ALT)f Fu(on)h(the)g(left)h(side)f(is)g (generally)h(set)f(to)h(w)m(ork)f(as)g(a)h(Meta)g(k)m(ey)-8 -b(.)42 b(The)29 b Fs(ALT)g Ft(k)m(ey)i(on)150 2850 y(the)c(righ)m(t)h +b(.)42 b(The)29 b Ft(ALT)g Fu(k)m(ey)i(on)150 2850 y(the)c(righ)m(t)h (ma)m(y)g(also)g(b)s(e)f(con\014gured)f(to)i(w)m(ork)f(as)h(a)f(Meta)i (k)m(ey)f(or)f(ma)m(y)h(b)s(e)e(con\014gured)h(as)g(some)h(other)150 2960 y(mo)s(di\014er,)i(suc)m(h)g(as)g(a)h(Comp)s(ose)f(k)m(ey)h(for)f (t)m(yping)h(accen)m(ted)h(c)m(haracters.)275 3130 y(If)23 -b(y)m(ou)i(do)f(not)h(ha)m(v)m(e)h(a)f(Meta)g(or)g Fs(ALT)e -Ft(k)m(ey)-8 b(,)27 b(or)e(another)f(k)m(ey)i(w)m(orking)e(as)h(a)g +b(y)m(ou)i(do)f(not)h(ha)m(v)m(e)h(a)f(Meta)g(or)g Ft(ALT)e +Fu(k)m(ey)-8 b(,)27 b(or)e(another)f(k)m(ey)i(w)m(orking)e(as)h(a)g (Meta)h(k)m(ey)-8 b(,)27 b(the)d(iden)m(tical)150 3239 y(k)m(eystrok)m(e)30 b(can)f(b)s(e)f(generated)h(b)m(y)g(t)m(yping)g -Fs(ESC)e Fk(\014rst)p Ft(,)j(and)e(then)g(t)m(yping)h -Fs(k)p Ft(.)40 b(Either)28 b(pro)s(cess)g(is)g(kno)m(wn)150 -3349 y(as)j Fq(metafying)39 b Ft(the)30 b Fs(k)g Ft(k)m(ey)-8 -b(.)275 3519 y(The)39 b(text)j Fi(M-C-k)d Ft(is)h(read)g(as)h +Ft(ESC)e Fl(\014rst)p Fu(,)j(and)e(then)g(t)m(yping)h +Ft(k)p Fu(.)40 b(Either)28 b(pro)s(cess)g(is)g(kno)m(wn)150 +3349 y(as)j Fr(metafying)39 b Fu(the)30 b Ft(k)g Fu(k)m(ey)-8 +b(.)275 3519 y(The)39 b(text)j Fj(M-C-k)d Fu(is)h(read)g(as)h (`Meta-Con)m(trol-k')j(and)39 b(describ)s(es)h(the)g(c)m(haracter)i -(pro)s(duced)d(b)m(y)150 3629 y Fq(metafying)g Fi(C-k)p -Ft(.)275 3799 y(In)c(addition,)j(sev)m(eral)f(k)m(eys)g(ha)m(v)m(e)g +(pro)s(duced)d(b)m(y)150 3629 y Fr(metafying)g Fj(C-k)p +Fu(.)275 3799 y(In)c(addition,)j(sev)m(eral)f(k)m(eys)g(ha)m(v)m(e)g (their)f(o)m(wn)g(names.)58 b(Sp)s(eci\014cally)-8 b(,)38 -b Fs(DEL)p Ft(,)f Fs(ESC)p Ft(,)g Fs(LFD)p Ft(,)g Fs(SPC)p -Ft(,)g Fs(RET)p Ft(,)150 3908 y(and)d Fs(TAB)f Ft(all)j(stand)e(for)g +b Ft(DEL)p Fu(,)f Ft(ESC)p Fu(,)g Ft(LFD)p Fu(,)g Ft(SPC)p +Fu(,)g Ft(RET)p Fu(,)150 3908 y(and)d Ft(TAB)f Fu(all)j(stand)e(for)g (themselv)m(es)i(when)d(seen)i(in)f(this)g(text,)j(or)d(in)h(an)f(init) h(\014le)f(\(see)i(Section)f(8.3)150 4018 y([Readline)f(Init)g(File],)i -(page)e(105\).)52 b(If)33 b(y)m(our)g(k)m(eyb)s(oard)h(lac)m(ks)g(a)g -Fs(LFD)f Ft(k)m(ey)-8 b(,)36 b(t)m(yping)e Fs(C-j)e Ft(will)i(pro)s +(page)e(104\).)52 b(If)33 b(y)m(our)g(k)m(eyb)s(oard)h(lac)m(ks)g(a)g +Ft(LFD)f Fu(k)m(ey)-8 b(,)36 b(t)m(yping)e Ft(C-j)e Fu(will)i(pro)s (duce)150 4128 y(the)d(desired)e(c)m(haracter.)43 b(The)30 -b Fs(RET)f Ft(k)m(ey)i(ma)m(y)g(b)s(e)f(lab)s(eled)h -Fs(Return)d Ft(or)j Fs(Enter)d Ft(on)j(some)g(k)m(eyb)s(oards.)150 -4413 y Fr(8.2)68 b(Readline)47 b(In)l(teraction)150 4573 -y Ft(Often)32 b(during)g(an)g(in)m(teractiv)m(e)j(session)e(y)m(ou)g(t) +b Ft(RET)f Fu(k)m(ey)i(ma)m(y)g(b)s(e)f(lab)s(eled)h +Ft(Return)d Fu(or)j Ft(Enter)d Fu(on)j(some)g(k)m(eyb)s(oards.)150 +4413 y Fs(8.2)68 b(Readline)47 b(In)l(teraction)150 4573 +y Fu(Often)32 b(during)g(an)g(in)m(teractiv)m(e)j(session)e(y)m(ou)g(t) m(yp)s(e)g(in)f(a)h(long)g(line)g(of)f(text,)j(only)d(to)i(notice)g (that)f(the)150 4682 y(\014rst)f(w)m(ord)g(on)g(the)g(line)h(is)g (missp)s(elled.)46 b(The)32 b(Readline)h(library)f(giv)m(es)h(y)m(ou)g @@ -14834,15 +15334,15 @@ b(of)f(the)h(line.)40 b(Using)28 b(these)h(editing)g(commands,)f(y)m (needs)g(correction,)j(and)d(delete)h(or)f(insert)h(the)f(text)h(of)g (the)f(corrections.)54 b(Then,)150 5121 y(when)24 b(y)m(ou)h(are)g (satis\014ed)g(with)g(the)g(line,)i(y)m(ou)e(simply)f(press)g -Fs(RET)p Ft(.)39 b(Y)-8 b(ou)25 b(do)g(not)g(ha)m(v)m(e)h(to)g(b)s(e)e +Ft(RET)p Fu(.)39 b(Y)-8 b(ou)25 b(do)g(not)g(ha)m(v)m(e)h(to)g(b)s(e)e (at)h(the)h(end)150 5230 y(of)33 b(the)h(line)g(to)g(press)e -Fs(RET)p Ft(;)i(the)g(en)m(tire)g(line)f(is)h(accepted)g(regardless)g +Ft(RET)p Fu(;)i(the)g(en)m(tire)g(line)f(is)h(accepted)g(regardless)g (of)f(the)h(lo)s(cation)h(of)e(the)h(cursor)150 5340 y(within)c(the)g(line.)p eop end -%%Page: 103 109 -TeXDict begin 103 108 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(103)150 299 y Fj(8.2.1)63 -b(Readline)40 b(Bare)h(Essen)m(tials)150 446 y Ft(In)31 +%%Page: 102 108 +TeXDict begin 102 107 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(102)150 299 y Fk(8.2.1)63 +b(Readline)40 b(Bare)h(Essen)m(tials)150 446 y Fu(In)31 b(order)h(to)h(en)m(ter)g(c)m(haracters)g(in)m(to)g(the)g(line,)g (simply)e(t)m(yp)s(e)i(them.)46 b(The)31 b(t)m(yp)s(ed)h(c)m(haracter)i (app)s(ears)150 555 y(where)e(the)h(cursor)e(w)m(as,)j(and)e(then)g @@ -14854,10 +15354,10 @@ y(Sometimes)i(y)m(ou)g(ma)m(y)h(mist)m(yp)s(e)e(a)i(c)m(haracter,)g (and)e(not)i(notice)g(the)f(error)f(un)m(til)h(y)m(ou)g(ha)m(v)m(e)h(t) m(yp)s(ed)150 916 y(sev)m(eral)e(other)f(c)m(haracters.)42 b(In)28 b(that)i(case,)g(y)m(ou)f(can)g(t)m(yp)s(e)h -Fi(C-b)d Ft(to)j(mo)m(v)m(e)g(the)f(cursor)g(to)g(the)g(left,)i(and)150 +Fj(C-b)d Fu(to)j(mo)m(v)m(e)g(the)f(cursor)g(to)g(the)g(left,)i(and)150 1026 y(then)f(correct)i(y)m(our)e(mistak)m(e.)42 b(Afterw)m(ards,)31 b(y)m(ou)f(can)h(mo)m(v)m(e)h(the)e(cursor)g(to)h(the)g(righ)m(t)g -(with)f Fi(C-f)p Ft(.)275 1167 y(When)i(y)m(ou)h(add)f(text)h(in)f(the) +(with)f Fj(C-f)p Fu(.)275 1167 y(When)i(y)m(ou)h(add)f(text)h(in)f(the) h(middle)f(of)h(a)g(line,)h(y)m(ou)e(will)h(notice)h(that)f(c)m (haracters)h(to)g(the)e(righ)m(t)150 1277 y(of)d(the)g(cursor)f(are)h (`pushed)e(o)m(v)m(er')j(to)g(mak)m(e)f(ro)s(om)g(for)f(the)h(text)h @@ -14868,53 +15368,53 @@ h(middle)f(of)h(a)g(line,)h(y)m(ou)e(will)h(notice)h(that)f(c)m (created)f(b)m(y)g(the)g(remo)m(v)-5 b(al)24 b(of)f(the)g(text.)39 b(A)23 b(list)g(of)g(the)g(bare)f(essen)m(tials)150 1605 y(for)30 b(editing)h(the)g(text)g(of)g(an)f(input)f(line)i(follo)m(ws.) -150 1775 y Fi(C-b)336 b Ft(Mo)m(v)m(e)32 b(bac)m(k)g(one)e(c)m -(haracter.)150 1941 y Fi(C-f)336 b Ft(Mo)m(v)m(e)32 b(forw)m(ard)e(one) -h(c)m(haracter.)150 2108 y Fs(DEL)e Ft(or)i Fs(Backspace)630 -2217 y Ft(Delete)i(the)d(c)m(haracter)i(to)f(the)g(left)g(of)f(the)h -(cursor.)150 2384 y Fi(C-d)336 b Ft(Delete)33 b(the)d(c)m(haracter)i +150 1775 y Fj(C-b)336 b Fu(Mo)m(v)m(e)32 b(bac)m(k)g(one)e(c)m +(haracter.)150 1941 y Fj(C-f)336 b Fu(Mo)m(v)m(e)32 b(forw)m(ard)e(one) +h(c)m(haracter.)150 2108 y Ft(DEL)e Fu(or)i Ft(Backspace)630 +2217 y Fu(Delete)i(the)d(c)m(haracter)i(to)f(the)g(left)g(of)f(the)h +(cursor.)150 2384 y Fj(C-d)336 b Fu(Delete)33 b(the)d(c)m(haracter)i (underneath)d(the)i(cursor.)150 2550 y(Prin)m(ting)g(c)m(haracters)630 2660 y(Insert)f(the)g(c)m(haracter)i(in)m(to)g(the)e(line)h(at)g(the)g -(cursor.)150 2826 y Fi(C-_)e Ft(or)i Fi(C-x)e(C-u)630 -2936 y Ft(Undo)k(the)h(last)g(editing)g(command.)50 b(Y)-8 +(cursor.)150 2826 y Fj(C-_)e Fu(or)i Fj(C-x)e(C-u)630 +2936 y Fu(Undo)k(the)h(last)g(editing)g(command.)50 b(Y)-8 b(ou)34 b(can)f(undo)g(all)h(the)f(w)m(a)m(y)i(bac)m(k)f(to)g(an)g (empt)m(y)630 3045 y(line.)150 3215 y(\(Dep)s(ending)29 -b(on)h(y)m(our)f(con\014guration,)i(the)e Fs(Backspace)e -Ft(k)m(ey)k(b)s(e)d(set)j(to)f(delete)h(the)e(c)m(haracter)i(to)g(the) +b(on)h(y)m(our)f(con\014guration,)i(the)e Ft(Backspace)e +Fu(k)m(ey)k(b)s(e)d(set)j(to)f(delete)h(the)e(c)m(haracter)i(to)g(the) 150 3324 y(left)37 b(of)f(the)h(cursor)e(and)h(the)g -Fs(DEL)g Ft(k)m(ey)h(set)f(to)h(delete)h(the)e(c)m(haracter)i -(underneath)d(the)h(cursor,)i(lik)m(e)150 3434 y Fi(C-d)p -Ft(,)30 b(rather)g(than)g(the)h(c)m(haracter)h(to)f(the)f(left)h(of)g -(the)f(cursor.\))150 3640 y Fj(8.2.2)63 b(Readline)40 -b(Mo)m(v)m(emen)m(t)h(Commands)150 3787 y Ft(The)27 b(ab)s(o)m(v)m(e)i +Ft(DEL)g Fu(k)m(ey)h(set)f(to)h(delete)h(the)e(c)m(haracter)i +(underneath)d(the)h(cursor,)i(lik)m(e)150 3434 y Fj(C-d)p +Fu(,)30 b(rather)g(than)g(the)h(c)m(haracter)h(to)f(the)f(left)h(of)g +(the)f(cursor.\))150 3640 y Fk(8.2.2)63 b(Readline)40 +b(Mo)m(v)m(emen)m(t)h(Commands)150 3787 y Fu(The)27 b(ab)s(o)m(v)m(e)i (table)g(describ)s(es)e(the)g(most)i(basic)f(k)m(eystrok)m(es)h(that)f (y)m(ou)g(need)g(in)f(order)g(to)i(do)e(editing)i(of)150 3897 y(the)k(input)f(line.)49 b(F)-8 b(or)34 b(y)m(our)f(con)m(v)m (enience,)j(man)m(y)d(other)g(commands)f(ha)m(v)m(e)j(b)s(een)d(added)g -(in)h(addition)150 4006 y(to)j Fi(C-b)p Ft(,)f Fi(C-f)p -Ft(,)g Fi(C-d)p Ft(,)h(and)e Fs(DEL)p Ft(.)54 b(Here)35 +(in)h(addition)150 4006 y(to)j Fj(C-b)p Fu(,)f Fj(C-f)p +Fu(,)g Fj(C-d)p Fu(,)h(and)e Ft(DEL)p Fu(.)54 b(Here)35 b(are)g(some)h(commands)e(for)h(mo)m(ving)h(more)f(rapidly)f(ab)s(out)h -(the)150 4116 y(line.)150 4286 y Fi(C-a)336 b Ft(Mo)m(v)m(e)32 -b(to)g(the)e(start)h(of)g(the)f(line.)150 4452 y Fi(C-e)336 -b Ft(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h(line.)150 -4618 y Fi(M-f)336 b Ft(Mo)m(v)m(e)32 b(forw)m(ard)e(a)h(w)m(ord,)f +(the)150 4116 y(line.)150 4286 y Fj(C-a)336 b Fu(Mo)m(v)m(e)32 +b(to)g(the)e(start)h(of)g(the)f(line.)150 4452 y Fj(C-e)336 +b Fu(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h(line.)150 +4618 y Fj(M-f)336 b Fu(Mo)m(v)m(e)32 b(forw)m(ard)e(a)h(w)m(ord,)f (where)g(a)h(w)m(ord)f(is)g(comp)s(osed)g(of)h(letters)h(and)d(digits.) -150 4785 y Fi(M-b)336 b Ft(Mo)m(v)m(e)32 b(bac)m(kw)m(ard)f(a)g(w)m -(ord.)150 4951 y Fi(C-l)336 b Ft(Clear)31 b(the)f(screen,)h(reprin)m +150 4785 y Fj(M-b)336 b Fu(Mo)m(v)m(e)32 b(bac)m(kw)m(ard)f(a)g(w)m +(ord.)150 4951 y Fj(C-l)336 b Fu(Clear)31 b(the)f(screen,)h(reprin)m (ting)f(the)h(curren)m(t)f(line)h(at)g(the)f(top.)275 -5121 y(Notice)c(ho)m(w)f Fi(C-f)e Ft(mo)m(v)m(es)j(forw)m(ard)e(a)h(c)m -(haracter,)j(while)d Fi(M-f)e Ft(mo)m(v)m(es)j(forw)m(ard)e(a)h(w)m +5121 y(Notice)c(ho)m(w)f Fj(C-f)e Fu(mo)m(v)m(es)j(forw)m(ard)e(a)h(c)m +(haracter,)j(while)d Fj(M-f)e Fu(mo)m(v)m(es)j(forw)m(ard)e(a)h(w)m (ord.)39 b(It)24 b(is)h(a)g(lo)s(ose)150 5230 y(con)m(v)m(en)m(tion)32 b(that)f(con)m(trol)g(k)m(eystrok)m(es)h(op)s(erate)e(on)g(c)m (haracters)h(while)f(meta)h(k)m(eystrok)m(es)h(op)s(erate)e(on)150 5340 y(w)m(ords.)p eop end -%%Page: 104 110 -TeXDict begin 104 109 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(104)150 299 y Fj(8.2.3)63 -b(Readline)40 b(Killing)i(Commands)150 446 y Fq(Killing)35 -b Ft(text)28 b(means)e(to)h(delete)h(the)f(text)g(from)g(the)f(line,)i +%%Page: 103 109 +TeXDict begin 103 108 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(103)150 299 y Fk(8.2.3)63 +b(Readline)40 b(Killing)i(Commands)150 446 y Fr(Killing)35 +b Fu(text)28 b(means)e(to)h(delete)h(the)f(text)g(from)g(the)f(line,)i (but)e(to)h(sa)m(v)m(e)h(it)g(a)m(w)m(a)m(y)g(for)e(later)i(use,)f -(usually)150 555 y(b)m(y)g Fq(y)m(anking)35 b Ft(\(re-inserting\))28 +(usually)150 555 y(b)m(y)g Fr(y)m(anking)35 b Fu(\(re-inserting\))28 b(it)g(bac)m(k)f(in)m(to)h(the)f(line.)40 b(\(`Cut')27 b(and)g(`paste')h(are)f(more)g(recen)m(t)h(jargon)f(for)150 665 y(`kill')32 b(and)d(`y)m(ank'.\))275 801 y(If)g(the)i(description)f @@ -14923,7 +15423,7 @@ b(and)g(`paste')h(are)f(more)g(recen)m(t)h(jargon)f(for)150 (text)g(bac)m(k)g(in)f(a)h(di\013eren)m(t)g(\(or)g(the)f(same\))h (place)h(later.)275 1047 y(When)23 b(y)m(ou)g(use)g(a)h(kill)g (command,)g(the)g(text)g(is)f(sa)m(v)m(ed)i(in)e(a)g -Fq(kill-ring)p Ft(.)39 b(An)m(y)24 b(n)m(um)m(b)s(er)e(of)h(consecutiv) +Fr(kill-ring)p Fu(.)39 b(An)m(y)24 b(n)m(um)m(b)s(er)e(of)h(consecutiv) m(e)150 1157 y(kills)31 b(sa)m(v)m(e)i(all)f(of)f(the)g(killed)h(text)g (together,)g(so)g(that)f(when)f(y)m(ou)h(y)m(ank)h(it)f(bac)m(k,)h(y)m (ou)g(get)g(it)f(all.)43 b(The)150 1267 y(kill)33 b(ring)f(is)g(not)h @@ -14931,66 +15431,66 @@ m(e)150 1157 y(kills)31 b(sa)m(v)m(e)i(all)f(of)f(the)g(killed)h(text)g (previously)g(t)m(yp)s(ed)h(line)f(is)h(a)m(v)-5 b(ailable)150 1376 y(to)31 b(b)s(e)f(y)m(ank)m(ed)h(bac)m(k)g(later,)h(when)d(y)m(ou) i(are)g(t)m(yping)f(another)h(line.)275 1513 y(Here)f(is)h(the)f(list)h -(of)g(commands)f(for)g(killing)h(text.)150 1675 y Fi(C-k)336 -b Ft(Kill)31 b(the)f(text)i(from)e(the)g(curren)m(t)g(cursor)g(p)s +(of)g(commands)f(for)g(killing)h(text.)150 1675 y Fj(C-k)336 +b Fu(Kill)31 b(the)f(text)i(from)e(the)g(curren)m(t)g(cursor)g(p)s (osition)h(to)g(the)f(end)g(of)g(the)h(line.)150 1836 -y Fi(M-d)336 b Ft(Kill)27 b(from)f(the)g(cursor)g(to)h(the)f(end)g(of)h +y Fj(M-d)336 b Fu(Kill)27 b(from)f(the)g(cursor)g(to)h(the)f(end)g(of)h (the)f(curren)m(t)g(w)m(ord,)h(or,)h(if)e(b)s(et)m(w)m(een)h(w)m(ords,) g(to)g(the)630 1946 y(end)j(of)g(the)h(next)f(w)m(ord.)41 b(W)-8 b(ord)30 b(b)s(oundaries)f(are)i(the)g(same)f(as)h(those)g(used) -f(b)m(y)g Fi(M-f)p Ft(.)150 2107 y Fi(M-DEL)240 b Ft(Kill)31 +f(b)m(y)g Fj(M-f)p Fu(.)150 2107 y Fj(M-DEL)240 b Fu(Kill)31 b(from)f(the)h(cursor)f(the)g(start)h(of)g(the)g(curren)m(t)f(w)m(ord,) h(or,)f(if)h(b)s(et)m(w)m(een)g(w)m(ords,)f(to)i(the)630 2217 y(start)39 b(of)f(the)h(previous)f(w)m(ord.)64 b(W)-8 b(ord)39 b(b)s(oundaries)e(are)i(the)f(same)h(as)g(those)f(used)g(b)m -(y)630 2326 y Fi(M-b)p Ft(.)150 2487 y Fi(C-w)336 b Ft(Kill)35 +(y)630 2326 y Fj(M-b)p Fu(.)150 2487 y Fj(C-w)336 b Fu(Kill)35 b(from)g(the)g(cursor)f(to)i(the)f(previous)g(whitespace.)55 -b(This)34 b(is)h(di\013eren)m(t)h(than)e Fi(M-DEL)630 -2597 y Ft(b)s(ecause)c(the)h(w)m(ord)f(b)s(oundaries)f(di\013er.)275 -2759 y(Here)42 b(is)f(ho)m(w)h(to)g Fq(y)m(ank)47 b Ft(the)42 +b(This)34 b(is)h(di\013eren)m(t)h(than)e Fj(M-DEL)630 +2597 y Fu(b)s(ecause)c(the)h(w)m(ord)f(b)s(oundaries)f(di\013er.)275 +2759 y(Here)42 b(is)f(ho)m(w)h(to)g Fr(y)m(ank)47 b Fu(the)42 b(text)g(bac)m(k)h(in)m(to)f(the)g(line.)74 b(Y)-8 b(anking)43 b(means)e(to)h(cop)m(y)h(the)e(most-)150 2869 y(recen)m(tly-killed)33 -b(text)e(from)f(the)g(kill)i(bu\013er.)150 3031 y Fi(C-y)336 -b Ft(Y)-8 b(ank)31 b(the)f(most)h(recen)m(tly)h(killed)f(text)g(bac)m +b(text)e(from)f(the)g(kill)i(bu\013er.)150 3031 y Fj(C-y)336 +b Fu(Y)-8 b(ank)31 b(the)f(most)h(recen)m(tly)h(killed)f(text)g(bac)m (k)g(in)m(to)h(the)e(bu\013er)g(at)h(the)f(cursor.)150 -3192 y Fi(M-y)336 b Ft(Rotate)36 b(the)f(kill-ring,)i(and)d(y)m(ank)h +3192 y Fj(M-y)336 b Fu(Rotate)36 b(the)f(kill-ring,)i(and)d(y)m(ank)h (the)f(new)g(top.)54 b(Y)-8 b(ou)35 b(can)g(only)f(do)h(this)f(if)h -(the)g(prior)630 3302 y(command)30 b(is)h Fi(C-y)e Ft(or)h -Fi(M-y)p Ft(.)150 3503 y Fj(8.2.4)63 b(Readline)40 b(Argumen)m(ts)150 -3650 y Ft(Y)-8 b(ou)40 b(can)f(pass)g(n)m(umeric)f(argumen)m(ts)i(to)f +(the)g(prior)630 3302 y(command)30 b(is)h Fj(C-y)e Fu(or)h +Fj(M-y)p Fu(.)150 3503 y Fk(8.2.4)63 b(Readline)40 b(Argumen)m(ts)150 +3650 y Fu(Y)-8 b(ou)40 b(can)f(pass)g(n)m(umeric)f(argumen)m(ts)i(to)f (Readline)h(commands.)67 b(Sometimes)39 b(the)g(argumen)m(t)h(acts)150 3760 y(as)g(a)h(rep)s(eat)f(coun)m(t,)j(other)e(times)f(it)h(is)f(the)g -Fk(sign)47 b Ft(of)41 b(the)f(argumen)m(t)g(that)h(is)f(signi\014can)m +Fl(sign)47 b Fu(of)41 b(the)f(argumen)m(t)g(that)h(is)f(signi\014can)m (t.)71 b(If)40 b(y)m(ou)150 3869 y(pass)33 b(a)h(negativ)m(e)i(argumen) m(t)e(to)g(a)g(command)f(whic)m(h)g(normally)h(acts)g(in)f(a)h(forw)m (ard)f(direction,)i(that)150 3979 y(command)g(will)h(act)g(in)f(a)h (bac)m(kw)m(ard)f(direction.)57 b(F)-8 b(or)36 b(example,)h(to)f(kill)g (text)g(bac)m(k)g(to)g(the)g(start)g(of)150 4088 y(the)31 -b(line,)g(y)m(ou)f(migh)m(t)h(t)m(yp)s(e)g(`)p Fs(M--)f(C-k)p -Ft('.)275 4225 y(The)d(general)i(w)m(a)m(y)h(to)e(pass)g(n)m(umeric)g +b(line,)g(y)m(ou)f(migh)m(t)h(t)m(yp)s(e)g(`)p Ft(M--)f(C-k)p +Fu('.)275 4225 y(The)d(general)i(w)m(a)m(y)h(to)e(pass)g(n)m(umeric)g (argumen)m(ts)h(to)g(a)f(command)g(is)g(to)h(t)m(yp)s(e)f(meta)i (digits)e(b)s(efore)150 4334 y(the)j(command.)42 b(If)30 b(the)h(\014rst)f(`digit')i(t)m(yp)s(ed)f(is)g(a)g(min)m(us)f(sign)h -(\(`)p Fs(-)p Ft('\),)h(then)f(the)g(sign)f(of)h(the)g(argumen)m(t)150 +(\(`)p Ft(-)p Fu('\),)h(then)f(the)g(sign)f(of)h(the)g(argumen)m(t)150 4444 y(will)39 b(b)s(e)e(negativ)m(e.)66 b(Once)38 b(y)m(ou)h(ha)m(v)m (e)g(t)m(yp)s(ed)f(one)h(meta)g(digit)g(to)f(get)i(the)e(argumen)m(t)h (started,)i(y)m(ou)150 4554 y(can)29 b(t)m(yp)s(e)g(the)g(remainder)f (of)h(the)g(digits,)h(and)f(then)f(the)h(command.)40 -b(F)-8 b(or)30 b(example,)g(to)f(giv)m(e)i(the)e Fi(C-d)150 -4663 y Ft(command)37 b(an)g(argumen)m(t)h(of)g(10,)i(y)m(ou)e(could)f -(t)m(yp)s(e)h(`)p Fs(M-1)29 b(0)h(C-d)p Ft(',)39 b(whic)m(h)e(will)h +b(F)-8 b(or)30 b(example,)g(to)f(giv)m(e)i(the)e Fj(C-d)150 +4663 y Fu(command)37 b(an)g(argumen)m(t)h(of)g(10,)i(y)m(ou)e(could)f +(t)m(yp)s(e)h(`)p Ft(M-1)29 b(0)h(C-d)p Fu(',)39 b(whic)m(h)e(will)h (delete)h(the)e(next)h(ten)150 4773 y(c)m(haracters)32 -b(on)e(the)h(input)e(line.)150 4974 y Fj(8.2.5)63 b(Searc)m(hing)40 -b(for)i(Commands)g(in)f(the)g(History)150 5121 y Ft(Readline)35 +b(on)e(the)h(input)e(line.)150 4974 y Fk(8.2.5)63 b(Searc)m(hing)40 +b(for)i(Commands)g(in)f(the)g(History)150 5121 y Fu(Readline)35 b(pro)m(vides)f(commands)g(for)g(searc)m(hing)h(through)e(the)i (command)f(history)g(\(see)h(Section)g(9.1)150 5230 y([Bash)i(History)h -(F)-8 b(acilities],)42 b(page)37 b(134\))i(for)d(lines)h(con)m(taining) +(F)-8 b(acilities],)42 b(page)37 b(133\))i(for)d(lines)h(con)m(taining) i(a)e(sp)s(eci\014ed)f(string.)60 b(There)36 b(are)i(t)m(w)m(o)150 -5340 y(searc)m(h)31 b(mo)s(des:)40 b Fq(incremen)m(tal)35 -b Ft(and)30 b Fq(non-incremen)m(tal)p Ft(.)p eop end -%%Page: 105 111 -TeXDict begin 105 110 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(105)275 299 y(Incremen)m(tal)26 +5340 y(searc)m(h)31 b(mo)s(des:)40 b Fr(incremen)m(tal)35 +b Fu(and)30 b Fr(non-incremen)m(tal)p Fu(.)p eop end +%%Page: 104 110 +TeXDict begin 104 109 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(104)275 299 y(Incremen)m(tal)26 b(searc)m(hes)h(b)s(egin)e(b)s(efore)g(the)h(user)f(has)h(\014nished)e (t)m(yping)i(the)g(searc)m(h)g(string.)39 b(As)26 b(eac)m(h)150 408 y(c)m(haracter)37 b(of)e(the)h(searc)m(h)g(string)f(is)h(t)m(yp)s @@ -15000,37 +15500,37 @@ b(searc)m(hes)h(b)s(egin)e(b)s(efore)g(the)h(user)f(has)h(\014nished)e (man)m(y)g(c)m(haracters)i(as)150 628 y(needed)i(to)i(\014nd)d(the)i (desired)f(history)h(en)m(try)-8 b(.)41 b(T)-8 b(o)29 b(searc)m(h)h(bac)m(kw)m(ard)f(in)f(the)h(history)g(for)f(a)i -(particular)150 737 y(string,)g(t)m(yp)s(e)f Fi(C-r)p -Ft(.)40 b(T)m(yping)29 b Fi(C-s)g Ft(searc)m(hes)h(forw)m(ard)f +(particular)150 737 y(string,)g(t)m(yp)s(e)f Fj(C-r)p +Fu(.)40 b(T)m(yping)29 b Fj(C-s)g Fu(searc)m(hes)h(forw)m(ard)f (through)g(the)g(history)-8 b(.)41 b(The)29 b(c)m(haracters)i(presen)m (t)150 847 y(in)38 b(the)g(v)-5 b(alue)38 b(of)g(the)g -Fs(isearch-terminators)33 b Ft(v)-5 b(ariable)39 b(are)f(used)f(to)i +Ft(isearch-terminators)33 b Fu(v)-5 b(ariable)39 b(are)f(used)f(to)i (terminate)g(an)f(incremen)m(tal)150 956 y(searc)m(h.)71 b(If)40 b(that)h(v)-5 b(ariable)41 b(has)f(not)h(b)s(een)e(assigned)i -(a)f(v)-5 b(alue,)44 b(the)c Fs(ESC)g Ft(and)f Fi(C-J)h -Ft(c)m(haracters)i(will)150 1066 y(terminate)h(an)g(incremen)m(tal)g -(searc)m(h.)78 b Fi(C-g)41 b Ft(will)i(ab)s(ort)f(an)g(incremen)m(tal)i +(a)f(v)-5 b(alue,)44 b(the)c Ft(ESC)g Fu(and)f Fj(C-J)h +Fu(c)m(haracters)i(will)150 1066 y(terminate)h(an)g(incremen)m(tal)g +(searc)m(h.)78 b Fj(C-g)41 b Fu(will)i(ab)s(ort)f(an)g(incremen)m(tal)i (searc)m(h)f(and)f(restore)h(the)150 1176 y(original)30 b(line.)41 b(When)28 b(the)h(searc)m(h)h(is)f(terminated,)h(the)f (history)g(en)m(try)g(con)m(taining)h(the)f(searc)m(h)h(string)150 1285 y(b)s(ecomes)h(the)f(curren)m(t)g(line.)275 1428 y(T)-8 b(o)31 b(\014nd)e(other)j(matc)m(hing)g(en)m(tries)g(in)e(the)h -(history)g(list,)h(t)m(yp)s(e)g Fi(C-r)e Ft(or)h Fi(C-s)f -Ft(as)h(appropriate.)43 b(This)150 1537 y(will)26 b(searc)m(h)h(bac)m +(history)g(list,)h(t)m(yp)s(e)g Fj(C-r)e Fu(or)h Fj(C-s)f +Fu(as)h(appropriate.)43 b(This)150 1537 y(will)26 b(searc)m(h)h(bac)m (kw)m(ard)g(or)f(forw)m(ard)g(in)f(the)i(history)f(for)g(the)g(next)g (en)m(try)h(matc)m(hing)g(the)f(searc)m(h)h(string)150 1647 y(t)m(yp)s(ed)37 b(so)h(far.)63 b(An)m(y)38 b(other)f(k)m(ey)i (sequence)f(b)s(ound)e(to)i(a)g(Readline)h(command)e(will)h(terminate)h (the)150 1757 y(searc)m(h)26 b(and)f(execute)i(that)f(command.)39 -b(F)-8 b(or)26 b(instance,)h(a)f Fs(RET)f Ft(will)g(terminate)i(the)f +b(F)-8 b(or)26 b(instance,)h(a)f Ft(RET)f Fu(will)g(terminate)i(the)f (searc)m(h)g(and)e(accept)150 1866 y(the)30 b(line,)g(thereb)m(y)f (executing)i(the)e(command)g(from)g(the)h(history)f(list.)41 b(A)29 b(mo)m(v)m(emen)m(t)j(command)d(will)150 1976 y(terminate)i(the)g(searc)m(h,)g(mak)m(e)h(the)e(last)h(line)g(found)e (the)i(curren)m(t)f(line,)h(and)f(b)s(egin)g(editing.)275 2119 y(Readline)35 b(remem)m(b)s(ers)f(the)h(last)h(incremen)m(tal)g -(searc)m(h)f(string.)54 b(If)34 b(t)m(w)m(o)j Fi(C-r)p -Ft(s)c(are)i(t)m(yp)s(ed)g(without)150 2228 y(an)m(y)i(in)m(terv)m +(searc)m(h)f(string.)54 b(If)34 b(t)m(w)m(o)j Fj(C-r)p +Fu(s)c(are)i(t)m(yp)s(ed)g(without)150 2228 y(an)m(y)i(in)m(terv)m (ening)g(c)m(haracters)h(de\014ning)e(a)h(new)f(searc)m(h)h(string,)h (an)m(y)f(remem)m(b)s(ered)e(searc)m(h)i(string)g(is)150 2338 y(used.)275 2480 y(Non-incremen)m(tal)48 b(searc)m(hes)g(read)e @@ -15038,91 +15538,90 @@ Ft(s)c(are)i(t)m(yp)s(ed)g(without)150 2228 y(an)m(y)i(in)m(terv)m (searc)m(h)f(for)150 2590 y(matc)m(hing)d(history)e(lines.)78 b(The)42 b(searc)m(h)h(string)g(ma)m(y)g(b)s(e)f(t)m(yp)s(ed)g(b)m(y)g (the)h(user)f(or)h(b)s(e)f(part)g(of)h(the)150 2700 y(con)m(ten)m(ts)32 -b(of)f(the)f(curren)m(t)g(line.)150 2944 y Fr(8.3)68 -b(Readline)47 b(Init)e(File)150 3104 y Ft(Although)f(the)g(Readline)g +b(of)f(the)f(curren)m(t)g(line.)150 2944 y Fs(8.3)68 +b(Readline)47 b(Init)e(File)150 3104 y Fu(Although)f(the)g(Readline)g (library)f(comes)i(with)e(a)h(set)h(of)f(Emacs-lik)m(e)h(k)m (eybindings)f(installed)g(b)m(y)150 3213 y(default,)26 b(it)g(is)e(p)s(ossible)h(to)g(use)f(a)i(di\013eren)m(t)f(set)g(of)g(k) m(eybindings.)38 b(An)m(y)25 b(user)f(can)h(customize)h(programs)150 3323 y(that)45 b(use)f(Readline)h(b)m(y)f(putting)g(commands)g(in)g(an) -g Fq(inputrc)49 b Ft(\014le,)g(con)m(v)m(en)m(tionally)e(in)d(his)g +g Fr(inputrc)49 b Fu(\014le,)g(con)m(v)m(en)m(tionally)e(in)d(his)g (home)150 3433 y(directory)-8 b(.)59 b(The)35 b(name)i(of)f(this)g (\014le)g(is)g(tak)m(en)h(from)f(the)g(v)-5 b(alue)37 -b(of)f(the)g(shell)h(v)-5 b(ariable)36 b Fs(INPUTRC)p -Ft(.)56 b(If)150 3542 y(that)33 b(v)-5 b(ariable)33 b(is)g(unset,)f -(the)h(default)f(is)h(`)p Fs(~/.inputrc)p Ft('.)44 b(If)32 -b(that)h(\014le)f(do)s(es)g(not)h(exist)g(or)g(cannot)g(b)s(e)150 -3652 y(read,)e(the)f(ultimate)i(default)e(is)h(`)p Fs(/etc/inputrc)p -Ft('.)275 3794 y(When)e(a)h(program)f(whic)m(h)h(uses)f(the)h(Readline) -g(library)f(starts)h(up,)f(the)h(init)g(\014le)f(is)h(read,)g(and)f -(the)150 3904 y(k)m(ey)i(bindings)e(are)i(set.)275 4047 -y(In)26 b(addition,)i(the)f Fs(C-x)i(C-r)d Ft(command)h(re-reads)g -(this)f(init)h(\014le,)h(th)m(us)f(incorp)s(orating)g(an)m(y)g(c)m -(hanges)150 4156 y(that)k(y)m(ou)g(migh)m(t)g(ha)m(v)m(e)g(made)g(to)g -(it.)150 4364 y Fj(8.3.1)63 b(Readline)40 b(Init)h(File)g(Syn)m(tax)150 -4511 y Ft(There)f(are)i(only)f(a)g(few)g(basic)g(constructs)h(allo)m(w) +b(of)f(the)g(shell)h(v)-5 b(ariable)36 b Ft(INPUTRC)p +Fu(.)56 b(If)150 3542 y(that)36 b(v)-5 b(ariable)36 b(is)f(unset,)h +(the)f(default)h(is)f Ft(~/.inputrc)p Fu(.)52 b(If)35 +b(that)g(\014le)h(do)s(es)e(not)i(exist)g(or)f(cannot)h(b)s(e)150 +3652 y(read,)31 b(the)f(ultimate)i(default)e(is)h Ft(/etc/inputrc)p +Fu(.)275 3794 y(When)e(a)h(program)f(whic)m(h)h(uses)f(the)h(Readline)g +(library)f(starts)h(up,)f(the)h(init)g(\014le)f(is)h(read,)g(and)f(the) +150 3904 y(k)m(ey)i(bindings)e(are)i(set.)275 4047 y(In)26 +b(addition,)i(the)f Ft(C-x)i(C-r)d Fu(command)h(re-reads)g(this)f(init) +h(\014le,)h(th)m(us)f(incorp)s(orating)g(an)m(y)g(c)m(hanges)150 +4156 y(that)k(y)m(ou)g(migh)m(t)g(ha)m(v)m(e)g(made)g(to)g(it.)150 +4364 y Fk(8.3.1)63 b(Readline)40 b(Init)h(File)g(Syn)m(tax)150 +4511 y Fu(There)f(are)i(only)f(a)g(few)g(basic)g(constructs)h(allo)m(w) m(ed)h(in)d(the)h(Readline)h(init)f(\014le.)73 b(Blank)41 b(lines)h(are)150 4620 y(ignored.)72 b(Lines)41 b(b)s(eginning)f(with)h -(a)g(`)p Fs(#)p Ft(')g(are)h(commen)m(ts.)73 b(Lines)41 -b(b)s(eginning)f(with)g(a)i(`)p Fs($)p Ft(')f(indicate)150 +(a)g(`)p Ft(#)p Fu(')g(are)h(commen)m(ts.)73 b(Lines)41 +b(b)s(eginning)f(with)g(a)i(`)p Ft($)p Fu(')f(indicate)150 4730 y(conditional)e(constructs)f(\(see)g(Section)h(8.3.2)g -([Conditional)g(Init)e(Constructs],)j(page)e(112\).)64 +([Conditional)g(Init)e(Constructs],)j(page)e(111\).)64 b(Other)150 4839 y(lines)31 b(denote)g(v)-5 b(ariable)31 b(settings)g(and)f(k)m(ey)h(bindings.)150 5011 y(V)-8 b(ariable)32 b(Settings)630 5121 y(Y)-8 b(ou)41 b(can)g(mo)s(dify)e (the)i(run-time)f(b)s(eha)m(vior)g(of)h(Readline)g(b)m(y)f(altering)h (the)g(v)-5 b(alues)41 b(of)630 5230 y(v)-5 b(ariables)34 -b(in)f(Readline)i(using)e(the)g Fs(set)g Ft(command)g(within)g(the)h +b(in)f(Readline)i(using)e(the)g Ft(set)g Fu(command)g(within)g(the)h (init)g(\014le.)50 b(The)33 b(syn)m(tax)630 5340 y(is)d(simple:)p eop end -%%Page: 106 112 -TeXDict begin 106 111 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(106)870 299 y Fs(set)47 -b Fi(variable)56 b(value)630 436 y Ft(Here,)29 b(for)e(example,)h(is)g -(ho)m(w)f(to)h(c)m(hange)g(from)f(the)g(default)h(Emacs-lik)m(e)h(k)m -(ey)f(binding)e(to)630 545 y(use)k Fs(vi)g Ft(line)h(editing)g -(commands:)870 682 y Fs(set)47 b(editing-mode)d(vi)630 -819 y Ft(V)-8 b(ariable)36 b(names)f(and)g(v)-5 b(alues,)36 -b(where)f(appropriate,)h(are)g(recognized)g(without)f(regard)630 -929 y(to)c(case.)42 b(Unrecognized)31 b(v)-5 b(ariable)31 -b(names)g(are)f(ignored.)630 1066 y(Bo)s(olean)c(v)-5 -b(ariables)26 b(\(those)g(that)g(can)f(b)s(e)f(set)i(to)g(on)f(or)g -(o\013)7 b(\))25 b(are)h(set)f(to)h(on)f(if)g(the)g(v)-5 -b(alue)26 b(is)630 1176 y(n)m(ull)e(or)g(empt)m(y)-8 -b(,)27 b Fq(on)d Ft(\(case-insensitiv)m(e\),)29 b(or)24 +%%Page: 105 111 +TeXDict begin 105 110 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(105)870 299 y Ft(set)47 +b Fj(variable)e(value)630 436 y Fu(Here,)29 b(for)e(example,)h(is)g(ho) +m(w)f(to)h(c)m(hange)g(from)f(the)g(default)h(Emacs-lik)m(e)h(k)m(ey)f +(binding)e(to)630 545 y(use)k Ft(vi)g Fu(line)h(editing)g(commands:)870 +682 y Ft(set)47 b(editing-mode)d(vi)630 819 y Fu(V)-8 +b(ariable)36 b(names)f(and)g(v)-5 b(alues,)36 b(where)f(appropriate,)h +(are)g(recognized)g(without)f(regard)630 929 y(to)c(case.)42 +b(Unrecognized)31 b(v)-5 b(ariable)31 b(names)g(are)f(ignored.)630 +1066 y(Bo)s(olean)c(v)-5 b(ariables)26 b(\(those)g(that)g(can)f(b)s(e)f +(set)i(to)g(on)f(or)g(o\013)7 b(\))25 b(are)h(set)f(to)h(on)f(if)g(the) +g(v)-5 b(alue)26 b(is)630 1176 y(n)m(ull)e(or)g(empt)m(y)-8 +b(,)27 b Fr(on)d Fu(\(case-insensitiv)m(e\),)29 b(or)24 b(1.)39 b(An)m(y)25 b(other)f(v)-5 b(alue)25 b(results)f(in)g(the)g(v) -5 b(ariable)630 1285 y(b)s(eing)30 b(set)h(to)g(o\013.)630 -1422 y(The)37 b Fs(bind)30 b(-V)37 b Ft(command)g(lists)i(the)f(curren) +1422 y(The)37 b Ft(bind)30 b(-V)37 b Fu(command)g(lists)i(the)f(curren) m(t)f(Readline)i(v)-5 b(ariable)38 b(names)g(and)f(v)-5 b(alues.)630 1532 y(See)31 b(Section)g(4.2)g([Bash)g(Builtins],)g(page) g(48.)630 1669 y(A)f(great)i(deal)f(of)g(run-time)f(b)s(eha)m(vior)g (is)g(c)m(hangeable)j(with)d(the)g(follo)m(wing)i(v)-5 -b(ariables.)630 1833 y Fs(bell-style)1110 1943 y Ft(Con)m(trols)44 +b(ariables.)630 1833 y Ft(bell-style)1110 1943 y Fu(Con)m(trols)44 b(what)g(happ)s(ens)e(when)h(Readline)i(w)m(an)m(ts)f(to)h(ring)e(the)h (termi-)1110 2052 y(nal)37 b(b)s(ell.)61 b(If)37 b(set)h(to)g(`)p -Fs(none)p Ft(',)g(Readline)g(nev)m(er)g(rings)e(the)i(b)s(ell.)61 -b(If)36 b(set)i(to)1110 2162 y(`)p Fs(visible)p Ft(',)32 +Ft(none)p Fu(',)g(Readline)g(nev)m(er)g(rings)e(the)i(b)s(ell.)61 +b(If)36 b(set)i(to)1110 2162 y(`)p Ft(visible)p Fu(',)32 b(Readline)i(uses)f(a)g(visible)g(b)s(ell)g(if)g(one)g(is)g(a)m(v)-5 -b(ailable.)51 b(If)33 b(set)g(to)1110 2271 y(`)p Fs(audible)p -Ft(')j(\(the)i(default\),)i(Readline)e(attempts)g(to)h(ring)e(the)g -(terminal's)1110 2381 y(b)s(ell.)630 2545 y Fs(bind-tty-special-chars) -1110 2655 y Ft(If)45 b(set)h(to)f(`)p Fs(on)p Ft(',)50 +b(ailable.)51 b(If)33 b(set)g(to)1110 2271 y(`)p Ft(audible)p +Fu(')j(\(the)i(default\),)i(Readline)e(attempts)g(to)h(ring)e(the)g +(terminal's)1110 2381 y(b)s(ell.)630 2545 y Ft(bind-tty-special-chars) +1110 2655 y Fu(If)45 b(set)h(to)f(`)p Ft(on)p Fu(',)50 b(Readline)45 b(attempts)i(to)f(bind)d(the)j(con)m(trol)g(c)m (haracters)1110 2765 y(treated)36 b(sp)s(ecially)h(b)m(y)e(the)h(k)m (ernel's)g(terminal)g(driv)m(er)f(to)h(their)f(Readline)1110 -2874 y(equiv)-5 b(alen)m(ts.)630 3039 y Fs(colored-stats)1110 -3148 y Ft(If)26 b(set)h(to)g(`)p Fs(on)p Ft(',)h(Readline)f(displa)m +2874 y(equiv)-5 b(alen)m(ts.)630 3039 y Ft(colored-stats)1110 +3148 y Fu(If)26 b(set)h(to)g(`)p Ft(on)p Fu(',)h(Readline)f(displa)m (ys)g(p)s(ossible)f(completions)h(using)f(di\013eren)m(t)1110 3258 y(colors)40 b(to)g(indicate)g(their)f(\014le)h(t)m(yp)s(e.)67 b(The)38 b(color)j(de\014nitions)d(are)i(tak)m(en)1110 -3367 y(from)24 b(the)h(v)-5 b(alue)25 b(of)g(the)g Fs(LS_COLORS)d -Ft(en)m(vironmen)m(t)j(v)-5 b(ariable.)40 b(The)24 b(default)1110 -3477 y(is)30 b(`)p Fs(off)p Ft('.)630 3641 y Fs(comment-begin)1110 -3751 y Ft(The)f(string)g(to)h(insert)f(at)h(the)f(b)s(eginning)g(of)g -(the)h(line)f(when)f(the)i Fs(insert-)1110 3861 y(comment)e -Ft(command)j(is)f(executed.)42 b(The)29 b(default)i(v)-5 -b(alue)31 b(is)f Fs("#")p Ft(.)630 4025 y Fs(completion-display-width) -1110 4134 y Ft(The)41 b(n)m(um)m(b)s(er)f(of)i(screen)g(columns)f(used) +3367 y(from)24 b(the)h(v)-5 b(alue)25 b(of)g(the)g Ft(LS_COLORS)d +Fu(en)m(vironmen)m(t)j(v)-5 b(ariable.)40 b(The)24 b(default)1110 +3477 y(is)30 b(`)p Ft(off)p Fu('.)630 3641 y Ft(comment-begin)1110 +3751 y Fu(The)62 b(string)g(to)h(insert)f(at)h(the)g(b)s(eginning)e(of) +h(the)h(line)f(when)g(the)1110 3861 y Ft(insert-comment)26 +b Fu(command)31 b(is)f(executed.)42 b(The)30 b(default)g(v)-5 +b(alue)31 b(is)f Ft("#")p Fu(.)630 4025 y Ft(completion-display-width) +1110 4134 y Fu(The)41 b(n)m(um)m(b)s(er)f(of)i(screen)g(columns)f(used) g(to)h(displa)m(y)g(p)s(ossible)f(matc)m(hes)1110 4244 y(when)28 b(p)s(erforming)g(completion.)41 b(The)29 b(v)-5 b(alue)29 b(is)g(ignored)g(if)g(it)h(is)f(less)g(than)1110 @@ -15130,29 +15629,29 @@ b(alue)29 b(is)g(ignored)g(if)g(it)h(is)f(less)g(than)1110 b(A)26 b(v)-5 b(alue)27 b(of)f(0)h(will)f(cause)1110 4463 y(matc)m(hes)32 b(to)f(b)s(e)e(displa)m(y)m(ed)i(one)g(p)s(er)e (line.)41 b(The)30 b(default)h(v)-5 b(alue)31 b(is)f(-1.)630 -4628 y Fs(completion-ignore-case)1110 4737 y Ft(If)d(set)h(to)g(`)p -Fs(on)p Ft(',)g(Readline)g(p)s(erforms)e(\014lename)h(matc)m(hing)i +4628 y Ft(completion-ignore-case)1110 4737 y Fu(If)d(set)h(to)g(`)p +Ft(on)p Fu(',)g(Readline)g(p)s(erforms)e(\014lename)h(matc)m(hing)i (and)e(completion)1110 4847 y(in)j(a)h(case-insensitiv)m(e)i(fashion.) -40 b(The)30 b(default)h(v)-5 b(alue)30 b(is)h(`)p Fs(off)p -Ft('.)630 5011 y Fs(completion-map-case)1110 5121 y Ft(If)22 -b(set)g(to)h(`)p Fs(on)p Ft(',)h(and)e Fq(completion-ignore-case)31 -b Ft(is)22 b(enabled,)i(Readline)f(treats)1110 5230 y(h)m(yphens)29 -b(\(`)p Fs(-)p Ft('\))j(and)e(underscores)g(\(`)p Fs(_)p -Ft('\))i(as)f(equiv)-5 b(alen)m(t)32 b(when)e(p)s(erforming)1110 +40 b(The)30 b(default)h(v)-5 b(alue)30 b(is)h(`)p Ft(off)p +Fu('.)630 5011 y Ft(completion-map-case)1110 5121 y Fu(If)22 +b(set)g(to)h(`)p Ft(on)p Fu(',)h(and)e Fr(completion-ignore-case)31 +b Fu(is)22 b(enabled,)i(Readline)f(treats)1110 5230 y(h)m(yphens)29 +b(\(`)p Ft(-)p Fu('\))j(and)e(underscores)g(\(`)p Ft(_)p +Fu('\))i(as)f(equiv)-5 b(alen)m(t)32 b(when)e(p)s(erforming)1110 5340 y(case-insensitiv)m(e)j(\014lename)d(matc)m(hing)i(and)e (completion.)p eop end -%%Page: 107 113 -TeXDict begin 107 112 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(107)630 299 y Fs -(completion-prefix-displa)o(y-le)o(ngth)1110 408 y Ft(The)31 +%%Page: 106 112 +TeXDict begin 106 111 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(106)630 299 y Ft +(completion-prefix-displa)o(y-le)o(ngth)1110 408 y Fu(The)31 b(length)g(in)g(c)m(haracters)i(of)f(the)f(common)h(pre\014x)e(of)h(a)h (list)g(of)f(p)s(ossible)1110 518 y(completions)g(that)f(is)g(displa)m (y)m(ed)g(without)g(mo)s(di\014cation.)41 b(When)29 b(set)h(to)h(a)1110 628 y(v)-5 b(alue)26 b(greater)h(than)e(zero,)j(common)e(pre\014xes)e (longer)j(than)e(this)g(v)-5 b(alue)27 b(are)1110 737 y(replaced)k(with)f(an)g(ellipsis)h(when)e(displa)m(ying)i(p)s(ossible) -f(completions.)630 902 y Fs(completion-query-items)1110 -1011 y Ft(The)c(n)m(um)m(b)s(er)f(of)h(p)s(ossible)g(completions)h +f(completions.)630 902 y Ft(completion-query-items)1110 +1011 y Fu(The)c(n)m(um)m(b)s(er)f(of)h(p)s(ossible)g(completions)h (that)g(determines)f(when)f(the)i(user)1110 1121 y(is)i(ask)m(ed)h (whether)f(the)h(list)g(of)f(p)s(ossibilities)h(should)e(b)s(e)h (displa)m(y)m(ed.)41 b(If)29 b(the)1110 1230 y(n)m(um)m(b)s(er)d(of)h @@ -15164,60 +15663,60 @@ b(ariable)25 b(m)m(ust)g(b)s(e)e(set)i(to)g(an)g(in)m(teger)g(v)-5 b(alue)1110 1559 y(greater)26 b(than)f(or)f(equal)i(to)f(0.)40 b(A)24 b(negativ)m(e)j(v)-5 b(alue)26 b(means)e(Readline)i(should)1110 1669 y(nev)m(er)31 b(ask.)41 b(The)29 b(default)i(limit)g(is)g -Fs(100)p Ft(.)630 1833 y Fs(convert-meta)1110 1943 y -Ft(If)22 b(set)g(to)h(`)p Fs(on)p Ft(',)h(Readline)f(will)f(con)m(v)m +Ft(100)p Fu(.)630 1833 y Ft(convert-meta)1110 1943 y +Fu(If)22 b(set)g(to)h(`)p Ft(on)p Fu(',)h(Readline)f(will)f(con)m(v)m (ert)i(c)m(haracters)f(with)f(the)g(eigh)m(th)h(bit)f(set)1110 -2052 y(to)33 b(an)e Fl(asci)r(i)h Ft(k)m(ey)h(sequence)f(b)m(y)g +2052 y(to)33 b(an)e Fm(asci)r(i)h Fu(k)m(ey)h(sequence)f(b)m(y)g (stripping)f(the)h(eigh)m(th)h(bit)f(and)f(pre\014xing)1110 -2162 y(an)24 b Fs(ESC)g Ft(c)m(haracter,)j(con)m(v)m(erting)f(them)f +2162 y(an)24 b Ft(ESC)g Fu(c)m(haracter,)j(con)m(v)m(erting)f(them)f (to)g(a)g(meta-pre\014xed)f(k)m(ey)h(sequence.)1110 2271 -y(The)30 b(default)g(v)-5 b(alue)31 b(is)g(`)p Fs(on)p -Ft('.)630 2436 y Fs(disable-completion)1110 2545 y Ft(If)36 -b(set)h(to)h(`)p Fs(On)p Ft(',)g(Readline)f(will)g(inhibit)f(w)m(ord)h +y(The)30 b(default)g(v)-5 b(alue)31 b(is)g(`)p Ft(on)p +Fu('.)630 2436 y Ft(disable-completion)1110 2545 y Fu(If)36 +b(set)h(to)h(`)p Ft(On)p Fu(',)g(Readline)f(will)g(inhibit)f(w)m(ord)h (completion.)60 b(Completion)1110 2655 y(c)m(haracters)28 b(will)e(b)s(e)f(inserted)h(in)m(to)h(the)g(line)f(as)g(if)g(they)h -(had)e(b)s(een)g(mapp)s(ed)1110 2765 y(to)31 b Fs(self-insert)p -Ft(.)38 b(The)30 b(default)g(is)h(`)p Fs(off)p Ft('.)630 -2929 y Fs(editing-mode)1110 3039 y Ft(The)d Fs(editing-mode)e -Ft(v)-5 b(ariable)29 b(con)m(trols)h(whic)m(h)e(default)h(set)h(of)e(k) +(had)e(b)s(een)g(mapp)s(ed)1110 2765 y(to)31 b Ft(self-insert)p +Fu(.)38 b(The)30 b(default)g(is)h(`)p Ft(off)p Fu('.)630 +2929 y Ft(editing-mode)1110 3039 y Fu(The)d Ft(editing-mode)e +Fu(v)-5 b(ariable)29 b(con)m(trols)h(whic)m(h)e(default)h(set)h(of)e(k) m(ey)i(bind-)1110 3148 y(ings)25 b(is)g(used.)38 b(By)26 b(default,)g(Readline)g(starts)f(up)f(in)h(Emacs)g(editing)h(mo)s(de,) 1110 3258 y(where)j(the)g(k)m(eystrok)m(es)i(are)e(most)h(similar)f(to) h(Emacs.)40 b(This)29 b(v)-5 b(ariable)30 b(can)1110 -3367 y(b)s(e)g(set)h(to)g(either)g(`)p Fs(emacs)p Ft(')e(or)h(`)p -Fs(vi)p Ft('.)630 3532 y Fs(echo-control-characters)1110 -3641 y Ft(When)g(set)h(to)g(`)p Fs(on)p Ft(',)f(on)g(op)s(erating)h +3367 y(b)s(e)g(set)h(to)g(either)g(`)p Ft(emacs)p Fu(')e(or)h(`)p +Ft(vi)p Fu('.)630 3532 y Ft(echo-control-characters)1110 +3641 y Fu(When)g(set)h(to)g(`)p Ft(on)p Fu(',)f(on)g(op)s(erating)h (systems)f(that)h(indicate)g(they)g(supp)s(ort)1110 3751 y(it,)i(readline)e(ec)m(ho)s(es)i(a)f(c)m(haracter)h(corresp)s(onding)d (to)j(a)f(signal)g(generated)1110 3861 y(from)e(the)g(k)m(eyb)s(oard.) -41 b(The)30 b(default)g(is)h(`)p Fs(on)p Ft('.)630 4025 -y Fs(enable-keypad)1110 4134 y Ft(When)23 b(set)h(to)g(`)p -Fs(on)p Ft(',)h(Readline)f(will)g(try)f(to)h(enable)g(the)f +41 b(The)30 b(default)g(is)h(`)p Ft(on)p Fu('.)630 4025 +y Ft(enable-keypad)1110 4134 y Fu(When)23 b(set)h(to)g(`)p +Ft(on)p Fu(',)h(Readline)f(will)g(try)f(to)h(enable)g(the)f (application)i(k)m(eypad)1110 4244 y(when)h(it)h(is)f(called.)41 b(Some)27 b(systems)f(need)h(this)f(to)h(enable)g(the)g(arro)m(w)g(k)m -(eys.)1110 4354 y(The)j(default)g(is)h(`)p Fs(off)p Ft('.)630 -4518 y Fs(enable-meta-key)1110 4628 y Ft(When)40 b(set)g(to)g(`)p -Fs(on)p Ft(',)j(Readline)d(will)g(try)g(to)g(enable)g(an)m(y)g(meta)h +(eys.)1110 4354 y(The)j(default)g(is)h(`)p Ft(off)p Fu('.)630 +4518 y Ft(enable-meta-key)1110 4628 y Fu(When)40 b(set)g(to)g(`)p +Ft(on)p Fu(',)j(Readline)d(will)g(try)g(to)g(enable)g(an)m(y)g(meta)h (mo)s(di\014er)1110 4737 y(k)m(ey)i(the)e(terminal)i(claims)f(to)h (supp)s(ort)d(when)h(it)h(is)g(called.)76 b(On)41 b(man)m(y)1110 4847 y(terminals,)c(the)e(meta)h(k)m(ey)g(is)f(used)g(to)h(send)e(eigh) m(t-bit)j(c)m(haracters.)56 b(The)1110 4956 y(default)31 -b(is)f(`)p Fs(on)p Ft('.)630 5121 y Fs(expand-tilde)1110 -5230 y Ft(If)d(set)h(to)h(`)p Fs(on)p Ft(',)f(tilde)g(expansion)g(is)f +b(is)f(`)p Ft(on)p Fu('.)630 5121 y Ft(expand-tilde)1110 +5230 y Fu(If)d(set)h(to)h(`)p Ft(on)p Fu(',)f(tilde)g(expansion)g(is)f (p)s(erformed)f(when)h(Readline)h(attempts)1110 5340 y(w)m(ord)i(completion.)42 b(The)30 b(default)g(is)h(`)p -Fs(off)p Ft('.)p eop end -%%Page: 108 114 -TeXDict begin 108 113 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(108)630 299 y Fs -(history-preserve-point)1110 408 y Ft(If)41 b(set)h(to)h(`)p -Fs(on)p Ft(',)i(the)c(history)h(co)s(de)g(attempts)h(to)f(place)h(the)f +Ft(off)p Fu('.)p eop end +%%Page: 107 113 +TeXDict begin 107 112 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(107)630 299 y Ft +(history-preserve-point)1110 408 y Fu(If)41 b(set)h(to)h(`)p +Ft(on)p Fu(',)i(the)c(history)h(co)s(de)g(attempts)h(to)f(place)h(the)f (p)s(oin)m(t)f(\(the)1110 518 y(curren)m(t)35 b(cursor)g(p)s(osition\)) g(at)h(the)g(same)f(lo)s(cation)i(on)e(eac)m(h)h(history)g(line)1110 -628 y(retriev)m(ed)h(with)f Fs(previous-history)c Ft(or)37 -b Fs(next-history)p Ft(.)55 b(The)36 b(default)1110 737 -y(is)30 b(`)p Fs(off)p Ft('.)630 883 y Fs(history-size)1110 -993 y Ft(Set)39 b(the)g(maxim)m(um)g(n)m(um)m(b)s(er)f(of)h(history)g +628 y(retriev)m(ed)h(with)f Ft(previous-history)c Fu(or)37 +b Ft(next-history)p Fu(.)55 b(The)36 b(default)1110 737 +y(is)30 b(`)p Ft(off)p Fu('.)630 883 y Ft(history-size)1110 +993 y Fu(Set)39 b(the)g(maxim)m(um)g(n)m(um)m(b)s(er)f(of)h(history)g (en)m(tries)h(sa)m(v)m(ed)g(in)f(the)g(history)1110 1103 y(list.)51 b(If)34 b(set)g(to)h(zero,)g(an)m(y)f(existing)h(history)f (en)m(tries)g(are)g(deleted)h(and)e(no)1110 1212 y(new)e(en)m(tries)i @@ -15225,47 +15724,47 @@ y(list.)51 b(If)34 b(set)g(to)h(zero,)g(an)m(y)f(existing)h(history)f b(alue)32 b(less)g(than)f(zero,)i(the)f(n)m(um)m(b)s(er)1110 1322 y(of)f(history)f(en)m(tries)h(is)g(not)g(limited.)42 b(By)30 b(default,)h(the)g(n)m(um)m(b)s(er)e(of)i(history)1110 -1431 y(en)m(tries)g(is)g(not)f(limited.)630 1577 y Fs -(horizontal-scroll-mode)1110 1687 y Ft(This)35 b(v)-5 +1431 y(en)m(tries)g(is)g(not)f(limited.)630 1577 y Ft +(horizontal-scroll-mode)1110 1687 y Fu(This)35 b(v)-5 b(ariable)37 b(can)f(b)s(e)f(set)h(to)h(either)f(`)p -Fs(on)p Ft(')g(or)g(`)p Fs(off)p Ft('.)57 b(Setting)36 -b(it)g(to)h(`)p Fs(on)p Ft(')1110 1797 y(means)26 b(that)h(the)f(text)h +Ft(on)p Fu(')g(or)g(`)p Ft(off)p Fu('.)57 b(Setting)36 +b(it)g(to)h(`)p Ft(on)p Fu(')1110 1797 y(means)26 b(that)h(the)f(text)h (of)g(the)f(lines)g(b)s(eing)g(edited)h(will)f(scroll)h(horizon)m (tally)1110 1906 y(on)32 b(a)g(single)g(screen)g(line)g(when)e(they)i (are)g(longer)h(than)e(the)h(width)f(of)h(the)1110 2016 y(screen,)27 b(instead)g(of)f(wrapping)f(on)m(to)i(a)f(new)g(screen)g (line.)39 b(By)27 b(default,)g(this)1110 2125 y(v)-5 -b(ariable)31 b(is)g(set)f(to)i(`)p Fs(off)p Ft('.)630 -2271 y Fs(input-meta)1110 2381 y Ft(If)f(set)g(to)h(`)p -Fs(on)p Ft(',)g(Readline)g(will)f(enable)h(eigh)m(t-bit)h(input)d(\(it) +b(ariable)31 b(is)g(set)f(to)i(`)p Ft(off)p Fu('.)630 +2271 y Ft(input-meta)1110 2381 y Fu(If)f(set)g(to)h(`)p +Ft(on)p Fu(',)g(Readline)g(will)f(enable)h(eigh)m(t-bit)h(input)d(\(it) i(will)f(not)h(clear)1110 2491 y(the)40 b(eigh)m(th)g(bit)g(in)f(the)h (c)m(haracters)h(it)f(reads\),)j(regardless)c(of)h(what)g(the)1110 2600 y(terminal)g(claims)h(it)g(can)f(supp)s(ort.)68 -b(The)39 b(default)h(v)-5 b(alue)40 b(is)g(`)p Fs(off)p -Ft('.)69 b(The)1110 2710 y(name)30 b Fs(meta-flag)e Ft(is)j(a)f(synon)m -(ym)g(for)g(this)h(v)-5 b(ariable.)630 2856 y Fs(isearch-terminators) -1110 2966 y Ft(The)51 b(string)h(of)g(c)m(haracters)h(that)f(should)e +b(The)39 b(default)h(v)-5 b(alue)40 b(is)g(`)p Ft(off)p +Fu('.)69 b(The)1110 2710 y(name)30 b Ft(meta-flag)e Fu(is)j(a)f(synon)m +(ym)g(for)g(this)h(v)-5 b(ariable.)630 2856 y Ft(isearch-terminators) +1110 2966 y Fu(The)51 b(string)h(of)g(c)m(haracters)h(that)f(should)e (terminate)j(an)f(incremen)m(tal)1110 3075 y(searc)m(h)25 b(without)g(subsequen)m(tly)g(executing)h(the)f(c)m(haracter)h(as)f(a)g (command)1110 3185 y(\(see)38 b(Section)g(8.2.5)h([Searc)m(hing],)h -(page)e(104\).)62 b(If)37 b(this)g(v)-5 b(ariable)38 +(page)e(103\).)62 b(If)37 b(this)g(v)-5 b(ariable)38 b(has)f(not)1110 3294 y(b)s(een)e(giv)m(en)h(a)g(v)-5 -b(alue,)37 b(the)f(c)m(haracters)h Fs(ESC)d Ft(and)h -Fi(C-J)g Ft(will)h(terminate)g(an)1110 3404 y(incremen)m(tal)c(searc)m -(h.)630 3550 y Fs(keymap)192 b Ft(Sets)39 b(Readline's)g(idea)h(of)f +b(alue,)37 b(the)f(c)m(haracters)h Ft(ESC)d Fu(and)h +Fj(C-J)g Fu(will)h(terminate)g(an)1110 3404 y(incremen)m(tal)c(searc)m +(h.)630 3550 y Ft(keymap)192 b Fu(Sets)39 b(Readline's)g(idea)h(of)f (the)g(curren)m(t)f(k)m(eymap)h(for)g(k)m(ey)g(binding)f(com-)1110 -3660 y(mands.)81 b(Acceptable)47 b Fs(keymap)42 b Ft(names)i(are)h -Fs(emacs)p Ft(,)i Fs(emacs-standard)p Ft(,)1110 3769 -y Fs(emacs-meta)p Ft(,)99 b Fs(emacs-ctlx)p Ft(,)f Fs(vi)p -Ft(,)j Fs(vi-move)p Ft(,)f Fs(vi-command)p Ft(,)f(and)1110 -3879 y Fs(vi-insert)p Ft(.)64 b Fs(vi)38 b Ft(is)h(equiv)-5 -b(alen)m(t)41 b(to)e Fs(vi-command)p Ft(;)i Fs(emacs)c -Ft(is)i(equiv)-5 b(alen)m(t)1110 3988 y(to)33 b Fs(emacs-standard)p -Ft(.)41 b(The)31 b(default)h(v)-5 b(alue)32 b(is)g Fs(emacs)p -Ft(.)44 b(The)31 b(v)-5 b(alue)33 b(of)f(the)1110 4098 -y Fs(editing-mode)27 b Ft(v)-5 b(ariable)31 b(also)h(a\013ects)f(the)g -(default)f(k)m(eymap.)630 4244 y Fs(keyseq-timeout)1110 -4354 y Ft(Sp)s(eci\014es)25 b(the)g(duration)g(Readline)h(will)g(w)m +3660 y(mands.)81 b(Acceptable)47 b Ft(keymap)42 b Fu(names)i(are)h +Ft(emacs)p Fu(,)i Ft(emacs-standard)p Fu(,)1110 3769 +y Ft(emacs-meta)p Fu(,)99 b Ft(emacs-ctlx)p Fu(,)f Ft(vi)p +Fu(,)j Ft(vi-move)p Fu(,)f Ft(vi-command)p Fu(,)f(and)1110 +3879 y Ft(vi-insert)p Fu(.)64 b Ft(vi)38 b Fu(is)h(equiv)-5 +b(alen)m(t)41 b(to)e Ft(vi-command)p Fu(;)i Ft(emacs)c +Fu(is)i(equiv)-5 b(alen)m(t)1110 3988 y(to)33 b Ft(emacs-standard)p +Fu(.)41 b(The)31 b(default)h(v)-5 b(alue)32 b(is)g Ft(emacs)p +Fu(.)44 b(The)31 b(v)-5 b(alue)33 b(of)f(the)1110 4098 +y Ft(editing-mode)27 b Fu(v)-5 b(ariable)31 b(also)h(a\013ects)f(the)g +(default)f(k)m(eymap.)630 4244 y Ft(keyseq-timeout)1110 +4354 y Fu(Sp)s(eci\014es)25 b(the)g(duration)g(Readline)h(will)g(w)m (ait)g(for)g(a)f(c)m(haracter)i(when)e(read-)1110 4463 y(ing)30 b(an)g(am)m(biguous)g(k)m(ey)h(sequence)f(\(one)g(that)h(can)f (form)g(a)g(complete)h(k)m(ey)1110 4573 y(sequence)24 @@ -15283,93 +15782,93 @@ y(set)28 b(to)h(a)f(v)-5 b(alue)29 b(less)f(than)g(or)f(equal)i(to)f 5230 y(Readline)30 b(will)f(w)m(ait)i(un)m(til)e(another)h(k)m(ey)g(is) f(pressed)g(to)h(decide)f(whic)m(h)g(k)m(ey)1110 5340 y(sequence)i(to)g(complete.)42 b(The)30 b(default)g(v)-5 -b(alue)31 b(is)g Fs(500)p Ft(.)p eop end -%%Page: 109 115 -TeXDict begin 109 114 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(109)630 299 y Fs(mark-directories) -1110 408 y Ft(If)38 b(set)g(to)h(`)p Fs(on)p Ft(',)i(completed)e +b(alue)31 b(is)g Ft(500)p Fu(.)p eop end +%%Page: 108 114 +TeXDict begin 108 113 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(108)630 299 y Ft(mark-directories) +1110 408 y Fu(If)38 b(set)g(to)h(`)p Ft(on)p Fu(',)i(completed)e (directory)f(names)g(ha)m(v)m(e)i(a)e(slash)g(app)s(ended.)1110 -518 y(The)30 b(default)g(is)h(`)p Fs(on)p Ft('.)630 676 -y Fs(mark-modified-lines)1110 786 y Ft(This)k(v)-5 b(ariable,)38 -b(when)d(set)h(to)h(`)p Fs(on)p Ft(',)g(causes)g(Readline)f(to)h -(displa)m(y)f(an)f(as-)1110 896 y(terisk)f(\(`)p Fs(*)p -Ft('\))h(at)f(the)g(start)g(of)g(history)g(lines)g(whic)m(h)f(ha)m(v)m +518 y(The)30 b(default)g(is)h(`)p Ft(on)p Fu('.)630 676 +y Ft(mark-modified-lines)1110 786 y Fu(This)k(v)-5 b(ariable,)38 +b(when)d(set)h(to)h(`)p Ft(on)p Fu(',)g(causes)g(Readline)f(to)h +(displa)m(y)f(an)f(as-)1110 896 y(terisk)f(\(`)p Ft(*)p +Fu('\))h(at)f(the)g(start)g(of)g(history)g(lines)g(whic)m(h)f(ha)m(v)m (e)i(b)s(een)e(mo)s(di\014ed.)1110 1005 y(This)d(v)-5 -b(ariable)31 b(is)f(`)p Fs(off)p Ft(')g(b)m(y)g(default.)630 -1163 y Fs(mark-symlinked-directori)o(es)1110 1273 y Ft(If)44 -b(set)h(to)h(`)p Fs(on)p Ft(',)i(completed)e(names)f(whic)m(h)f(are)h -(sym)m(b)s(olic)g(links)g(to)g(di-)1110 1383 y(rectories)j(ha)m(v)m(e)f -(a)g(slash)f(app)s(ended)e(\(sub)5 b(ject)47 b(to)g(the)f(v)-5 -b(alue)47 b(of)f Fs(mark-)1110 1492 y(directories)p Ft(\).)38 -b(The)30 b(default)g(is)h(`)p Fs(off)p Ft('.)630 1650 -y Fs(match-hidden-files)1110 1760 y Ft(This)21 b(v)-5 -b(ariable,)25 b(when)d(set)g(to)h(`)p Fs(on)p Ft(',)h(causes)f +b(ariable)31 b(is)f(`)p Ft(off)p Fu(')g(b)m(y)g(default.)630 +1163 y Ft(mark-symlinked-directori)o(es)1110 1273 y Fu(If)59 +b(set)h(to)g(`)p Ft(on)p Fu(',)67 b(completed)60 b(names)f(whic)m(h)g +(are)h(sym)m(b)s(olic)g(links)f(to)1110 1383 y(directories)71 +b(ha)m(v)m(e)f(a)g(slash)f(app)s(ended)f(\(sub)5 b(ject)70 +b(to)g(the)g(v)-5 b(alue)70 b(of)1110 1492 y Ft(mark-directories)p +Fu(\).)37 b(The)30 b(default)g(is)g(`)p Ft(off)p Fu('.)630 +1650 y Ft(match-hidden-files)1110 1760 y Fu(This)21 b(v)-5 +b(ariable,)25 b(when)d(set)g(to)h(`)p Ft(on)p Fu(',)h(causes)f (Readline)g(to)g(matc)m(h)g(\014les)f(whose)1110 1870 -y(names)44 b(b)s(egin)g(with)g(a)g(`)p Fs(.)p Ft(')g(\(hidden)f +y(names)44 b(b)s(egin)g(with)g(a)g(`)p Ft(.)p Fu(')g(\(hidden)f (\014les\))i(when)e(p)s(erforming)g(\014lename)1110 1979 -y(completion.)75 b(If)41 b(set)g(to)h(`)p Fs(off)p Ft(',)i(the)e -(leading)g(`)p Fs(.)p Ft(')f(m)m(ust)g(b)s(e)g(supplied)f(b)m(y)1110 +y(completion.)75 b(If)41 b(set)g(to)h(`)p Ft(off)p Fu(',)i(the)e +(leading)g(`)p Ft(.)p Fu(')f(m)m(ust)g(b)s(e)g(supplied)f(b)m(y)1110 2089 y(the)34 b(user)g(in)g(the)g(\014lename)g(to)h(b)s(e)f(completed.) -53 b(This)33 b(v)-5 b(ariable)35 b(is)f(`)p Fs(on)p Ft(')g(b)m(y)1110 -2198 y(default.)630 2357 y Fs(menu-complete-display-pr)o(efix)1110 -2466 y Ft(If)f(set)h(to)g(`)p Fs(on)p Ft(',)h(men)m(u)e(completion)i +53 b(This)33 b(v)-5 b(ariable)35 b(is)f(`)p Ft(on)p Fu(')g(b)m(y)1110 +2198 y(default.)630 2357 y Ft(menu-complete-display-pr)o(efix)1110 +2466 y Fu(If)f(set)h(to)g(`)p Ft(on)p Fu(',)h(men)m(u)e(completion)i (displa)m(ys)e(the)h(common)g(pre\014x)e(of)i(the)1110 2576 y(list)k(of)g(p)s(ossible)f(completions)i(\(whic)m(h)e(ma)m(y)h(b) s(e)f(empt)m(y\))i(b)s(efore)e(cycling)1110 2685 y(through)30 -b(the)g(list.)42 b(The)29 b(default)i(is)f(`)p Fs(off)p -Ft('.)630 2844 y Fs(output-meta)1110 2953 y Ft(If)35 -b(set)h(to)g(`)p Fs(on)p Ft(',)h(Readline)f(will)g(displa)m(y)f(c)m +b(the)g(list.)42 b(The)29 b(default)i(is)f(`)p Ft(off)p +Fu('.)630 2844 y Ft(output-meta)1110 2953 y Fu(If)35 +b(set)h(to)g(`)p Ft(on)p Fu(',)h(Readline)f(will)g(displa)m(y)f(c)m (haracters)i(with)e(the)h(eigh)m(th)g(bit)1110 3063 y(set)h(directly)g (rather)f(than)g(as)h(a)g(meta-pre\014xed)f(escap)s(e)h(sequence.)59 -b(The)1110 3173 y(default)31 b(is)f(`)p Fs(off)p Ft('.)630 -3331 y Fs(page-completions)1110 3440 y Ft(If)j(set)i(to)f(`)p -Fs(on)p Ft(',)h(Readline)g(uses)e(an)h(in)m(ternal)h -Fs(more)p Ft(-lik)m(e)f(pager)g(to)h(displa)m(y)1110 +b(The)1110 3173 y(default)31 b(is)f(`)p Ft(off)p Fu('.)630 +3331 y Ft(page-completions)1110 3440 y Fu(If)j(set)i(to)f(`)p +Ft(on)p Fu(',)h(Readline)g(uses)e(an)h(in)m(ternal)h +Ft(more)p Fu(-lik)m(e)f(pager)g(to)h(displa)m(y)1110 3550 y(a)e(screenful)f(of)g(p)s(ossible)g(completions)i(at)f(a)g(time.) -47 b(This)31 b(v)-5 b(ariable)34 b(is)e(`)p Fs(on)p Ft(')1110 -3660 y(b)m(y)e(default.)630 3818 y Fs(print-completions-horizo)o(ntal)o -(ly)1110 3927 y Ft(If)23 b(set)i(to)g(`)p Fs(on)p Ft(',)g(Readline)g +47 b(This)31 b(v)-5 b(ariable)34 b(is)e(`)p Ft(on)p Fu(')1110 +3660 y(b)m(y)e(default.)630 3818 y Ft(print-completions-horizo)o(ntal)o +(ly)1110 3927 y Fu(If)23 b(set)i(to)g(`)p Ft(on)p Fu(',)g(Readline)g (will)f(displa)m(y)g(completions)h(with)f(matc)m(hes)h(sorted)1110 4037 y(horizon)m(tally)45 b(in)e(alphab)s(etical)i(order,)i(rather)c (than)g(do)m(wn)g(the)h(screen.)1110 4147 y(The)30 b(default)g(is)h(`)p -Fs(off)p Ft('.)630 4305 y Fs(revert-all-at-newline)1110 -4415 y Ft(If)e(set)h(to)g(`)p Fs(on)p Ft(',)g(Readline)g(will)g(undo)f +Ft(off)p Fu('.)630 4305 y Ft(revert-all-at-newline)1110 +4415 y Fu(If)e(set)h(to)g(`)p Ft(on)p Fu(',)g(Readline)g(will)g(undo)f (all)h(c)m(hanges)h(to)f(history)g(lines)f(b)s(efore)1110 -4524 y(returning)f(when)f Fs(accept-line)f Ft(is)j(executed.)41 +4524 y(returning)f(when)f Ft(accept-line)f Fu(is)j(executed.)41 b(By)29 b(default,)g(history)g(lines)1110 4634 y(ma)m(y)42 b(b)s(e)g(mo)s(di\014ed)e(and)h(retain)i(individual)e(undo)g(lists)h -(across)g(calls)h(to)1110 4743 y Fs(readline)p Ft(.)38 -b(The)30 b(default)h(is)f(`)p Fs(off)p Ft('.)630 4902 -y Fs(show-all-if-ambiguous)1110 5011 y Ft(This)f(alters)i(the)f +(across)g(calls)h(to)1110 4743 y Ft(readline)p Fu(.)38 +b(The)30 b(default)h(is)f(`)p Ft(off)p Fu('.)630 4902 +y Ft(show-all-if-ambiguous)1110 5011 y Fu(This)f(alters)i(the)f (default)g(b)s(eha)m(vior)g(of)g(the)h(completion)g(functions.)40 -b(If)29 b(set)1110 5121 y(to)f(`)p Fs(on)p Ft(',)g(w)m(ords)f(whic)m(h) +b(If)29 b(set)1110 5121 y(to)f(`)p Ft(on)p Fu(',)g(w)m(ords)f(whic)m(h) g(ha)m(v)m(e)i(more)f(than)f(one)h(p)s(ossible)f(completion)h(cause) 1110 5230 y(the)39 b(matc)m(hes)h(to)g(b)s(e)e(listed)h(immediately)i (instead)e(of)g(ringing)g(the)g(b)s(ell.)1110 5340 y(The)30 -b(default)g(v)-5 b(alue)31 b(is)g(`)p Fs(off)p Ft('.)p +b(default)g(v)-5 b(alue)31 b(is)g(`)p Ft(off)p Fu('.)p eop end -%%Page: 110 116 -TeXDict begin 110 115 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(110)630 299 y Fs -(show-all-if-unmodified)1110 408 y Ft(This)38 b(alters)h(the)g(default) +%%Page: 109 115 +TeXDict begin 109 114 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(109)630 299 y Ft +(show-all-if-unmodified)1110 408 y Fu(This)38 b(alters)h(the)g(default) g(b)s(eha)m(vior)g(of)f(the)h(completion)h(functions)e(in)h(a)1110 -518 y(fashion)25 b(similar)g(to)h Fq(sho)m(w-all-if-am)m(biguous)t -Ft(.)41 b(If)24 b(set)i(to)f(`)p Fs(on)p Ft(',)i(w)m(ords)d(whic)m(h) +518 y(fashion)25 b(similar)h(to)g Fr(sho)m(w-all-if-am)m(biguous)p +Fu(.)41 b(If)25 b(set)h(to)h(`)p Ft(on)p Fu(',)f(w)m(ords)f(whic)m(h) 1110 628 y(ha)m(v)m(e)32 b(more)f(than)f(one)i(p)s(ossible)e (completion)i(without)f(an)m(y)g(p)s(ossible)f(par-)1110 737 y(tial)43 b(completion)h(\(the)f(p)s(ossible)f(completions)h(don't) f(share)g(a)h(common)1110 847 y(pre\014x\))30 b(cause)g(the)h(matc)m (hes)g(to)g(b)s(e)f(listed)g(immediately)i(instead)e(of)h(ring-)1110 956 y(ing)g(the)f(b)s(ell.)41 b(The)30 b(default)g(v)-5 -b(alue)31 b(is)f(`)p Fs(off)p Ft('.)630 1113 y Fs(show-mode-in-prompt) -1110 1223 y Ft(If)35 b(set)i(to)f(`)p Fs(on)p Ft(',)h(add)e(a)h(c)m +b(alue)31 b(is)f(`)p Ft(off)p Fu('.)630 1113 y Ft(show-mode-in-prompt) +1110 1223 y Fu(If)35 b(set)i(to)f(`)p Ft(on)p Fu(',)h(add)e(a)h(c)m (haracter)i(to)e(the)g(b)s(eginning)f(of)h(the)g(prompt)f(in-)1110 1332 y(dicating)43 b(the)f(editing)h(mo)s(de:)63 b(emacs)43 -b(\(`)p Fs(@)p Ft('\),)i(vi)d(command)g(\(`)p Fs(:)p -Ft('\),)k(or)c(vi)1110 1442 y(insertion)30 b(\(`)p Fs(+)p -Ft('\).)42 b(The)30 b(default)h(v)-5 b(alue)30 b(is)h(`)p -Fs(off)p Ft('.)630 1598 y Fs(skip-completed-text)1110 -1708 y Ft(If)h(set)i(to)f(`)p Fs(on)p Ft(',)h(this)f(alters)g(the)g +b(\(`)p Ft(@)p Fu('\),)i(vi)d(command)g(\(`)p Ft(:)p +Fu('\),)k(or)c(vi)1110 1442 y(insertion)30 b(\(`)p Ft(+)p +Fu('\).)42 b(The)30 b(default)h(v)-5 b(alue)30 b(is)h(`)p +Ft(off)p Fu('.)630 1598 y Ft(skip-completed-text)1110 +1708 y Fu(If)h(set)i(to)f(`)p Ft(on)p Fu(',)h(this)f(alters)g(the)g (default)g(completion)h(b)s(eha)m(vior)f(when)f(in-)1110 1817 y(serting)d(a)h(single)g(matc)m(h)f(in)m(to)h(the)g(line.)40 b(It's)30 b(only)f(activ)m(e)i(when)d(p)s(erform-)1110 @@ -15381,16 +15880,16 @@ b(insert)f(c)m(haracters)i(from)e(the)h(completion)h(that)f(matc)m(h)g 2256 y(follo)m(wing)c(the)f(cursor)f(are)h(not)g(duplicated.)45 b(F)-8 b(or)32 b(instance,)h(if)f(this)f(is)h(en-)1110 2365 y(abled,)43 b(attempting)f(completion)g(when)d(the)i(cursor)f(is)g -(after)h(the)g(`)p Fs(e)p Ft(')f(in)1110 2475 y(`)p Fs(Makefile)p -Ft(')c(will)i(result)f(in)g(`)p Fs(Makefile)p Ft(')f(rather)h(than)h(`) -p Fs(Makefilefile)p Ft(',)1110 2585 y(assuming)d(there)g(is)h(a)f +(after)h(the)g(`)p Ft(e)p Fu(')f(in)1110 2475 y(`)p Ft(Makefile)p +Fu(')c(will)i(result)f(in)g(`)p Ft(Makefile)p Fu(')f(rather)h(than)h(`) +p Ft(Makefilefile)p Fu(',)1110 2585 y(assuming)d(there)g(is)h(a)f (single)h(p)s(ossible)f(completion.)56 b(The)35 b(default)g(v)-5 -b(alue)1110 2694 y(is)30 b(`)p Fs(off)p Ft('.)630 2851 -y Fs(visible-stats)1110 2960 y Ft(If)h(set)i(to)f(`)p -Fs(on)p Ft(',)h(a)f(c)m(haracter)i(denoting)e(a)g(\014le's)g(t)m(yp)s +b(alue)1110 2694 y(is)30 b(`)p Ft(off)p Fu('.)630 2851 +y Ft(visible-stats)1110 2960 y Fu(If)h(set)i(to)f(`)p +Ft(on)p Fu(',)h(a)f(c)m(haracter)i(denoting)e(a)g(\014le's)g(t)m(yp)s (e)g(is)g(app)s(ended)e(to)j(the)1110 3070 y(\014lename)e(when)e (listing)i(p)s(ossible)f(completions.)42 b(The)30 b(default)g(is)h(`)p -Fs(off)p Ft('.)150 3226 y(Key)f(Bindings)630 3336 y(The)41 +Ft(off)p Fu('.)150 3226 y(Key)f(Bindings)630 3336 y(The)41 b(syn)m(tax)i(for)f(con)m(trolling)h(k)m(ey)g(bindings)e(in)h(the)g (init)g(\014le)g(is)g(simple.)75 b(First)43 b(y)m(ou)630 3446 y(need)27 b(to)i(\014nd)d(the)i(name)f(of)h(the)g(command)f(that)i @@ -15412,158 +15911,158 @@ b(The)40 b(name)h(of)630 4236 y(the)35 b(k)m(ey)g(can)g(b)s(e)f 4479 y(In)i(addition)h(to)h(command)f(names,)i(readline)e(allo)m(ws)h (k)m(eys)g(to)g(b)s(e)e(b)s(ound)f(to)j(a)f(string)630 4589 y(that)31 b(is)f(inserted)h(when)e(the)i(k)m(ey)g(is)f(pressed)g -(\(a)h Fq(macro)5 b Ft(\).)630 4722 y(The)42 b Fs(bind)30 -b(-p)42 b Ft(command)h(displa)m(ys)g(Readline)g(function)g(names)g(and) +(\(a)h Fr(macro)5 b Fu(\).)630 4722 y(The)42 b Ft(bind)30 +b(-p)42 b Fu(command)h(displa)m(ys)g(Readline)g(function)g(names)g(and) f(bindings)g(in)h(a)630 4831 y(format)37 b(that)h(can)f(put)f(directly) i(in)m(to)g(an)f(initialization)j(\014le.)60 b(See)38 b(Section)f(4.2)i([Bash)630 4941 y(Builtins],)31 b(page)g(48.)630 -5097 y Fq(k)m(eyname)5 b Ft(:)42 b Fq(function-name)35 -b Ft(or)c Fq(macro)1110 5207 y(k)m(eyname)k Ft(is)29 +5097 y Fr(k)m(eyname)5 b Fu(:)42 b Fr(function-name)35 +b Fu(or)c Fr(macro)1110 5207 y(k)m(eyname)k Fu(is)29 b(the)f(name)h(of)g(a)g(k)m(ey)h(sp)s(elled)e(out)h(in)g(English.)39 -b(F)-8 b(or)30 b(example:)1350 5340 y Fs(Control-u:)45 +b(F)-8 b(or)30 b(example:)1350 5340 y Ft(Control-u:)45 b(universal-argument)p eop end -%%Page: 111 117 -TeXDict begin 111 116 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(111)1350 299 y Fs(Meta-Rubout:)44 +%%Page: 110 116 +TeXDict begin 110 115 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(110)1350 299 y Ft(Meta-Rubout:)44 b(backward-kill-word)1350 408 y(Control-o:)h(">)i(output")1110 -542 y Ft(In)38 b(the)h(ab)s(o)m(v)m(e)h(example,)h Fi(C-u)d -Ft(is)h(b)s(ound)d(to)k(the)e(function)h Fs(universal-)1110 -652 y(argument)p Ft(,)f Fi(M-DEL)e Ft(is)i(b)s(ound)e(to)i(the)g -(function)g Fs(backward-kill-word)p Ft(,)1110 762 y(and)g -Fi(C-o)g Ft(is)h(b)s(ound)e(to)j(run)d(the)j(macro)f(expressed)g(on)f -(the)i(righ)m(t)f(hand)1110 871 y(side)30 b(\(that)i(is,)e(to)h(insert) -g(the)f(text)i(`)p Fs(>)e(output)p Ft(')f(in)m(to)i(the)g(line\).)1110 -1005 y(A)37 b(n)m(um)m(b)s(er)f(of)h(sym)m(b)s(olic)g(c)m(haracter)i -(names)e(are)g(recognized)h(while)f(pro-)1110 1115 y(cessing)22 -b(this)g(k)m(ey)g(binding)e(syn)m(tax:)37 b Fq(DEL)p -Ft(,)22 b Fq(ESC)8 b Ft(,)20 b Fq(ESCAPE)5 b Ft(,)21 -b Fq(LFD)5 b Ft(,)22 b Fq(NEW-)1110 1224 y(LINE)5 b Ft(,)31 -b Fq(RET)7 b Ft(,)29 b Fq(RETURN)10 b Ft(,)30 b Fq(R)m(UBOUT)7 -b Ft(,)31 b Fq(SP)-8 b(A)m(CE)5 b Ft(,)31 b Fq(SPC)8 -b Ft(,)29 b(and)h Fq(T)-8 b(AB)5 b Ft(.)630 1383 y Fs(")p -Fq(k)m(eyseq)r Fs(")p Ft(:)41 b Fq(function-name)36 b -Ft(or)30 b Fq(macro)1110 1492 y(k)m(eyseq)k Ft(di\013ers)d(from)f -Fq(k)m(eyname)37 b Ft(ab)s(o)m(v)m(e)32 b(in)f(that)h(strings)f -(denoting)g(an)g(en-)1110 1602 y(tire)j(k)m(ey)h(sequence)f(can)g(b)s +544 y Fu(In)94 b(the)g(ab)s(o)m(v)m(e)i(example,)111 +b Fj(C-u)94 b Fu(is)g(b)s(ound)f(to)i(the)f(function)1110 +653 y Ft(universal-argument)p Fu(,)124 b Fj(M-DEL)107 +b Fu(is)i(b)s(ound)e(to)j(the)f(function)1110 763 y Ft +(backward-kill-word)p Fu(,)75 b(and)69 b Fj(C-o)g Fu(is)h(b)s(ound)e +(to)j(run)d(the)i(macro)1110 873 y(expressed)45 b(on)h(the)g(righ)m(t)g +(hand)e(side)i(\(that)h(is,)i(to)e(insert)e(the)h(text)h(`)p +Ft(>)1110 982 y(output)p Fu(')29 b(in)m(to)i(the)g(line\).)1110 +1118 y(A)62 b(n)m(um)m(b)s(er)e(of)i(sym)m(b)s(olic)h(c)m(haracter)g +(names)f(are)g(recognized)h(while)1110 1227 y(pro)s(cessing)40 +b(this)f(k)m(ey)i(binding)e(syn)m(tax:)60 b Fr(DEL)p +Fu(,)42 b Fr(ESC)p Fu(,)g Fr(ESCAPE)p Fu(,)f Fr(LFD)p +Fu(,)1110 1337 y Fr(NEWLINE)p Fu(,)31 b Fr(RET)p Fu(,)f +Fr(RETURN)p Fu(,)g Fr(R)m(UBOUT)p Fu(,)h Fr(SP)-8 b(A)m(CE)p +Fu(,)31 b Fr(SPC)p Fu(,)e(and)h Fr(T)-8 b(AB)p Fu(.)630 +1498 y Ft(")p Fr(k)m(eyseq)r Ft(")p Fu(:)41 b Fr(function-name)36 +b Fu(or)30 b Fr(macro)1110 1608 y(k)m(eyseq)k Fu(di\013ers)d(from)f +Fr(k)m(eyname)37 b Fu(ab)s(o)m(v)m(e)32 b(in)f(that)h(strings)f +(denoting)g(an)g(en-)1110 1717 y(tire)j(k)m(ey)h(sequence)f(can)g(b)s (e)f(sp)s(eci\014ed,)h(b)m(y)f(placing)i(the)f(k)m(ey)g(sequence)g(in) -1110 1711 y(double)29 b(quotes.)41 b(Some)29 b Fl(gnu)h -Ft(Emacs)f(st)m(yle)i(k)m(ey)f(escap)s(es)g(can)g(b)s(e)f(used,)g(as) -1110 1821 y(in)k(the)h(follo)m(wing)i(example,)f(but)e(the)h(sp)s -(ecial)h(c)m(haracter)g(names)f(are)g(not)1110 1931 y(recognized.)1350 -2064 y Fs("\\C-u":)46 b(universal-argument)1350 2174 -y("\\C-x\\C-r":)f(re-read-init-file)1350 2284 y("\\e[11~":)g("Function) -h(Key)g(1")1110 2418 y Ft(In)64 b(the)g(ab)s(o)m(v)m(e)i(example,)74 -b Fi(C-u)64 b Ft(is)g(again)i(b)s(ound)c(to)k(the)e(function)1110 -2527 y Fs(universal-argument)39 b Ft(\(just)k(as)h(it)g(w)m(as)g(in)g -(the)f(\014rst)g(example\),)49 b(`)p Fi(C-x)1110 2637 -y(C-r)p Ft(')30 b(is)g(b)s(ound)e(to)j(the)g(function)f -Fs(re-read-init-file)p Ft(,)c(and)j(`)p Fs(ESC)h([)g(1)g(1)1110 -2746 y(~)p Ft(')g(is)h(b)s(ound)d(to)j(insert)f(the)h(text)g(`)p -Fs(Function)e(Key)g(1)p Ft('.)630 2905 y(The)g(follo)m(wing)i -Fl(gnu)f Ft(Emacs)g(st)m(yle)h(escap)s(e)f(sequences)g(are)g(a)m(v)-5 -b(ailable)32 b(when)d(sp)s(ecifying)630 3014 y(k)m(ey)i(sequences:)630 -3173 y Fi(\\C-)336 b Ft(con)m(trol)32 b(pre\014x)630 -3331 y Fi(\\M-)336 b Ft(meta)31 b(pre\014x)630 3489 y -Fi(\\e)384 b Ft(an)30 b(escap)s(e)h(c)m(haracter)630 -3647 y Fi(\\\\)384 b Ft(bac)m(kslash)630 3806 y Fi(\\)p -Fs(")g(")p Ft(,)30 b(a)h(double)f(quotation)i(mark)630 -3964 y Fi(\\')384 b Fs(')p Ft(,)30 b(a)h(single)g(quote)g(or)f(ap)s -(ostrophe)630 4122 y(In)d(addition)h(to)g(the)g Fl(gnu)f -Ft(Emacs)h(st)m(yle)h(escap)s(e)f(sequences,)h(a)f(second)f(set)h(of)g -(bac)m(kslash)630 4232 y(escap)s(es)j(is)f(a)m(v)-5 b(ailable:)630 -4390 y Fs(\\a)384 b Ft(alert)31 b(\(b)s(ell\))630 4548 -y Fs(\\b)384 b Ft(bac)m(kspace)630 4707 y Fs(\\d)g Ft(delete)630 -4865 y Fs(\\f)g Ft(form)30 b(feed)630 5023 y Fs(\\n)384 -b Ft(newline)630 5182 y Fs(\\r)g Ft(carriage)32 b(return)630 -5340 y Fs(\\t)384 b Ft(horizon)m(tal)32 b(tab)p eop end -%%Page: 112 118 -TeXDict begin 112 117 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(112)630 299 y Fs(\\v)384 -b Ft(v)m(ertical)32 b(tab)630 451 y Fs(\\)p Fi(nnn)288 -b Ft(the)35 b(eigh)m(t-bit)h(c)m(haracter)g(whose)e(v)-5 -b(alue)35 b(is)g(the)f(o)s(ctal)i(v)-5 b(alue)35 b Fq(nnn)e -Ft(\(one)i(to)1110 561 y(three)c(digits\))630 713 y Fs(\\x)p -Fi(HH)288 b Ft(the)40 b(eigh)m(t-bit)h(c)m(haracter)g(whose)e(v)-5 -b(alue)39 b(is)h(the)f(hexadecimal)i(v)-5 b(alue)40 b -Fq(HH)1110 823 y Ft(\(one)31 b(or)f(t)m(w)m(o)i(hex)e(digits\))630 -975 y(When)37 b(en)m(tering)h(the)g(text)g(of)g(a)g(macro,)i(single)e -(or)f(double)g(quotes)h(m)m(ust)f(b)s(e)g(used)f(to)630 -1085 y(indicate)23 b(a)e(macro)h(de\014nition.)38 b(Unquoted)21 -b(text)i(is)e(assumed)g(to)h(b)s(e)f(a)h(function)f(name.)38 -b(In)630 1194 y(the)22 b(macro)f(b)s(o)s(dy)-8 b(,)23 -b(the)e(bac)m(kslash)h(escap)s(es)g(describ)s(ed)e(ab)s(o)m(v)m(e)j -(are)e(expanded.)37 b(Bac)m(kslash)630 1304 y(will)j(quote)h(an)m(y)f -(other)g(c)m(haracter)i(in)d(the)i(macro)f(text,)k(including)39 -b(`)p Fs(")p Ft(')h(and)g(`)p Fs(')p Ft('.)69 b(F)-8 -b(or)630 1414 y(example,)28 b(the)e(follo)m(wing)h(binding)d(will)i -(mak)m(e)h(`)p Fi(C-x)j Fs(\\)p Ft(')c(insert)f(a)h(single)h(`)p -Fs(\\)p Ft(')f(in)m(to)g(the)g(line:)870 1545 y Fs("\\C-x\\\\":)45 -b("\\\\")150 1737 y Fj(8.3.2)63 b(Conditional)41 b(Init)g(Constructs) -150 1884 y Ft(Readline)c(implemen)m(ts)g(a)h(facilit)m(y)g(similar)f +1110 1827 y(double)29 b(quotes.)41 b(Some)29 b Fm(gnu)h +Fu(Emacs)f(st)m(yle)i(k)m(ey)f(escap)s(es)g(can)g(b)s(e)f(used,)g(as) +1110 1936 y(in)k(the)h(follo)m(wing)i(example,)f(but)e(the)h(sp)s +(ecial)h(c)m(haracter)g(names)f(are)g(not)1110 2046 y(recognized.)1350 +2181 y Ft("\\C-u":)46 b(universal-argument)1350 2291 +y("\\C-x\\C-r":)f(re-read-init-file)1350 2400 y("\\e[11~":)g("Function) +h(Key)g(1")1110 2536 y Fu(In)64 b(the)g(ab)s(o)m(v)m(e)i(example,)74 +b Fj(C-u)64 b Fu(is)g(again)i(b)s(ound)c(to)k(the)e(function)1110 +2645 y Ft(universal-argument)39 b Fu(\(just)k(as)h(it)g(w)m(as)g(in)g +(the)f(\014rst)g(example\),)49 b(`)p Fj(C-x)1110 2755 +y(C-r)p Fu(')30 b(is)g(b)s(ound)e(to)j(the)g(function)f +Ft(re-read-init-file)p Fu(,)c(and)j(`)p Ft(ESC)h([)g(1)g(1)1110 +2865 y(~)p Fu(')g(is)h(b)s(ound)d(to)j(insert)f(the)h(text)g(`)p +Ft(Function)e(Key)g(1)p Fu('.)630 3026 y(The)g(follo)m(wing)i +Fm(gnu)f Fu(Emacs)g(st)m(yle)h(escap)s(e)f(sequences)g(are)g(a)m(v)-5 +b(ailable)32 b(when)d(sp)s(ecifying)630 3135 y(k)m(ey)i(sequences:)630 +3296 y Fj(\\C-)336 b Fu(con)m(trol)32 b(pre\014x)630 +3458 y Fj(\\M-)336 b Fu(meta)31 b(pre\014x)630 3619 y +Fj(\\e)384 b Fu(an)30 b(escap)s(e)h(c)m(haracter)630 +3780 y Fj(\\\\)384 b Fu(bac)m(kslash)630 3941 y Fj(\\)p +Ft(")g(")p Fu(,)30 b(a)h(double)f(quotation)i(mark)630 +4102 y Fj(\\')384 b Ft(')p Fu(,)30 b(a)h(single)g(quote)g(or)f(ap)s +(ostrophe)630 4263 y(In)d(addition)h(to)g(the)g Fm(gnu)f +Fu(Emacs)h(st)m(yle)h(escap)s(e)f(sequences,)h(a)f(second)f(set)h(of)g +(bac)m(kslash)630 4373 y(escap)s(es)j(is)f(a)m(v)-5 b(ailable:)630 +4534 y Ft(\\a)384 b Fu(alert)31 b(\(b)s(ell\))630 4695 +y Ft(\\b)384 b Fu(bac)m(kspace)630 4856 y Ft(\\d)g Fu(delete)630 +5018 y Ft(\\f)g Fu(form)30 b(feed)630 5179 y Ft(\\n)384 +b Fu(newline)630 5340 y Ft(\\r)g Fu(carriage)32 b(return)p +eop end +%%Page: 111 117 +TeXDict begin 111 116 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(111)630 299 y Ft(\\t)384 +b Fu(horizon)m(tal)32 b(tab)630 451 y Ft(\\v)384 b Fu(v)m(ertical)32 +b(tab)630 604 y Ft(\\)p Fj(nnn)288 b Fu(the)35 b(eigh)m(t-bit)h(c)m +(haracter)g(whose)e(v)-5 b(alue)35 b(is)g(the)f(o)s(ctal)i(v)-5 +b(alue)35 b Fr(nnn)e Fu(\(one)i(to)1110 713 y(three)c(digits\))630 +866 y Ft(\\x)p Fj(HH)288 b Fu(the)38 b(eigh)m(t-bit)i(c)m(haracter)g +(whose)e(v)-5 b(alue)39 b(is)f(the)h(hexadecimal)g(v)-5 +b(alue)39 b Fr(HH)1110 975 y Fu(\(one)31 b(or)f(t)m(w)m(o)i(hex)e +(digits\))630 1128 y(When)37 b(en)m(tering)h(the)g(text)g(of)g(a)g +(macro,)i(single)e(or)f(double)g(quotes)h(m)m(ust)f(b)s(e)g(used)f(to) +630 1237 y(indicate)23 b(a)e(macro)h(de\014nition.)38 +b(Unquoted)21 b(text)i(is)e(assumed)g(to)h(b)s(e)f(a)h(function)f +(name.)38 b(In)630 1347 y(the)22 b(macro)f(b)s(o)s(dy)-8 +b(,)23 b(the)e(bac)m(kslash)h(escap)s(es)g(describ)s(ed)e(ab)s(o)m(v)m +(e)j(are)e(expanded.)37 b(Bac)m(kslash)630 1456 y(will)j(quote)h(an)m +(y)f(other)g(c)m(haracter)i(in)d(the)i(macro)f(text,)k(including)39 +b(`)p Ft(")p Fu(')h(and)g(`)p Ft(')p Fu('.)69 b(F)-8 +b(or)630 1566 y(example,)28 b(the)e(follo)m(wing)h(binding)d(will)i +(mak)m(e)h(`)p Fj(C-x)j Ft(\\)p Fu(')c(insert)f(a)h(single)h(`)p +Ft(\\)p Fu(')f(in)m(to)g(the)g(line:)870 1697 y Ft("\\C-x\\\\":)45 +b("\\\\")150 1889 y Fk(8.3.2)63 b(Conditional)41 b(Init)g(Constructs) +150 2036 y Fu(Readline)c(implemen)m(ts)g(a)h(facilit)m(y)g(similar)f (in)g(spirit)f(to)i(the)f(conditional)h(compilation)g(features)f(of)150 -1993 y(the)31 b(C)f(prepro)s(cessor)g(whic)m(h)g(allo)m(ws)i(k)m(ey)g +2146 y(the)31 b(C)f(prepro)s(cessor)g(whic)m(h)g(allo)m(ws)i(k)m(ey)g (bindings)d(and)h(v)-5 b(ariable)32 b(settings)f(to)h(b)s(e)e(p)s -(erformed)f(as)i(the)150 2103 y(result)f(of)h(tests.)41 +(erformed)f(as)i(the)150 2255 y(result)f(of)h(tests.)41 b(There)30 b(are)h(four)f(parser)f(directiv)m(es)j(used.)150 -2255 y Fs($if)336 b Ft(The)31 b Fs($if)f Ft(construct)i(allo)m(ws)h +2408 y Ft($if)336 b Fu(The)31 b Ft($if)f Fu(construct)i(allo)m(ws)h (bindings)d(to)i(b)s(e)e(made)i(based)f(on)g(the)g(editing)h(mo)s(de,)g -(the)630 2365 y(terminal)39 b(b)s(eing)e(used,)j(or)e(the)g +(the)630 2517 y(terminal)39 b(b)s(eing)e(used,)j(or)e(the)g (application)h(using)f(Readline.)64 b(The)38 b(text)h(of)f(the)g(test) -630 2474 y(extends)30 b(to)h(the)g(end)f(of)g(the)h(line;)g(no)f(c)m +630 2627 y(extends)30 b(to)h(the)g(end)f(of)g(the)h(line;)g(no)f(c)m (haracters)i(are)f(required)e(to)i(isolate)i(it.)630 -2627 y Fs(mode)288 b Ft(The)20 b Fs(mode=)g Ft(form)g(of)h(the)g -Fs($if)f Ft(directiv)m(e)j(is)e(used)f(to)h(test)h(whether)e(Readline) -1110 2736 y(is)29 b(in)h Fs(emacs)e Ft(or)h Fs(vi)g Ft(mo)s(de.)40 -b(This)29 b(ma)m(y)h(b)s(e)e(used)h(in)g(conjunction)h(with)f(the)1110 -2846 y(`)p Fs(set)h(keymap)p Ft(')c(command,)i(for)f(instance,)i(to)f -(set)g(bindings)f(in)g(the)h Fs(emacs-)1110 2956 y(standard)23 -b Ft(and)h Fs(emacs-ctlx)f Ft(k)m(eymaps)i(only)g(if)g(Readline)h(is)f -(starting)h(out)1110 3065 y(in)k Fs(emacs)f Ft(mo)s(de.)630 -3218 y Fs(term)288 b Ft(The)26 b Fs(term=)g Ft(form)g(ma)m(y)i(b)s(e)e -(used)g(to)i(include)f(terminal-sp)s(eci\014c)g(k)m(ey)h(bind-)1110 -3327 y(ings,)38 b(p)s(erhaps)c(to)j(bind)e(the)h(k)m(ey)h(sequences)f -(output)g(b)m(y)g(the)g(terminal's)1110 3437 y(function)24 -b(k)m(eys.)39 b(The)23 b(w)m(ord)h(on)f(the)i(righ)m(t)f(side)g(of)g -(the)g(`)p Fs(=)p Ft(')g(is)g(tested)h(against)1110 3546 -y(b)s(oth)k(the)h(full)g(name)g(of)g(the)g(terminal)h(and)e(the)i(p)s -(ortion)e(of)h(the)g(terminal)1110 3656 y(name)k(b)s(efore)f(the)g -(\014rst)g(`)p Fs(-)p Ft('.)50 b(This)33 b(allo)m(ws)i -Fs(sun)e Ft(to)h(matc)m(h)g(b)s(oth)f Fs(sun)g Ft(and)1110 -3766 y Fs(sun-cmd)p Ft(,)c(for)h(instance.)630 3918 y -Fs(application)1110 4028 y Ft(The)21 b Fq(application)j -Ft(construct)e(is)g(used)f(to)i(include)f(application-sp)s(eci\014c)h -(set-)1110 4137 y(tings.)39 b(Eac)m(h)26 b(program)e(using)g(the)h -(Readline)g(library)g(sets)g(the)g Fq(application)1110 -4247 y(name)5 b Ft(,)25 b(and)d(y)m(ou)h(can)g(test)h(for)e(a)h -(particular)h(v)-5 b(alue.)38 b(This)22 b(could)h(b)s(e)f(used)g(to) -1110 4356 y(bind)32 b(k)m(ey)h(sequences)g(to)h(functions)e(useful)g -(for)h(a)g(sp)s(eci\014c)f(program.)48 b(F)-8 b(or)1110 -4466 y(instance,)35 b(the)e(follo)m(wing)h(command)f(adds)f(a)i(k)m(ey) -f(sequence)h(that)f(quotes)1110 4575 y(the)e(curren)m(t)f(or)g -(previous)g(w)m(ord)g(in)g(Bash:)1350 4706 y Fs($if)47 -b(Bash)1350 4816 y(#)g(Quote)g(the)g(current)f(or)h(previous)e(word) -1350 4926 y("\\C-xq":)h("\\eb\\"\\ef\\"")1350 5035 y($endif)150 -5188 y($endif)192 b Ft(This)29 b(command,)i(as)f(seen)h(in)f(the)g -(previous)g(example,)h(terminates)g(an)g Fs($if)e Ft(command.)150 -5340 y Fs($else)240 b Ft(Commands)29 b(in)h(this)h(branc)m(h)e(of)i -(the)f Fs($if)g Ft(directiv)m(e)i(are)f(executed)g(if)f(the)h(test)g -(fails.)p eop end -%%Page: 113 119 -TeXDict begin 113 118 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(113)150 299 y Fs($include)96 -b Ft(This)43 b(directiv)m(e)i(tak)m(es)g(a)e(single)i(\014lename)e(as)h -(an)f(argumen)m(t)h(and)f(reads)g(commands)630 408 y(and)38 -b(bindings)f(from)h(that)i(\014le.)65 b(F)-8 b(or)39 -b(example,)j(the)d(follo)m(wing)h(directiv)m(e)g(reads)e(from)630 -518 y(`)p Fs(/etc/inputrc)p Ft(':)870 653 y Fs($include)46 -b(/etc/inputrc)150 852 y Fj(8.3.3)63 b(Sample)41 b(Init)g(File)150 -999 y Ft(Here)27 b(is)f(an)h(example)g(of)f(an)h Fq(inputrc)k -Ft(\014le.)39 b(This)26 b(illustrates)h(k)m(ey)h(binding,)e(v)-5 -b(ariable)27 b(assignmen)m(t,)i(and)150 1108 y(conditional)j(syn)m +2779 y Ft(mode)288 b Fu(The)30 b Ft(mode=)e Fu(form)i(of)g(the)h +Ft($if)e Fu(directiv)m(e)j(is)e(used)f(to)i(test)g(whether)e(Read-)1110 +2889 y(line)44 b(is)f(in)g Ft(emacs)f Fu(or)h Ft(vi)g +Fu(mo)s(de.)79 b(This)42 b(ma)m(y)i(b)s(e)e(used)h(in)g(conjunction) +1110 2998 y(with)c(the)h(`)p Ft(set)29 b(keymap)p Fu(')38 +b(command,)k(for)d(instance,)j(to)e(set)g(bindings)e(in)1110 +3108 y(the)32 b Ft(emacs-standard)c Fu(and)j Ft(emacs-ctlx)d +Fu(k)m(eymaps)k(only)g(if)g(Readline)g(is)1110 3218 y(starting)f(out)g +(in)f Ft(emacs)f Fu(mo)s(de.)630 3370 y Ft(term)288 b +Fu(The)26 b Ft(term=)g Fu(form)g(ma)m(y)i(b)s(e)e(used)g(to)i(include)f +(terminal-sp)s(eci\014c)g(k)m(ey)h(bind-)1110 3480 y(ings,)38 +b(p)s(erhaps)c(to)j(bind)e(the)h(k)m(ey)h(sequences)f(output)g(b)m(y)g +(the)g(terminal's)1110 3589 y(function)24 b(k)m(eys.)39 +b(The)23 b(w)m(ord)h(on)f(the)i(righ)m(t)f(side)g(of)g(the)g(`)p +Ft(=)p Fu(')g(is)g(tested)h(against)1110 3699 y(b)s(oth)k(the)h(full)g +(name)g(of)g(the)g(terminal)h(and)e(the)i(p)s(ortion)e(of)h(the)g +(terminal)1110 3808 y(name)k(b)s(efore)f(the)g(\014rst)g(`)p +Ft(-)p Fu('.)50 b(This)33 b(allo)m(ws)i Ft(sun)e Fu(to)h(matc)m(h)g(b)s +(oth)f Ft(sun)g Fu(and)1110 3918 y Ft(sun-cmd)p Fu(,)c(for)h(instance.) +630 4070 y Ft(application)1110 4180 y Fu(The)21 b Fr(application)j +Fu(construct)e(is)g(used)f(to)i(include)f(application-sp)s(eci\014c)h +(set-)1110 4289 y(tings.)39 b(Eac)m(h)26 b(program)e(using)g(the)h +(Readline)g(library)g(sets)g(the)g Fr(application)1110 +4399 y(name)p Fu(,)g(and)e(y)m(ou)g(can)h(test)g(for)f(a)g(particular)h +(v)-5 b(alue.)39 b(This)22 b(could)h(b)s(e)g(used)f(to)1110 +4509 y(bind)32 b(k)m(ey)h(sequences)g(to)h(functions)e(useful)g(for)h +(a)g(sp)s(eci\014c)f(program.)48 b(F)-8 b(or)1110 4618 +y(instance,)35 b(the)e(follo)m(wing)h(command)f(adds)f(a)i(k)m(ey)f +(sequence)h(that)f(quotes)1110 4728 y(the)e(curren)m(t)f(or)g(previous) +g(w)m(ord)g(in)g(Bash:)1350 4859 y Ft($if)47 b(Bash)1350 +4968 y(#)g(Quote)g(the)g(current)f(or)h(previous)e(word)1350 +5078 y("\\C-xq":)h("\\eb\\"\\ef\\"")1350 5188 y($endif)150 +5340 y($endif)192 b Fu(This)29 b(command,)i(as)f(seen)h(in)f(the)g +(previous)g(example,)h(terminates)g(an)g Ft($if)e Fu(command.)p +eop end +%%Page: 112 118 +TeXDict begin 112 117 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(112)150 299 y Ft($else)240 +b Fu(Commands)29 b(in)h(this)h(branc)m(h)e(of)i(the)f +Ft($if)g Fu(directiv)m(e)i(are)f(executed)g(if)f(the)h(test)g(fails.) +150 458 y Ft($include)96 b Fu(This)43 b(directiv)m(e)i(tak)m(es)g(a)e +(single)i(\014lename)e(as)h(an)f(argumen)m(t)h(and)f(reads)g(commands) +630 568 y(and)38 b(bindings)f(from)h(that)i(\014le.)65 +b(F)-8 b(or)39 b(example,)j(the)d(follo)m(wing)h(directiv)m(e)g(reads)e +(from)630 677 y Ft(/etc/inputrc)p Fu(:)870 812 y Ft($include)46 +b(/etc/inputrc)150 1011 y Fk(8.3.3)63 b(Sample)41 b(Init)g(File)150 +1158 y Fu(Here)27 b(is)f(an)h(example)g(of)f(an)h Fr(inputrc)k +Fu(\014le.)39 b(This)26 b(illustrates)h(k)m(ey)h(binding,)e(v)-5 +b(ariable)27 b(assignmen)m(t,)i(and)150 1268 y(conditional)j(syn)m (tax.)p eop end -%%Page: 114 120 -TeXDict begin 114 119 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(114)390 408 y Fs(#)47 +%%Page: 113 119 +TeXDict begin 113 118 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(113)390 408 y Ft(#)47 b(This)g(file)g(controls)e(the)i(behaviour)e(of)j(line)e(input)h (editing)e(for)390 518 y(#)i(programs)f(that)h(use)g(the)f(GNU)h (Readline)f(library.)93 b(Existing)390 628 y(#)47 b(programs)f(include) @@ -15592,9 +16091,9 @@ y(#)47 b(Arrow)g(keys)f(in)i(8)f(bit)g(keypad)f(mode)390 4902 y(#)390 5011 y(#)47 b(Arrow)g(keys)f(in)i(8)f(bit)g(ANSI)g(mode) 390 5121 y(#)390 5230 y(#"\\M-\\C-[D":)331 b(backward-char)390 5340 y(#"\\M-\\C-[C":)g(forward-char)p eop end -%%Page: 115 121 -TeXDict begin 115 120 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(115)390 299 y Fs(#"\\M-\\C-[A":) +%%Page: 114 120 +TeXDict begin 114 119 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(114)390 299 y Ft(#"\\M-\\C-[A":) 331 b(previous-history)390 408 y(#"\\M-\\C-[B":)g(next-history)390 628 y(C-q:)47 b(quoted-insert)390 847 y($endif)390 1066 y(#)g(An)h(old-style)d(binding.)93 b(This)47 b(happens)f(to)h(be)g(the) @@ -15627,150 +16126,150 @@ y($endif)390 3477 y(#)i(use)g(a)h(visible)e(bell)g(if)h(one)g(is)h (completions)e(for)390 5121 y(#)j(a)h(word,)e(ask)h(the)g(user)g(if)g (he)g(wants)f(to)i(see)f(all)f(of)i(them)390 5230 y(set)f (completion-query-items)42 b(150)p eop end -%%Page: 116 122 -TeXDict begin 116 121 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(116)390 299 y Fs(#)47 +%%Page: 115 121 +TeXDict begin 115 120 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(115)390 299 y Ft(#)47 b(For)g(FTP)390 408 y($if)g(Ftp)390 518 y("\\C-xg":)f("get)g(\\M-?")390 628 y("\\C-xt":)g("put)g(\\M-?")390 737 y("\\M-.":)g(yank-last-arg)390 -847 y($endif)150 1075 y Fr(8.4)68 b(Bindable)45 b(Readline)i(Commands) -150 1235 y Ft(This)32 b(section)h(describ)s(es)f(Readline)h(commands)f +847 y($endif)150 1075 y Fs(8.4)68 b(Bindable)45 b(Readline)i(Commands) +150 1235 y Fu(This)32 b(section)h(describ)s(es)f(Readline)h(commands)f (that)h(ma)m(y)h(b)s(e)d(b)s(ound)g(to)i(k)m(ey)g(sequences.)48 b(Y)-8 b(ou)33 b(can)150 1344 y(list)40 b(y)m(our)f(k)m(ey)i(bindings)d -(b)m(y)h(executing)i Fs(bind)29 b(-P)39 b Ft(or,)j(for)d(a)h(more)g -(terse)g(format,)i(suitable)e(for)f(an)150 1454 y Fq(inputrc)34 -b Ft(\014le,)29 b Fs(bind)g(-p)p Ft(.)40 b(\(See)30 b(Section)f(4.2)h +(b)m(y)h(executing)i Ft(bind)29 b(-P)39 b Fu(or,)j(for)d(a)h(more)g +(terse)g(format,)i(suitable)e(for)f(an)150 1454 y Fr(inputrc)34 +b Fu(\014le,)29 b Ft(bind)g(-p)p Fu(.)40 b(\(See)30 b(Section)f(4.2)h ([Bash)g(Builtins],)g(page)g(48.\))41 b(Command)28 b(names)h(without) 150 1563 y(an)h(accompan)m(ying)i(k)m(ey)f(sequence)g(are)g(un)m(b)s (ound)d(b)m(y)i(default.)275 1696 y(In)25 b(the)h(follo)m(wing)i -(descriptions,)f Fq(p)s(oin)m(t)h Ft(refers)e(to)h(the)f(curren)m(t)g -(cursor)g(p)s(osition,)h(and)f Fq(mark)31 b Ft(refers)150 +(descriptions,)f Fr(p)s(oin)m(t)h Fu(refers)e(to)h(the)f(curren)m(t)g +(cursor)g(p)s(osition,)h(and)f Fr(mark)31 b Fu(refers)150 1805 y(to)40 b(a)f(cursor)f(p)s(osition)h(sa)m(v)m(ed)h(b)m(y)f(the)g -Fs(set-mark)d Ft(command.)66 b(The)38 b(text)i(b)s(et)m(w)m(een)g(the)f +Ft(set-mark)d Fu(command.)66 b(The)38 b(text)i(b)s(et)m(w)m(een)g(the)f (p)s(oin)m(t)g(and)150 1915 y(mark)30 b(is)h(referred)e(to)i(as)g(the)f -Fq(region)p Ft(.)150 2110 y Fj(8.4.1)63 b(Commands)42 -b(F)-10 b(or)41 b(Mo)m(ving)150 2280 y Fs(beginning-of-line)26 -b(\(C-a\))630 2390 y Ft(Mo)m(v)m(e)32 b(to)g(the)e(start)h(of)g(the)f -(curren)m(t)g(line.)150 2545 y Fs(end-of-line)d(\(C-e\))630 -2655 y Ft(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h(line.)150 -2810 y Fs(forward-char)c(\(C-f\))630 2920 y Ft(Mo)m(v)m(e)32 -b(forw)m(ard)e(a)h(c)m(haracter.)150 3075 y Fs(backward-char)c(\(C-b\)) -630 3185 y Ft(Mo)m(v)m(e)32 b(bac)m(k)g(a)e(c)m(haracter.)150 -3340 y Fs(forward-word)d(\(M-f\))630 3450 y Ft(Mo)m(v)m(e)32 +Fr(region)p Fu(.)150 2110 y Fk(8.4.1)63 b(Commands)42 +b(F)-10 b(or)41 b(Mo)m(ving)150 2280 y Ft(beginning-of-line)26 +b(\(C-a\))630 2390 y Fu(Mo)m(v)m(e)32 b(to)g(the)e(start)h(of)g(the)f +(curren)m(t)g(line.)150 2545 y Ft(end-of-line)d(\(C-e\))630 +2655 y Fu(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h(line.)150 +2810 y Ft(forward-char)c(\(C-f\))630 2920 y Fu(Mo)m(v)m(e)32 +b(forw)m(ard)e(a)h(c)m(haracter.)150 3075 y Ft(backward-char)c(\(C-b\)) +630 3185 y Fu(Mo)m(v)m(e)32 b(bac)m(k)g(a)e(c)m(haracter.)150 +3340 y Ft(forward-word)d(\(M-f\))630 3450 y Fu(Mo)m(v)m(e)32 b(forw)m(ard)e(to)h(the)f(end)g(of)g(the)h(next)f(w)m(ord.)41 b(W)-8 b(ords)30 b(are)h(comp)s(osed)f(of)g(letters)i(and)630 -3559 y(digits.)150 3715 y Fs(backward-word)27 b(\(M-b\))630 -3824 y Ft(Mo)m(v)m(e)36 b(bac)m(k)e(to)g(the)g(start)g(of)g(the)g +3559 y(digits.)150 3715 y Ft(backward-word)27 b(\(M-b\))630 +3824 y Fu(Mo)m(v)m(e)36 b(bac)m(k)e(to)g(the)g(start)g(of)g(the)g (curren)m(t)f(or)g(previous)g(w)m(ord.)50 b(W)-8 b(ords)34 b(are)g(comp)s(osed)630 3934 y(of)d(letters)g(and)f(digits.)150 -4089 y Fs(shell-forward-word)25 b(\(\))630 4199 y Ft(Mo)m(v)m(e)30 +4089 y Ft(shell-forward-word)25 b(\(\))630 4199 y Fu(Mo)m(v)m(e)30 b(forw)m(ard)e(to)h(the)f(end)f(of)h(the)h(next)f(w)m(ord.)40 b(W)-8 b(ords)28 b(are)g(delimited)h(b)m(y)f(non-quoted)630 -4308 y(shell)j(metac)m(haracters.)150 4464 y Fs(shell-backward-word)25 -b(\(\))630 4573 y Ft(Mo)m(v)m(e)37 b(bac)m(k)e(to)h(the)f(start)g(of)g +4308 y(shell)j(metac)m(haracters.)150 4464 y Ft(shell-backward-word)25 +b(\(\))630 4573 y Fu(Mo)m(v)m(e)37 b(bac)m(k)e(to)h(the)f(start)g(of)g (the)g(curren)m(t)g(or)f(previous)h(w)m(ord.)53 b(W)-8 b(ords)35 b(are)g(delimited)630 4683 y(b)m(y)30 b(non-quoted)h(shell)f -(metac)m(haracters.)150 4838 y Fs(clear-screen)d(\(C-l\))630 -4948 y Ft(Clear)g(the)g(screen)f(and)h(redra)m(w)f(the)h(curren)m(t)f +(metac)m(haracters.)150 4838 y Ft(clear-screen)d(\(C-l\))630 +4948 y Fu(Clear)g(the)g(screen)f(and)h(redra)m(w)f(the)h(curren)m(t)f (line,)i(lea)m(ving)g(the)f(curren)m(t)g(line)g(at)g(the)g(top)630 -5057 y(of)k(the)f(screen.)150 5213 y Fs(redraw-current-line)25 -b(\(\))630 5322 y Ft(Refresh)30 b(the)g(curren)m(t)h(line.)41 +5057 y(of)k(the)f(screen.)150 5213 y Ft(redraw-current-line)25 +b(\(\))630 5322 y Fu(Refresh)30 b(the)g(curren)m(t)h(line.)41 b(By)30 b(default,)h(this)f(is)h(un)m(b)s(ound.)p eop end -%%Page: 117 123 -TeXDict begin 117 122 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(117)150 299 y Fj(8.4.2)63 +%%Page: 116 122 +TeXDict begin 116 121 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(116)150 299 y Fk(8.4.2)63 b(Commands)42 b(F)-10 b(or)41 b(Manipulating)h(The)f(History)150 -473 y Fs(accept-line)27 b(\(Newline)h(or)i(Return\))630 -582 y Ft(Accept)25 b(the)e(line)h(regardless)g(of)f(where)g(the)h +473 y Ft(accept-line)27 b(\(Newline)h(or)i(Return\))630 +582 y Fu(Accept)25 b(the)e(line)h(regardless)g(of)f(where)g(the)h (cursor)e(is.)39 b(If)23 b(this)g(line)h(is)f(non-empt)m(y)-8 b(,)26 b(add)c(it)630 692 y(to)27 b(the)f(history)g(list)h(according)g -(to)g(the)f(setting)i(of)e(the)g Fs(HISTCONTROL)d Ft(and)j -Fs(HISTIGNORE)630 802 y Ft(v)-5 b(ariables.)42 b(If)30 +(to)g(the)f(setting)i(of)e(the)g Ft(HISTCONTROL)d Fu(and)j +Ft(HISTIGNORE)630 802 y Fu(v)-5 b(ariables.)42 b(If)30 b(this)h(line)g(is)g(a)g(mo)s(di\014ed)e(history)i(line,)g(then)f (restore)i(the)f(history)f(line)h(to)630 911 y(its)g(original)g(state.) -150 1075 y Fs(previous-history)26 b(\(C-p\))630 1184 -y Ft(Mo)m(v)m(e)32 b(`bac)m(k')g(through)e(the)g(history)h(list,)g -(fetc)m(hing)g(the)g(previous)f(command.)150 1348 y Fs(next-history)d -(\(C-n\))630 1457 y Ft(Mo)m(v)m(e)32 b(`forw)m(ard')f(through)e(the)i +150 1075 y Ft(previous-history)26 b(\(C-p\))630 1184 +y Fu(Mo)m(v)m(e)32 b(`bac)m(k')g(through)e(the)g(history)h(list,)g +(fetc)m(hing)g(the)g(previous)f(command.)150 1348 y Ft(next-history)d +(\(C-n\))630 1457 y Fu(Mo)m(v)m(e)32 b(`forw)m(ard')f(through)e(the)i (history)f(list,)i(fetc)m(hing)f(the)g(next)f(command.)150 -1621 y Fs(beginning-of-history)25 b(\(M-<\))630 1730 -y Ft(Mo)m(v)m(e)32 b(to)g(the)e(\014rst)g(line)g(in)h(the)f(history)-8 -b(.)150 1894 y Fs(end-of-history)26 b(\(M->\))630 2004 -y Ft(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h(input)e(history)-8 +1621 y Ft(beginning-of-history)25 b(\(M-<\))630 1730 +y Fu(Mo)m(v)m(e)32 b(to)g(the)e(\014rst)g(line)g(in)h(the)f(history)-8 +b(.)150 1894 y Ft(end-of-history)26 b(\(M->\))630 2004 +y Fu(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h(input)e(history)-8 b(,)31 b(i.e.,)h(the)f(line)f(curren)m(tly)h(b)s(eing)f(en)m(tered.)150 -2167 y Fs(reverse-search-history)24 b(\(C-r\))630 2277 -y Ft(Searc)m(h)31 b(bac)m(kw)m(ard)h(starting)g(at)g(the)f(curren)m(t)g +2167 y Ft(reverse-search-history)24 b(\(C-r\))630 2277 +y Fu(Searc)m(h)31 b(bac)m(kw)m(ard)h(starting)g(at)g(the)f(curren)m(t)g (line)g(and)g(mo)m(ving)h(`up')e(through)h(the)g(his-)630 2386 y(tory)g(as)f(necessary)-8 b(.)42 b(This)29 b(is)i(an)f(incremen)m -(tal)i(searc)m(h.)150 2550 y Fs(forward-search-history)24 -b(\(C-s\))630 2659 y Ft(Searc)m(h)30 b(forw)m(ard)f(starting)h(at)g +(tal)i(searc)m(h.)150 2550 y Ft(forward-search-history)24 +b(\(C-s\))630 2659 y Fu(Searc)m(h)30 b(forw)m(ard)f(starting)h(at)g (the)g(curren)m(t)f(line)h(and)f(mo)m(ving)h(`do)m(wn')f(through)g(the) h(the)630 2769 y(history)g(as)h(necessary)-8 b(.)41 b(This)30 -b(is)g(an)h(incremen)m(tal)g(searc)m(h.)150 2932 y Fs +b(is)g(an)h(incremen)m(tal)g(searc)m(h.)150 2932 y Ft (non-incremental-reverse-)o(sear)o(ch-h)o(ist)o(ory)24 -b(\(M-p\))630 3042 y Ft(Searc)m(h)31 b(bac)m(kw)m(ard)h(starting)g(at)g +b(\(M-p\))630 3042 y Fu(Searc)m(h)31 b(bac)m(kw)m(ard)h(starting)g(at)g (the)f(curren)m(t)g(line)g(and)g(mo)m(ving)h(`up')e(through)h(the)g (his-)630 3152 y(tory)36 b(as)g(necessary)h(using)e(a)i(non-incremen)m (tal)g(searc)m(h)f(for)g(a)g(string)g(supplied)f(b)m(y)h(the)630 -3261 y(user.)150 3425 y Fs(non-incremental-forward-)o(sear)o(ch-h)o -(ist)o(ory)24 b(\(M-n\))630 3534 y Ft(Searc)m(h)30 b(forw)m(ard)f +3261 y(user.)150 3425 y Ft(non-incremental-forward-)o(sear)o(ch-h)o +(ist)o(ory)24 b(\(M-n\))630 3534 y Fu(Searc)m(h)30 b(forw)m(ard)f (starting)h(at)g(the)g(curren)m(t)f(line)h(and)f(mo)m(ving)h(`do)m(wn') f(through)g(the)h(the)630 3644 y(history)d(as)f(necessary)i(using)e(a)h (non-incremen)m(tal)g(searc)m(h)h(for)e(a)h(string)g(supplied)e(b)m(y)i -(the)630 3754 y(user.)150 3917 y Fs(history-search-forward)d(\(\))630 -4027 y Ft(Searc)m(h)42 b(forw)m(ard)f(through)f(the)i(history)f(for)g +(the)630 3754 y(user.)150 3917 y Ft(history-search-forward)d(\(\))630 +4027 y Fu(Searc)m(h)42 b(forw)m(ard)f(through)f(the)i(history)f(for)g (the)h(string)f(of)h(c)m(haracters)h(b)s(et)m(w)m(een)f(the)630 4136 y(start)36 b(of)h(the)f(curren)m(t)f(line)i(and)e(the)h(p)s(oin)m (t.)58 b(The)35 b(searc)m(h)i(string)e(m)m(ust)h(matc)m(h)h(at)g(the) 630 4246 y(b)s(eginning)32 b(of)g(a)h(history)g(line.)47 b(This)32 b(is)h(a)f(non-incremen)m(tal)i(searc)m(h.)48 b(By)33 b(default,)g(this)630 4355 y(command)d(is)h(un)m(b)s(ound.)150 -4519 y Fs(history-search-backward)24 b(\(\))630 4629 -y Ft(Searc)m(h)35 b(bac)m(kw)m(ard)g(through)f(the)h(history)g(for)g +4519 y Ft(history-search-backward)24 b(\(\))630 4629 +y Fu(Searc)m(h)35 b(bac)m(kw)m(ard)g(through)f(the)h(history)g(for)g (the)f(string)h(of)g(c)m(haracters)h(b)s(et)m(w)m(een)g(the)630 4738 y(start)g(of)h(the)f(curren)m(t)f(line)i(and)e(the)h(p)s(oin)m(t.) 58 b(The)35 b(searc)m(h)i(string)e(m)m(ust)h(matc)m(h)h(at)g(the)630 4848 y(b)s(eginning)32 b(of)g(a)h(history)g(line.)47 b(This)32 b(is)h(a)f(non-incremen)m(tal)i(searc)m(h.)48 b(By)33 b(default,)g(this)630 4957 y(command)d(is)h(un)m(b)s(ound.)150 -5121 y Fs(history-substr-search-fo)o(rwar)o(d)24 b(\(\))630 -5230 y Ft(Searc)m(h)42 b(forw)m(ard)f(through)f(the)i(history)f(for)g +5121 y Ft(history-substr-search-fo)o(rwar)o(d)24 b(\(\))630 +5230 y Fu(Searc)m(h)42 b(forw)m(ard)f(through)f(the)i(history)f(for)g (the)h(string)f(of)h(c)m(haracters)h(b)s(et)m(w)m(een)f(the)630 5340 y(start)29 b(of)g(the)g(curren)m(t)g(line)g(and)f(the)h(p)s(oin)m (t.)40 b(The)29 b(searc)m(h)g(string)g(ma)m(y)g(matc)m(h)h(an)m(ywhere) p eop end -%%Page: 118 124 -TeXDict begin 118 123 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(118)630 299 y(in)32 +%%Page: 117 123 +TeXDict begin 117 122 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(117)630 299 y(in)32 b(a)h(history)g(line.)47 b(This)32 b(is)g(a)h(non-incremen)m(tal)h (searc)m(h.)47 b(By)33 b(default,)h(this)e(command)630 -408 y(is)e(un)m(b)s(ound.)150 586 y Fs(history-substr-search-ba)o(ckwa) -o(rd)24 b(\(\))630 696 y Ft(Searc)m(h)35 b(bac)m(kw)m(ard)g(through)f +408 y(is)e(un)m(b)s(ound.)150 586 y Ft(history-substr-search-ba)o(ckwa) +o(rd)24 b(\(\))630 696 y Fu(Searc)m(h)35 b(bac)m(kw)m(ard)g(through)f (the)h(history)g(for)g(the)f(string)h(of)g(c)m(haracters)h(b)s(et)m(w)m (een)g(the)630 806 y(start)29 b(of)g(the)g(curren)m(t)g(line)g(and)f (the)h(p)s(oin)m(t.)40 b(The)29 b(searc)m(h)g(string)g(ma)m(y)g(matc)m (h)h(an)m(ywhere)630 915 y(in)i(a)h(history)g(line.)47 b(This)32 b(is)g(a)h(non-incremen)m(tal)h(searc)m(h.)47 b(By)33 b(default,)h(this)e(command)630 1025 y(is)e(un)m(b)s(ound.)150 -1203 y Fs(yank-nth-arg)d(\(M-C-y\))630 1312 y Ft(Insert)37 +1203 y Ft(yank-nth-arg)d(\(M-C-y\))630 1312 y Fu(Insert)37 b(the)g(\014rst)f(argumen)m(t)i(to)f(the)h(previous)e(command)h (\(usually)g(the)g(second)g(w)m(ord)630 1422 y(on)32 b(the)g(previous)f(line\))i(at)f(p)s(oin)m(t.)46 b(With)32 -b(an)g(argumen)m(t)g Fq(n)p Ft(,)g(insert)g(the)g Fq(n)p -Ft(th)f(w)m(ord)g(from)630 1531 y(the)k(previous)f(command)h(\(the)g(w) +b(an)g(argumen)m(t)g Fr(n)p Fu(,)g(insert)g(the)g Fr(n)p +Fu(th)f(w)m(ord)g(from)630 1531 y(the)k(previous)f(command)h(\(the)g(w) m(ords)g(in)f(the)h(previous)g(command)f(b)s(egin)h(with)f(w)m(ord)630 1641 y(0\).)69 b(A)40 b(negativ)m(e)h(argumen)m(t)f(inserts)g(the)f -Fq(n)p Ft(th)g(w)m(ord)g(from)g(the)h(end)f(of)h(the)f(previous)630 -1750 y(command.)48 b(Once)33 b(the)g(argumen)m(t)h Fq(n)e -Ft(is)h(computed,)h(the)f(argumen)m(t)g(is)g(extracted)i(as)e(if)630 -1860 y(the)e(`)p Fs(!)p Fi(n)11 b Ft(')29 b(history)i(expansion)f(had)g -(b)s(een)f(sp)s(eci\014ed.)150 2038 y Fs(yank-last-arg)e(\(M-.)i(or)h -(M-_\))630 2148 y Ft(Insert)k(last)i(argumen)m(t)g(to)g(the)f(previous) +Fr(n)p Fu(th)g(w)m(ord)g(from)g(the)h(end)f(of)h(the)f(previous)630 +1750 y(command.)48 b(Once)33 b(the)g(argumen)m(t)h Fr(n)e +Fu(is)h(computed,)h(the)f(argumen)m(t)g(is)g(extracted)i(as)e(if)630 +1860 y(the)e(`)p Ft(!)p Fj(n)p Fu(')f(history)g(expansion)g(had)g(b)s +(een)g(sp)s(eci\014ed.)150 2038 y Ft(yank-last-arg)d(\(M-.)i(or)h +(M-_\))630 2148 y Fu(Insert)k(last)i(argumen)m(t)g(to)g(the)f(previous) f(command)h(\(the)h(last)f(w)m(ord)g(of)g(the)g(previous)630 2257 y(history)e(en)m(try\).)51 b(With)34 b(a)g(n)m(umeric)g(argumen)m -(t,)h(b)s(eha)m(v)m(e)f(exactly)h(lik)m(e)g Fs(yank-nth-arg)p -Ft(.)630 2367 y(Successiv)m(e)26 b(calls)g(to)f Fs(yank-last-arg)c -Ft(mo)m(v)m(e)27 b(bac)m(k)e(through)f(the)h(history)g(list,)i +(t,)h(b)s(eha)m(v)m(e)f(exactly)h(lik)m(e)g Ft(yank-nth-arg)p +Fu(.)630 2367 y(Successiv)m(e)26 b(calls)g(to)f Ft(yank-last-arg)c +Fu(mo)m(v)m(e)27 b(bac)m(k)e(through)f(the)h(history)g(list,)i (inserting)630 2476 y(the)c(last)g(w)m(ord)f(\(or)h(the)g(w)m(ord)f(sp) s(eci\014ed)g(b)m(y)g(the)h(argumen)m(t)g(to)g(the)g(\014rst)f(call\))i (of)f(eac)m(h)h(line)630 2586 y(in)36 b(turn.)58 b(An)m(y)36 @@ -15780,155 +16279,156 @@ b(n)m(umeric)h(argumen)m(t)f(supplied)g(to)h(these)g(successiv)m(e)g (switc)m(hes)h(the)630 2805 y(direction)23 b(through)g(the)g(history)f (\(bac)m(k)i(or)f(forw)m(ard\).)38 b(The)22 b(history)h(expansion)g (facilities)630 2915 y(are)28 b(used)f(to)h(extract)h(the)f(last)g -(argumen)m(t,)h(as)e(if)h(the)g(`)p Fs(!$)p Ft(')f(history)g(expansion) +(argumen)m(t,)h(as)e(if)h(the)g(`)p Ft(!$)p Fu(')f(history)g(expansion) h(had)f(b)s(een)630 3024 y(sp)s(eci\014ed.)150 3242 y -Fj(8.4.3)63 b(Commands)42 b(F)-10 b(or)41 b(Changing)g(T)-10 -b(ext)150 3423 y Fs(delete-char)27 b(\(C-d\))630 3533 -y Ft(Delete)41 b(the)e(c)m(haracter)i(at)e(p)s(oin)m(t.)66 +Fk(8.4.3)63 b(Commands)42 b(F)-10 b(or)41 b(Changing)g(T)-10 +b(ext)150 3423 y Ft(delete-char)27 b(\(C-d\))630 3533 +y Fu(Delete)41 b(the)e(c)m(haracter)i(at)e(p)s(oin)m(t.)66 b(If)39 b(p)s(oin)m(t)f(is)h(at)h(the)f(b)s(eginning)f(of)h(the)g (line,)j(there)630 3642 y(are)37 b(no)g(c)m(haracters)i(in)d(the)i (line,)h(and)d(the)h(last)h(c)m(haracter)h(t)m(yp)s(ed)e(w)m(as)g(not)g -(b)s(ound)e(to)630 3752 y Fs(delete-char)p Ft(,)28 b(then)i(return)f -Fl(eof)p Ft(.)150 3930 y Fs(backward-delete-char)c(\(Rubout\))630 -4039 y Ft(Delete)32 b(the)f(c)m(haracter)g(b)s(ehind)e(the)h(cursor.)40 +(b)s(ound)e(to)630 3752 y Ft(delete-char)p Fu(,)28 b(then)i(return)f +Fm(eof)p Fu(.)150 3930 y Ft(backward-delete-char)c(\(Rubout\))630 +4039 y Fu(Delete)32 b(the)f(c)m(haracter)g(b)s(ehind)e(the)h(cursor.)40 b(A)30 b(n)m(umeric)g(argumen)m(t)h(means)f(to)h(kill)g(the)630 4149 y(c)m(haracters)h(instead)e(of)h(deleting)g(them.)150 -4327 y Fs(forward-backward-delete-)o(char)24 b(\(\))630 -4436 y Ft(Delete)40 b(the)f(c)m(haracter)h(under)c(the)j(cursor,)h +4327 y Ft(forward-backward-delete-)o(char)24 b(\(\))630 +4436 y Fu(Delete)40 b(the)f(c)m(haracter)h(under)c(the)j(cursor,)h (unless)d(the)i(cursor)e(is)h(at)h(the)g(end)e(of)i(the)630 4546 y(line,)33 b(in)e(whic)m(h)g(case)i(the)f(c)m(haracter)h(b)s (ehind)d(the)i(cursor)f(is)g(deleted.)46 b(By)32 b(default,)g(this)630 4655 y(is)e(not)h(b)s(ound)d(to)j(a)g(k)m(ey)-8 b(.)150 -4833 y Fs(quoted-insert)27 b(\(C-q)i(or)h(C-v\))630 4943 -y Ft(Add)j(the)i(next)f(c)m(haracter)i(t)m(yp)s(ed)e(to)h(the)f(line)h +4833 y Ft(quoted-insert)27 b(\(C-q)i(or)h(C-v\))630 4943 +y Fu(Add)j(the)i(next)f(c)m(haracter)i(t)m(yp)s(ed)e(to)h(the)f(line)h (v)m(erbatim.)53 b(This)33 b(is)i(ho)m(w)f(to)h(insert)f(k)m(ey)630 -5053 y(sequences)d(lik)m(e)g Fi(C-q)p Ft(,)f(for)g(example.)150 -5230 y Fs(self-insert)d(\(a,)j(b,)g(A,)f(1,)h(!,)g(...)o(\))630 -5340 y Ft(Insert)g(y)m(ourself.)p eop end -%%Page: 119 125 -TeXDict begin 119 124 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(119)150 299 y Fs(transpose-chars) -26 b(\(C-t\))630 408 y Ft(Drag)33 b(the)f(c)m(haracter)h(b)s(efore)f +5053 y(sequences)d(lik)m(e)g Fj(C-q)p Fu(,)f(for)g(example.)150 +5230 y Ft(self-insert)d(\(a,)j(b,)g(A,)f(1,)h(!,)g(...)o(\))630 +5340 y Fu(Insert)g(y)m(ourself.)p eop end +%%Page: 118 124 +TeXDict begin 118 123 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(118)150 299 y Ft(transpose-chars) +26 b(\(C-t\))630 408 y Fu(Drag)33 b(the)f(c)m(haracter)h(b)s(efore)f (the)g(cursor)f(forw)m(ard)h(o)m(v)m(er)h(the)f(c)m(haracter)i(at)e (the)g(cursor,)630 518 y(mo)m(ving)k(the)g(cursor)f(forw)m(ard)g(as)g (w)m(ell.)57 b(If)35 b(the)h(insertion)g(p)s(oin)m(t)f(is)g(at)i(the)e (end)g(of)h(the)630 628 y(line,)24 b(then)e(this)g(transp)s(oses)f(the) h(last)h(t)m(w)m(o)g(c)m(haracters)g(of)f(the)h(line.)38 b(Negativ)m(e)25 b(argumen)m(ts)630 737 y(ha)m(v)m(e)32 -b(no)e(e\013ect.)150 907 y Fs(transpose-words)c(\(M-t\))630 -1016 y Ft(Drag)33 b(the)g(w)m(ord)f(b)s(efore)g(p)s(oin)m(t)g(past)g +b(no)e(e\013ect.)150 907 y Ft(transpose-words)c(\(M-t\))630 +1016 y Fu(Drag)33 b(the)g(w)m(ord)f(b)s(efore)g(p)s(oin)m(t)g(past)g (the)h(w)m(ord)f(after)g(p)s(oin)m(t,)i(mo)m(ving)f(p)s(oin)m(t)f(past) g(that)630 1126 y(w)m(ord)c(as)h(w)m(ell.)41 b(If)27 b(the)i(insertion)f(p)s(oin)m(t)h(is)f(at)h(the)g(end)e(of)i(the)f (line,)i(this)e(transp)s(oses)g(the)630 1236 y(last)j(t)m(w)m(o)h(w)m -(ords)e(on)g(the)h(line.)150 1405 y Fs(upcase-word)c(\(M-u\))630 -1515 y Ft(Upp)s(ercase)32 b(the)g(curren)m(t)g(\(or)g(follo)m(wing\))i +(ords)e(on)g(the)h(line.)150 1405 y Ft(upcase-word)c(\(M-u\))630 +1515 y Fu(Upp)s(ercase)32 b(the)g(curren)m(t)g(\(or)g(follo)m(wing\))i (w)m(ord.)45 b(With)32 b(a)g(negativ)m(e)j(argumen)m(t,)e(upp)s(er-)630 1624 y(case)e(the)g(previous)f(w)m(ord,)g(but)g(do)g(not)h(mo)m(v)m(e)h -(the)e(cursor.)150 1794 y Fs(downcase-word)d(\(M-l\))630 -1904 y Ft(Lo)m(w)m(ercase)c(the)f(curren)m(t)f(\(or)h(follo)m(wing\))i +(the)e(cursor.)150 1794 y Ft(downcase-word)d(\(M-l\))630 +1904 y Fu(Lo)m(w)m(ercase)c(the)f(curren)m(t)f(\(or)h(follo)m(wing\))i (w)m(ord.)37 b(With)22 b(a)g(negativ)m(e)i(argumen)m(t,)g(lo)m(w)m (ercase)630 2013 y(the)31 b(previous)e(w)m(ord,)i(but)e(do)i(not)f(mo)m -(v)m(e)i(the)f(cursor.)150 2183 y Fs(capitalize-word)26 -b(\(M-c\))630 2292 y Ft(Capitalize)d(the)f(curren)m(t)f(\(or)g(follo)m +(v)m(e)i(the)f(cursor.)150 2183 y Ft(capitalize-word)26 +b(\(M-c\))630 2292 y Fu(Capitalize)d(the)f(curren)m(t)f(\(or)g(follo)m (wing\))i(w)m(ord.)38 b(With)21 b(a)h(negativ)m(e)h(argumen)m(t,)h (capitalize)630 2402 y(the)31 b(previous)e(w)m(ord,)i(but)e(do)i(not)f -(mo)m(v)m(e)i(the)f(cursor.)150 2571 y Fs(overwrite-mode)26 -b(\(\))630 2681 y Ft(T)-8 b(oggle)35 b(o)m(v)m(erwrite)g(mo)s(de.)48 +(mo)m(v)m(e)i(the)f(cursor.)150 2571 y Ft(overwrite-mode)26 +b(\(\))630 2681 y Fu(T)-8 b(oggle)35 b(o)m(v)m(erwrite)g(mo)s(de.)48 b(With)33 b(an)g(explicit)h(p)s(ositiv)m(e)g(n)m(umeric)f(argumen)m(t,) h(switc)m(hes)630 2791 y(to)22 b(o)m(v)m(erwrite)i(mo)s(de.)37 b(With)22 b(an)g(explicit)h(non-p)s(ositiv)m(e)f(n)m(umeric)g(argumen)m (t,)i(switc)m(hes)e(to)630 2900 y(insert)30 b(mo)s(de.)41 -b(This)30 b(command)h(a\013ects)h(only)e Fs(emacs)f Ft(mo)s(de;)i -Fs(vi)f Ft(mo)s(de)g(do)s(es)g(o)m(v)m(erwrite)630 3010 +b(This)30 b(command)h(a\013ects)h(only)e Ft(emacs)f Fu(mo)s(de;)i +Ft(vi)f Fu(mo)s(de)g(do)s(es)g(o)m(v)m(erwrite)630 3010 y(di\013eren)m(tly)-8 b(.)42 b(Eac)m(h)31 b(call)h(to)f -Fs(readline\(\))c Ft(starts)k(in)f(insert)g(mo)s(de.)630 -3149 y(In)e(o)m(v)m(erwrite)j(mo)s(de,)e(c)m(haracters)i(b)s(ound)c(to) -j Fs(self-insert)c Ft(replace)k(the)g(text)g(at)g(p)s(oin)m(t)630 -3259 y(rather)41 b(than)h(pushing)e(the)i(text)g(to)g(the)g(righ)m(t.) -75 b(Characters)42 b(b)s(ound)d(to)j Fs(backward-)630 -3369 y(delete-char)27 b Ft(replace)32 b(the)e(c)m(haracter)i(b)s(efore) -e(p)s(oin)m(t)h(with)f(a)g(space.)630 3508 y(By)h(default,)f(this)h -(command)f(is)g(un)m(b)s(ound.)150 3718 y Fj(8.4.4)63 -b(Killing)42 b(And)e(Y)-10 b(anking)150 3895 y Fs(kill-line)28 -b(\(C-k\))630 4004 y Ft(Kill)j(the)f(text)i(from)e(p)s(oin)m(t)g(to)h -(the)g(end)e(of)i(the)f(line.)150 4174 y Fs(backward-kill-line)25 -b(\(C-x)30 b(Rubout\))630 4283 y Ft(Kill)h(bac)m(kw)m(ard)g(to)g(the)f -(b)s(eginning)g(of)g(the)h(line.)150 4453 y Fs(unix-line-discard)26 -b(\(C-u\))630 4562 y Ft(Kill)31 b(bac)m(kw)m(ard)g(from)e(the)i(cursor) -f(to)h(the)f(b)s(eginning)g(of)h(the)f(curren)m(t)g(line.)150 -4732 y Fs(kill-whole-line)c(\(\))630 4842 y Ft(Kill)37 -b(all)g(c)m(haracters)h(on)f(the)f(curren)m(t)h(line,)h(no)f(matter)g -(where)f(p)s(oin)m(t)h(is.)59 b(By)36 b(default,)630 -4951 y(this)30 b(is)h(un)m(b)s(ound.)150 5121 y Fs(kill-word)d(\(M-d\)) -630 5230 y Ft(Kill)i(from)f(p)s(oin)m(t)g(to)h(the)g(end)e(of)i(the)f +Ft(readline\(\))c Fu(starts)k(in)f(insert)g(mo)s(de.)630 +3149 y(In)52 b(o)m(v)m(erwrite)h(mo)s(de,)58 b(c)m(haracters)c(b)s +(ound)c(to)j Ft(self-insert)c Fu(replace)k(the)g(text)g(at)630 +3259 y(p)s(oin)m(t)59 b(rather)f(than)h(pushing)e(the)i(text)g(to)h +(the)f(righ)m(t.)126 b(Characters)59 b(b)s(ound)d(to)630 +3369 y Ft(backward-delete-char)25 b Fu(replace)31 b(the)g(c)m(haracter) +h(b)s(efore)e(p)s(oin)m(t)g(with)g(a)h(space.)630 3508 +y(By)g(default,)f(this)h(command)f(is)g(un)m(b)s(ound.)150 +3718 y Fk(8.4.4)63 b(Killing)42 b(And)e(Y)-10 b(anking)150 +3895 y Ft(kill-line)28 b(\(C-k\))630 4004 y Fu(Kill)j(the)f(text)i +(from)e(p)s(oin)m(t)g(to)h(the)g(end)e(of)i(the)f(line.)150 +4174 y Ft(backward-kill-line)25 b(\(C-x)30 b(Rubout\))630 +4283 y Fu(Kill)h(bac)m(kw)m(ard)g(to)g(the)f(b)s(eginning)g(of)g(the)h +(line.)150 4453 y Ft(unix-line-discard)26 b(\(C-u\))630 +4562 y Fu(Kill)31 b(bac)m(kw)m(ard)g(from)e(the)i(cursor)f(to)h(the)f +(b)s(eginning)g(of)h(the)f(curren)m(t)g(line.)150 4732 +y Ft(kill-whole-line)c(\(\))630 4842 y Fu(Kill)37 b(all)g(c)m +(haracters)h(on)f(the)f(curren)m(t)h(line,)h(no)f(matter)g(where)f(p)s +(oin)m(t)h(is.)59 b(By)36 b(default,)630 4951 y(this)30 +b(is)h(un)m(b)s(ound.)150 5121 y Ft(kill-word)d(\(M-d\))630 +5230 y Fu(Kill)i(from)f(p)s(oin)m(t)g(to)h(the)g(end)e(of)i(the)f (curren)m(t)h(w)m(ord,)f(or)g(if)h(b)s(et)m(w)m(een)g(w)m(ords,)f(to)h (the)g(end)630 5340 y(of)h(the)f(next)h(w)m(ord.)40 b(W)-8 -b(ord)31 b(b)s(oundaries)e(are)h(the)h(same)g(as)f Fs(forward-word)p -Ft(.)p eop end -%%Page: 120 126 -TeXDict begin 120 125 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(120)150 299 y Fs -(backward-kill-word)25 b(\(M-DEL\))630 408 y Ft(Kill)k(the)g(w)m(ord)g +b(ord)31 b(b)s(oundaries)e(are)h(the)h(same)g(as)f Ft(forward-word)p +Fu(.)p eop end +%%Page: 119 125 +TeXDict begin 119 124 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(119)150 299 y Ft +(backward-kill-word)25 b(\(M-DEL\))630 408 y Fu(Kill)k(the)g(w)m(ord)g (b)s(ehind)e(p)s(oin)m(t.)40 b(W)-8 b(ord)29 b(b)s(oundaries)f(are)h -(the)g(same)g(as)g Fs(backward-word)p Ft(.)150 569 y -Fs(shell-kill-word)d(\(\))630 679 y Ft(Kill)k(from)f(p)s(oin)m(t)g(to)h +(the)g(same)g(as)g Ft(backward-word)p Fu(.)150 569 y +Ft(shell-kill-word)d(\(\))630 679 y Fu(Kill)k(from)f(p)s(oin)m(t)g(to)h (the)g(end)e(of)i(the)f(curren)m(t)h(w)m(ord,)f(or)g(if)h(b)s(et)m(w)m (een)g(w)m(ords,)f(to)h(the)g(end)630 788 y(of)h(the)f(next)h(w)m(ord.) 40 b(W)-8 b(ord)31 b(b)s(oundaries)e(are)h(the)h(same)g(as)f -Fs(shell-forward-word)p Ft(.)150 949 y Fs(shell-backward-kill-word)24 -b(\(\))630 1059 y Ft(Kill)e(the)h(w)m(ord)e(b)s(ehind)g(p)s(oin)m(t.)38 +Ft(shell-forward-word)p Fu(.)150 949 y Ft(shell-backward-kill-word)24 +b(\(\))630 1059 y Fu(Kill)e(the)h(w)m(ord)e(b)s(ehind)g(p)s(oin)m(t.)38 b(W)-8 b(ord)22 b(b)s(oundaries)f(are)h(the)g(same)h(as)f -Fs(shell-backward-)630 1168 y(word)p Ft(.)150 1329 y -Fs(unix-word-rubout)k(\(C-w\))630 1438 y Ft(Kill)32 b(the)g(w)m(ord)f +Ft(shell-backward-)630 1168 y(word)p Fu(.)150 1329 y +Ft(unix-word-rubout)k(\(C-w\))630 1438 y Fu(Kill)32 b(the)g(w)m(ord)f (b)s(ehind)f(p)s(oin)m(t,)i(using)f(white)h(space)g(as)g(a)g(w)m(ord)f (b)s(oundary)-8 b(.)43 b(The)31 b(killed)630 1548 y(text)g(is)g(sa)m(v) -m(ed)g(on)g(the)f(kill-ring.)150 1709 y Fs(unix-filename-rubout)25 -b(\(\))630 1818 y Ft(Kill)37 b(the)f(w)m(ord)g(b)s(ehind)f(p)s(oin)m +m(ed)g(on)g(the)f(kill-ring.)150 1709 y Ft(unix-filename-rubout)25 +b(\(\))630 1818 y Fu(Kill)37 b(the)f(w)m(ord)g(b)s(ehind)f(p)s(oin)m (t,)j(using)e(white)g(space)h(and)f(the)g(slash)g(c)m(haracter)i(as)f (the)630 1928 y(w)m(ord)30 b(b)s(oundaries.)39 b(The)30 b(killed)h(text)g(is)g(sa)m(v)m(ed)g(on)g(the)f(kill-ring.)150 -2089 y Fs(delete-horizontal-space)24 b(\(\))630 2198 -y Ft(Delete)33 b(all)e(spaces)g(and)e(tabs)i(around)e(p)s(oin)m(t.)41 +2089 y Ft(delete-horizontal-space)24 b(\(\))630 2198 +y Fu(Delete)33 b(all)e(spaces)g(and)e(tabs)i(around)e(p)s(oin)m(t.)41 b(By)31 b(default,)f(this)h(is)f(un)m(b)s(ound.)150 2359 -y Fs(kill-region)d(\(\))630 2469 y Ft(Kill)k(the)f(text)i(in)e(the)g +y Ft(kill-region)d(\(\))630 2469 y Fu(Kill)k(the)f(text)i(in)e(the)g (curren)m(t)h(region.)41 b(By)31 b(default,)f(this)h(command)f(is)g(un) -m(b)s(ound.)150 2629 y Fs(copy-region-as-kill)25 b(\(\))630 -2739 y Ft(Cop)m(y)34 b(the)g(text)h(in)f(the)g(region)g(to)h(the)f +m(b)s(ound.)150 2629 y Ft(copy-region-as-kill)25 b(\(\))630 +2739 y Fu(Cop)m(y)34 b(the)g(text)h(in)f(the)g(region)g(to)h(the)f (kill)h(bu\013er,)f(so)g(it)h(can)f(b)s(e)f(y)m(ank)m(ed)i(righ)m(t)f (a)m(w)m(a)m(y)-8 b(.)630 2848 y(By)31 b(default,)f(this)h(command)f -(is)g(un)m(b)s(ound.)150 3009 y Fs(copy-backward-word)25 -b(\(\))630 3119 y Ft(Cop)m(y)38 b(the)h(w)m(ord)f(b)s(efore)g(p)s(oin)m +(is)g(un)m(b)s(ound.)150 3009 y Ft(copy-backward-word)25 +b(\(\))630 3119 y Fu(Cop)m(y)38 b(the)h(w)m(ord)f(b)s(efore)g(p)s(oin)m (t)g(to)i(the)e(kill)h(bu\013er.)64 b(The)38 b(w)m(ord)g(b)s(oundaries) -f(are)i(the)630 3228 y(same)31 b(as)f Fs(backward-word)p -Ft(.)38 b(By)30 b(default,)h(this)f(command)g(is)h(un)m(b)s(ound.)150 -3389 y Fs(copy-forward-word)26 b(\(\))630 3499 y Ft(Cop)m(y)31 +f(are)i(the)630 3228 y(same)31 b(as)f Ft(backward-word)p +Fu(.)38 b(By)30 b(default,)h(this)f(command)g(is)h(un)m(b)s(ound.)150 +3389 y Ft(copy-forward-word)26 b(\(\))630 3499 y Fu(Cop)m(y)31 b(the)g(w)m(ord)g(follo)m(wing)h(p)s(oin)m(t)f(to)h(the)f(kill)h (bu\013er.)42 b(The)30 b(w)m(ord)h(b)s(oundaries)e(are)j(the)630 -3608 y(same)f(as)f Fs(forward-word)p Ft(.)38 b(By)30 +3608 y(same)f(as)f Ft(forward-word)p Fu(.)38 b(By)30 b(default,)h(this)g(command)f(is)g(un)m(b)s(ound.)150 -3769 y Fs(yank)f(\(C-y\))630 3878 y Ft(Y)-8 b(ank)31 +3769 y Ft(yank)f(\(C-y\))630 3878 y Fu(Y)-8 b(ank)31 b(the)f(top)h(of)g(the)f(kill)h(ring)f(in)m(to)i(the)e(bu\013er)g(at)h -(p)s(oin)m(t.)150 4039 y Fs(yank-pop)d(\(M-y\))630 4149 -y Ft(Rotate)36 b(the)f(kill-ring,)i(and)d(y)m(ank)h(the)f(new)g(top.)54 +(p)s(oin)m(t.)150 4039 y Ft(yank-pop)d(\(M-y\))630 4149 +y Fu(Rotate)36 b(the)f(kill-ring,)i(and)d(y)m(ank)h(the)f(new)g(top.)54 b(Y)-8 b(ou)35 b(can)g(only)f(do)h(this)f(if)h(the)g(prior)630 -4258 y(command)30 b(is)h Fs(yank)e Ft(or)h Fs(yank-pop)p -Ft(.)150 4459 y Fj(8.4.5)63 b(Sp)s(ecifying)42 b(Numeric)f(Argumen)m -(ts)150 4631 y Fs(digit-argument)26 b(\()p Fi(M-0)p Fs(,)j -Fi(M-1)p Fs(,)h(...)f Fi(M--)p Fs(\))630 4741 y Ft(Add)d(this)h(digit)g +4258 y(command)30 b(is)h Ft(yank)e Fu(or)h Ft(yank-pop)p +Fu(.)150 4459 y Fk(8.4.5)63 b(Sp)s(ecifying)42 b(Numeric)f(Argumen)m +(ts)150 4631 y Ft(digit-argument)26 b(\()p Fj(M-0)p Ft(,)j +Fj(M-1)p Ft(,)h(...)f Fj(M--)p Ft(\))630 4741 y Fu(Add)d(this)h(digit)g (to)h(the)f(argumen)m(t)g(already)h(accum)m(ulating,)h(or)e(start)h(a)f -(new)f(argumen)m(t.)630 4851 y Fi(M--)j Ft(starts)i(a)g(negativ)m(e)i -(argumen)m(t.)150 5011 y Fs(universal-argument)25 b(\(\))630 -5121 y Ft(This)g(is)g(another)h(w)m(a)m(y)g(to)h(sp)s(ecify)e(an)g +(new)f(argumen)m(t.)630 4851 y Fj(M--)j Fu(starts)i(a)g(negativ)m(e)i +(argumen)m(t.)150 5011 y Ft(universal-argument)25 b(\(\))630 +5121 y Fu(This)g(is)g(another)h(w)m(a)m(y)g(to)h(sp)s(ecify)e(an)g (argumen)m(t.)40 b(If)25 b(this)g(command)h(is)f(follo)m(w)m(ed)i(b)m (y)f(one)630 5230 y(or)k(more)f(digits,)i(optionally)g(with)e(a)h (leading)h(min)m(us)e(sign,)h(those)g(digits)g(de\014ne)f(the)h(ar-)630 5340 y(gumen)m(t.)41 b(If)28 b(the)i(command)f(is)g(follo)m(w)m(ed)h(b) -m(y)f(digits,)i(executing)f Fs(universal-argument)p eop +m(y)f(digits,)i(executing)f Ft(universal-argument)p eop end -%%Page: 121 127 -TeXDict begin 121 126 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(121)630 299 y(again)33 +%%Page: 120 126 +TeXDict begin 120 125 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(120)630 299 y(again)33 b(ends)e(the)h(n)m(umeric)f(argumen)m(t,)i(but)e(is)h(otherwise)g (ignored.)45 b(As)32 b(a)g(sp)s(ecial)h(case,)630 408 y(if)g(this)g(command)f(is)h(immediately)h(follo)m(w)m(ed)h(b)m(y)d(a)h @@ -15940,304 +16440,304 @@ y(or)28 b(min)m(us)f(sign,)i(the)f(argumen)m(t)g(coun)m(t)h(for)e(the)i 737 y(mak)m(es)d(the)e(argumen)m(t)i(coun)m(t)f(four,)f(a)i(second)e (time)i(mak)m(es)f(the)g(argumen)m(t)g(coun)m(t)h(six-)630 847 y(teen,)e(and)f(so)h(on.)40 b(By)31 b(default,)g(this)f(is)g(not)h -(b)s(ound)d(to)j(a)g(k)m(ey)-8 b(.)150 1052 y Fj(8.4.6)63 +(b)s(ound)d(to)j(a)g(k)m(ey)-8 b(.)150 1052 y Fk(8.4.6)63 b(Letting)40 b(Readline)h(T)m(yp)s(e)g(F)-10 b(or)42 -b(Y)-10 b(ou)150 1226 y Fs(complete)28 b(\(TAB\))630 -1336 y Ft(A)m(ttempt)c(to)f(p)s(erform)e(completion)j(on)f(the)g(text)g +b(Y)-10 b(ou)150 1226 y Ft(complete)28 b(\(TAB\))630 +1336 y Fu(A)m(ttempt)c(to)f(p)s(erform)e(completion)j(on)f(the)g(text)g (b)s(efore)f(p)s(oin)m(t.)39 b(The)22 b(actual)i(completion)630 1445 y(p)s(erformed)33 b(is)h(application-sp)s(eci\014c.)53 b(Bash)35 b(attempts)g(completion)g(treating)h(the)e(text)630 1555 y(as)39 b(a)h(v)-5 b(ariable)39 b(\(if)h(the)f(text)h(b)s(egins)e -(with)h(`)p Fs($)p Ft('\),)j(username)c(\(if)i(the)f(text)h(b)s(egins)e -(with)630 1665 y(`)p Fs(~)p Ft('\),)31 b(hostname)f(\(if)g(the)g(text)h -(b)s(egins)e(with)h(`)p Fs(@)p Ft('\),)h(or)f(command)f(\(including)h +(with)h(`)p Ft($)p Fu('\),)j(username)c(\(if)i(the)f(text)h(b)s(egins)e +(with)630 1665 y(`)p Ft(~)p Fu('\),)31 b(hostname)f(\(if)g(the)g(text)h +(b)s(egins)e(with)h(`)p Ft(@)p Fu('\),)h(or)f(command)f(\(including)h (aliases)i(and)630 1774 y(functions\))j(in)f(turn.)53 b(If)34 b(none)g(of)h(these)h(pro)s(duces)d(a)i(matc)m(h,)i(\014lename) -e(completion)h(is)630 1884 y(attempted.)150 2049 y Fs -(possible-completions)25 b(\(M-?\))630 2158 y Ft(List)35 +e(completion)h(is)630 1884 y(attempted.)150 2049 y Ft +(possible-completions)25 b(\(M-?\))630 2158 y Fu(List)35 b(the)g(p)s(ossible)f(completions)i(of)e(the)h(text)h(b)s(efore)e(p)s (oin)m(t.)54 b(When)34 b(displa)m(ying)h(com-)630 2268 y(pletions,)f(Readline)f(sets)f(the)h(n)m(um)m(b)s(er)e(of)i(columns)f (used)f(for)i(displa)m(y)f(to)h(the)g(v)-5 b(alue)33 -b(of)630 2378 y Fs(completion-display-width)o Ft(,)g(the)j(v)-5 +b(of)630 2378 y Ft(completion-display-width)o Fu(,)g(the)j(v)-5 b(alue)37 b(of)g(the)f(en)m(vironmen)m(t)h(v)-5 b(ariable)38 -b Fs(COLUMNS)p Ft(,)630 2487 y(or)30 b(the)h(screen)f(width,)g(in)g -(that)h(order.)150 2652 y Fs(insert-completions)25 b(\(M-*\))630 -2762 y Ft(Insert)30 b(all)h(completions)h(of)f(the)g(text)g(b)s(efore)f +b Ft(COLUMNS)p Fu(,)630 2487 y(or)30 b(the)h(screen)f(width,)g(in)g +(that)h(order.)150 2652 y Ft(insert-completions)25 b(\(M-*\))630 +2762 y Fu(Insert)30 b(all)h(completions)h(of)f(the)g(text)g(b)s(efore)f (p)s(oin)m(t)h(that)g(w)m(ould)f(ha)m(v)m(e)i(b)s(een)e(generated)630 -2871 y(b)m(y)g Fs(possible-completions)p Ft(.)150 3036 -y Fs(menu-complete)d(\(\))630 3146 y Ft(Similar)d(to)g -Fs(complete)p Ft(,)f(but)h(replaces)g(the)g(w)m(ord)g(to)g(b)s(e)f +2871 y(b)m(y)g Ft(possible-completions)p Fu(.)150 3036 +y Ft(menu-complete)d(\(\))630 3146 y Fu(Similar)d(to)g +Ft(complete)p Fu(,)f(but)h(replaces)g(the)g(w)m(ord)g(to)g(b)s(e)f (completed)i(with)e(a)i(single)f(matc)m(h)630 3255 y(from)37 b(the)h(list)h(of)f(p)s(ossible)f(completions.)64 b(Rep)s(eated)39 -b(execution)g(of)f Fs(menu-complete)630 3365 y Ft(steps)i(through)g +b(execution)g(of)f Ft(menu-complete)630 3365 y Fu(steps)i(through)g (the)g(list)h(of)f(p)s(ossible)g(completions,)k(inserting)c(eac)m(h)i (matc)m(h)f(in)f(turn.)630 3475 y(A)m(t)e(the)f(end)f(of)h(the)g(list)g (of)g(completions,)i(the)e(b)s(ell)g(is)g(rung)f(\(sub)5 -b(ject)36 b(to)i(the)f(setting)630 3584 y(of)f Fs(bell-style)p -Ft(\))e(and)h(the)h(original)i(text)f(is)f(restored.)57 -b(An)36 b(argumen)m(t)h(of)f Fq(n)f Ft(mo)m(v)m(es)i -Fq(n)630 3694 y Ft(p)s(ositions)e(forw)m(ard)f(in)g(the)h(list)h(of)e +b(ject)36 b(to)i(the)f(setting)630 3584 y(of)f Ft(bell-style)p +Fu(\))e(and)h(the)h(original)i(text)f(is)f(restored.)57 +b(An)36 b(argumen)m(t)h(of)f Fr(n)f Fu(mo)m(v)m(es)i +Fr(n)630 3694 y Fu(p)s(ositions)e(forw)m(ard)f(in)g(the)h(list)h(of)e (matc)m(hes;)39 b(a)c(negativ)m(e)i(argumen)m(t)e(ma)m(y)g(b)s(e)f (used)g(to)630 3803 y(mo)m(v)m(e)40 b(bac)m(kw)m(ard)e(through)g(the)g (list.)65 b(This)38 b(command)g(is)g(in)m(tended)g(to)h(b)s(e)f(b)s -(ound)e(to)630 3913 y Fs(TAB)p Ft(,)30 b(but)f(is)i(un)m(b)s(ound)d(b)m -(y)i(default.)150 4078 y Fs(menu-complete-backward)24 -b(\(\))630 4188 y Ft(Iden)m(tical)36 b(to)g Fs(menu-complete)p -Ft(,)d(but)h(mo)m(v)m(es)j(bac)m(kw)m(ard)e(through)f(the)i(list)f(of)g -(p)s(ossible)630 4297 y(completions,)d(as)e(if)h Fs(menu-complete)26 -b Ft(had)k(b)s(een)g(giv)m(en)h(a)g(negativ)m(e)i(argumen)m(t.)150 -4462 y Fs(delete-char-or-list)25 b(\(\))630 4572 y Ft(Deletes)k(the)e -(c)m(haracter)h(under)e(the)h(cursor)f(if)h(not)g(at)g(the)g(b)s -(eginning)g(or)f(end)h(of)g(the)g(line)630 4681 y(\(lik)m(e)k -Fs(delete-char)p Ft(\).)37 b(If)29 b(at)h(the)f(end)f(of)i(the)f(line,) -h(b)s(eha)m(v)m(es)g(iden)m(tically)h(to)e Fs(possible-)630 -4791 y(completions)p Ft(.)38 b(This)29 b(command)h(is)h(un)m(b)s(ound)d -(b)m(y)i(default.)150 4956 y Fs(complete-filename)c(\(M-/\))630 -5065 y Ft(A)m(ttempt)32 b(\014lename)e(completion)i(on)e(the)h(text)g -(b)s(efore)f(p)s(oin)m(t.)150 5230 y Fs(possible-filename-comple)o -(tion)o(s)24 b(\(C-x)30 b(/\))630 5340 y Ft(List)f(the)g(p)s(ossible)f +(ound)e(to)630 3913 y Ft(TAB)p Fu(,)30 b(but)f(is)i(un)m(b)s(ound)d(b)m +(y)i(default.)150 4078 y Ft(menu-complete-backward)24 +b(\(\))630 4188 y Fu(Iden)m(tical)36 b(to)g Ft(menu-complete)p +Fu(,)d(but)h(mo)m(v)m(es)j(bac)m(kw)m(ard)e(through)f(the)i(list)f(of)g +(p)s(ossible)630 4297 y(completions,)d(as)e(if)h Ft(menu-complete)26 +b Fu(had)k(b)s(een)g(giv)m(en)h(a)g(negativ)m(e)i(argumen)m(t.)150 +4462 y Ft(delete-char-or-list)25 b(\(\))630 4572 y Fu(Deletes)41 +b(the)e(c)m(haracter)h(under)e(the)h(cursor)f(if)h(not)g(at)g(the)h(b)s +(eginning)e(or)h(end)f(of)h(the)630 4681 y(line)50 b(\(lik)m(e)h +Ft(delete-char)p Fu(\).)96 b(If)49 b(at)h(the)g(end)f(of)h(the)f(line,) +55 b(b)s(eha)m(v)m(es)c(iden)m(tically)g(to)630 4791 +y Ft(possible-completions)p Fu(.)35 b(This)30 b(command)g(is)g(un)m(b)s +(ound)e(b)m(y)i(default.)150 4956 y Ft(complete-filename)c(\(M-/\))630 +5065 y Fu(A)m(ttempt)32 b(\014lename)e(completion)i(on)e(the)h(text)g +(b)s(efore)f(p)s(oin)m(t.)150 5230 y Ft(possible-filename-comple)o +(tion)o(s)24 b(\(C-x)30 b(/\))630 5340 y Fu(List)f(the)g(p)s(ossible)f (completions)h(of)g(the)g(text)g(b)s(efore)g(p)s(oin)m(t,)g(treating)h (it)f(as)g(a)f(\014lename.)p eop end -%%Page: 122 128 -TeXDict begin 122 127 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(122)150 299 y Fs -(complete-username)26 b(\(M-~\))630 408 y Ft(A)m(ttempt)32 +%%Page: 121 127 +TeXDict begin 121 126 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(121)150 299 y Ft +(complete-username)26 b(\(M-~\))630 408 y Fu(A)m(ttempt)32 b(completion)f(on)g(the)f(text)i(b)s(efore)e(p)s(oin)m(t,)g(treating)i -(it)f(as)f(a)h(username.)150 569 y Fs(possible-username-comple)o(tion)o -(s)24 b(\(C-x)30 b(~\))630 679 y Ft(List)25 b(the)g(p)s(ossible)g +(it)f(as)f(a)h(username.)150 569 y Ft(possible-username-comple)o(tion)o +(s)24 b(\(C-x)30 b(~\))630 679 y Fu(List)25 b(the)g(p)s(ossible)g (completions)h(of)f(the)g(text)h(b)s(efore)f(p)s(oin)m(t,)h(treating)g -(it)g(as)f(a)g(username.)150 839 y Fs(complete-variable)h(\(M-$\))630 -949 y Ft(A)m(ttempt)32 b(completion)f(on)g(the)f(text)i(b)s(efore)e(p)s +(it)g(as)f(a)g(username.)150 839 y Ft(complete-variable)h(\(M-$\))630 +949 y Fu(A)m(ttempt)32 b(completion)f(on)g(the)f(text)i(b)s(efore)e(p)s (oin)m(t,)g(treating)i(it)f(as)f(a)h(shell)g(v)-5 b(ariable.)150 -1110 y Fs(possible-variable-comple)o(tion)o(s)24 b(\(C-x)30 -b($\))630 1219 y Ft(List)42 b(the)g(p)s(ossible)g(completions)h(of)f +1110 y Ft(possible-variable-comple)o(tion)o(s)24 b(\(C-x)30 +b($\))630 1219 y Fu(List)42 b(the)g(p)s(ossible)g(completions)h(of)f (the)g(text)h(b)s(efore)e(p)s(oin)m(t,)46 b(treating)d(it)f(as)g(a)h -(shell)630 1329 y(v)-5 b(ariable.)150 1490 y Fs(complete-hostname)26 -b(\(M-@\))630 1599 y Ft(A)m(ttempt)32 b(completion)f(on)g(the)f(text)i +(shell)630 1329 y(v)-5 b(ariable.)150 1490 y Ft(complete-hostname)26 +b(\(M-@\))630 1599 y Fu(A)m(ttempt)32 b(completion)f(on)g(the)f(text)i (b)s(efore)e(p)s(oin)m(t,)g(treating)i(it)f(as)f(a)h(hostname.)150 -1760 y Fs(possible-hostname-comple)o(tion)o(s)24 b(\(C-x)30 -b(@\))630 1869 y Ft(List)25 b(the)g(p)s(ossible)f(completions)h(of)g +1760 y Ft(possible-hostname-comple)o(tion)o(s)24 b(\(C-x)30 +b(@\))630 1869 y Fu(List)25 b(the)g(p)s(ossible)f(completions)h(of)g (the)g(text)g(b)s(efore)g(p)s(oin)m(t,)h(treating)g(it)f(as)f(a)h -(hostname.)150 2030 y Fs(complete-command)h(\(M-!\))630 -2140 y Ft(A)m(ttempt)32 b(completion)g(on)f(the)g(text)h(b)s(efore)e(p) +(hostname.)150 2030 y Ft(complete-command)h(\(M-!\))630 +2140 y Fu(A)m(ttempt)32 b(completion)g(on)f(the)g(text)h(b)s(efore)e(p) s(oin)m(t,)h(treating)h(it)g(as)f(a)g(command)g(name.)630 2249 y(Command)46 b(completion)i(attempts)g(to)f(matc)m(h)h(the)f(text) h(against)g(aliases,)53 b(reserv)m(ed)630 2359 y(w)m(ords,)36 b(shell)g(functions,)h(shell)e(builtins,)i(and)e(\014nally)g (executable)i(\014lenames,)g(in)e(that)630 2469 y(order.)150 -2629 y Fs(possible-command-complet)o(ions)24 b(\(C-x)29 -b(!\))630 2739 y Ft(List)d(the)h(p)s(ossible)f(completions)h(of)f(the)h +2629 y Ft(possible-command-complet)o(ions)24 b(\(C-x)29 +b(!\))630 2739 y Fu(List)d(the)h(p)s(ossible)f(completions)h(of)f(the)h (text)g(b)s(efore)f(p)s(oin)m(t,)h(treating)g(it)g(as)g(a)f(command)630 -2848 y(name.)150 3009 y Fs(dynamic-complete-history)e(\(M-TAB\))630 -3119 y Ft(A)m(ttempt)31 b(completion)h(on)e(the)g(text)h(b)s(efore)f(p) +2848 y(name.)150 3009 y Ft(dynamic-complete-history)e(\(M-TAB\))630 +3119 y Fu(A)m(ttempt)31 b(completion)h(on)e(the)g(text)h(b)s(efore)f(p) s(oin)m(t,)g(comparing)h(the)f(text)h(against)h(lines)630 3228 y(from)e(the)g(history)h(list)g(for)f(p)s(ossible)g(completion)i -(matc)m(hes.)150 3389 y Fs(dabbrev-expand)26 b(\(\))630 -3499 y Ft(A)m(ttempt)i(men)m(u)e(completion)i(on)f(the)g(text)g(b)s +(matc)m(hes.)150 3389 y Ft(dabbrev-expand)26 b(\(\))630 +3499 y Fu(A)m(ttempt)i(men)m(u)e(completion)i(on)f(the)g(text)g(b)s (efore)f(p)s(oin)m(t,)i(comparing)f(the)g(text)h(against)630 3608 y(lines)j(from)e(the)i(history)f(list)h(for)g(p)s(ossible)e -(completion)j(matc)m(hes.)150 3769 y Fs(complete-into-braces)25 -b(\(M-{\))630 3878 y Ft(P)m(erform)f(\014lename)f(completion)i(and)f +(completion)j(matc)m(hes.)150 3769 y Ft(complete-into-braces)25 +b(\(M-{\))630 3878 y Fu(P)m(erform)f(\014lename)f(completion)i(and)f (insert)f(the)h(list)g(of)g(p)s(ossible)f(completions)i(enclosed)630 3988 y(within)34 b(braces)h(so)f(the)h(list)g(is)g(a)m(v)-5 b(ailable)37 b(to)e(the)g(shell)g(\(see)g(Section)h(3.5.1)g([Brace)g (Ex-)630 4098 y(pansion],)30 b(page)h(21\).)150 4298 -y Fj(8.4.7)63 b(Keyb)s(oard)41 b(Macros)150 4471 y Fs(start-kbd-macro) -26 b(\(C-x)j(\(\))630 4580 y Ft(Begin)i(sa)m(ving)h(the)e(c)m +y Fk(8.4.7)63 b(Keyb)s(oard)41 b(Macros)150 4471 y Ft(start-kbd-macro) +26 b(\(C-x)j(\(\))630 4580 y Fu(Begin)i(sa)m(ving)h(the)e(c)m (haracters)i(t)m(yp)s(ed)e(in)m(to)h(the)g(curren)m(t)f(k)m(eyb)s(oard) -g(macro.)150 4741 y Fs(end-kbd-macro)d(\(C-x)i(\)\))630 -4851 y Ft(Stop)e(sa)m(ving)h(the)g(c)m(haracters)g(t)m(yp)s(ed)f(in)m +g(macro.)150 4741 y Ft(end-kbd-macro)d(\(C-x)i(\)\))630 +4851 y Fu(Stop)e(sa)m(ving)h(the)g(c)m(haracters)g(t)m(yp)s(ed)f(in)m (to)i(the)e(curren)m(t)g(k)m(eyb)s(oard)g(macro)h(and)f(sa)m(v)m(e)i -(the)630 4960 y(de\014nition.)150 5121 y Fs(call-last-kbd-macro)c -(\(C-x)k(e\))630 5230 y Ft(Re-execute)37 b(the)e(last)h(k)m(eyb)s(oard) +(the)630 4960 y(de\014nition.)150 5121 y Ft(call-last-kbd-macro)c +(\(C-x)k(e\))630 5230 y Fu(Re-execute)37 b(the)e(last)h(k)m(eyb)s(oard) f(macro)h(de\014ned,)f(b)m(y)h(making)f(the)g(c)m(haracters)i(in)e(the) 630 5340 y(macro)c(app)s(ear)f(as)g(if)h(t)m(yp)s(ed)f(at)h(the)f(k)m (eyb)s(oard.)p eop end -%%Page: 123 129 -TeXDict begin 123 128 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(123)150 299 y Fs -(print-last-kbd-macro)25 b(\(\))630 408 y Ft(Prin)m(t)30 +%%Page: 122 128 +TeXDict begin 122 127 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(122)150 299 y Ft +(print-last-kbd-macro)25 b(\(\))630 408 y Fu(Prin)m(t)30 b(the)h(last)g(k)m(eb)s(oard)f(macro)h(de\014ned)e(in)i(a)f(format)h -(suitable)g(for)f(the)h Fq(inputrc)k Ft(\014le.)150 604 -y Fj(8.4.8)63 b(Some)41 b(Miscellaneous)i(Commands)150 -774 y Fs(re-read-init-file)26 b(\(C-x)j(C-r\))630 884 -y Ft(Read)22 b(in)g(the)g(con)m(ten)m(ts)h(of)f(the)g -Fq(inputrc)27 b Ft(\014le,)d(and)d(incorp)s(orate)h(an)m(y)h(bindings)d +(suitable)g(for)f(the)h Fr(inputrc)k Fu(\014le.)150 604 +y Fk(8.4.8)63 b(Some)41 b(Miscellaneous)i(Commands)150 +774 y Ft(re-read-init-file)26 b(\(C-x)j(C-r\))630 884 +y Fu(Read)22 b(in)g(the)g(con)m(ten)m(ts)h(of)f(the)g +Fr(inputrc)27 b Fu(\014le,)d(and)d(incorp)s(orate)h(an)m(y)h(bindings)d (or)i(v)-5 b(ariable)630 994 y(assignmen)m(ts)31 b(found)e(there.)150 -1150 y Fs(abort)g(\(C-g\))630 1259 y Ft(Ab)s(ort)d(the)h(curren)m(t)f +1150 y Ft(abort)g(\(C-g\))630 1259 y Fu(Ab)s(ort)d(the)h(curren)m(t)f (editing)h(command)f(and)g(ring)h(the)f(terminal's)h(b)s(ell)g(\(sub)5 -b(ject)26 b(to)i(the)630 1369 y(setting)j(of)g Fs(bell-style)p -Ft(\).)150 1525 y Fs(do-uppercase-version)25 b(\(M-a,)k(M-b,)g(M-)p -Fi(x)11 b Fs(,)29 b(...)o(\))630 1634 y Ft(If)e(the)h(meta\014ed)g(c)m -(haracter)h Fq(x)34 b Ft(is)28 b(lo)m(w)m(ercase,)i(run)d(the)g +b(ject)26 b(to)i(the)630 1369 y(setting)j(of)g Ft(bell-style)p +Fu(\).)150 1525 y Ft(do-uppercase-version)25 b(\(M-a,)k(M-b,)g(M-)p +Fj(x)p Ft(,)g(...)o(\))630 1634 y Fu(If)e(the)h(meta\014ed)g(c)m +(haracter)h Fr(x)34 b Fu(is)28 b(lo)m(w)m(ercase,)i(run)d(the)g (command)h(that)g(is)g(b)s(ound)d(to)k(the)630 1744 y(corresp)s(onding) -g(upp)s(ercase)h(c)m(haracter.)150 1900 y Fs(prefix-meta)d(\(ESC\))630 -2010 y Ft(Metafy)39 b(the)e(next)h(c)m(haracter)h(t)m(yp)s(ed.)62 +g(upp)s(ercase)h(c)m(haracter.)150 1900 y Ft(prefix-meta)d(\(ESC\))630 +2010 y Fu(Metafy)39 b(the)e(next)h(c)m(haracter)h(t)m(yp)s(ed.)62 b(This)37 b(is)g(for)h(k)m(eyb)s(oards)f(without)g(a)h(meta)g(k)m(ey)-8 -b(.)630 2119 y(T)m(yping)30 b(`)p Fs(ESC)g(f)p Ft(')g(is)h(equiv)-5 -b(alen)m(t)31 b(to)g(t)m(yping)g Fi(M-f)p Ft(.)150 2275 -y Fs(undo)e(\(C-_)g(or)h(C-x)g(C-u\))630 2385 y Ft(Incremen)m(tal)h +b(.)630 2119 y(T)m(yping)30 b(`)p Ft(ESC)g(f)p Fu(')g(is)h(equiv)-5 +b(alen)m(t)31 b(to)g(t)m(yping)g Fj(M-f)p Fu(.)150 2275 +y Ft(undo)e(\(C-_)g(or)h(C-x)g(C-u\))630 2385 y Fu(Incremen)m(tal)h (undo,)f(separately)h(remem)m(b)s(ered)f(for)g(eac)m(h)i(line.)150 -2541 y Fs(revert-line)27 b(\(M-r\))630 2650 y Ft(Undo)33 +2541 y Ft(revert-line)27 b(\(M-r\))630 2650 y Fu(Undo)33 b(all)h(c)m(hanges)g(made)f(to)h(this)f(line.)49 b(This)32 -b(is)h(lik)m(e)i(executing)f(the)f Fs(undo)f Ft(command)630 +b(is)h(lik)m(e)i(executing)f(the)f Ft(undo)f Fu(command)630 2760 y(enough)e(times)h(to)g(get)h(bac)m(k)f(to)g(the)f(b)s(eginning.) -150 2916 y Fs(tilde-expand)d(\(M-&\))630 3026 y Ft(P)m(erform)j(tilde)h +150 2916 y Ft(tilde-expand)d(\(M-&\))630 3026 y Fu(P)m(erform)j(tilde)h (expansion)g(on)f(the)g(curren)m(t)h(w)m(ord.)150 3182 -y Fs(set-mark)d(\(C-@\))630 3291 y Ft(Set)33 b(the)g(mark)f(to)i(the)f +y Ft(set-mark)d(\(C-@\))630 3291 y Fu(Set)33 b(the)g(mark)f(to)i(the)f (p)s(oin)m(t.)48 b(If)32 b(a)h(n)m(umeric)g(argumen)m(t)g(is)g (supplied,)f(the)h(mark)g(is)f(set)630 3401 y(to)f(that)g(p)s(osition.) -150 3557 y Fs(exchange-point-and-mark)24 b(\(C-x)29 b(C-x\))630 -3666 y Ft(Sw)m(ap)i(the)g(p)s(oin)m(t)g(with)g(the)g(mark.)43 +150 3557 y Ft(exchange-point-and-mark)24 b(\(C-x)29 b(C-x\))630 +3666 y Fu(Sw)m(ap)i(the)g(p)s(oin)m(t)g(with)g(the)g(mark.)43 b(The)31 b(curren)m(t)g(cursor)f(p)s(osition)i(is)f(set)h(to)f(the)h (sa)m(v)m(ed)630 3776 y(p)s(osition,)f(and)e(the)i(old)g(cursor)e(p)s (osition)i(is)f(sa)m(v)m(ed)i(as)e(the)h(mark.)150 3932 -y Fs(character-search)26 b(\(C-]\))630 4042 y Ft(A)f(c)m(haracter)h(is) +y Ft(character-search)26 b(\(C-]\))630 4042 y Fu(A)f(c)m(haracter)h(is) f(read)g(and)f(p)s(oin)m(t)h(is)g(mo)m(v)m(ed)h(to)g(the)f(next)g(o)s (ccurrence)g(of)g(that)g(c)m(haracter.)630 4151 y(A)30 b(negativ)m(e)j(coun)m(t)e(searc)m(hes)g(for)f(previous)g(o)s -(ccurrences.)150 4307 y Fs(character-search-backwar)o(d)24 -b(\(M-C-]\))630 4417 y Ft(A)45 b(c)m(haracter)h(is)f(read)g(and)f(p)s +(ccurrences.)150 4307 y Ft(character-search-backwar)o(d)24 +b(\(M-C-]\))630 4417 y Fu(A)45 b(c)m(haracter)h(is)f(read)g(and)f(p)s (oin)m(t)h(is)g(mo)m(v)m(ed)h(to)f(the)g(previous)f(o)s(ccurrence)h(of) g(that)630 4526 y(c)m(haracter.)d(A)31 b(negativ)m(e)h(coun)m(t)f (searc)m(hes)h(for)e(subsequen)m(t)f(o)s(ccurrences.)150 -4682 y Fs(skip-csi-sequence)d(\(\))630 4792 y Ft(Read)i(enough)f(c)m +4682 y Ft(skip-csi-sequence)d(\(\))630 4792 y Fu(Read)i(enough)f(c)m (haracters)h(to)g(consume)f(a)h(m)m(ulti-k)m(ey)h(sequence)f(suc)m(h)f (as)g(those)h(de\014ned)630 4902 y(for)37 b(k)m(eys)h(lik)m(e)g(Home)g (and)f(End.)60 b(Suc)m(h)37 b(sequences)g(b)s(egin)g(with)g(a)h(Con)m (trol)g(Sequence)630 5011 y(Indicator)f(\(CSI\),)f(usually)h(ESC-[.)59 -b(If)36 b(this)g(sequence)h(is)g(b)s(ound)d(to)k Fs("\\)p -Ft(e[)p Fs(")p Ft(,)g(k)m(eys)f(pro-)630 5121 y(ducing)31 +b(If)36 b(this)g(sequence)h(is)g(b)s(ound)d(to)k Ft("\\)p +Fu(e[)p Ft(")p Fu(,)g(k)m(eys)f(pro-)630 5121 y(ducing)31 b(suc)m(h)h(sequences)g(will)h(ha)m(v)m(e)g(no)f(e\013ect)h(unless)e (explicitly)j(b)s(ound)c(to)i(a)h(readline)630 5230 y(command,)f (instead)g(of)g(inserting)g(stra)m(y)h(c)m(haracters)g(in)m(to)g(the)f (editing)h(bu\013er.)44 b(This)31 b(is)630 5340 y(un)m(b)s(ound)d(b)m (y)i(default,)h(but)f(usually)g(b)s(ound)e(to)j(ESC-[.)p eop end -%%Page: 124 130 -TeXDict begin 124 129 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(124)150 299 y Fs(insert-comment)26 -b(\(M-#\))630 408 y Ft(Without)36 b(a)g(n)m(umeric)g(argumen)m(t,)h -(the)f(v)-5 b(alue)36 b(of)g(the)g Fs(comment-begin)c -Ft(v)-5 b(ariable)36 b(is)g(in-)630 518 y(serted)c(at)g(the)g(b)s +%%Page: 123 129 +TeXDict begin 123 128 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(123)150 299 y Ft(insert-comment)26 +b(\(M-#\))630 408 y Fu(Without)36 b(a)g(n)m(umeric)g(argumen)m(t,)h +(the)f(v)-5 b(alue)36 b(of)g(the)g Ft(comment-begin)c +Fu(v)-5 b(ariable)36 b(is)g(in-)630 518 y(serted)c(at)g(the)g(b)s (eginning)f(of)h(the)f(curren)m(t)h(line.)45 b(If)31 b(a)h(n)m(umeric)f(argumen)m(t)h(is)g(supplied,)630 628 y(this)k(command)h(acts)g(as)g(a)g(toggle:)55 b(if)37 b(the)f(c)m(haracters)i(at)g(the)e(b)s(eginning)g(of)h(the)g(line)630 737 y(do)30 b(not)h(matc)m(h)h(the)f(v)-5 b(alue)31 b(of)f -Fs(comment-begin)p Ft(,)e(the)i(v)-5 b(alue)31 b(is)g(inserted,)g -(otherwise)g(the)630 847 y(c)m(haracters)42 b(in)d Fs(comment-begin)e -Ft(are)j(deleted)h(from)f(the)g(b)s(eginning)g(of)g(the)g(line.)71 +Ft(comment-begin)p Fu(,)e(the)i(v)-5 b(alue)31 b(is)g(inserted,)g +(otherwise)g(the)630 847 y(c)m(haracters)42 b(in)d Ft(comment-begin)e +Fu(are)j(deleted)h(from)f(the)g(b)s(eginning)g(of)g(the)g(line.)71 b(In)630 956 y(either)37 b(case,)j(the)e(line)f(is)g(accepted)i(as)e (if)g(a)g(newline)g(had)g(b)s(een)f(t)m(yp)s(ed.)60 b(The)37 -b(default)630 1066 y(v)-5 b(alue)32 b(of)g Fs(comment-begin)c -Ft(causes)k(this)f(command)h(to)g(mak)m(e)h(the)e(curren)m(t)h(line)g +b(default)630 1066 y(v)-5 b(alue)32 b(of)g Ft(comment-begin)c +Fu(causes)k(this)f(command)h(to)g(mak)m(e)h(the)e(curren)m(t)h(line)g (a)g(shell)630 1176 y(commen)m(t.)40 b(If)26 b(a)h(n)m(umeric)f (argumen)m(t)h(causes)g(the)f(commen)m(t)i(c)m(haracter)g(to)f(b)s(e)f (remo)m(v)m(ed,)630 1285 y(the)31 b(line)f(will)h(b)s(e)f(executed)h(b) -m(y)f(the)h(shell.)150 1443 y Fs(dump-functions)26 b(\(\))630 -1553 y Ft(Prin)m(t)g(all)i(of)e(the)h(functions)f(and)g(their)g(k)m(ey) +m(y)f(the)h(shell.)150 1443 y Ft(dump-functions)26 b(\(\))630 +1553 y Fu(Prin)m(t)g(all)i(of)e(the)h(functions)f(and)g(their)g(k)m(ey) h(bindings)e(to)j(the)e(Readline)h(output)f(stream.)630 1663 y(If)31 b(a)h(n)m(umeric)g(argumen)m(t)g(is)g(supplied,)f(the)h (output)f(is)h(formatted)g(in)f(suc)m(h)h(a)g(w)m(a)m(y)g(that)630 -1772 y(it)f(can)g(b)s(e)e(made)i(part)f(of)g(an)h Fq(inputrc)k -Ft(\014le.)41 b(This)29 b(command)h(is)h(un)m(b)s(ound)c(b)m(y)k -(default.)150 1931 y Fs(dump-variables)26 b(\(\))630 -2040 y Ft(Prin)m(t)21 b(all)h(of)g(the)f(settable)i(v)-5 +1772 y(it)f(can)g(b)s(e)e(made)i(part)f(of)g(an)h Fr(inputrc)k +Fu(\014le.)41 b(This)29 b(command)h(is)h(un)m(b)s(ound)c(b)m(y)k +(default.)150 1931 y Ft(dump-variables)26 b(\(\))630 +2040 y Fu(Prin)m(t)21 b(all)h(of)g(the)f(settable)i(v)-5 b(ariables)22 b(and)f(their)g(v)-5 b(alues)22 b(to)g(the)f(Readline)h (output)f(stream.)630 2150 y(If)31 b(a)h(n)m(umeric)g(argumen)m(t)g(is) g(supplied,)f(the)h(output)f(is)h(formatted)g(in)f(suc)m(h)h(a)g(w)m(a) m(y)g(that)630 2259 y(it)f(can)g(b)s(e)e(made)i(part)f(of)g(an)h -Fq(inputrc)k Ft(\014le.)41 b(This)29 b(command)h(is)h(un)m(b)s(ound)c -(b)m(y)k(default.)150 2418 y Fs(dump-macros)c(\(\))630 -2527 y Ft(Prin)m(t)34 b(all)g(of)g(the)g(Readline)g(k)m(ey)h(sequences) +Fr(inputrc)k Fu(\014le.)41 b(This)29 b(command)h(is)h(un)m(b)s(ound)c +(b)m(y)k(default.)150 2418 y Ft(dump-macros)c(\(\))630 +2527 y Fu(Prin)m(t)34 b(all)g(of)g(the)g(Readline)g(k)m(ey)h(sequences) f(b)s(ound)e(to)i(macros)g(and)f(the)h(strings)g(they)630 2637 y(output.)53 b(If)35 b(a)g(n)m(umeric)f(argumen)m(t)i(is)e (supplied,)h(the)g(output)g(is)f(formatted)i(in)e(suc)m(h)h(a)630 2746 y(w)m(a)m(y)c(that)g(it)f(can)g(b)s(e)g(made)g(part)f(of)i(an)e -Fq(inputrc)35 b Ft(\014le.)41 b(This)29 b(command)h(is)g(un)m(b)s(ound) -d(b)m(y)630 2856 y(default.)150 3014 y Fs(glob-complete-word)e(\(M-g\)) -630 3124 y Ft(The)i(w)m(ord)h(b)s(efore)f(p)s(oin)m(t)h(is)g(treated)h +Fr(inputrc)35 b Fu(\014le.)41 b(This)29 b(command)h(is)g(un)m(b)s(ound) +d(b)m(y)630 2856 y(default.)150 3014 y Ft(glob-complete-word)e(\(M-g\)) +630 3124 y Fu(The)i(w)m(ord)h(b)s(efore)f(p)s(oin)m(t)h(is)g(treated)h (as)f(a)h(pattern)f(for)f(pathname)h(expansion,)g(with)g(an)630 3233 y(asterisk)d(implicitly)h(app)s(ended.)37 b(This)23 b(pattern)i(is)f(used)g(to)h(generate)h(a)e(list)h(of)g(matc)m(hing)630 3343 y(\014le)30 b(names)h(for)f(p)s(ossible)g(completions.)150 -3501 y Fs(glob-expand-word)c(\(C-x)j(*\))630 3611 y Ft(The)40 +3501 y Ft(glob-expand-word)c(\(C-x)j(*\))630 3611 y Fu(The)40 b(w)m(ord)g(b)s(efore)g(p)s(oin)m(t)h(is)g(treated)g(as)g(a)g(pattern)g (for)f(pathname)g(expansion,)k(and)630 3720 y(the)c(list)g(of)f(matc)m (hing)i(\014le)e(names)g(is)h(inserted,)h(replacing)g(the)e(w)m(ord.)67 b(If)39 b(a)h(n)m(umeric)630 3830 y(argumen)m(t)31 b(is)f(supplied,)g -(a)g(`)p Fs(*)p Ft(')h(is)f(app)s(ended)f(b)s(efore)h(pathname)g -(expansion.)150 3988 y Fs(glob-list-expansions)25 b(\(C-x)k(g\))630 -4098 y Ft(The)k(list)h(of)f(expansions)g(that)h(w)m(ould)f(ha)m(v)m(e)h -(b)s(een)f(generated)h(b)m(y)f Fs(glob-expand-word)630 -4208 y Ft(is)h(displa)m(y)m(ed,)h(and)e(the)h(line)g(is)f(redra)m(wn.) +(a)g(`)p Ft(*)p Fu(')h(is)f(app)s(ended)f(b)s(efore)h(pathname)g +(expansion.)150 3988 y Ft(glob-list-expansions)25 b(\(C-x)k(g\))630 +4098 y Fu(The)k(list)h(of)f(expansions)g(that)h(w)m(ould)f(ha)m(v)m(e)h +(b)s(een)f(generated)h(b)m(y)f Ft(glob-expand-word)630 +4208 y Fu(is)h(displa)m(y)m(ed,)h(and)e(the)h(line)g(is)f(redra)m(wn.) 50 b(If)33 b(a)h(n)m(umeric)g(argumen)m(t)g(is)f(supplied,)h(a)g(`)p -Fs(*)p Ft(')630 4317 y(is)c(app)s(ended)f(b)s(efore)h(pathname)g -(expansion.)150 4475 y Fs(display-shell-version)25 b(\(C-x)k(C-v\))630 -4585 y Ft(Displa)m(y)j(v)m(ersion)e(information)h(ab)s(out)f(the)h -(curren)m(t)f(instance)h(of)f(Bash.)150 4743 y Fs(shell-expand-line)c -(\(M-C-e\))630 4853 y Ft(Expand)34 b(the)h(line)h(as)g(the)f(shell)h +Ft(*)p Fu(')630 4317 y(is)c(app)s(ended)f(b)s(efore)h(pathname)g +(expansion.)150 4475 y Ft(display-shell-version)25 b(\(C-x)k(C-v\))630 +4585 y Fu(Displa)m(y)j(v)m(ersion)e(information)h(ab)s(out)f(the)h +(curren)m(t)f(instance)h(of)f(Bash.)150 4743 y Ft(shell-expand-line)c +(\(M-C-e\))630 4853 y Fu(Expand)34 b(the)h(line)h(as)g(the)f(shell)h (do)s(es.)55 b(This)34 b(p)s(erforms)g(alias)i(and)f(history)g (expansion)630 4963 y(as)f(w)m(ell)g(as)g(all)h(of)e(the)h(shell)g(w)m (ord)f(expansions)g(\(see)i(Section)f(3.5)h([Shell)e(Expansions],)630 -5072 y(page)e(21\).)150 5230 y Fs(history-expand-line)25 -b(\(M-^\))630 5340 y Ft(P)m(erform)30 b(history)h(expansion)f(on)g(the) +5072 y(page)e(21\).)150 5230 y Ft(history-expand-line)25 +b(\(M-^\))630 5340 y Fu(P)m(erform)30 b(history)h(expansion)f(on)g(the) h(curren)m(t)f(line.)p eop end -%%Page: 125 131 -TeXDict begin 125 130 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(125)150 299 y Fs(magic-space)27 -b(\(\))630 408 y Ft(P)m(erform)c(history)g(expansion)g(on)g(the)g +%%Page: 124 130 +TeXDict begin 124 129 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(124)150 299 y Ft(magic-space)27 +b(\(\))630 408 y Fu(P)m(erform)c(history)g(expansion)g(on)g(the)g (curren)m(t)g(line)g(and)g(insert)g(a)g(space)h(\(see)g(Section)g(9.3) -630 518 y([History)31 b(In)m(teraction],)i(page)e(136\).)150 -686 y Fs(alias-expand-line)26 b(\(\))630 796 y Ft(P)m(erform)i(alias)i +630 518 y([History)31 b(In)m(teraction],)i(page)e(135\).)150 +686 y Ft(alias-expand-line)26 b(\(\))630 796 y Fu(P)m(erform)i(alias)i (expansion)e(on)g(the)h(curren)m(t)f(line)h(\(see)g(Section)g(6.6)h -([Aliases],)g(page)f(88\).)150 964 y Fs(history-and-alias-expand)o -(-lin)o(e)24 b(\(\))630 1074 y Ft(P)m(erform)30 b(history)h(and)e +([Aliases],)g(page)f(88\).)150 964 y Ft(history-and-alias-expand)o +(-lin)o(e)24 b(\(\))630 1074 y Fu(P)m(erform)30 b(history)h(and)e (alias)j(expansion)e(on)g(the)h(curren)m(t)f(line.)150 -1242 y Fs(insert-last-argument)25 b(\(M-.)k(or)h(M-_\))630 -1352 y Ft(A)g(synon)m(ym)g(for)g Fs(yank-last-arg)p Ft(.)150 -1520 y Fs(operate-and-get-next)25 b(\(C-o\))630 1630 -y Ft(Accept)42 b(the)e(curren)m(t)h(line)f(for)h(execution)g(and)f +1242 y Ft(insert-last-argument)25 b(\(M-.)k(or)h(M-_\))630 +1352 y Fu(A)g(synon)m(ym)g(for)g Ft(yank-last-arg)p Fu(.)150 +1520 y Ft(operate-and-get-next)25 b(\(C-o\))630 1630 +y Fu(Accept)42 b(the)e(curren)m(t)h(line)f(for)h(execution)g(and)f (fetc)m(h)i(the)e(next)h(line)g(relativ)m(e)i(to)e(the)630 1739 y(curren)m(t)30 b(line)h(from)f(the)g(history)h(for)f(editing.)41 b(An)m(y)31 b(argumen)m(t)f(is)h(ignored.)150 1908 y -Fs(edit-and-execute-command)24 b(\(C-xC-e\))630 2017 -y Ft(In)m(v)m(ok)m(e)34 b(an)f(editor)g(on)g(the)g(curren)m(t)f +Ft(edit-and-execute-command)24 b(\(C-xC-e\))630 2017 +y Fu(In)m(v)m(ok)m(e)34 b(an)f(editor)g(on)g(the)g(curren)m(t)f (command)h(line,)h(and)e(execute)i(the)f(result)g(as)g(shell)630 2127 y(commands.)81 b(Bash)44 b(attempts)h(to)g(in)m(v)m(ok)m(e)h -Fs($VISUAL)p Ft(,)f Fs($EDITOR)p Ft(,)h(and)d Fs(emacs)g -Ft(as)h(the)630 2236 y(editor,)31 b(in)f(that)h(order.)150 -2482 y Fr(8.5)68 b(Readline)47 b(vi)e(Mo)t(de)150 2642 -y Ft(While)32 b(the)g(Readline)g(library)f(do)s(es)g(not)h(ha)m(v)m(e)h -(a)f(full)f(set)h(of)g Fs(vi)f Ft(editing)h(functions,)f(it)h(do)s(es)g +Ft($VISUAL)p Fu(,)f Ft($EDITOR)p Fu(,)h(and)d Ft(emacs)g +Fu(as)h(the)630 2236 y(editor,)31 b(in)f(that)h(order.)150 +2482 y Fs(8.5)68 b(Readline)47 b(vi)e(Mo)t(de)150 2642 +y Fu(While)32 b(the)g(Readline)g(library)f(do)s(es)g(not)h(ha)m(v)m(e)h +(a)f(full)f(set)h(of)g Ft(vi)f Fu(editing)h(functions,)f(it)h(do)s(es)g (con)m(tain)150 2751 y(enough)i(to)h(allo)m(w)g(simple)f(editing)h(of)f -(the)g(line.)52 b(The)34 b(Readline)g Fs(vi)g Ft(mo)s(de)f(b)s(eha)m(v) -m(es)i(as)f(sp)s(eci\014ed)f(in)150 2861 y(the)e Fl(posix)e -Ft(standard.)275 3004 y(In)35 b(order)g(to)i(switc)m(h)f(in)m(teractiv) -m(ely)j(b)s(et)m(w)m(een)d Fs(emacs)f Ft(and)g Fs(vi)g -Ft(editing)h(mo)s(des,)h(use)f(the)g(`)p Fs(set)30 b(-o)150 -3114 y(emacs)p Ft(')43 b(and)h(`)p Fs(set)30 b(-o)f(vi)p -Ft(')44 b(commands)g(\(see)i(Section)f(4.3.1)h([The)e(Set)h(Builtin],)j -(page)e(59\).)83 b(The)150 3223 y(Readline)31 b(default)g(is)f -Fs(emacs)f Ft(mo)s(de.)275 3367 y(When)g(y)m(ou)i(en)m(ter)f(a)h(line)f -(in)g Fs(vi)f Ft(mo)s(de,)h(y)m(ou)h(are)f(already)h(placed)f(in)g +(the)g(line.)52 b(The)34 b(Readline)g Ft(vi)g Fu(mo)s(de)f(b)s(eha)m(v) +m(es)i(as)f(sp)s(eci\014ed)f(in)150 2861 y(the)e Fm(posix)e +Fu(standard.)275 3004 y(In)35 b(order)g(to)i(switc)m(h)f(in)m(teractiv) +m(ely)j(b)s(et)m(w)m(een)d Ft(emacs)f Fu(and)g Ft(vi)g +Fu(editing)h(mo)s(des,)h(use)f(the)g(`)p Ft(set)30 b(-o)150 +3114 y(emacs)p Fu(')43 b(and)h(`)p Ft(set)30 b(-o)f(vi)p +Fu(')44 b(commands)g(\(see)i(Section)f(4.3.1)h([The)e(Set)h(Builtin],)j +(page)e(58\).)83 b(The)150 3223 y(Readline)31 b(default)g(is)f +Ft(emacs)f Fu(mo)s(de.)275 3367 y(When)g(y)m(ou)i(en)m(ter)f(a)h(line)f +(in)g Ft(vi)f Fu(mo)s(de,)h(y)m(ou)h(are)f(already)h(placed)f(in)g (`insertion')g(mo)s(de,)g(as)h(if)f(y)m(ou)150 3476 y(had)f(t)m(yp)s -(ed)g(an)g(`)p Fs(i)p Ft('.)41 b(Pressing)29 b Fs(ESC)f -Ft(switc)m(hes)i(y)m(ou)g(in)m(to)h(`command')e(mo)s(de,)h(where)e(y)m +(ed)g(an)g(`)p Ft(i)p Fu('.)41 b(Pressing)29 b Ft(ESC)f +Fu(switc)m(hes)i(y)m(ou)g(in)m(to)h(`command')e(mo)s(de,)h(where)e(y)m (ou)i(can)g(edit)g(the)150 3586 y(text)35 b(of)f(the)g(line)g(with)f -(the)h(standard)f Fs(vi)g Ft(mo)m(v)m(emen)m(t)j(k)m(eys,)g(mo)m(v)m(e) +(the)h(standard)f Ft(vi)g Fu(mo)m(v)m(emen)m(t)j(k)m(eys,)g(mo)m(v)m(e) f(to)f(previous)g(history)f(lines)h(with)150 3695 y(`)p -Fs(k)p Ft(')d(and)e(subsequen)m(t)h(lines)h(with)f(`)p -Fs(j)p Ft(',)g(and)g(so)h(forth.)150 3941 y Fr(8.6)68 -b(Programmable)47 b(Completion)150 4101 y Ft(When)25 +Ft(k)p Fu(')d(and)e(subsequen)m(t)h(lines)h(with)f(`)p +Ft(j)p Fu(',)g(and)g(so)h(forth.)150 3941 y Fs(8.6)68 +b(Programmable)47 b(Completion)150 4101 y Fu(When)25 b(w)m(ord)g(completion)i(is)f(attempted)g(for)g(an)f(argumen)m(t)h(to)g (a)g(command)f(for)h(whic)m(h)f(a)h(completion)150 4210 -y(sp)s(eci\014cation)40 b(\(a)h Fq(compsp)s(ec)6 b Ft(\))39 -b(has)h(b)s(een)f(de\014ned)f(using)h(the)h Fs(complete)d -Ft(builtin)j(\(see)g(Section)h(8.7)150 4320 y([Programmable)h -(Completion)f(Builtins],)k(page)d(127\),)j(the)c(programmable)g +y(sp)s(eci\014cation)40 b(\(a)h Fr(compsp)s(ec)6 b Fu(\))39 +b(has)h(b)s(een)f(de\014ned)f(using)h(the)h Ft(complete)d +Fu(builtin)j(\(see)g(Section)h(8.7)150 4320 y([Programmable)h +(Completion)f(Builtins],)k(page)d(126\),)j(the)c(programmable)g (completion)i(facilities)150 4429 y(are)31 b(in)m(v)m(ok)m(ed.)275 4573 y(First,)23 b(the)e(command)g(name)g(is)h(iden)m(ti\014ed.)37 b(If)21 b(a)g(compsp)s(ec)g(has)g(b)s(een)f(de\014ned)g(for)h(that)h @@ -16245,49 +16745,47 @@ b(If)21 b(a)g(compsp)s(ec)g(has)g(b)s(een)f(de\014ned)g(for)h(that)h (the)e(list)g(of)g(p)s(ossible)g(completions)h(for)e(the)h(w)m(ord.)81 b(If)44 b(the)150 4792 y(command)36 b(w)m(ord)g(is)g(the)g(empt)m(y)h (string)f(\(completion)i(attempted)f(at)g(the)g(b)s(eginning)e(of)h(an) -h(empt)m(y)150 4902 y(line\),)28 b(an)m(y)e(compsp)s(ec)f(de\014ned)g -(with)g(the)h(`)p Fs(-E)p Ft(')f(option)i(to)f Fs(complete)e -Ft(is)h(used.)39 b(If)25 b(the)h(command)f(w)m(ord)150 -5011 y(is)i(a)h(full)e(pathname,)i(a)g(compsp)s(ec)e(for)h(the)g(full)g +h(empt)m(y)150 4902 y(line\),)30 b(an)m(y)g(compsp)s(ec)f(de\014ned)f +(with)h(the)h Ft(-E)e Fu(option)i(to)g Ft(complete)d +Fu(is)i(used.)40 b(If)29 b(the)g(command)g(w)m(ord)150 +5011 y(is)e(a)h(full)e(pathname,)i(a)g(compsp)s(ec)e(for)h(the)g(full)g (pathname)g(is)g(searc)m(hed)h(for)f(\014rst.)39 b(If)26 b(no)h(compsp)s(ec)g(is)150 5121 y(found)22 b(for)g(the)h(full)g (pathname,)h(an)f(attempt)h(is)f(made)g(to)g(\014nd)f(a)h(compsp)s(ec)f (for)h(the)g(p)s(ortion)f(follo)m(wing)150 5230 y(the)34 b(\014nal)g(slash.)53 b(If)34 b(those)g(searc)m(hes)i(do)e(not)g (result)h(in)f(a)g(compsp)s(ec,)h(an)m(y)g(compsp)s(ec)f(de\014ned)f -(with)150 5340 y(the)e(`)p Fs(-D)p Ft(')f(option)h(to)g -Fs(complete)d Ft(is)i(used)g(as)g(the)h(default.)p eop -end -%%Page: 126 132 -TeXDict begin 126 131 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(126)275 299 y(Once)34 +(with)150 5340 y(the)e Ft(-D)e Fu(option)i(to)g Ft(complete)d +Fu(is)j(used)e(as)i(the)g(default.)p eop end +%%Page: 125 131 +TeXDict begin 125 130 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(125)275 299 y(Once)34 b(a)g(compsp)s(ec)g(has)g(b)s(een)f(found,)h(it)h(is)f(used)f(to)i (generate)h(the)e(list)h(of)f(matc)m(hing)h(w)m(ords.)51 b(If)150 408 y(a)37 b(compsp)s(ec)f(is)g(not)h(found,)f(the)h(default)f (Bash)h(completion)g(describ)s(ed)e(ab)s(o)m(v)m(e)j(\(see)f(Section)g (8.4.6)150 518 y([Commands)30 b(F)-8 b(or)31 b(Completion],)g(page)g -(121\))h(is)f(p)s(erformed.)275 655 y(First,)g(the)g(actions)g(sp)s +(120\))h(is)f(p)s(erformed.)275 655 y(First,)g(the)g(actions)g(sp)s (eci\014ed)f(b)m(y)h(the)f(compsp)s(ec)h(are)g(used.)40 b(Only)30 b(matc)m(hes)i(whic)m(h)e(are)h(pre\014xed)150 -765 y(b)m(y)25 b(the)h(w)m(ord)f(b)s(eing)f(completed)j(are)e -(returned.)38 b(When)25 b(the)h(`)p Fs(-f)p Ft(')f(or)g(`)p -Fs(-d)p Ft(')g(option)h(is)f(used)g(for)g(\014lename)150 -874 y(or)30 b(directory)h(name)f(completion,)i(the)e(shell)h(v)-5 -b(ariable)31 b Fs(FIGNORE)d Ft(is)i(used)f(to)i(\014lter)g(the)f(matc)m -(hes.)42 b(See)150 984 y(Section)31 b(5.2)h([Bash)e(V)-8 +765 y(b)m(y)h(the)f(w)m(ord)h(b)s(eing)f(completed)h(are)g(returned.)44 +b(When)31 b(the)h Ft(-f)f Fu(or)h Ft(-d)f Fu(option)h(is)f(used)g(for)h +(\014lename)150 874 y(or)e(directory)h(name)f(completion,)i(the)e +(shell)h(v)-5 b(ariable)31 b Ft(FIGNORE)d Fu(is)i(used)f(to)i(\014lter) +g(the)f(matc)m(hes.)42 b(See)150 984 y(Section)31 b(5.2)h([Bash)e(V)-8 b(ariables],)33 b(page)e(69,)g(for)f(a)h(description)g(of)f -Fs(FIGNORE)p Ft(.)275 1121 y(An)m(y)f(completions)h(sp)s(eci\014ed)f(b) -m(y)g(a)h(\014lename)f(expansion)h(pattern)f(to)h(the)g(`)p -Fs(-G)p Ft(')f(option)h(are)f(gener-)150 1230 y(ated)h(next.)40 -b(The)29 b(w)m(ords)g(generated)h(b)m(y)f(the)h(pattern)f(need)g(not)g -(matc)m(h)i(the)e(w)m(ord)g(b)s(eing)g(completed.)150 -1340 y(The)42 b Fs(GLOBIGNORE)d Ft(shell)k(v)-5 b(ariable)43 -b(is)f(not)h(used)e(to)i(\014lter)f(the)h(matc)m(hes,)j(but)c(the)g -Fs(FIGNORE)f Ft(shell)150 1450 y(v)-5 b(ariable)31 b(is)g(used.)275 -1587 y(Next,)k(the)g(string)e(sp)s(eci\014ed)h(as)g(the)g(argumen)m(t)g -(to)h(the)f(`)p Fs(-W)p Ft(')g(option)g(is)g(considered.)52 -b(The)33 b(string)150 1696 y(is)g(\014rst)e(split)i(using)f(the)h(c)m -(haracters)h(in)e(the)h Fs(IFS)e Ft(sp)s(ecial)j(v)-5 +Ft(FIGNORE)p Fu(.)275 1121 y(An)m(y)22 b(completions)h(sp)s(eci\014ed)f +(b)m(y)g(a)h(\014lename)f(expansion)h(pattern)f(to)h(the)g +Ft(-G)e Fu(option)i(are)g(generated)150 1230 y(next.)41 +b(The)29 b(w)m(ords)g(generated)h(b)m(y)g(the)g(pattern)f(need)h(not)f +(matc)m(h)i(the)f(w)m(ord)f(b)s(eing)g(completed.)41 +b(The)150 1340 y Ft(GLOBIGNORE)29 b Fu(shell)i(v)-5 b(ariable)32 +b(is)g(not)g(used)e(to)i(\014lter)g(the)g(matc)m(hes,)h(but)d(the)i +Ft(FIGNORE)e Fu(shell)h(v)-5 b(ariable)150 1450 y(is)30 +b(used.)275 1587 y(Next,)39 b(the)f(string)f(sp)s(eci\014ed)f(as)h(the) +g(argumen)m(t)h(to)g(the)f Ft(-W)f Fu(option)i(is)f(considered.)60 +b(The)37 b(string)150 1696 y(is)c(\014rst)e(split)i(using)f(the)h(c)m +(haracters)h(in)e(the)h Ft(IFS)e Fu(sp)s(ecial)j(v)-5 b(ariable)33 b(as)g(delimiters.)48 b(Shell)32 b(quoting)h(is)150 1806 y(honored.)56 b(Eac)m(h)37 b(w)m(ord)e(is)h(then)f(expanded)g (using)h(brace)g(expansion,)h(tilde)f(expansion,)h(parameter)150 @@ -16302,16 +16800,16 @@ y(are)f(pre\014x-matc)m(hed)h(against)g(the)f(w)m(ord)g(b)s(eing)f (completed,)j(and)d(the)i(matc)m(hing)g(w)m(ords)e(b)s(ecome)i(the)150 2354 y(p)s(ossible)g(completions.)275 2491 y(After)f(these)g(matc)m (hes)i(ha)m(v)m(e)f(b)s(een)f(generated,)h(an)m(y)g(shell)f(function)g -(or)g(command)g(sp)s(eci\014ed)f(with)150 2600 y(the)i(`)p -Fs(-F)p Ft(')g(and)f(`)p Fs(-C)p Ft(')h(options)g(is)g(in)m(v)m(ok)m -(ed.)41 b(When)30 b(the)g(command)g(or)f(function)h(is)g(in)m(v)m(ok)m -(ed,)h(the)f Fs(COMP_)150 2710 y(LINE)p Ft(,)42 b Fs(COMP_POINT)p -Ft(,)d Fs(COMP_KEY)p Ft(,)i(and)e Fs(COMP_TYPE)f Ft(v)-5 +(or)g(command)g(sp)s(eci\014ed)f(with)150 2600 y(the)36 +b Ft(-F)f Fu(and)g Ft(-C)g Fu(options)h(is)g(in)m(v)m(ok)m(ed.)59 +b(When)35 b(the)h(command)g(or)f(function)h(is)g(in)m(v)m(ok)m(ed,)i +(the)e Ft(COMP_)150 2710 y(LINE)p Fu(,)42 b Ft(COMP_POINT)p +Fu(,)d Ft(COMP_KEY)p Fu(,)i(and)e Ft(COMP_TYPE)f Fu(v)-5 b(ariables)41 b(are)f(assigned)g(v)-5 b(alues)41 b(as)f(describ)s(ed) 150 2819 y(ab)s(o)m(v)m(e)34 b(\(see)g(Section)g(5.2)g([Bash)f(V)-8 b(ariables],)36 b(page)d(69\).)50 b(If)33 b(a)g(shell)g(function)g(is)g -(b)s(eing)f(in)m(v)m(ok)m(ed,)k(the)150 2929 y Fs(COMP_WORDS)j -Ft(and)i Fs(COMP_CWORD)d Ft(v)-5 b(ariables)42 b(are)g(also)h(set.)74 +(b)s(eing)f(in)m(v)m(ok)m(ed,)k(the)150 2929 y Ft(COMP_WORDS)j +Fu(and)i Ft(COMP_CWORD)d Fu(v)-5 b(ariables)42 b(are)g(also)h(set.)74 b(When)41 b(the)h(function)f(or)h(command)f(is)150 3039 y(in)m(v)m(ok)m(ed,)c(the)e(\014rst)f(argumen)m(t)h(\($1\))h(is)e(the)h (name)g(of)f(the)h(command)f(whose)h(argumen)m(ts)f(are)h(b)s(eing)150 @@ -16322,69 +16820,68 @@ y(in)m(v)m(ok)m(ed,)c(the)e(\014rst)f(argumen)m(t)h(\($1\))h(is)e(the)h b(No)150 3367 y(\014ltering)33 b(of)h(the)f(generated)h(completions)g (against)h(the)e(w)m(ord)g(b)s(eing)f(completed)i(is)g(p)s(erformed;)f (the)150 3477 y(function)d(or)g(command)h(has)f(complete)i(freedom)e -(in)g(generating)h(the)g(matc)m(hes.)275 3614 y(An)m(y)g(function)h(sp) -s(eci\014ed)f(with)g(`)p Fs(-F)p Ft(')h(is)g(in)m(v)m(ok)m(ed)h -(\014rst.)44 b(The)31 b(function)h(ma)m(y)g(use)g(an)m(y)g(of)g(the)g -(shell)150 3724 y(facilities,)50 b(including)44 b(the)h -Fs(compgen)d Ft(and)i Fs(compopt)e Ft(builtins)i(describ)s(ed)f(b)s -(elo)m(w)h(\(see)i(Section)f(8.7)150 3833 y([Programmable)31 -b(Completion)h(Builtins],)f(page)h(127\),)g(to)g(generate)g(the)f(matc) -m(hes.)42 b(It)31 b(m)m(ust)g(put)f(the)150 3943 y(p)s(ossible)g -(completions)h(in)f(the)h Fs(COMPREPLY)d Ft(arra)m(y)j(v)-5 -b(ariable,)31 b(one)g(p)s(er)e(arra)m(y)i(elemen)m(t.)275 -4080 y(Next,)23 b(an)m(y)e(command)f(sp)s(eci\014ed)g(with)g(the)h(`)p -Fs(-C)p Ft(')f(option)h(is)g(in)m(v)m(ok)m(ed)h(in)e(an)g(en)m -(vironmen)m(t)h(equiv)-5 b(alen)m(t)150 4189 y(to)26 -b(command)e(substitution.)39 b(It)25 b(should)f(prin)m(t)h(a)g(list)h -(of)f(completions,)i(one)e(p)s(er)f(line,)j(to)f(the)f(standard)150 -4299 y(output.)40 b(Bac)m(kslash)32 b(ma)m(y)f(b)s(e)f(used)g(to)h -(escap)s(e)g(a)f(newline,)h(if)f(necessary)-8 b(.)275 -4436 y(After)42 b(all)g(of)g(the)g(p)s(ossible)g(completions)h(are)f -(generated,)k(an)m(y)c(\014lter)g(sp)s(eci\014ed)f(with)h(the)g(`)p -Fs(-X)p Ft(')150 4545 y(option)34 b(is)f(applied)g(to)h(the)f(list.)49 -b(The)33 b(\014lter)g(is)g(a)h(pattern)f(as)g(used)g(for)g(pathname)g -(expansion;)h(a)g(`)p Fs(&)p Ft(')150 4655 y(in)39 b(the)g(pattern)g -(is)g(replaced)g(with)g(the)g(text)h(of)f(the)g(w)m(ord)g(b)s(eing)f -(completed.)68 b(A)39 b(literal)h(`)p Fs(&)p Ft(')f(ma)m(y)150 -4765 y(b)s(e)e(escap)s(ed)h(with)g(a)h(bac)m(kslash;)k(the)38 -b(bac)m(kslash)h(is)f(remo)m(v)m(ed)h(b)s(efore)e(attempting)j(a)e -(matc)m(h.)65 b(An)m(y)150 4874 y(completion)35 b(that)g(matc)m(hes)g -(the)f(pattern)g(will)g(b)s(e)g(remo)m(v)m(ed)h(from)e(the)h(list.)53 -b(A)34 b(leading)g(`)p Fs(!)p Ft(')h(negates)150 4984 -y(the)c(pattern;)f(in)g(this)h(case)g(an)m(y)g(completion)g(not)g(matc) -m(hing)h(the)e(pattern)h(will)f(b)s(e)g(remo)m(v)m(ed.)275 -5121 y(Finally)-8 b(,)33 b(an)m(y)f(pre\014x)f(and)g(su\016x)g(sp)s -(eci\014ed)g(with)h(the)g(`)p Fs(-P)p Ft(')f(and)g(`)p -Fs(-S)p Ft(')h(options)g(are)g(added)f(to)i(eac)m(h)150 -5230 y(mem)m(b)s(er)e(of)g(the)h(completion)h(list,)f(and)f(the)h -(result)f(is)h(returned)e(to)i(the)g(Readline)g(completion)h(co)s(de) -150 5340 y(as)e(the)f(list)h(of)g(p)s(ossible)f(completions.)p +(in)g(generating)h(the)g(matc)m(hes.)275 3614 y(An)m(y)j(function)h(sp) +s(eci\014ed)f(with)g Ft(-F)g Fu(is)h(in)m(v)m(ok)m(ed)h(\014rst.)53 +b(The)35 b(function)f(ma)m(y)h(use)g(an)m(y)g(of)g(the)g(shell)150 +3724 y(facilities,)50 b(including)44 b(the)h Ft(compgen)d +Fu(and)i Ft(compopt)e Fu(builtins)i(describ)s(ed)f(b)s(elo)m(w)h(\(see) +i(Section)f(8.7)150 3833 y([Programmable)31 b(Completion)h(Builtins],)f +(page)h(126\),)g(to)g(generate)g(the)f(matc)m(hes.)42 +b(It)31 b(m)m(ust)g(put)f(the)150 3943 y(p)s(ossible)g(completions)h +(in)f(the)h Ft(COMPREPLY)d Fu(arra)m(y)j(v)-5 b(ariable,)31 +b(one)g(p)s(er)e(arra)m(y)i(elemen)m(t.)275 4080 y(Next,)26 +b(an)m(y)f(command)f(sp)s(eci\014ed)g(with)g(the)h Ft(-C)f +Fu(option)h(is)f(in)m(v)m(ok)m(ed)i(in)e(an)g(en)m(vironmen)m(t)h +(equiv)-5 b(alen)m(t)150 4189 y(to)26 b(command)e(substitution.)39 +b(It)25 b(should)f(prin)m(t)h(a)g(list)h(of)f(completions,)i(one)e(p)s +(er)f(line,)j(to)f(the)f(standard)150 4299 y(output.)40 +b(Bac)m(kslash)32 b(ma)m(y)f(b)s(e)f(used)g(to)h(escap)s(e)g(a)f +(newline,)h(if)f(necessary)-8 b(.)275 4436 y(After)24 +b(all)i(of)f(the)f(p)s(ossible)g(completions)i(are)f(generated,)i(an)m +(y)e(\014lter)g(sp)s(eci\014ed)e(with)i(the)g Ft(-X)e +Fu(option)150 4545 y(is)34 b(applied)g(to)g(the)h(list.)52 +b(The)33 b(\014lter)h(is)g(a)h(pattern)f(as)g(used)f(for)h(pathname)g +(expansion;)i(a)e(`)p Ft(&)p Fu(')g(in)g(the)150 4655 +y(pattern)28 b(is)f(replaced)h(with)g(the)f(text)i(of)f(the)f(w)m(ord)h +(b)s(eing)f(completed.)40 b(A)28 b(literal)h(`)p Ft(&)p +Fu(')f(ma)m(y)g(b)s(e)f(escap)s(ed)150 4765 y(with)38 +b(a)h(bac)m(kslash;)k(the)38 b(bac)m(kslash)h(is)g(remo)m(v)m(ed)g(b)s +(efore)f(attempting)h(a)g(matc)m(h.)65 b(An)m(y)39 b(completion)150 +4874 y(that)32 b(matc)m(hes)g(the)g(pattern)g(will)f(b)s(e)g(remo)m(v)m +(ed)h(from)f(the)h(list.)44 b(A)32 b(leading)g(`)p Ft(!)p +Fu(')f(negates)i(the)f(pattern;)150 4984 y(in)e(this)g(case)i(an)m(y)e +(completion)i(not)f(matc)m(hing)g(the)g(pattern)f(will)h(b)s(e)f(remo)m +(v)m(ed.)275 5121 y(Finally)-8 b(,)42 b(an)m(y)c(pre\014x)g(and)f +(su\016x)h(sp)s(eci\014ed)f(with)i(the)f Ft(-P)g Fu(and)g +Ft(-S)f Fu(options)i(are)g(added)f(to)h(eac)m(h)150 5230 +y(mem)m(b)s(er)31 b(of)g(the)h(completion)h(list,)f(and)f(the)h(result) +f(is)h(returned)e(to)i(the)g(Readline)g(completion)h(co)s(de)150 +5340 y(as)e(the)f(list)h(of)g(p)s(ossible)f(completions.)p eop end -%%Page: 127 133 -TeXDict begin 127 132 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(127)275 299 y(If)22 -b(the)i(previously-applied)f(actions)i(do)e(not)h(generate)h(an)m(y)f -(matc)m(hes,)i(and)d(the)g(`)p Fs(-o)30 b(dirnames)p -Ft(')22 b(op-)150 408 y(tion)29 b(w)m(as)f(supplied)f(to)i -Fs(complete)d Ft(when)h(the)h(compsp)s(ec)g(w)m(as)g(de\014ned,)g -(directory)g(name)h(completion)150 518 y(is)h(attempted.)275 -654 y(If)g(the)i(`)p Fs(-o)e(plusdirs)p Ft(')f(option)j(w)m(as)f -(supplied)f(to)i Fs(complete)e Ft(when)g(the)h(compsp)s(ec)g(w)m(as)h -(de\014ned,)150 764 y(directory)k(name)f(completion)i(is)e(attempted)h -(and)f(an)m(y)h(matc)m(hes)g(are)g(added)f(to)h(the)f(results)g(of)h -(the)150 873 y(other)31 b(actions.)275 1010 y(By)g(default,)i(if)e(a)h -(compsp)s(ec)f(is)h(found,)f(whatev)m(er)h(it)g(generates)h(is)e -(returned)g(to)h(the)g(completion)150 1119 y(co)s(de)21 -b(as)g(the)g(full)g(set)g(of)g(p)s(ossible)f(completions.)39 -b(The)20 b(default)h(Bash)g(completions)h(are)g(not)f(attempted,)150 -1229 y(and)k(the)h(Readline)g(default)g(of)g(\014lename)g(completion)h -(is)f(disabled.)38 b(If)26 b(the)g(`)p Fs(-o)k(bashdefault)p -Ft(')22 b(option)150 1338 y(w)m(as)i(supplied)e(to)j -Fs(complete)c Ft(when)i(the)g(compsp)s(ec)h(w)m(as)g(de\014ned,)g(the)f -(default)h(Bash)g(completions)h(are)150 1448 y(attempted)f(if)f(the)g -(compsp)s(ec)g(generates)i(no)e(matc)m(hes.)39 b(If)23 -b(the)g(`)p Fs(-o)30 b(default)p Ft(')21 b(option)j(w)m(as)f(supplied)f -(to)150 1557 y Fs(complete)j Ft(when)h(the)h(compsp)s(ec)f(w)m(as)i +%%Page: 126 132 +TeXDict begin 126 131 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(126)275 299 y(If)27 +b(the)h(previously-applied)f(actions)i(do)f(not)g(generate)h(an)m(y)f +(matc)m(hes,)i(and)d(the)h Ft(-o)h(dirnames)d Fu(op-)150 +408 y(tion)j(w)m(as)f(supplied)f(to)i Ft(complete)d Fu(when)h(the)h +(compsp)s(ec)g(w)m(as)g(de\014ned,)g(directory)g(name)h(completion)150 +518 y(is)h(attempted.)275 654 y(If)35 b(the)g Ft(-o)30 +b(plusdirs)j Fu(option)j(w)m(as)g(supplied)e(to)i Ft(complete)e +Fu(when)g(the)i(compsp)s(ec)f(w)m(as)h(de\014ned,)150 +764 y(directory)g(name)f(completion)i(is)e(attempted)h(and)f(an)m(y)h +(matc)m(hes)g(are)g(added)f(to)h(the)f(results)g(of)h(the)150 +873 y(other)31 b(actions.)275 1010 y(By)g(default,)i(if)e(a)h(compsp)s +(ec)f(is)h(found,)f(whatev)m(er)h(it)g(generates)h(is)e(returned)g(to)h +(the)g(completion)150 1119 y(co)s(de)21 b(as)g(the)g(full)g(set)g(of)g +(p)s(ossible)f(completions.)39 b(The)20 b(default)h(Bash)g(completions) +h(are)g(not)f(attempted,)150 1229 y(and)30 b(the)g(Readline)h(default)f +(of)g(\014lename)h(completion)g(is)f(disabled.)41 b(If)29 +b(the)i Ft(-o)e(bashdefault)e Fu(option)150 1338 y(w)m(as)d(supplied)e +(to)j Ft(complete)c Fu(when)i(the)g(compsp)s(ec)h(w)m(as)g(de\014ned,)g +(the)f(default)h(Bash)g(completions)h(are)150 1448 y(attempted)j(if)f +(the)h(compsp)s(ec)f(generates)h(no)f(matc)m(hes.)41 +b(If)27 b(the)g Ft(-o)j(default)25 b Fu(option)j(w)m(as)f(supplied)f +(to)150 1557 y Ft(complete)f Fu(when)h(the)h(compsp)s(ec)f(w)m(as)i (de\014ned,)e(Readline's)i(default)f(completion)h(will)f(b)s(e)f(p)s (erformed)150 1667 y(if)k(the)h(compsp)s(ec)f(\(and,)g(if)h(attempted,) g(the)g(default)f(Bash)h(completions\))h(generate)g(no)e(matc)m(hes.) @@ -16393,25 +16890,24 @@ g(the)g(default)f(Bash)h(completions\))h(generate)g(no)e(matc)m(hes.) 1913 y(completion)31 b(functions)e(force)i(Readline)f(to)h(app)s(end)d (a)i(slash)g(to)g(completed)h(names)e(whic)m(h)h(are)g(sym-)150 2022 y(b)s(olic)40 b(links)g(to)h(directories,)j(sub)5 -b(ject)40 b(to)h(the)f(v)-5 b(alue)41 b(of)f(the)g Fq(mark-directories) -45 b Ft(Readline)c(v)-5 b(ariable,)150 2132 y(regardless)31 -b(of)f(the)h(setting)g(of)g(the)f Fq(mark-symlink)m(ed-directories)36 -b Ft(Readline)31 b(v)-5 b(ariable.)275 2268 y(There)25 +b(ject)40 b(to)h(the)f(v)-5 b(alue)41 b(of)f(the)g Fr(mark-directories) +45 b Fu(Readline)c(v)-5 b(ariable,)150 2132 y(regardless)31 +b(of)f(the)h(setting)g(of)g(the)f Fr(mark-symlink)m(ed-directories)36 +b Fu(Readline)31 b(v)-5 b(ariable.)275 2268 y(There)25 b(is)i(some)g(supp)s(ort)e(for)h(dynamically)h(mo)s(difying)f (completions.)40 b(This)26 b(is)g(most)h(useful)f(when)150 -2378 y(used)37 b(in)h(com)m(bination)h(with)e(a)i(default)f(completion) -h(sp)s(eci\014ed)e(with)h(`)p Fs(-D)p Ft('.)63 b(It's)38 -b(p)s(ossible)f(for)h(shell)150 2487 y(functions)28 b(executed)h(as)f -(completion)i(handlers)d(to)i(indicate)g(that)g(completion)g(should)e -(b)s(e)h(retried)g(b)m(y)150 2597 y(returning)j(an)i(exit)g(status)f -(of)h(124.)48 b(If)31 b(a)i(shell)f(function)g(returns)f(124,)k(and)c -(c)m(hanges)j(the)e(compsp)s(ec)150 2707 y(asso)s(ciated)43 -b(with)e(the)g(command)g(on)g(whic)m(h)g(completion)i(is)e(b)s(eing)g -(attempted)h(\(supplied)e(as)i(the)150 2816 y(\014rst)29 -b(argumen)m(t)h(when)e(the)i(function)f(is)g(executed\),)j -(programmable)d(completion)i(restarts)f(from)f(the)150 -2926 y(b)s(eginning,)e(with)g(an)h(attempt)g(to)g(\014nd)e(a)i(new)e -(compsp)s(ec)i(for)f(that)h(command.)39 b(This)27 b(allo)m(ws)h(a)g +2378 y(used)40 b(in)h(com)m(bination)i(with)e(a)g(default)h(completion) +g(sp)s(eci\014ed)f(with)g Ft(-D)p Fu(.)72 b(It's)42 b(p)s(ossible)f +(for)g(shell)150 2487 y(functions)28 b(executed)h(as)f(completion)i +(handlers)d(to)i(indicate)g(that)g(completion)g(should)e(b)s(e)h +(retried)g(b)m(y)150 2597 y(returning)j(an)i(exit)g(status)f(of)h(124.) +48 b(If)31 b(a)i(shell)f(function)g(returns)f(124,)k(and)c(c)m(hanges)j +(the)e(compsp)s(ec)150 2707 y(asso)s(ciated)43 b(with)e(the)g(command)g +(on)g(whic)m(h)g(completion)i(is)e(b)s(eing)g(attempted)h(\(supplied)e +(as)i(the)150 2816 y(\014rst)29 b(argumen)m(t)h(when)e(the)i(function)f +(is)g(executed\),)j(programmable)d(completion)i(restarts)f(from)f(the) +150 2926 y(b)s(eginning,)e(with)g(an)h(attempt)g(to)g(\014nd)e(a)i(new) +e(compsp)s(ec)i(for)f(that)h(command.)39 b(This)27 b(allo)m(ws)h(a)g (set)g(of)150 3035 y(completions)33 b(to)f(b)s(e)g(built)f(dynamically) i(as)f(completion)h(is)f(attempted,)h(rather)f(than)f(b)s(eing)g (loaded)150 3145 y(all)g(at)g(once.)275 3281 y(F)-8 b(or)38 @@ -16420,442 +16916,433 @@ s(ecs,)i(eac)m(h)g(k)m(ept)e(in)g(a)h(\014le)f(corre-)150 3391 y(sp)s(onding)g(to)j(the)f(name)f(of)h(the)g(command,)i(the)e (follo)m(wing)h(default)f(completion)h(function)e(w)m(ould)150 3500 y(load)31 b(completions)g(dynamically:)390 3636 -y Fs(_completion_loader\(\))390 3746 y({)581 3856 y(.)47 +y Ft(_completion_loader\(\))390 3746 y({)581 3856 y(.)47 b("/etc/bash_completion.d/$1)o(.sh)o(")42 b(>/dev/null)j(2>&1)i(&&)g (return)f(124)390 3965 y(})390 4075 y(complete)g(-D)h(-F)g (_completion_loader)c(-o)k(bashdefault)e(-o)i(default)150 -4310 y Fr(8.7)68 b(Programmable)47 b(Completion)f(Builtins)150 -4469 y Ft(Three)21 b(builtin)g(commands)f(are)i(a)m(v)-5 +4310 y Fs(8.7)68 b(Programmable)47 b(Completion)f(Builtins)150 +4469 y Fu(Three)21 b(builtin)g(commands)f(are)i(a)m(v)-5 b(ailable)24 b(to)e(manipulate)f(the)h(programmable)f(completion)h (facilities:)150 4579 y(one)34 b(to)g(sp)s(ecify)f(ho)m(w)h(the)f (argumen)m(ts)h(to)g(a)g(particular)g(command)f(are)h(to)g(b)s(e)f (completed,)j(and)d(t)m(w)m(o)150 4688 y(to)e(mo)s(dify)f(the)g (completion)i(as)e(it)h(is)g(happ)s(ening.)150 4850 y -Fs(compgen)870 4985 y(compgen)46 b([)p Fi(option)11 b -Fs(])45 b([)p Fi(word)11 b Fs(])630 5121 y Ft(Generate)27 -b(p)s(ossible)e(completion)i(matc)m(hes)g(for)e Fq(w)m(ord)k -Ft(according)e(to)f(the)g Fq(option)p Ft(s,)h(whic)m(h)630 -5230 y(ma)m(y)h(b)s(e)f(an)m(y)h(option)g(accepted)h(b)m(y)e(the)h -Fs(complete)d Ft(builtin)j(with)f(the)h(exception)g(of)g(`)p -Fs(-p)p Ft(')630 5340 y(and)k(`)p Fs(-r)p Ft(',)i(and)e(write)h(the)g -(matc)m(hes)h(to)g(the)f(standard)f(output.)48 b(When)33 -b(using)f(the)h(`)p Fs(-F)p Ft(')p eop end -%%Page: 128 134 -TeXDict begin 128 133 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(128)630 299 y(or)28 -b(`)p Fs(-C)p Ft(')g(options,)h(the)f(v)-5 b(arious)29 -b(shell)f(v)-5 b(ariables)29 b(set)f(b)m(y)g(the)g(programmable)h -(completion)630 408 y(facilities,)k(while)d(a)m(v)-5 -b(ailable,)33 b(will)e(not)g(ha)m(v)m(e)g(useful)f(v)-5 -b(alues.)630 552 y(The)34 b(matc)m(hes)h(will)g(b)s(e)f(generated)h(in) -f(the)h(same)g(w)m(a)m(y)g(as)g(if)f(the)h(programmable)f(com-)630 -662 y(pletion)d(co)s(de)g(had)f(generated)i(them)e(directly)i(from)e(a) -h(completion)h(sp)s(eci\014cation)f(with)630 771 y(the)e(same)h -(\015ags.)40 b(If)29 b Fq(w)m(ord)j Ft(is)d(sp)s(eci\014ed,)g(only)g -(those)h(completions)g(matc)m(hing)g Fq(w)m(ord)j Ft(will)630 -881 y(b)s(e)d(displa)m(y)m(ed.)630 1025 y(The)24 b(return)g(v)-5 -b(alue)25 b(is)g(true)f(unless)g(an)h(in)m(v)-5 b(alid)25 -b(option)g(is)g(supplied,)f(or)h(no)g(matc)m(hes)g(w)m(ere)630 -1134 y(generated.)150 1313 y Fs(complete)870 1456 y(complete)46 -b([-abcdefgjksuv])d([-o)k Fi(comp-option)11 b Fs(])44 -b([-DE])i([-A)h Fi(action)11 b Fs(])46 b([-)870 1566 -y(G)h Fi(globpat)11 b Fs(])46 b([-W)g Fi(wordlist)11 -b Fs(])870 1676 y([-F)47 b Fi(function)11 b Fs(])45 b([-C)i -Fi(command)11 b Fs(])45 b([-X)i Fi(filterpat)11 b Fs(])870 -1785 y([-P)47 b Fi(prefix)11 b Fs(])45 b([-S)i Fi(suffix)11 -b Fs(])45 b Fi(name)58 b Fs([)p Fi(name)f Fs(...)o(])870 -1895 y(complete)46 b(-pr)g([-DE])h([)p Fi(name)57 b Fs(...)o(])630 -2039 y Ft(Sp)s(ecify)33 b(ho)m(w)h(argumen)m(ts)h(to)f(eac)m(h)i -Fq(name)j Ft(should)33 b(b)s(e)g(completed.)53 b(If)33 -b(the)i(`)p Fs(-p)p Ft(')e(option)630 2148 y(is)d(supplied,)e(or)i(if)g -(no)f(options)h(are)g(supplied,)f(existing)h(completion)h(sp)s -(eci\014cations)g(are)630 2258 y(prin)m(ted)43 b(in)h(a)g(w)m(a)m(y)h -(that)f(allo)m(ws)h(them)f(to)g(b)s(e)g(reused)f(as)h(input.)80 -b(The)43 b(`)p Fs(-r)p Ft(')g(option)630 2367 y(remo)m(v)m(es)29 -b(a)e(completion)i(sp)s(eci\014cation)e(for)g(eac)m(h)i -Fq(name)5 b Ft(,)28 b(or,)g(if)f(no)g Fq(name)5 b Ft(s)27 -b(are)h(supplied,)630 2477 y(all)46 b(completion)h(sp)s -(eci\014cations.)87 b(The)45 b(`)p Fs(-D)p Ft(')h(option)g(indicates)g -(that)g(the)g(remaining)630 2587 y(options)35 b(and)f(actions)h(should) -f(apply)g(to)h(the)g(\\default")g(command)f(completion;)k(that)630 -2696 y(is,)25 b(completion)g(attempted)g(on)e(a)h(command)f(for)g(whic) -m(h)h(no)f(completion)i(has)e(previously)630 2806 y(b)s(een)28 -b(de\014ned.)39 b(The)27 b(`)p Fs(-E)p Ft(')i(option)g(indicates)g -(that)g(the)g(remaining)f(options)h(and)f(actions)630 -2915 y(should)i(apply)i(to)g(\\empt)m(y")g(command)g(completion;)h -(that)f(is,)g(completion)h(attempted)630 3025 y(on)d(a)h(blank)f(line.) -630 3169 y(The)f(pro)s(cess)g(of)h(applying)g(these)g(completion)g(sp)s -(eci\014cations)h(when)d(w)m(ord)i(completion)630 3278 +Ft(compgen)870 4985 y(compgen)46 b([)p Fj(option)p Ft(])f([)p +Fj(word)p Ft(])630 5121 y Fu(Generate)27 b(p)s(ossible)e(completion)i +(matc)m(hes)g(for)e Fr(w)m(ord)k Fu(according)e(to)f(the)g +Fr(option)p Fu(s,)h(whic)m(h)630 5230 y(ma)m(y)32 b(b)s(e)f(an)m(y)h +(option)g(accepted)g(b)m(y)g(the)f Ft(complete)f Fu(builtin)h(with)g +(the)g(exception)i(of)f Ft(-p)630 5340 y Fu(and)39 b +Ft(-r)p Fu(,)i(and)e(write)h(the)g(matc)m(hes)g(to)g(the)g(standard)f +(output.)68 b(When)39 b(using)g(the)h Ft(-F)p eop end +%%Page: 127 133 +TeXDict begin 127 132 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(127)630 299 y(or)33 +b Ft(-C)f Fu(options,)i(the)e(v)-5 b(arious)33 b(shell)g(v)-5 +b(ariables)33 b(set)g(b)m(y)g(the)g(programmable)g(completion)630 +408 y(facilities,)g(while)d(a)m(v)-5 b(ailable,)33 b(will)e(not)g(ha)m +(v)m(e)g(useful)f(v)-5 b(alues.)630 542 y(The)34 b(matc)m(hes)h(will)g +(b)s(e)f(generated)h(in)f(the)h(same)g(w)m(a)m(y)g(as)g(if)f(the)h +(programmable)f(com-)630 652 y(pletion)d(co)s(de)g(had)f(generated)i +(them)e(directly)i(from)e(a)h(completion)h(sp)s(eci\014cation)f(with) +630 762 y(the)e(same)h(\015ags.)40 b(If)29 b Fr(w)m(ord)j +Fu(is)d(sp)s(eci\014ed,)g(only)g(those)h(completions)g(matc)m(hing)g +Fr(w)m(ord)j Fu(will)630 871 y(b)s(e)d(displa)m(y)m(ed.)630 +1005 y(The)24 b(return)g(v)-5 b(alue)25 b(is)g(true)f(unless)g(an)h(in) +m(v)-5 b(alid)25 b(option)g(is)g(supplied,)f(or)h(no)g(matc)m(hes)g(w)m +(ere)630 1115 y(generated.)150 1273 y Ft(complete)870 +1407 y(complete)46 b([-abcdefgjksuv])d([-o)k Fj(comp-option)p +Ft(])e([-DE])h([-A)h Fj(action)p Ft(])f([-)870 1517 y(G)h +Fj(globpat)p Ft(])f([-W)h Fj(wordlist)p Ft(])870 1626 +y([-F)g Fj(function)p Ft(])e([-C)i Fj(command)p Ft(])f([-X)h +Fj(filterpat)p Ft(])870 1736 y([-P)g Fj(prefix)p Ft(])f([-S)h +Fj(suffix)p Ft(])e Fj(name)i Ft([)p Fj(name)f Ft(...])870 +1845 y(complete)g(-pr)g([-DE])h([)p Fj(name)f Ft(...)o(])630 +1979 y Fu(Sp)s(ecify)37 b(ho)m(w)h(argumen)m(ts)f(to)i(eac)m(h)g +Fr(name)j Fu(should)37 b(b)s(e)g(completed.)63 b(If)38 +b(the)f Ft(-p)g Fu(option)630 2089 y(is)30 b(supplied,)e(or)i(if)g(no)f +(options)h(are)g(supplied,)f(existing)h(completion)h(sp)s +(eci\014cations)g(are)630 2198 y(prin)m(ted)24 b(in)h(a)g(w)m(a)m(y)g +(that)h(allo)m(ws)g(them)e(to)i(b)s(e)e(reused)f(as)i(input.)38 +b(The)24 b Ft(-r)g Fu(option)i(remo)m(v)m(es)630 2308 +y(a)i(completion)h(sp)s(eci\014cation)f(for)g(eac)m(h)h +Fr(name)p Fu(,)f(or,)h(if)e(no)h Fr(name)5 b Fu(s)27 +b(are)h(supplied,)g(all)g(com-)630 2418 y(pletion)k(sp)s +(eci\014cations.)44 b(The)30 b Ft(-D)h Fu(option)h(indicates)g(that)f +(the)h(remaining)f(options)h(and)630 2527 y(actions)27 +b(should)e(apply)g(to)i(the)f(\\default")h(command)e(completion;)k +(that)e(is,)g(completion)630 2637 y(attempted)g(on)f(a)h(command)f(for) +g(whic)m(h)g(no)g(completion)i(has)d(previously)h(b)s(een)g(de\014ned.) +630 2746 y(The)f Ft(-E)g Fu(option)h(indicates)h(that)f(the)g +(remaining)g(options)g(and)f(actions)i(should)e(apply)g(to)630 +2856 y(\\empt)m(y")32 b(command)e(completion;)i(that)f(is,)f +(completion)i(attempted)f(on)g(a)f(blank)g(line.)630 +2990 y(The)f(pro)s(cess)g(of)h(applying)g(these)g(completion)g(sp)s +(eci\014cations)h(when)d(w)m(ord)i(completion)630 3099 y(is)35 b(attempted)h(is)f(describ)s(ed)f(ab)s(o)m(v)m(e)j(\(see)f -(Section)g(8.6)g([Programmable)g(Completion],)630 3388 -y(page)31 b(125\).)42 b(The)30 b(`)p Fs(-D)p Ft(')h(option)f(tak)m(es)i -(precedence)f(o)m(v)m(er)h(`)p Fs(-E)p Ft('.)630 3532 -y(Other)41 b(options,)46 b(if)41 b(sp)s(eci\014ed,)j(ha)m(v)m(e)f(the)f -(follo)m(wing)i(meanings.)75 b(The)41 b(argumen)m(ts)h(to)630 -3641 y(the)e(`)p Fs(-G)p Ft(',)j(`)p Fs(-W)p Ft(',)g(and)d(`)p -Fs(-X)p Ft(')g(options)g(\(and,)j(if)d(necessary)-8 b(,)44 -b(the)c(`)p Fs(-P)p Ft(')h(and)e(`)p Fs(-S)p Ft(')h(options\))630 -3751 y(should)30 b(b)s(e)h(quoted)g(to)h(protect)g(them)f(from)g -(expansion)g(b)s(efore)g(the)g Fs(complete)e Ft(builtin)630 -3861 y(is)h(in)m(v)m(ok)m(ed.)630 4039 y Fs(-o)g Fi(comp-option)1110 -4148 y Ft(The)c Fq(comp-option)i Ft(con)m(trols)g(sev)m(eral)h(asp)s -(ects)e(of)g(the)g(compsp)s(ec's)g(b)s(eha)m(v-)1110 -4258 y(ior)g(b)s(ey)m(ond)f(the)g(simple)h(generation)h(of)e -(completions.)41 b Fq(comp-option)27 b Ft(ma)m(y)1110 -4367 y(b)s(e)j(one)g(of:)1110 4545 y Fs(bashdefault)1590 -4655 y Ft(P)m(erform)d(the)h(rest)f(of)h(the)g(default)f(Bash)h -(completions)g(if)g(the)1590 4765 y(compsp)s(ec)i(generates)i(no)e -(matc)m(hes.)1110 4943 y Fs(default)144 b Ft(Use)22 b(Readline's)g -(default)g(\014lename)g(completion)g(if)g(the)g(comp-)1590 -5052 y(sp)s(ec)30 b(generates)i(no)e(matc)m(hes.)1110 -5230 y Fs(dirnames)96 b Ft(P)m(erform)46 b(directory)g(name)h -(completion)g(if)f(the)g(compsp)s(ec)1590 5340 y(generates)32 -b(no)e(matc)m(hes.)p eop end -%%Page: 129 135 -TeXDict begin 129 134 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(129)1110 299 y Fs(filenames)1590 -408 y Ft(T)-8 b(ell)40 b(Readline)f(that)h(the)f(compsp)s(ec)f -(generates)j(\014lenames,)1590 518 y(so)29 b(it)h(can)f(p)s(erform)f -(an)m(y)h(\014lename-sp)s(eci\014c)h(pro)s(cessing)e(\(lik)m(e)1590 -628 y(adding)d(a)h(slash)f(to)h(directory)g(names)f(quoting)h(sp)s -(ecial)g(c)m(har-)1590 737 y(acters,)39 b(or)d(suppressing)f(trailing)i -(spaces\).)59 b(This)35 b(option)i(is)1590 847 y(in)m(tended)30 -b(to)g(b)s(e)g(used)f(with)g(shell)i(functions)e(sp)s(eci\014ed)g(with) -1590 956 y(`)p Fs(-F)p Ft('.)1110 1115 y Fs(noquote)144 -b Ft(T)-8 b(ell)28 b(Readline)g(not)g(to)g(quote)g(the)g(completed)g(w) -m(ords)f(if)h(they)1590 1224 y(are)j(\014lenames)f(\(quoting)h -(\014lenames)g(is)f(the)h(default\).)1110 1383 y Fs(nospace)144 -b Ft(T)-8 b(ell)40 b(Readline)g(not)g(to)g(app)s(end)d(a)j(space)g -(\(the)f(default\))h(to)1590 1492 y(w)m(ords)30 b(completed)h(at)g(the) -g(end)f(of)g(the)h(line.)1110 1650 y Fs(plusdirs)96 b -Ft(After)30 b(an)m(y)h(matc)m(hes)g(de\014ned)d(b)m(y)i(the)g(compsp)s -(ec)g(are)g(gener-)1590 1760 y(ated,)g(directory)f(name)g(completion)i -(is)d(attempted)i(and)f(an)m(y)1590 1870 y(matc)m(hes)j(are)e(added)g -(to)h(the)g(results)f(of)g(the)h(other)g(actions.)630 -2028 y Fs(-A)f Fi(action)1110 2138 y Ft(The)25 b Fq(action)h -Ft(ma)m(y)g(b)s(e)e(one)h(of)h(the)f(follo)m(wing)i(to)e(generate)i(a)e -(list)h(of)f(p)s(ossible)1110 2247 y(completions:)1110 -2405 y Fs(alias)240 b Ft(Alias)31 b(names.)41 b(Ma)m(y)31 -b(also)h(b)s(e)e(sp)s(eci\014ed)f(as)i(`)p Fs(-a)p Ft('.)1110 -2564 y Fs(arrayvar)96 b Ft(Arra)m(y)31 b(v)-5 b(ariable)31 -b(names.)1110 2722 y Fs(binding)144 b Ft(Readline)30 -b(k)m(ey)f(binding)f(names)h(\(see)h(Section)f(8.4)h([Bindable)1590 -2832 y(Readline)h(Commands],)f(page)h(116\).)1110 2990 -y Fs(builtin)144 b Ft(Names)21 b(of)g(shell)f(builtin)h(commands.)37 -b(Ma)m(y)21 b(also)h(b)s(e)e(sp)s(eci\014ed)1590 3099 -y(as)31 b(`)p Fs(-b)p Ft('.)1110 3258 y Fs(command)144 -b Ft(Command)29 b(names.)41 b(Ma)m(y)32 b(also)f(b)s(e)f(sp)s -(eci\014ed)f(as)i(`)p Fs(-c)p Ft('.)1110 3416 y Fs(directory)1590 -3526 y Ft(Directory)h(names.)40 b(Ma)m(y)32 b(also)f(b)s(e)f(sp)s -(eci\014ed)g(as)g(`)p Fs(-d)p Ft('.)1110 3684 y Fs(disabled)96 -b Ft(Names)31 b(of)g(disabled)f(shell)g(builtins.)1110 -3842 y Fs(enabled)144 b Ft(Names)31 b(of)g(enabled)f(shell)g(builtins.) -1110 4001 y Fs(export)192 b Ft(Names)34 b(of)f(exp)s(orted)f(shell)h(v) --5 b(ariables.)49 b(Ma)m(y)35 b(also)e(b)s(e)g(sp)s(eci-)1590 -4110 y(\014ed)d(as)g(`)p Fs(-e)p Ft('.)1110 4268 y Fs(file)288 -b Ft(File)32 b(names.)40 b(Ma)m(y)32 b(also)f(b)s(e)f(sp)s(eci\014ed)f -(as)i(`)p Fs(-f)p Ft('.)1110 4427 y Fs(function)96 b -Ft(Names)31 b(of)g(shell)f(functions.)1110 4585 y Fs(group)240 -b Ft(Group)30 b(names.)40 b(Ma)m(y)32 b(also)f(b)s(e)f(sp)s(eci\014ed)g -(as)g(`)p Fs(-g)p Ft('.)1110 4743 y Fs(helptopic)1590 -4853 y Ft(Help)37 b(topics)g(as)g(accepted)h(b)m(y)e(the)h -Fs(help)f Ft(builtin)g(\(see)h(Sec-)1590 4963 y(tion)31 -b(4.2)g([Bash)g(Builtins],)g(page)g(48\).)1110 5121 y -Fs(hostname)96 b Ft(Hostnames,)89 b(as)76 b(tak)m(en)h(from)f(the)g -(\014le)h(sp)s(eci\014ed)e(b)m(y)1590 5230 y(the)55 b -Fs(HOSTFILE)e Ft(shell)j(v)-5 b(ariable)56 b(\(see)g(Section)g(5.2)h -([Bash)1590 5340 y(V)-8 b(ariables],)32 b(page)f(69\).)p +(Section)g(8.6)g([Programmable)g(Completion],)630 3209 +y(page)31 b(124\).)42 b(The)30 b Ft(-D)g Fu(option)h(tak)m(es)h +(precedence)f(o)m(v)m(er)g Ft(-E)p Fu(.)630 3343 y(Other)d(options,)i +(if)f(sp)s(eci\014ed,)g(ha)m(v)m(e)h(the)f(follo)m(wing)i(meanings.)40 +b(The)29 b(argumen)m(ts)g(to)h(the)630 3453 y Ft(-G)p +Fu(,)41 b Ft(-W)p Fu(,)h(and)c Ft(-X)h Fu(options)h(\(and,)h(if)f +(necessary)-8 b(,)42 b(the)e Ft(-P)f Fu(and)f Ft(-S)h +Fu(options\))h(should)f(b)s(e)630 3562 y(quoted)28 b(to)h(protect)g +(them)f(from)f(expansion)h(b)s(efore)g(the)g Ft(complete)e +Fu(builtin)h(is)h(in)m(v)m(ok)m(ed.)630 3720 y Ft(-o)i +Fj(comp-option)1110 3830 y Fu(The)c Fr(comp-option)i +Fu(con)m(trols)g(sev)m(eral)h(asp)s(ects)e(of)g(the)g(compsp)s(ec's)g +(b)s(eha)m(v-)1110 3940 y(ior)g(b)s(ey)m(ond)f(the)g(simple)h +(generation)h(of)e(completions.)41 b Fr(comp-option)27 +b Fu(ma)m(y)1110 4049 y(b)s(e)j(one)g(of:)1110 4208 y +Ft(bashdefault)1590 4317 y Fu(P)m(erform)d(the)h(rest)f(of)h(the)g +(default)f(Bash)h(completions)g(if)g(the)1590 4427 y(compsp)s(ec)i +(generates)i(no)e(matc)m(hes.)1110 4585 y Ft(default)144 +b Fu(Use)22 b(Readline's)g(default)g(\014lename)g(completion)g(if)g +(the)g(comp-)1590 4695 y(sp)s(ec)30 b(generates)i(no)e(matc)m(hes.)1110 +4853 y Ft(dirnames)96 b Fu(P)m(erform)46 b(directory)g(name)h +(completion)g(if)f(the)g(compsp)s(ec)1590 4963 y(generates)32 +b(no)e(matc)m(hes.)1110 5121 y Ft(filenames)1590 5230 +y Fu(T)-8 b(ell)40 b(Readline)f(that)h(the)f(compsp)s(ec)f(generates)j +(\014lenames,)1590 5340 y(so)29 b(it)h(can)f(p)s(erform)f(an)m(y)h +(\014lename-sp)s(eci\014c)h(pro)s(cessing)e(\(lik)m(e)p eop end -%%Page: 130 136 -TeXDict begin 130 135 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(130)1110 299 y Fs(job)336 -b Ft(Job)31 b(names,)h(if)g(job)f(con)m(trol)i(is)f(activ)m(e.)46 -b(Ma)m(y)33 b(also)g(b)s(e)e(sp)s(eci-)1590 408 y(\014ed)f(as)g(`)p -Fs(-j)p Ft('.)1110 577 y Fs(keyword)144 b Ft(Shell)30 -b(reserv)m(ed)h(w)m(ords.)40 b(Ma)m(y)32 b(also)f(b)s(e)f(sp)s -(eci\014ed)f(as)i(`)p Fs(-k)p Ft('.)1110 745 y Fs(running)144 -b Ft(Names)31 b(of)g(running)d(jobs,)i(if)h(job)f(con)m(trol)h(is)g -(activ)m(e.)1110 913 y Fs(service)144 b Ft(Service)31 -b(names.)41 b(Ma)m(y)31 b(also)g(b)s(e)f(sp)s(eci\014ed)g(as)g(`)p -Fs(-s)p Ft('.)1110 1081 y Fs(setopt)192 b Ft(V)-8 b(alid)34 -b(argumen)m(ts)f(for)f(the)h(`)p Fs(-o)p Ft(')g(option)g(to)h(the)f -Fs(set)e Ft(builtin)1590 1190 y(\(see)g(Section)h(4.3.1)g([The)e(Set)g -(Builtin],)i(page)f(59\).)1110 1358 y Fs(shopt)240 b -Ft(Shell)40 b(option)g(names)g(as)g(accepted)i(b)m(y)e(the)g -Fs(shopt)e Ft(builtin)1590 1468 y(\(see)31 b(Section)h(4.2)f([Bash)g -(Builtins],)g(page)g(48\).)1110 1636 y Fs(signal)192 -b Ft(Signal)31 b(names.)1110 1804 y Fs(stopped)144 b -Ft(Names)31 b(of)g(stopp)s(ed)e(jobs,)h(if)g(job)g(con)m(trol)i(is)f -(activ)m(e.)1110 1972 y Fs(user)288 b Ft(User)30 b(names.)41 -b(Ma)m(y)32 b(also)f(b)s(e)f(sp)s(eci\014ed)f(as)i(`)p -Fs(-u)p Ft('.)1110 2140 y Fs(variable)96 b Ft(Names)36 -b(of)g(all)g(shell)g(v)-5 b(ariables.)56 b(Ma)m(y)37 -b(also)f(b)s(e)f(sp)s(eci\014ed)g(as)1590 2250 y(`)p -Fs(-v)p Ft('.)630 2418 y Fs(-C)30 b Fi(command)1110 2527 -y Fq(command)35 b Ft(is)e(executed)g(in)e(a)i(subshell)e(en)m(vironmen) -m(t,)i(and)f(its)g(output)g(is)1110 2637 y(used)e(as)g(the)h(p)s -(ossible)f(completions.)630 2805 y Fs(-F)g Fi(function)1110 -2914 y Ft(The)39 b(shell)g(function)g Fq(function)g Ft(is)g(executed)h -(in)f(the)g(curren)m(t)g(shell)g(en)m(vi-)1110 3024 y(ronmen)m(t.)72 +%%Page: 128 134 +TeXDict begin 128 133 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(128)1590 299 y(adding)25 +b(a)h(slash)f(to)h(directory)g(names)f(quoting)h(sp)s(ecial)g(c)m(har-) +1590 408 y(acters,)39 b(or)d(suppressing)f(trailing)i(spaces\).)59 +b(This)35 b(option)i(is)1590 518 y(in)m(tended)30 b(to)g(b)s(e)g(used)f +(with)g(shell)i(functions)e(sp)s(eci\014ed)g(with)1590 +628 y Ft(-F)p Fu(.)1110 787 y Ft(noquote)144 b Fu(T)-8 +b(ell)28 b(Readline)g(not)g(to)g(quote)g(the)g(completed)g(w)m(ords)f +(if)h(they)1590 896 y(are)j(\014lenames)f(\(quoting)h(\014lenames)g(is) +f(the)h(default\).)1110 1055 y Ft(nospace)144 b Fu(T)-8 +b(ell)40 b(Readline)g(not)g(to)g(app)s(end)d(a)j(space)g(\(the)f +(default\))h(to)1590 1165 y(w)m(ords)30 b(completed)h(at)g(the)g(end)f +(of)g(the)h(line.)1110 1324 y Ft(plusdirs)96 b Fu(After)30 +b(an)m(y)h(matc)m(hes)g(de\014ned)d(b)m(y)i(the)g(compsp)s(ec)g(are)g +(gener-)1590 1433 y(ated,)g(directory)f(name)g(completion)i(is)d +(attempted)i(and)f(an)m(y)1590 1543 y(matc)m(hes)j(are)e(added)g(to)h +(the)g(results)f(of)g(the)h(other)g(actions.)630 1702 +y Ft(-A)f Fj(action)66 b Fu(The)25 b Fr(action)h Fu(ma)m(y)g(b)s(e)e +(one)h(of)h(the)f(follo)m(wing)i(to)e(generate)i(a)e(list)h(of)f(p)s +(ossible)1110 1811 y(completions:)1110 1970 y Ft(alias)240 +b Fu(Alias)31 b(names.)41 b(Ma)m(y)31 b(also)h(b)s(e)e(sp)s(eci\014ed)f +(as)i Ft(-a)p Fu(.)1110 2129 y Ft(arrayvar)96 b Fu(Arra)m(y)31 +b(v)-5 b(ariable)31 b(names.)1110 2288 y Ft(binding)144 +b Fu(Readline)30 b(k)m(ey)f(binding)f(names)h(\(see)h(Section)f(8.4)h +([Bindable)1590 2398 y(Readline)h(Commands],)f(page)h(115\).)1110 +2556 y Ft(builtin)144 b Fu(Names)21 b(of)g(shell)f(builtin)h(commands.) +37 b(Ma)m(y)21 b(also)h(b)s(e)e(sp)s(eci\014ed)1590 2666 +y(as)31 b Ft(-b)p Fu(.)1110 2825 y Ft(command)144 b Fu(Command)29 +b(names.)41 b(Ma)m(y)32 b(also)f(b)s(e)f(sp)s(eci\014ed)f(as)i +Ft(-c)p Fu(.)1110 2984 y Ft(directory)1590 3093 y Fu(Directory)h +(names.)40 b(Ma)m(y)32 b(also)f(b)s(e)f(sp)s(eci\014ed)g(as)g +Ft(-d)p Fu(.)1110 3252 y Ft(disabled)96 b Fu(Names)31 +b(of)g(disabled)f(shell)g(builtins.)1110 3411 y Ft(enabled)144 +b Fu(Names)31 b(of)g(enabled)f(shell)g(builtins.)1110 +3570 y Ft(export)192 b Fu(Names)34 b(of)f(exp)s(orted)f(shell)h(v)-5 +b(ariables.)49 b(Ma)m(y)35 b(also)e(b)s(e)g(sp)s(eci-)1590 +3680 y(\014ed)d(as)g Ft(-e)p Fu(.)1110 3839 y Ft(file)288 +b Fu(File)32 b(names.)40 b(Ma)m(y)32 b(also)f(b)s(e)f(sp)s(eci\014ed)f +(as)i Ft(-f)p Fu(.)1110 3998 y Ft(function)96 b Fu(Names)31 +b(of)g(shell)f(functions.)1110 4156 y Ft(group)240 b +Fu(Group)30 b(names.)40 b(Ma)m(y)32 b(also)f(b)s(e)f(sp)s(eci\014ed)g +(as)g Ft(-g)p Fu(.)1110 4315 y Ft(helptopic)1590 4425 +y Fu(Help)37 b(topics)g(as)g(accepted)h(b)m(y)e(the)h +Ft(help)f Fu(builtin)g(\(see)h(Sec-)1590 4534 y(tion)31 +b(4.2)g([Bash)g(Builtins],)g(page)g(48\).)1110 4693 y +Ft(hostname)96 b Fu(Hostnames,)89 b(as)76 b(tak)m(en)h(from)f(the)g +(\014le)h(sp)s(eci\014ed)e(b)m(y)1590 4803 y(the)55 b +Ft(HOSTFILE)e Fu(shell)j(v)-5 b(ariable)56 b(\(see)g(Section)g(5.2)h +([Bash)1590 4913 y(V)-8 b(ariables],)32 b(page)f(69\).)1110 +5071 y Ft(job)336 b Fu(Job)31 b(names,)h(if)g(job)f(con)m(trol)i(is)f +(activ)m(e.)46 b(Ma)m(y)33 b(also)g(b)s(e)e(sp)s(eci-)1590 +5181 y(\014ed)f(as)g Ft(-j)p Fu(.)1110 5340 y Ft(keyword)144 +b Fu(Shell)30 b(reserv)m(ed)h(w)m(ords.)40 b(Ma)m(y)32 +b(also)f(b)s(e)f(sp)s(eci\014ed)f(as)i Ft(-k)p Fu(.)p +eop end +%%Page: 129 135 +TeXDict begin 129 134 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(129)1110 299 y Ft(running)144 +b Fu(Names)31 b(of)g(running)d(jobs,)i(if)h(job)f(con)m(trol)h(is)g +(activ)m(e.)1110 463 y Ft(service)144 b Fu(Service)31 +b(names.)41 b(Ma)m(y)31 b(also)g(b)s(e)f(sp)s(eci\014ed)g(as)g +Ft(-s)p Fu(.)1110 628 y Ft(setopt)192 b Fu(V)-8 b(alid)39 +b(argumen)m(ts)g(for)f(the)h Ft(-o)e Fu(option)i(to)g(the)g +Ft(set)e Fu(builtin)1590 737 y(\(see)31 b(Section)h(4.3.1)g([The)e(Set) +g(Builtin],)i(page)f(58\).)1110 902 y Ft(shopt)240 b +Fu(Shell)40 b(option)g(names)g(as)g(accepted)i(b)m(y)e(the)g +Ft(shopt)e Fu(builtin)1590 1011 y(\(see)31 b(Section)h(4.2)f([Bash)g +(Builtins],)g(page)g(48\).)1110 1176 y Ft(signal)192 +b Fu(Signal)31 b(names.)1110 1340 y Ft(stopped)144 b +Fu(Names)31 b(of)g(stopp)s(ed)e(jobs,)h(if)g(job)g(con)m(trol)i(is)f +(activ)m(e.)1110 1504 y Ft(user)288 b Fu(User)30 b(names.)41 +b(Ma)m(y)32 b(also)f(b)s(e)f(sp)s(eci\014ed)f(as)i Ft(-u)p +Fu(.)1110 1669 y Ft(variable)96 b Fu(Names)36 b(of)g(all)g(shell)g(v)-5 +b(ariables.)56 b(Ma)m(y)37 b(also)f(b)s(e)f(sp)s(eci\014ed)g(as)1590 +1778 y Ft(-v)p Fu(.)630 1943 y Ft(-C)30 b Fj(command)1110 +2052 y Fr(command)35 b Fu(is)e(executed)g(in)e(a)i(subshell)e(en)m +(vironmen)m(t,)i(and)f(its)g(output)g(is)1110 2162 y(used)e(as)g(the)h +(p)s(ossible)f(completions.)630 2326 y Ft(-F)g Fj(function)1110 +2436 y Fu(The)39 b(shell)g(function)g Fr(function)g Fu(is)g(executed)h +(in)f(the)g(curren)m(t)g(shell)g(en)m(vi-)1110 2545 y(ronmen)m(t.)72 b(When)41 b(it)g(is)g(executed,)k($1)c(is)g(the)g(name)g(of)g(the)g -(command)1110 3134 y(whose)34 b(argumen)m(ts)h(are)g(b)s(eing)f +(command)1110 2655 y(whose)34 b(argumen)m(ts)h(are)g(b)s(eing)f (completed,)j($2)e(is)f(the)h(w)m(ord)f(b)s(eing)g(com-)1110 -3243 y(pleted,)44 b(and)c($3)i(is)e(the)h(w)m(ord)g(preceding)f(the)h -(w)m(ord)f(b)s(eing)h(completed,)1110 3353 y(as)g(describ)s(ed)f(ab)s +2765 y(pleted,)44 b(and)c($3)i(is)e(the)h(w)m(ord)g(preceding)f(the)h +(w)m(ord)f(b)s(eing)h(completed,)1110 2874 y(as)g(describ)s(ed)f(ab)s (o)m(v)m(e)i(\(see)g(Section)f(8.6)h([Programmable)g(Completion],)1110 -3462 y(page)30 b(125\).)42 b(When)29 b(it)h(\014nishes,)e(the)h(p)s -(ossible)g(completions)h(are)g(retriev)m(ed)1110 3572 -y(from)g(the)g(v)-5 b(alue)31 b(of)g(the)f Fs(COMPREPLY)e -Ft(arra)m(y)j(v)-5 b(ariable.)630 3740 y Fs(-G)30 b Fi(globpat)1110 -3850 y Ft(The)39 b(\014lename)h(expansion)g(pattern)g -Fq(globpat)j Ft(is)d(expanded)f(to)h(generate)1110 3959 -y(the)31 b(p)s(ossible)e(completions.)630 4127 y Fs(-P)h -Fi(prefix)1110 4237 y Fq(pre\014x)39 b Ft(is)34 b(added)f(at)i(the)f(b) -s(eginning)f(of)i(eac)m(h)g(p)s(ossible)e(completion)i(after)1110 -4346 y(all)c(other)g(options)g(ha)m(v)m(e)g(b)s(een)f(applied.)630 -4514 y Fs(-S)g Fi(suffix)1110 4624 y Fq(su\016x)c Ft(is)20 +2984 y(page)30 b(124\).)42 b(When)29 b(it)h(\014nishes,)e(the)h(p)s +(ossible)g(completions)h(are)g(retriev)m(ed)1110 3093 +y(from)g(the)g(v)-5 b(alue)31 b(of)g(the)f Ft(COMPREPLY)e +Fu(arra)m(y)j(v)-5 b(ariable.)630 3258 y Ft(-G)30 b Fj(globpat)1110 +3367 y Fu(The)39 b(\014lename)h(expansion)g(pattern)g +Fr(globpat)j Fu(is)d(expanded)f(to)h(generate)1110 3477 +y(the)31 b(p)s(ossible)e(completions.)630 3641 y Ft(-P)h +Fj(prefix)66 b Fr(pre\014x)39 b Fu(is)34 b(added)f(at)i(the)f(b)s +(eginning)f(of)i(eac)m(h)g(p)s(ossible)e(completion)i(after)1110 +3751 y(all)c(other)g(options)g(ha)m(v)m(e)g(b)s(een)f(applied.)630 +3915 y Ft(-S)g Fj(suffix)66 b Fr(su\016x)26 b Fu(is)20 b(app)s(ended)f(to)i(eac)m(h)h(p)s(ossible)e(completion)i(after)f(all)g -(other)g(options)1110 4734 y(ha)m(v)m(e)32 b(b)s(een)d(applied.)630 -4902 y Fs(-W)h Fi(wordlist)1110 5011 y Ft(The)24 b Fq(w)m(ordlist)k -Ft(is)d(split)g(using)f(the)h(c)m(haracters)i(in)d(the)i -Fs(IFS)e Ft(sp)s(ecial)h(v)-5 b(ariable)1110 5121 y(as)36 +(other)g(options)1110 4025 y(ha)m(v)m(e)32 b(b)s(een)d(applied.)630 +4189 y Ft(-W)h Fj(wordlist)1110 4299 y Fu(The)24 b Fr(w)m(ordlist)k +Fu(is)d(split)g(using)f(the)h(c)m(haracters)i(in)d(the)i +Ft(IFS)e Fu(sp)s(ecial)h(v)-5 b(ariable)1110 4408 y(as)36 b(delimiters,)i(and)e(eac)m(h)h(resultan)m(t)g(w)m(ord)e(is)h -(expanded.)57 b(The)35 b(p)s(ossible)1110 5230 y(completions)c(are)e +(expanded.)57 b(The)35 b(p)s(ossible)1110 4518 y(completions)c(are)e (the)h(mem)m(b)s(ers)f(of)g(the)h(resultan)m(t)g(list)g(whic)m(h)f -(matc)m(h)i(the)1110 5340 y(w)m(ord)f(b)s(eing)g(completed.)p -eop end -%%Page: 131 137 -TeXDict begin 131 136 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(131)630 299 y Fs(-X)30 -b Fi(filterpat)1110 408 y Fq(\014lterpat)d Ft(is)e(a)g(pattern)g(as)f -(used)g(for)h(\014lename)g(expansion.)38 b(It)25 b(is)g(applied)f(to) -1110 518 y(the)30 b(list)f(of)h(p)s(ossible)f(completions)h(generated)h -(b)m(y)e(the)g(preceding)h(options)1110 628 y(and)d(argumen)m(ts,)i -(and)e(eac)m(h)i(completion)g(matc)m(hing)g Fq(\014lterpat)h -Ft(is)e(remo)m(v)m(ed)1110 737 y(from)i(the)h(list.)42 -b(A)30 b(leading)i(`)p Fs(!)p Ft(')e(in)g Fq(\014lterpat)j -Ft(negates)f(the)f(pattern;)g(in)f(this)1110 847 y(case,)i(an)m(y)e -(completion)i(not)f(matc)m(hing)g Fq(\014lterpat)i Ft(is)d(remo)m(v)m -(ed.)630 1038 y(The)35 b(return)g(v)-5 b(alue)37 b(is)f(true)f(unless)h -(an)f(in)m(v)-5 b(alid)37 b(option)f(is)g(supplied,)g(an)g(option)h -(other)630 1147 y(than)31 b(`)p Fs(-p)p Ft(')g(or)g(`)p -Fs(-r)p Ft(')g(is)g(supplied)f(without)h(a)g Fq(name)37 -b Ft(argumen)m(t,)32 b(an)f(attempt)h(is)f(made)g(to)630 -1257 y(remo)m(v)m(e)h(a)e(completion)i(sp)s(eci\014cation)f(for)f(a)h -Fq(name)k Ft(for)30 b(whic)m(h)g(no)g(sp)s(eci\014cation)h(exists,)630 -1366 y(or)f(an)h(error)f(o)s(ccurs)g(adding)g(a)g(completion)i(sp)s -(eci\014cation.)150 1557 y Fs(compopt)870 1707 y(compopt)46 -b([-o)h Fi(option)11 b Fs(])45 b([-DE])h([+o)h Fi(option)11 -b Fs(])46 b([)p Fi(name)11 b Fs(])630 1858 y Ft(Mo)s(dify)33 -b(completion)h(options)g(for)f(eac)m(h)h Fq(name)39 b -Ft(according)34 b(to)g(the)f Fq(option)p Ft(s,)i(or)e(for)g(the)630 -1967 y(curren)m(tly-executing)46 b(completion)f(if)f(no)f -Fq(name)5 b Ft(s)44 b(are)h(supplied.)80 b(If)43 b(no)h -Fq(option)p Ft(s)h(are)630 2077 y(giv)m(en,)30 b(displa)m(y)e(the)g -(completion)h(options)g(for)e(eac)m(h)i Fq(name)34 b -Ft(or)27 b(the)i(curren)m(t)e(completion.)630 2186 y(The)f(p)s(ossible) -g(v)-5 b(alues)27 b(of)f Fq(option)h Ft(are)g(those)g(v)-5 -b(alid)26 b(for)g(the)h Fs(complete)d Ft(builtin)i(describ)s(ed)630 -2296 y(ab)s(o)m(v)m(e.)40 b(The)23 b(`)p Fs(-D)p Ft(')i(option)f -(indicates)h(that)g(the)f(remaining)g(options)h(should)e(apply)h(to)h -(the)630 2406 y(\\default")33 b(command)f(completion;)i(that)f(is,)g -(completion)g(attempted)g(on)f(a)g(command)630 2515 y(for)c(whic)m(h)f -(no)h(completion)h(has)f(previously)g(b)s(een)f(de\014ned.)38 -b(The)28 b(`)p Fs(-E)p Ft(')g(option)g(indicates)630 -2625 y(that)c(the)g(remaining)g(options)g(should)e(apply)h(to)i(\\empt) -m(y")g(command)e(completion;)k(that)630 2734 y(is,)k(completion)g -(attempted)h(on)e(a)h(blank)f(line.)630 2885 y(The)g(`)p -Fs(-D)p Ft(')g(option)h(tak)m(es)h(precedence)f(o)m(v)m(er)g(`)p -Fs(-E)p Ft('.)630 3035 y(The)23 b(return)g(v)-5 b(alue)25 -b(is)f(true)g(unless)f(an)h(in)m(v)-5 b(alid)24 b(option)h(is)f -(supplied,)g(an)g(attempt)h(is)f(made)630 3144 y(to)32 -b(mo)s(dify)f(the)g(options)h(for)f(a)h Fq(name)k Ft(for)31 -b(whic)m(h)g(no)g(completion)i(sp)s(eci\014cation)f(exists,)630 -3254 y(or)e(an)h(output)f(error)g(o)s(ccurs.)150 3534 -y Fr(8.8)68 b(A)44 b(Programmable)j(Completion)f(Example)150 -3693 y Ft(The)37 b(most)g(common)g(w)m(a)m(y)i(to)e(obtain)h +(matc)m(h)i(the)1110 4628 y(w)m(ord)f(b)s(eing)g(completed.)630 +4792 y Ft(-X)g Fj(filterpat)1110 4902 y Fr(\014lterpat)d +Fu(is)e(a)g(pattern)g(as)f(used)g(for)h(\014lename)g(expansion.)38 +b(It)25 b(is)g(applied)f(to)1110 5011 y(the)30 b(list)f(of)h(p)s +(ossible)f(completions)h(generated)h(b)m(y)e(the)g(preceding)h(options) +1110 5121 y(and)d(argumen)m(ts,)i(and)e(eac)m(h)i(completion)g(matc)m +(hing)g Fr(\014lterpat)h Fu(is)e(remo)m(v)m(ed)1110 5230 +y(from)i(the)h(list.)42 b(A)30 b(leading)i(`)p Ft(!)p +Fu(')e(in)g Fr(\014lterpat)j Fu(negates)f(the)f(pattern;)g(in)f(this) +1110 5340 y(case,)i(an)m(y)e(completion)i(not)f(matc)m(hing)g +Fr(\014lterpat)i Fu(is)d(remo)m(v)m(ed.)p eop end +%%Page: 130 136 +TeXDict begin 130 135 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(130)630 299 y(The)35 +b(return)g(v)-5 b(alue)37 b(is)f(true)f(unless)h(an)f(in)m(v)-5 +b(alid)37 b(option)f(is)g(supplied,)g(an)g(option)h(other)630 +408 y(than)h Ft(-p)g Fu(or)g Ft(-r)f Fu(is)h(supplied)f(without)i(a)f +Fr(name)44 b Fu(argumen)m(t,)c(an)e(attempt)i(is)e(made)g(to)630 +518 y(remo)m(v)m(e)32 b(a)e(completion)i(sp)s(eci\014cation)f(for)f(a)h +Fr(name)k Fu(for)30 b(whic)m(h)g(no)g(sp)s(eci\014cation)h(exists,)630 +628 y(or)f(an)h(error)f(o)s(ccurs)g(adding)g(a)g(completion)i(sp)s +(eci\014cation.)150 789 y Ft(compopt)870 924 y(compopt)46 +b([-o)h Fj(option)p Ft(])f([-DE])g([+o)h Fj(option)p +Ft(])f([)p Fj(name)p Ft(])630 1060 y Fu(Mo)s(dify)33 +b(completion)h(options)g(for)f(eac)m(h)h Fr(name)39 b +Fu(according)34 b(to)g(the)f Fr(option)p Fu(s,)i(or)e(for)g(the)630 +1170 y(curren)m(tly-executing)46 b(completion)f(if)f(no)f +Fr(name)5 b Fu(s)44 b(are)h(supplied.)80 b(If)43 b(no)h +Fr(option)p Fu(s)h(are)630 1279 y(giv)m(en,)30 b(displa)m(y)e(the)g +(completion)h(options)g(for)e(eac)m(h)i Fr(name)34 b +Fu(or)27 b(the)i(curren)m(t)e(completion.)630 1389 y(The)f(p)s(ossible) +g(v)-5 b(alues)27 b(of)f Fr(option)h Fu(are)g(those)g(v)-5 +b(alid)26 b(for)g(the)h Ft(complete)d Fu(builtin)i(describ)s(ed)630 +1498 y(ab)s(o)m(v)m(e.)41 b(The)28 b Ft(-D)g Fu(option)h(indicates)h +(that)f(the)g(remaining)g(options)g(should)e(apply)h(to)i(the)630 +1608 y(\\default")j(command)f(completion;)i(that)f(is,)g(completion)g +(attempted)g(on)f(a)g(command)630 1717 y(for)g(whic)m(h)g(no)g +(completion)i(has)e(previously)g(b)s(een)g(de\014ned.)45 +b(The)32 b Ft(-E)f Fu(option)i(indicates)630 1827 y(that)24 +b(the)g(remaining)g(options)g(should)e(apply)h(to)i(\\empt)m(y")g +(command)e(completion;)k(that)630 1937 y(is,)k(completion)g(attempted)h +(on)e(a)h(blank)f(line.)630 2072 y(The)g Ft(-D)g Fu(option)g(tak)m(es)i +(precedence)f(o)m(v)m(er)h Ft(-E)p Fu(.)630 2208 y(The)23 +b(return)g(v)-5 b(alue)25 b(is)f(true)g(unless)f(an)h(in)m(v)-5 +b(alid)24 b(option)h(is)f(supplied,)g(an)g(attempt)h(is)f(made)630 +2317 y(to)32 b(mo)s(dify)f(the)g(options)h(for)f(a)h +Fr(name)k Fu(for)31 b(whic)m(h)g(no)g(completion)i(sp)s(eci\014cation)f +(exists,)630 2427 y(or)e(an)h(output)f(error)g(o)s(ccurs.)150 +2662 y Fs(8.8)68 b(A)44 b(Programmable)j(Completion)f(Example)150 +2822 y Fu(The)37 b(most)g(common)g(w)m(a)m(y)i(to)e(obtain)h (additional)g(completion)g(functionalit)m(y)h(b)s(ey)m(ond)d(the)i -(default)150 3803 y(actions)29 b Fs(complete)d Ft(and)i -Fs(compgen)e Ft(pro)m(vide)i(is)h(to)f(use)g(a)h(shell)f(function)g -(and)g(bind)e(it)j(to)g(a)g(particular)150 3912 y(command)h(using)g -Fs(complete)e(-F)p Ft(.)275 4078 y(The)j(follo)m(wing)j(function)e(pro) -m(vides)g(completions)i(for)e(the)g Fs(cd)g Ft(builtin.)46 -b(It)32 b(is)h(a)f(reasonably)h(go)s(o)s(d)150 4188 y(example)e(of)f +(default)150 2931 y(actions)29 b Ft(complete)d Fu(and)i +Ft(compgen)e Fu(pro)m(vide)i(is)h(to)f(use)g(a)h(shell)f(function)g +(and)g(bind)e(it)j(to)g(a)g(particular)150 3041 y(command)h(using)g +Ft(complete)e(-F)p Fu(.)275 3177 y(The)j(follo)m(wing)j(function)e(pro) +m(vides)g(completions)i(for)e(the)g Ft(cd)g Fu(builtin.)46 +b(It)32 b(is)h(a)f(reasonably)h(go)s(o)s(d)150 3287 y(example)e(of)f (what)g(shell)g(functions)g(m)m(ust)f(do)h(when)f(used)h(for)f (completion.)42 b(This)29 b(function)h(uses)g(the)150 -4297 y(w)m(ord)38 b(passsed)g(as)h Fs($2)g Ft(to)g(determine)g(the)g +3396 y(w)m(ord)38 b(passsed)g(as)h Ft($2)g Fu(to)g(determine)g(the)g (directory)g(name)g(to)g(complete.)67 b(Y)-8 b(ou)40 -b(can)f(also)g(use)g(the)150 4407 y Fs(COMP_WORDS)28 -b Ft(arra)m(y)i(v)-5 b(ariable;)32 b(the)e(curren)m(t)h(w)m(ord)f(is)g -(indexed)g(b)m(y)g(the)h Fs(COMP_CWORD)c Ft(v)-5 b(ariable.)275 -4573 y(The)42 b(function)h(relies)h(on)e(the)i Fs(complete)c -Ft(and)j Fs(compgen)e Ft(builtins)h(to)i(do)f(m)m(uc)m(h)g(of)g(the)h -(w)m(ork,)150 4682 y(adding)25 b(only)h(the)g(things)g(that)g(the)g -(Bash)g Fs(cd)f Ft(do)s(es)g(b)s(ey)m(ond)g(accepting)j(basic)e -(directory)g(names:)38 b(tilde)150 4792 y(expansion)21 -b(\(see)h(Section)g(3.5.2)h([Tilde)e(Expansion],)i(page)e(22\),)k -(searc)m(hing)d(directories)g(in)f Fq($CDP)-8 b(A)g(TH)10 -b Ft(,)150 4902 y(whic)m(h)21 b(is)h(describ)s(ed)e(ab)s(o)m(v)m(e)j +b(can)f(also)g(use)g(the)150 3506 y Ft(COMP_WORDS)28 +b Fu(arra)m(y)i(v)-5 b(ariable;)32 b(the)e(curren)m(t)h(w)m(ord)f(is)g +(indexed)g(b)m(y)g(the)h Ft(COMP_CWORD)c Fu(v)-5 b(ariable.)275 +3642 y(The)42 b(function)h(relies)h(on)e(the)i Ft(complete)c +Fu(and)j Ft(compgen)e Fu(builtins)h(to)i(do)f(m)m(uc)m(h)g(of)g(the)h +(w)m(ork,)150 3752 y(adding)25 b(only)h(the)g(things)g(that)g(the)g +(Bash)g Ft(cd)f Fu(do)s(es)g(b)s(ey)m(ond)g(accepting)j(basic)e +(directory)g(names:)38 b(tilde)150 3862 y(expansion)22 +b(\(see)h(Section)g(3.5.2)g([Tilde)g(Expansion],)g(page)g(22\),)i +(searc)m(hing)e(directories)g(in)e Fr($CDP)-8 b(A)g(TH)p +Fu(,)150 3971 y(whic)m(h)21 b(is)h(describ)s(ed)e(ab)s(o)m(v)m(e)j (\(see)f(Section)h(4.1)f([Bourne)g(Shell)f(Builtins],)j(page)e(41\),)j -(and)c(basic)h(supp)s(ort)150 5011 y(for)31 b(the)h Fs(cdable_vars)d -Ft(shell)i(option)h(\(see)h(Section)f(4.3.2)i([The)d(Shopt)g(Builtin],) -i(page)f(63\).)46 b Fs(_comp_)150 5121 y(cd)30 b Ft(mo)s(di\014es)g -(the)h(v)-5 b(alue)31 b(of)g Fq(IFS)36 b Ft(so)31 b(that)g(it)g(con)m +(and)c(basic)h(supp)s(ort)150 4081 y(for)31 b(the)h Ft(cdable_vars)d +Fu(shell)i(option)h(\(see)h(Section)f(4.3.2)i([The)d(Shopt)g(Builtin],) +i(page)f(62\).)46 b Ft(_comp_)150 4190 y(cd)30 b Fu(mo)s(di\014es)g +(the)h(v)-5 b(alue)31 b(of)g Fr(IFS)36 b Fu(so)31 b(that)g(it)g(con)m (tains)h(only)f(a)g(newline)g(to)h(accommo)s(date)g(\014le)f(names)150 -5230 y(con)m(taining)i(spaces)g(and)e(tabs)h({)g Fs(compgen)e -Ft(prin)m(ts)h(the)h(p)s(ossible)f(completions)i(it)g(generates)g(one)f -(p)s(er)150 5340 y(line.)p eop end -%%Page: 132 138 -TeXDict begin 132 137 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(132)275 299 y(P)m(ossible)24 -b(completions)h(go)g(in)m(to)g(the)f Fq(COMPREPL)-8 b(Y)36 -b Ft(arra)m(y)24 b(v)-5 b(ariable,)26 b(one)e(completion)i(p)s(er)c -(arra)m(y)150 408 y(elemen)m(t.)42 b(The)30 b(programmable)g -(completion)i(system)e(retriev)m(es)h(the)g(completions)g(from)f(there) -g(when)150 518 y(the)h(function)f(returns.)390 737 y -Fs(#)47 b(A)h(completion)d(function)g(for)i(the)g(cd)g(builtin)390 -847 y(#)g(based)g(on)g(the)g(cd)g(completion)e(function)h(from)g(the)h -(bash_completion)d(package)390 956 y(_comp_cd\(\))390 -1066 y({)581 1176 y(local)i(IFS=$')g(\\t\\n')190 b(#)47 -b(normalize)f(IFS)581 1285 y(local)g(cur)h(_skipdot)f(_cdpath)581 -1395 y(local)g(i)i(j)f(k)581 1614 y(#)g(Tilde)g(expansion,)e(with)h -(side)h(effect)f(of)h(expanding)f(tilde)g(to)h(full)g(pathname)581 -1724 y(case)g("$2")f(in)581 1833 y(\\~*\))190 b(eval)46 -b(cur="$2")g(;;)581 1943 y(*\))286 b(cur=$2)46 b(;;)581 -2052 y(esac)581 2271 y(#)h(no)h(cdpath)e(or)h(absolute)e(pathname)h(--) -h(straight)f(directory)f(completion)581 2381 y(if)i([[)g(-z)g -("${CDPATH:-}")e(]])i(||)g([[)g("$cur")f(==)h(@\(./*|../*|/*\))d(]];)j -(then)772 2491 y(#)g(compgen)f(prints)g(paths)h(one)f(per)h(line;)g -(could)f(also)h(use)g(while)f(loop)772 2600 y(IFS=$'\\n')772 -2710 y(COMPREPLY=\()f($\(compgen)g(-d)i(--)g("$cur"\))f(\))772 -2819 y(IFS=$')g(\\t\\n')581 2929 y(#)h(CDPATH+directories)c(in)k(the)g -(current)f(directory)f(if)j(not)e(in)i(CDPATH)581 3039 -y(else)772 3148 y(IFS=$'\\n')772 3258 y(_skipdot=false)772 -3367 y(#)f(preprocess)e(CDPATH)h(to)i(convert)d(null)i(directory)e -(names)i(to)g(.)772 3477 y(_cdpath=${CDPATH/#:/.:})772 -3587 y(_cdpath=${_cdpath//::/:.)o(:})772 3696 y -(_cdpath=${_cdpath/\045:/:.})772 3806 y(for)g(i)g(in)g -(${_cdpath//:/$'\\n'};)c(do)963 3915 y(if)k([[)g($i)g(-ef)g(.)h(]];)f -(then)f(_skipdot=true;)e(fi)963 4025 y(k="${#COMPREPLY[@]}")963 -4134 y(for)j(j)g(in)g($\()g(compgen)f(-d)h(--)h("$i/$cur")d(\);)i(do) -1154 4244 y(COMPREPLY[k++]=${j#$i/})375 b(#)48 b(cut)f(off)f(directory) -963 4354 y(done)772 4463 y(done)772 4573 y($_skipdot)f(||)i +4300 y(con)m(taining)i(spaces)g(and)e(tabs)h({)g Ft(compgen)e +Fu(prin)m(ts)h(the)h(p)s(ossible)f(completions)i(it)g(generates)g(one)f +(p)s(er)150 4410 y(line.)275 4546 y(P)m(ossible)24 b(completions)h(go)g +(in)m(to)g(the)f Fr(COMPREPL)-8 b(Y)36 b Fu(arra)m(y)24 +b(v)-5 b(ariable,)26 b(one)e(completion)i(p)s(er)c(arra)m(y)150 +4656 y(elemen)m(t.)42 b(The)30 b(programmable)g(completion)i(system)e +(retriev)m(es)h(the)g(completions)g(from)f(there)g(when)150 +4765 y(the)h(function)f(returns.)390 4902 y Ft(#)47 b(A)h(completion)d +(function)g(for)i(the)g(cd)g(builtin)390 5011 y(#)g(based)g(on)g(the)g +(cd)g(completion)e(function)h(from)g(the)h(bash_completion)d(package) +390 5121 y(_comp_cd\(\))390 5230 y({)581 5340 y(local)i(IFS=$')g +(\\t\\n')190 b(#)47 b(normalize)f(IFS)p eop end +%%Page: 131 137 +TeXDict begin 131 136 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(131)581 299 y Ft(local)46 +b(cur)h(_skipdot)f(_cdpath)581 408 y(local)g(i)i(j)f(k)581 +628 y(#)g(Tilde)g(expansion,)e(with)h(side)h(effect)f(of)h(expanding)f +(tilde)g(to)h(full)g(pathname)581 737 y(case)g("$2")f(in)581 +847 y(\\~*\))190 b(eval)46 b(cur="$2")g(;;)581 956 y(*\))286 +b(cur=$2)46 b(;;)581 1066 y(esac)581 1285 y(#)h(no)h(cdpath)e(or)h +(absolute)e(pathname)h(--)h(straight)f(directory)f(completion)581 +1395 y(if)i([[)g(-z)g("${CDPATH:-}")e(]])i(||)g([[)g("$cur")f(==)h +(@\(./*|../*|/*\))d(]];)j(then)772 1504 y(#)g(compgen)f(prints)g(paths) +h(one)f(per)h(line;)g(could)f(also)h(use)g(while)f(loop)772 +1614 y(IFS=$'\\n')772 1724 y(COMPREPLY=\()f($\(compgen)g(-d)i(--)g +("$cur"\))f(\))772 1833 y(IFS=$')g(\\t\\n')581 1943 y(#)h +(CDPATH+directories)c(in)k(the)g(current)f(directory)f(if)j(not)e(in)i +(CDPATH)581 2052 y(else)772 2162 y(IFS=$'\\n')772 2271 +y(_skipdot=false)772 2381 y(#)f(preprocess)e(CDPATH)h(to)i(convert)d +(null)i(directory)e(names)i(to)g(.)772 2491 y(_cdpath=${CDPATH/#:/.:}) +772 2600 y(_cdpath=${_cdpath//::/:.)o(:})772 2710 y +(_cdpath=${_cdpath/\045:/:.})772 2819 y(for)g(i)g(in)g +(${_cdpath//:/$'\\n'};)c(do)963 2929 y(if)k([[)g($i)g(-ef)g(.)h(]];)f +(then)f(_skipdot=true;)e(fi)963 3039 y(k="${#COMPREPLY[@]}")963 +3148 y(for)j(j)g(in)g($\()g(compgen)f(-d)h(--)h("$i/$cur")d(\);)i(do) +1154 3258 y(COMPREPLY[k++]=${j#$i/})375 b(#)48 b(cut)f(off)f(directory) +963 3367 y(done)772 3477 y(done)772 3587 y($_skipdot)f(||)i (COMPREPLY+=\()e($\(compgen)g(-d)i(--)g("$cur"\))f(\))772 -4682 y(IFS=$')g(\\t\\n')581 4792 y(fi)581 5011 y(#)h(variable)f(names)g +3696 y(IFS=$')g(\\t\\n')581 3806 y(fi)581 4025 y(#)h(variable)f(names)g (if)h(appropriate)e(shell)i(option)f(set)h(and)f(no)i(completions)581 -5121 y(if)f(shopt)f(-q)i(cdable_vars)c(&&)k([[)f(${#COMPREPLY[@]})c -(-eq)k(0)g(]];)g(then)772 5230 y(COMPREPLY=\()e($\(compgen)g(-v)i(--)g -("$cur"\))f(\))581 5340 y(fi)p eop end -%%Page: 133 139 -TeXDict begin 133 138 bop 150 -116 a Ft(Chapter)30 b(8:)41 -b(Command)29 b(Line)i(Editing)2062 b(133)581 408 y Fs(return)46 -b(0)390 518 y(})275 653 y Ft(W)-8 b(e)31 b(install)g(the)g(completion)h -(function)e(using)f(the)i(`)p Fs(-F)p Ft(')f(option)h(to)g -Fs(complete)p Ft(:)390 787 y Fs(#)47 b(Tell)g(readline)f(to)h(quote)f -(appropriate)f(and)i(append)f(slashes)g(to)h(directories;)390 -897 y(#)g(use)g(the)g(bash)g(default)f(completion)f(for)i(other)f -(arguments)390 1006 y(complete)g(-o)h(filenames)e(-o)i(nospace)f(-o)h -(bashdefault)e(-F)i(_comp_cd)f(cd)150 1141 y Ft(Since)33 +4134 y(if)f(shopt)f(-q)i(cdable_vars)c(&&)k([[)f(${#COMPREPLY[@]})c +(-eq)k(0)g(]];)g(then)772 4244 y(COMPREPLY=\()e($\(compgen)g(-v)i(--)g +("$cur"\))f(\))581 4354 y(fi)581 4573 y(return)g(0)390 +4682 y(})275 4902 y Fu(W)-8 b(e)31 b(install)g(the)g(completion)h +(function)e(using)f(the)i Ft(-F)f Fu(option)h(to)g Ft(complete)p +Fu(:)390 5121 y Ft(#)47 b(Tell)g(readline)f(to)h(quote)f(appropriate)f +(and)i(append)f(slashes)g(to)h(directories;)390 5230 +y(#)g(use)g(the)g(bash)g(default)f(completion)f(for)i(other)f +(arguments)390 5340 y(complete)g(-o)h(filenames)e(-o)i(nospace)f(-o)h +(bashdefault)e(-F)i(_comp_cd)f(cd)p eop end +%%Page: 132 138 +TeXDict begin 132 137 bop 150 -116 a Fu(Chapter)30 b(8:)41 +b(Command)29 b(Line)i(Editing)2062 b(132)150 299 y(Since)33 b(w)m(e'd)g(lik)m(e)i(Bash)e(and)f(Readline)i(to)g(tak)m(e)g(care)g(of) f(some)h(of)f(the)g(other)h(details)g(for)e(us,)i(w)m(e)f(use)150 -1250 y(sev)m(eral)40 b(other)f(options)g(to)g(tell)h(Bash)f(and)f -(Readline)h(what)f(to)i(do.)65 b(The)38 b(`)p Fs(-o)30 -b(filenames)p Ft(')36 b(option)150 1360 y(tells)42 b(Readline)g(that)g -(the)f(p)s(ossible)g(completions)h(should)f(b)s(e)f(treated)i(as)g -(\014lenames,)i(and)d(quoted)150 1469 y(appropriately)-8 -b(.)53 b(That)34 b(option)h(will)g(also)g(cause)g(Readline)g(to)g(app)s -(end)e(a)h(slash)g(to)h(\014lenames)g(it)g(can)150 1579 -y(determine)i(are)g(directories)h(\(whic)m(h)g(is)f(wh)m(y)f(w)m(e)i -(migh)m(t)f(w)m(an)m(t)h(to)g(extend)f Fs(_comp_cd)e -Ft(to)i(app)s(end)f(a)150 1689 y(slash)23 b(if)g(w)m(e're)h(using)f -(directories)i(found)d(via)h Fq(CDP)-8 b(A)g(TH)10 b -Ft(:)25 b(Readline)f(can't)g(tell)g(those)g(completions)h(are)150 -1798 y(directories\).)41 b(The)27 b(`)p Fs(-o)j(nospace)p -Ft(')c(option)i(tells)g(Readline)h(to)f(not)g(app)s(end)d(a)j(space)g -(c)m(haracter)h(to)g(the)150 1908 y(directory)c(name,)h(in)e(case)h(w)m -(e)g(w)m(an)m(t)g(to)g(app)s(end)e(to)i(it.)39 b(The)24 -b(`)p Fs(-o)30 b(bashdefault)p Ft(')21 b(option)k(brings)f(in)g(the)150 -2017 y(rest)29 b(of)f(the)h Fs(")p Ft(Bash)f(default)p -Fs(")h Ft(completions)g({)g(p)s(ossible)f(completion)i(that)f(Bash)f -(adds)g(to)h(the)g(default)150 2127 y(Readline)40 b(set.)68 +408 y(sev)m(eral)43 b(other)g(options)f(to)h(tell)g(Bash)f(and)f +(Readline)i(what)f(to)g(do.)76 b(The)41 b Ft(-o)30 b(filenames)39 +b Fu(option)150 518 y(tells)j(Readline)g(that)g(the)f(p)s(ossible)g +(completions)h(should)f(b)s(e)f(treated)i(as)g(\014lenames,)i(and)d +(quoted)150 628 y(appropriately)-8 b(.)53 b(That)34 b(option)h(will)g +(also)g(cause)g(Readline)g(to)g(app)s(end)e(a)h(slash)g(to)h +(\014lenames)g(it)g(can)150 737 y(determine)i(are)g(directories)h +(\(whic)m(h)g(is)f(wh)m(y)f(w)m(e)i(migh)m(t)f(w)m(an)m(t)h(to)g +(extend)f Ft(_comp_cd)e Fu(to)i(app)s(end)f(a)150 847 +y(slash)22 b(if)g(w)m(e're)h(using)f(directories)h(found)e(via)i +Fr(CDP)-8 b(A)g(TH)10 b Fu(:)37 b(Readline)23 b(can't)g(tell)g(those)g +(completions)h(are)150 956 y(directories\).)45 b(The)31 +b Ft(-o)f(nospace)f Fu(option)j(tells)g(Readline)g(to)h(not)e(app)s +(end)f(a)i(space)g(c)m(haracter)h(to)f(the)150 1066 y(directory)c +(name,)h(in)f(case)h(w)m(e)f(w)m(an)m(t)h(to)f(app)s(end)f(to)h(it.)41 +b(The)27 b Ft(-o)j(bashdefault)25 b Fu(option)j(brings)f(in)h(the)150 +1176 y(rest)h(of)f(the)h Ft(")p Fu(Bash)f(default)p Ft(")h +Fu(completions)g({)g(p)s(ossible)f(completion)i(that)f(Bash)f(adds)g +(to)h(the)g(default)150 1285 y(Readline)40 b(set.)68 b(These)39 b(include)g(things)g(lik)m(e)i(command)e(name)g(completion,) -44 b(v)-5 b(ariable)40 b(completion)150 2237 y(for)i(w)m(ords)g(b)s -(eginning)f(with)h(`)p Fs({)p Ft(',)k(completions)e(con)m(taining)f -(pathname)g(expansion)f(patterns)g(\(see)150 2346 y(Section)31 +44 b(v)-5 b(ariable)40 b(completion)150 1395 y(for)i(w)m(ords)g(b)s +(eginning)f(with)h(`)p Ft({)p Fu(',)k(completions)e(con)m(taining)f +(pathname)g(expansion)f(patterns)g(\(see)150 1504 y(Section)31 b(3.5.8)h([Filename)g(Expansion],)e(page)i(29\),)f(and)f(so)h(on.)275 -2481 y(Once)39 b(installed)i(using)e Fs(complete)p Ft(,)h -Fs(_comp_cd)d Ft(will)j(b)s(e)g(called)g(ev)m(ery)h(time)f(w)m(e)g -(attempt)h(w)m(ord)150 2590 y(completion)32 b(for)e(a)h -Fs(cd)e Ft(command.)275 2725 y(Man)m(y)34 b(more)g(examples)g({)g(an)g +1639 y(Once)39 b(installed)i(using)e Ft(complete)p Fu(,)h +Ft(_comp_cd)d Fu(will)j(b)s(e)g(called)g(ev)m(ery)h(time)f(w)m(e)g +(attempt)h(w)m(ord)150 1748 y(completion)32 b(for)e(a)h +Ft(cd)e Fu(command.)275 1883 y(Man)m(y)34 b(more)g(examples)g({)g(an)g (extensiv)m(e)h(collection)i(of)c(completions)i(for)f(most)g(of)g(the)g -(common)150 2834 y(GNU,)g(Unix,)h(and)d(Lin)m(ux)h(commands)g({)h(are)g +(common)150 1993 y(GNU,)g(Unix,)h(and)d(Lin)m(ux)h(commands)g({)h(are)g (a)m(v)-5 b(ailable)36 b(as)e(part)f(of)h(the)f(bash)p -2943 2834 28 4 v 39 w(completion)i(pro)5 b(ject.)150 -2944 y(This)46 b(is)g(installed)i(b)m(y)e(default)h(on)g(man)m(y)f -(GNU/Lin)m(ux)i(distributions.)88 b(Originally)47 b(written)g(b)m(y)150 -3054 y(Ian)29 b(Macdonald,)i(the)f(pro)5 b(ject)31 b(no)m(w)e(liv)m(es) -i(at)g Fs(http://bash-completion.a)o(liot)o(h.d)o(ebia)o(n.or)o(g/)p -Ft(.)150 3163 y(There)f(are)h(p)s(orts)e(for)h(other)h(systems)f(suc)m -(h)g(as)h(Solaris)g(and)f(Mac)h(OS)f(X.)275 3298 y(An)54 -b(older)h(v)m(ersion)h(of)f(the)g(bash)p 1532 3298 V +2943 1993 28 4 v 39 w(completion)i(pro)5 b(ject.)150 +2102 y(This)33 b(is)h(installed)h(b)m(y)f(default)g(on)g(man)m(y)h +(GNU/Lin)m(ux)f(distributions.)51 b(Originally)35 b(written)f(b)m(y)g +(Ian)150 2212 y(Macdonald,)45 b(the)c(pro)5 b(ject)42 +b(no)m(w)f(liv)m(es)i(at)f Ft(http:)9 b(/)g(/)e(bash-completio)o(n)i(.) +e(a)o(lio)o(th)i(.)d(debi)o(an)j(.)d(org)i(/)f Fu(.)150 +2321 y(There)30 b(are)h(p)s(orts)e(for)h(other)h(systems)f(suc)m(h)g +(as)h(Solaris)g(and)f(Mac)h(OS)f(X.)275 2456 y(An)54 +b(older)h(v)m(ersion)h(of)f(the)g(bash)p 1532 2456 V 40 w(completion)h(pac)m(k)-5 b(age)57 b(is)e(distributed)f(with)h(bash) -f(in)h(the)150 3407 y(`)p Fs(examples/complete)p Ft(')26 -b(sub)s(directory)-8 b(.)p eop end -%%Page: 134 140 -TeXDict begin 134 139 bop 150 -116 a Ft(Chapter)30 b(9:)41 -b(Using)30 b(History)h(In)m(teractiv)m(ely)1925 b(134)150 -299 y Fo(9)80 b(Using)53 b(History)g(In)l(teractiv)l(ely)150 -543 y Ft(This)42 b(c)m(hapter)h(describ)s(es)f(ho)m(w)g(to)h(use)g(the) -f Fl(gnu)h Ft(History)g(Library)e(in)m(teractiv)m(ely)-8 +f(in)h(the)150 2565 y Ft(examples/complete)26 b Fu(sub)s(directory)-8 +b(.)p eop end +%%Page: 133 139 +TeXDict begin 133 138 bop 150 -116 a Fu(Chapter)30 b(9:)41 +b(Using)30 b(History)h(In)m(teractiv)m(ely)1925 b(133)150 +299 y Fp(9)80 b(Using)53 b(History)g(In)l(teractiv)l(ely)150 +543 y Fu(This)42 b(c)m(hapter)h(describ)s(es)f(ho)m(w)g(to)h(use)g(the) +f Fm(gnu)h Fu(History)g(Library)e(in)m(teractiv)m(ely)-8 b(,)50 b(from)42 b(a)h(user's)150 653 y(standp)s(oin)m(t.)76 b(It)42 b(should)f(b)s(e)h(considered)g(a)g(user's)g(guide.)76 -b(F)-8 b(or)43 b(information)f(on)g(using)g(the)g Fl(gnu)150 -762 y Ft(History)31 b(Library)f(in)g(other)g(programs,)g(see)h(the)g -Fl(gnu)f Ft(Readline)h(Library)f(Man)m(ual.)150 1000 -y Fr(9.1)68 b(Bash)45 b(History)h(F)-11 b(acilities)150 -1159 y Ft(When)40 b(the)h(`)p Fs(-o)30 b(history)p Ft(')38 -b(option)j(to)g(the)g Fs(set)e Ft(builtin)h(is)h(enabled)f(\(see)h -(Section)g(4.3.1)i([The)d(Set)150 1269 y(Builtin],)32 -b(page)g(59\),)h(the)e(shell)h(pro)m(vides)f(access)h(to)g(the)f -Fq(command)g(history)p Ft(,)h(the)f(list)h(of)f(commands)150 -1378 y(previously)h(t)m(yp)s(ed.)47 b(The)33 b(v)-5 b(alue)33 -b(of)f(the)h Fs(HISTSIZE)e Ft(shell)h(v)-5 b(ariable)34 -b(is)f(used)e(as)i(the)g(n)m(um)m(b)s(er)e(of)i(com-)150 -1488 y(mands)i(to)i(sa)m(v)m(e)h(in)e(a)g(history)h(list.)58 -b(The)36 b(text)h(of)g(the)f(last)h Fs($HISTSIZE)d Ft(commands)i -(\(default)g(500\))150 1597 y(is)h(sa)m(v)m(ed.)61 b(The)36 -b(shell)h(stores)h(eac)m(h)g(command)e(in)h(the)g(history)g(list)g -(prior)f(to)i(parameter)f(and)f(v)-5 b(ari-)150 1707 -y(able)33 b(expansion)g(but)f(after)h(history)f(expansion)h(is)g(p)s -(erformed,)e(sub)5 b(ject)33 b(to)g(the)g(v)-5 b(alues)33 -b(of)g(the)g(shell)150 1817 y(v)-5 b(ariables)31 b Fs(HISTIGNORE)d -Ft(and)h Fs(HISTCONTROL)p Ft(.)275 1954 y(When)g(the)g(shell)h(starts)g +b(F)-8 b(or)43 b(information)f(on)g(using)g(the)g Fm(gnu)150 +762 y Fu(History)31 b(Library)f(in)g(other)g(programs,)g(see)h(the)g +Fm(gnu)f Fu(Readline)h(Library)f(Man)m(ual.)150 1000 +y Fs(9.1)68 b(Bash)45 b(History)h(F)-11 b(acilities)150 +1159 y Fu(When)44 b(the)g Ft(-o)30 b(history)42 b Fu(option)i(to)h(the) +f Ft(set)f Fu(builtin)h(is)g(enabled)g(\(see)g(Section)h(4.3.1)h([The)e +(Set)150 1269 y(Builtin],)32 b(page)g(58\),)h(the)e(shell)h(pro)m +(vides)f(access)h(to)g(the)f Fr(command)g(history)p Fu(,)h(the)f(list)h +(of)f(commands)150 1378 y(previously)h(t)m(yp)s(ed.)47 +b(The)33 b(v)-5 b(alue)33 b(of)f(the)h Ft(HISTSIZE)e +Fu(shell)h(v)-5 b(ariable)34 b(is)f(used)e(as)i(the)g(n)m(um)m(b)s(er)e +(of)i(com-)150 1488 y(mands)i(to)i(sa)m(v)m(e)h(in)e(a)g(history)h +(list.)58 b(The)36 b(text)h(of)g(the)f(last)h Ft($HISTSIZE)d +Fu(commands)i(\(default)g(500\))150 1597 y(is)h(sa)m(v)m(ed.)61 +b(The)36 b(shell)h(stores)h(eac)m(h)g(command)e(in)h(the)g(history)g +(list)g(prior)f(to)i(parameter)f(and)f(v)-5 b(ari-)150 +1707 y(able)33 b(expansion)g(but)f(after)h(history)f(expansion)h(is)g +(p)s(erformed,)e(sub)5 b(ject)33 b(to)g(the)g(v)-5 b(alues)33 +b(of)g(the)g(shell)150 1817 y(v)-5 b(ariables)31 b Ft(HISTIGNORE)d +Fu(and)h Ft(HISTCONTROL)p Fu(.)275 1954 y(When)g(the)g(shell)h(starts)g (up,)f(the)h(history)f(is)h(initialized)h(from)e(the)h(\014le)f(named)g -(b)m(y)h(the)f Fs(HISTFILE)150 2064 y Ft(v)-5 b(ariable)21 -b(\(default)h(`)p Fs(~/.bash_history)p Ft('\).)34 b(The)20 -b(\014le)h(named)f(b)m(y)h(the)g(v)-5 b(alue)21 b(of)g -Fs(HISTFILE)d Ft(is)j(truncated,)150 2174 y(if)42 b(necessary)-8 +(b)m(y)h(the)f Ft(HISTFILE)150 2064 y Fu(v)-5 b(ariable)26 +b(\(default)g Ft(~/.bash_history)p Fu(\).)35 b(The)24 +b(\014le)i(named)e(b)m(y)h(the)h(v)-5 b(alue)25 b(of)h +Ft(HISTFILE)c Fu(is)k(truncated,)150 2174 y(if)42 b(necessary)-8 b(,)45 b(to)e(con)m(tain)g(no)f(more)g(than)f(the)h(n)m(um)m(b)s(er)f (of)h(lines)g(sp)s(eci\014ed)f(b)m(y)h(the)g(v)-5 b(alue)42 -b(of)g(the)150 2283 y Fs(HISTFILESIZE)28 b Ft(v)-5 b(ariable.)46 +b(of)g(the)150 2283 y Ft(HISTFILESIZE)28 b Fu(v)-5 b(ariable.)46 b(When)31 b(a)h(shell)g(with)g(history)f(enabled)h(exits,)h(the)f(last) -h Fs($HISTSIZE)c Ft(lines)150 2393 y(are)35 b(copied)g(from)g(the)g +h Ft($HISTSIZE)c Fu(lines)150 2393 y(are)35 b(copied)g(from)g(the)g (history)f(list)i(to)f(the)g(\014le)g(named)f(b)m(y)h -Fs($HISTFILE)p Ft(.)51 b(If)35 b(the)g Fs(histappend)d -Ft(shell)150 2502 y(option)26 b(is)g(set)g(\(see)h(Section)f(4.2)h +Ft($HISTFILE)p Fu(.)51 b(If)35 b(the)g Ft(histappend)d +Fu(shell)150 2502 y(option)26 b(is)g(set)g(\(see)h(Section)f(4.2)h ([Bash)f(Builtins],)h(page)g(48\),)h(the)e(lines)g(are)g(app)s(ended)e (to)i(the)g(history)150 2612 y(\014le,)36 b(otherwise)f(the)g(history)f -(\014le)h(is)f(o)m(v)m(erwritten.)55 b(If)34 b Fs(HISTFILE)e -Ft(is)j(unset,)g(or)g(if)f(the)h(history)f(\014le)h(is)150 +(\014le)h(is)f(o)m(v)m(erwritten.)55 b(If)34 b Ft(HISTFILE)e +Fu(is)j(unset,)g(or)g(if)f(the)h(history)f(\014le)h(is)150 2721 y(un)m(writable,)f(the)f(history)g(is)g(not)h(sa)m(v)m(ed.)49 b(After)34 b(sa)m(ving)g(the)f(history)-8 b(,)34 b(the)g(history)f (\014le)g(is)g(truncated)150 2831 y(to)g(con)m(tain)h(no)f(more)g(than) -f Fs($HISTFILESIZE)d Ft(lines.)48 b(If)33 b Fs(HISTFILESIZE)c -Ft(is)k(unset,)g(or)f(set)i(to)f(n)m(ull,)h(a)150 2941 +f Ft($HISTFILESIZE)d Fu(lines.)48 b(If)33 b Ft(HISTFILESIZE)c +Fu(is)k(unset,)g(or)f(set)i(to)f(n)m(ull,)h(a)150 2941 y(non-n)m(umeric)c(v)-5 b(alue,)31 b(or)f(a)h(n)m(umeric)f(v)-5 b(alue)31 b(less)g(than)f(zero,)h(the)g(history)f(\014le)h(is)f(not)h -(truncated.)275 3078 y(If)g(the)h Fs(HISTTIMEFORMAT)d -Ft(is)j(set,)h(the)f(time)h(stamp)f(information)g(asso)s(ciated)i(with) +(truncated.)275 3078 y(If)g(the)h Ft(HISTTIMEFORMAT)d +Fu(is)j(set,)h(the)f(time)h(stamp)f(information)g(asso)s(ciated)i(with) e(eac)m(h)h(history)150 3188 y(en)m(try)d(is)h(written)f(to)h(the)f (history)h(\014le,)f(mark)m(ed)h(with)f(the)g(history)g(commen)m(t)h(c) m(haracter.)43 b(When)30 b(the)150 3298 y(history)22 @@ -16863,857 +17350,848 @@ b(\014le)h(is)g(read,)h(lines)f(b)s(eginning)e(with)i(the)f(history)h (commen)m(t)g(c)m(haracter)h(follo)m(w)m(ed)h(immediately)150 3407 y(b)m(y)30 b(a)h(digit)g(are)g(in)m(terpreted)g(as)f(timestamps)h (for)f(the)h(previous)f(history)g(line.)275 3545 y(The)19 -b(builtin)h(command)g Fs(fc)g Ft(ma)m(y)h(b)s(e)f(used)f(to)i(list)g +b(builtin)h(command)g Ft(fc)g Fu(ma)m(y)h(b)s(e)f(used)f(to)i(list)g (or)g(edit)g(and)e(re-execute)j(a)f(p)s(ortion)f(of)g(the)h(history)150 -3655 y(list.)41 b(The)27 b Fs(history)f Ft(builtin)i(ma)m(y)h(b)s(e)e +3655 y(list.)41 b(The)27 b Ft(history)f Fu(builtin)i(ma)m(y)h(b)s(e)e (used)g(to)i(displa)m(y)g(or)f(mo)s(dify)f(the)h(history)g(list)h(and)f (manipulate)150 3764 y(the)j(history)g(\014le.)42 b(When)31 b(using)f(command-line)h(editing,)h(searc)m(h)f(commands)g(are)g(a)m(v) -5 b(ailable)33 b(in)e(eac)m(h)150 3874 y(editing)45 b(mo)s(de)g(that)g(pro)m(vide)g(access)h(to)f(the)g(history)f(list)i (\(see)f(Section)h(8.4.2)g([Commands)e(F)-8 b(or)150 -3983 y(History],)31 b(page)h(117\).)275 4121 y(The)47 +3983 y(History],)31 b(page)h(116\).)275 4121 y(The)47 b(shell)i(allo)m(ws)h(con)m(trol)f(o)m(v)m(er)h(whic)m(h)e(commands)g (are)h(sa)m(v)m(ed)g(on)f(the)h(history)f(list.)95 b(The)150 -4231 y Fs(HISTCONTROL)25 b Ft(and)j Fs(HISTIGNORE)e Ft(v)-5 +4231 y Ft(HISTCONTROL)25 b Fu(and)j Ft(HISTIGNORE)e Fu(v)-5 b(ariables)29 b(ma)m(y)h(b)s(e)d(set)j(to)f(cause)g(the)g(shell)f(to)i (sa)m(v)m(e)g(only)f(a)g(subset)150 4340 y(of)e(the)g(commands)f(en)m -(tered.)40 b(The)26 b Fs(cmdhist)f Ft(shell)i(option,)h(if)f(enabled,)g +(tered.)40 b(The)26 b Ft(cmdhist)f Fu(shell)i(option,)h(if)f(enabled,)g (causes)h(the)e(shell)h(to)h(attempt)150 4450 y(to)23 b(sa)m(v)m(e)h(eac)m(h)f(line)g(of)f(a)h(m)m(ulti-line)g(command)f(in)g (the)h(same)f(history)g(en)m(try)-8 b(,)25 b(adding)d(semicolons)h (where)150 4560 y(necessary)37 b(to)f(preserv)m(e)h(syn)m(tactic)h -(correctness.)58 b(The)36 b Fs(lithist)e Ft(shell)i(option)h(causes)g +(correctness.)58 b(The)36 b Ft(lithist)e Fu(shell)i(option)h(causes)g (the)f(shell)g(to)150 4669 y(sa)m(v)m(e)25 b(the)e(command)h(with)f(em) m(b)s(edded)f(newlines)h(instead)h(of)f(semicolons.)40 -b(The)23 b Fs(shopt)e Ft(builtin)i(is)h(used)150 4779 +b(The)23 b Ft(shopt)e Fu(builtin)i(is)h(used)150 4779 y(to)31 b(set)g(these)g(options.)41 b(See)31 b(Section)g(4.2)g([Bash)g (Builtins],)g(page)g(48,)h(for)e(a)h(description)f(of)h -Fs(shopt)p Ft(.)150 5016 y Fr(9.2)68 b(Bash)45 b(History)h(Builtins)150 -5176 y Ft(Bash)31 b(pro)m(vides)f(t)m(w)m(o)i(builtin)e(commands)g +Ft(shopt)p Fu(.)150 5016 y Fs(9.2)68 b(Bash)45 b(History)h(Builtins)150 +5176 y Fu(Bash)31 b(pro)m(vides)f(t)m(w)m(o)i(builtin)e(commands)g (whic)m(h)g(manipulate)g(the)h(history)f(list)h(and)f(history)g -(\014le.)150 5340 y Fs(fc)p eop end -%%Page: 135 141 -TeXDict begin 135 140 bop 150 -116 a Ft(Chapter)30 b(9:)41 -b(Using)30 b(History)h(In)m(teractiv)m(ely)1925 b(135)870 -299 y Fs(fc)47 b([-e)g Fi(ename)11 b Fs(])46 b([-lnr])g([)p -Fi(first)11 b Fs(])45 b([)p Fi(last)11 b Fs(])870 408 -y(fc)47 b(-s)g([)p Fi(pat)11 b Fs(=)p Fi(rep)g Fs(])45 -b([)p Fi(command)11 b Fs(])630 557 y Ft(The)22 b(\014rst)g(form)f -(selects)j(a)f(range)g(of)f(commands)g(from)g Fq(\014rst)i -Ft(to)f Fq(last)i Ft(from)d(the)h(history)f(list)630 -667 y(and)i(displa)m(ys)h(or)g(edits)h(and)e(re-executes)j(them.)39 -b(Both)25 b Fq(\014rst)h Ft(and)f Fq(last)j Ft(ma)m(y)d(b)s(e)g(sp)s -(eci\014ed)630 776 y(as)31 b(a)g(string)f(\(to)i(lo)s(cate)h(the)d +(\014le.)150 5340 y Ft(fc)p eop end +%%Page: 134 140 +TeXDict begin 134 139 bop 150 -116 a Fu(Chapter)30 b(9:)41 +b(Using)30 b(History)h(In)m(teractiv)m(ely)1925 b(134)870 +299 y Ft(fc)47 b([-e)g Fj(ename)p Ft(])f([-lnr])g([)p +Fj(first)p Ft(])g([)p Fj(last)p Ft(])870 408 y(fc)h(-s)g([)p +Fj(pat)p Ft(=)p Fj(rep)p Ft(])f([)p Fj(command)p Ft(])630 +539 y Fu(The)22 b(\014rst)g(form)f(selects)j(a)f(range)g(of)f(commands) +g(from)g Fr(\014rst)i Fu(to)f Fr(last)i Fu(from)d(the)h(history)f(list) +630 648 y(and)i(displa)m(ys)h(or)g(edits)h(and)e(re-executes)j(them.)39 +b(Both)25 b Fr(\014rst)h Fu(and)f Fr(last)j Fu(ma)m(y)d(b)s(e)g(sp)s +(eci\014ed)630 758 y(as)31 b(a)g(string)f(\(to)i(lo)s(cate)h(the)d (most)h(recen)m(t)h(command)f(b)s(eginning)e(with)i(that)g(string\))g -(or)630 886 y(as)d(a)g(n)m(um)m(b)s(er)f(\(an)h(index)f(in)m(to)i(the)f +(or)630 867 y(as)d(a)g(n)m(um)m(b)s(er)f(\(an)h(index)f(in)m(to)i(the)f (history)g(list,)h(where)e(a)h(negativ)m(e)i(n)m(um)m(b)s(er)d(is)h -(used)f(as)630 996 y(an)g(o\013set)i(from)e(the)h(curren)m(t)f(command) -h(n)m(um)m(b)s(er\).)39 b(If)27 b Fq(last)j Ft(is)e(not)f(sp)s -(eci\014ed)g(it)h(is)g(set)g(to)630 1105 y Fq(\014rst)r -Ft(.)47 b(If)32 b Fq(\014rst)i Ft(is)e(not)h(sp)s(eci\014ed)f(it)h(is)g -(set)g(to)h(the)e(previous)g(command)h(for)f(editing)i(and)630 -1215 y Fp(\000)p Ft(16)g(for)g(listing.)51 b(If)34 b(the)f(`)p -Fs(-l)p Ft(')h(\015ag)g(is)g(giv)m(en,)i(the)d(commands)h(are)g(listed) -g(on)g(standard)630 1324 y(output.)40 b(The)29 b(`)p -Fs(-n)p Ft(')h(\015ag)g(suppresses)e(the)i(command)f(n)m(um)m(b)s(ers)g -(when)f(listing.)42 b(The)29 b(`)p Fs(-r)p Ft(')630 1434 -y(\015ag)35 b(rev)m(erses)f(the)h(order)e(of)i(the)f(listing.)53 -b(Otherwise,)35 b(the)f(editor)h(giv)m(en)g(b)m(y)f Fq(ename)40 -b Ft(is)630 1543 y(in)m(v)m(ok)m(ed)33 b(on)f(a)g(\014le)g(con)m -(taining)h(those)f(commands.)44 b(If)31 b Fq(ename)38 -b Ft(is)31 b(not)h(giv)m(en,)i(the)d(v)-5 b(alue)630 -1653 y(of)29 b(the)g(follo)m(wing)i(v)-5 b(ariable)29 -b(expansion)g(is)g(used:)39 b Fs(${FCEDIT:-${EDITOR:-vi}})p -Ft(.)34 b(This)630 1763 y(sa)m(ys)g(to)g(use)f(the)h(v)-5 -b(alue)34 b(of)f(the)h Fs(FCEDIT)e Ft(v)-5 b(ariable)34 +(used)f(as)630 977 y(an)g(o\013set)i(from)e(the)h(curren)m(t)f(command) +h(n)m(um)m(b)s(er\).)39 b(If)27 b Fr(last)j Fu(is)e(not)f(sp)s +(eci\014ed)g(it)h(is)g(set)g(to)630 1087 y Fr(\014rst)p +Fu(.)47 b(If)32 b Fr(\014rst)i Fu(is)f(not)g(sp)s(eci\014ed)f(it)h(is)g +(set)g(to)h(the)f(previous)f(command)h(for)f(editing)i(and)630 +1196 y Fq(\000)p Fu(16)j(for)g(listing.)61 b(If)36 b(the)h +Ft(-l)f Fu(\015ag)i(is)e(giv)m(en,)k(the)d(commands)f(are)i(listed)f +(on)g(standard)630 1306 y(output.)59 b(The)36 b Ft(-n)h +Fu(\015ag)g(suppresses)e(the)h(command)h(n)m(um)m(b)s(ers)e(when)h +(listing.)60 b(The)37 b Ft(-r)630 1415 y Fu(\015ag)e(rev)m(erses)f(the) +h(order)e(of)i(the)f(listing.)53 b(Otherwise,)35 b(the)f(editor)h(giv)m +(en)g(b)m(y)f Fr(ename)40 b Fu(is)630 1525 y(in)m(v)m(ok)m(ed)33 +b(on)f(a)g(\014le)g(con)m(taining)h(those)f(commands.)44 +b(If)31 b Fr(ename)38 b Fu(is)31 b(not)h(giv)m(en,)i(the)d(v)-5 +b(alue)630 1634 y(of)29 b(the)g(follo)m(wing)i(v)-5 b(ariable)29 +b(expansion)g(is)g(used:)39 b Ft(${FCEDIT:-${EDITOR:-vi}})p +Fu(.)34 b(This)630 1744 y(sa)m(ys)g(to)g(use)f(the)h(v)-5 +b(alue)34 b(of)f(the)h Ft(FCEDIT)e Fu(v)-5 b(ariable)34 b(if)f(set,)i(or)f(the)f(v)-5 b(alue)34 b(of)g(the)g -Fs(EDITOR)630 1872 y Ft(v)-5 b(ariable)40 b(if)e(that)i(is)f(set,)i(or) -e Fs(vi)f Ft(if)h(neither)g(is)g(set.)66 b(When)39 b(editing)g(is)g -(complete,)k(the)630 1982 y(edited)31 b(commands)f(are)g(ec)m(ho)s(ed)h -(and)f(executed.)630 2131 y(In)k(the)g(second)g(form,)h -Fq(command)j Ft(is)c(re-executed)i(after)f(eac)m(h)g(instance)g(of)f -Fq(pat)j Ft(in)d(the)630 2240 y(selected)e(command)e(is)h(replaced)g(b) -m(y)f Fq(rep)s Ft(.)40 b Fq(command)34 b Ft(is)c(in)m(tepreted)h(the)g -(same)g(as)g Fq(\014rst)630 2350 y Ft(ab)s(o)m(v)m(e.)630 -2498 y(A)g(useful)f(alias)i(to)g(use)e(with)h(the)g Fs(fc)f -Ft(command)h(is)g Fs(r='fc)e(-s')p Ft(,)h(so)h(that)h(t)m(yping)f(`)p -Fs(r)f(cc)p Ft(')630 2608 y(runs)35 b(the)h(last)h(command)f(b)s -(eginning)g(with)g Fs(cc)f Ft(and)h(t)m(yping)g(`)p Fs(r)p -Ft(')h(re-executes)h(the)e(last)630 2718 y(command)30 +Ft(EDITOR)630 1854 y Fu(v)-5 b(ariable)40 b(if)e(that)i(is)f(set,)i(or) +e Ft(vi)f Fu(if)h(neither)g(is)g(set.)66 b(When)39 b(editing)g(is)g +(complete,)k(the)630 1963 y(edited)31 b(commands)f(are)g(ec)m(ho)s(ed)h +(and)f(executed.)630 2093 y(In)k(the)g(second)g(form,)h +Fr(command)j Fu(is)c(re-executed)i(after)f(eac)m(h)g(instance)g(of)f +Fr(pat)j Fu(in)d(the)630 2203 y(selected)e(command)e(is)h(replaced)g(b) +m(y)f Fr(rep)p Fu(.)41 b Fr(command)34 b Fu(is)c(in)m(tepreted)h(the)g +(same)g(as)g Fr(\014rst)630 2313 y Fu(ab)s(o)m(v)m(e.)630 +2443 y(A)g(useful)f(alias)i(to)g(use)e(with)h(the)g Ft(fc)f +Fu(command)h(is)g Ft(r='fc)e(-s')p Fu(,)h(so)h(that)h(t)m(yping)f(`)p +Ft(r)f(cc)p Fu(')630 2552 y(runs)35 b(the)h(last)h(command)f(b)s +(eginning)g(with)g Ft(cc)f Fu(and)h(t)m(yping)g(`)p Ft(r)p +Fu(')h(re-executes)h(the)e(last)630 2662 y(command)30 b(\(see)h(Section)h(6.6)f([Aliases],)h(page)g(88\).)150 -2906 y Fs(history)870 3054 y(history)46 b([)p Fi(n)11 -b Fs(])870 3164 y(history)46 b(-c)870 3273 y(history)g(-d)h -Fi(offset)870 3383 y Fs(history)f([-anrw])g([)p Fi(filename)11 -b Fs(])870 3493 y(history)46 b(-ps)h Fi(arg)630 3641 -y Ft(With)26 b(no)g(options,)h(displa)m(y)f(the)g(history)g(list)g -(with)f(line)h(n)m(um)m(b)s(ers.)38 b(Lines)26 b(pre\014xed)e(with)630 -3751 y(a)35 b(`)p Fs(*)p Ft(')g(ha)m(v)m(e)h(b)s(een)e(mo)s(di\014ed.) -53 b(An)34 b(argumen)m(t)h(of)g Fq(n)f Ft(lists)i(only)f(the)g(last)g -Fq(n)f Ft(lines.)54 b(If)35 b(the)630 3861 y(shell)30 -b(v)-5 b(ariable)31 b Fs(HISTTIMEFORMAT)26 b Ft(is)k(set)h(and)e(not)i +2813 y Ft(history)870 2943 y(history)46 b([)p Fj(n)p +Ft(])870 3052 y(history)g(-c)870 3162 y(history)g(-d)h +Fj(offset)870 3271 y Ft(history)f([-anrw])g([)p Fj(filename)p +Ft(])870 3381 y(history)g(-ps)h Fj(arg)630 3511 y Fu(With)26 +b(no)g(options,)h(displa)m(y)f(the)g(history)g(list)g(with)f(line)h(n)m +(um)m(b)s(ers.)38 b(Lines)26 b(pre\014xed)e(with)630 +3621 y(a)35 b(`)p Ft(*)p Fu(')g(ha)m(v)m(e)h(b)s(een)e(mo)s(di\014ed.) +53 b(An)34 b(argumen)m(t)h(of)g Fr(n)f Fu(lists)i(only)f(the)g(last)g +Fr(n)f Fu(lines.)54 b(If)35 b(the)630 3730 y(shell)30 +b(v)-5 b(ariable)31 b Ft(HISTTIMEFORMAT)26 b Fu(is)k(set)h(and)e(not)i (n)m(ull,)f(it)h(is)f(used)f(as)h(a)h(format)f(string)630 -3970 y(for)36 b Fq(strftime)41 b Ft(to)36 b(displa)m(y)g(the)g(time)h +3840 y(for)36 b Fr(strftime)41 b Fu(to)36 b(displa)m(y)g(the)g(time)h (stamp)f(asso)s(ciated)h(with)f(eac)m(h)h(displa)m(y)m(ed)f(history)630 -4080 y(en)m(try)-8 b(.)47 b(No)33 b(in)m(terv)m(ening)g(blank)f(is)g +3950 y(en)m(try)-8 b(.)47 b(No)33 b(in)m(terv)m(ening)g(blank)f(is)g (prin)m(ted)g(b)s(et)m(w)m(een)h(the)g(formatted)f(time)h(stamp)g(and) -630 4189 y(the)e(history)f(line.)630 4338 y(Options,)g(if)h(supplied,)e -(ha)m(v)m(e)i(the)g(follo)m(wing)h(meanings:)630 4526 -y Fs(-c)384 b Ft(Clear)23 b(the)g(history)g(list.)39 +630 4059 y(the)e(history)f(line.)630 4189 y(Options,)g(if)h(supplied,)e +(ha)m(v)m(e)i(the)g(follo)m(wing)h(meanings:)630 4340 +y Ft(-c)384 b Fu(Clear)23 b(the)g(history)g(list.)39 b(This)22 b(ma)m(y)i(b)s(e)e(com)m(bined)h(with)f(the)h(other)h -(options)1110 4635 y(to)31 b(replace)g(the)g(history)f(list)h -(completely)-8 b(.)630 4823 y Fs(-d)30 b Fi(offset)1110 -4933 y Ft(Delete)25 b(the)f(history)f(en)m(try)g(at)h(p)s(osition)f -Fq(o\013set)r Ft(.)39 b Fq(o\013set)26 b Ft(should)c(b)s(e)h(sp)s -(eci\014ed)1110 5043 y(as)31 b(it)g(app)s(ears)e(when)h(the)g(history)g -(is)h(displa)m(y)m(ed.)630 5230 y Fs(-a)384 b Ft(App)s(end)35 -b(the)i(new)g(history)g(lines)g(\(history)g(lines)g(en)m(tered)h(since) -f(the)g(b)s(e-)1110 5340 y(ginning)30 b(of)h(the)f(curren)m(t)g(Bash)h -(session\))g(to)g(the)g(history)f(\014le.)p eop end -%%Page: 136 142 -TeXDict begin 136 141 bop 150 -116 a Ft(Chapter)30 b(9:)41 -b(Using)30 b(History)h(In)m(teractiv)m(ely)1925 b(136)630 -299 y Fs(-n)384 b Ft(App)s(end)32 b(the)i(history)f(lines)h(not)g -(already)g(read)g(from)f(the)h(history)f(\014le)h(to)1110 -408 y(the)26 b(curren)m(t)f(history)g(list.)40 b(These)25 +(options)1110 4450 y(to)31 b(replace)g(the)g(history)f(list)h +(completely)-8 b(.)630 4600 y Ft(-d)30 b Fj(offset)66 +b Fu(Delete)25 b(the)f(history)f(en)m(try)h(at)g(p)s(osition)f +Fr(o\013set)p Fu(.)39 b Fr(o\013set)27 b Fu(should)22 +b(b)s(e)h(sp)s(eci\014ed)1110 4710 y(as)31 b(it)g(app)s(ears)e(when)h +(the)g(history)g(is)h(displa)m(y)m(ed.)630 4861 y Ft(-a)384 +b Fu(App)s(end)35 b(the)i(new)g(history)g(lines)g(\(history)g(lines)g +(en)m(tered)h(since)f(the)g(b)s(e-)1110 4970 y(ginning)30 +b(of)h(the)f(curren)m(t)g(Bash)h(session\))g(to)g(the)g(history)f +(\014le.)630 5121 y Ft(-n)384 b Fu(App)s(end)32 b(the)i(history)f +(lines)h(not)g(already)g(read)g(from)f(the)h(history)f(\014le)h(to)1110 +5230 y(the)26 b(curren)m(t)f(history)g(list.)40 b(These)25 b(are)h(lines)g(app)s(ended)e(to)i(the)f(history)h(\014le)1110 -518 y(since)31 b(the)f(b)s(eginning)g(of)g(the)h(curren)m(t)f(Bash)h -(session.)630 690 y Fs(-r)384 b Ft(Read)31 b(the)f(history)g(\014le)h -(and)f(app)s(end)e(its)j(con)m(ten)m(ts)h(to)f(the)g(history)f(list.) -630 863 y Fs(-w)384 b Ft(W)-8 b(rite)32 b(out)e(the)h(curren)m(t)f -(history)g(list)h(to)h(the)e(history)g(\014le.)630 1035 -y Fs(-p)384 b Ft(P)m(erform)31 b(history)f(substitution)h(on)f(the)h -Fq(arg)8 b Ft(s)31 b(and)f(displa)m(y)h(the)f(result)h(on)1110 -1145 y(the)d(standard)f(output,)i(without)f(storing)g(the)g(results)g -(in)g(the)g(history)g(list.)630 1317 y Fs(-s)384 b Ft(The)30 -b Fq(arg)8 b Ft(s)30 b(are)h(added)f(to)h(the)f(end)g(of)h(the)f +5340 y(since)31 b(the)f(b)s(eginning)g(of)g(the)h(curren)m(t)f(Bash)h +(session.)p eop end +%%Page: 135 141 +TeXDict begin 135 140 bop 150 -116 a Fu(Chapter)30 b(9:)41 +b(Using)30 b(History)h(In)m(teractiv)m(ely)1925 b(135)630 +299 y Ft(-r)384 b Fu(Read)31 b(the)f(history)g(\014le)h(and)f(app)s +(end)e(its)j(con)m(ten)m(ts)h(to)f(the)g(history)f(list.)630 +447 y Ft(-w)384 b Fu(W)-8 b(rite)32 b(out)e(the)h(curren)m(t)f(history) +g(list)h(to)h(the)e(history)g(\014le.)630 595 y Ft(-p)384 +b Fu(P)m(erform)31 b(history)f(substitution)h(on)f(the)h +Fr(arg)8 b Fu(s)31 b(and)f(displa)m(y)h(the)f(result)h(on)1110 +705 y(the)d(standard)f(output,)i(without)f(storing)g(the)g(results)g +(in)g(the)g(history)g(list.)630 853 y Ft(-s)384 b Fu(The)30 +b Fr(arg)8 b Fu(s)30 b(are)h(added)f(to)h(the)f(end)g(of)h(the)f (history)h(list)g(as)f(a)h(single)g(en)m(try)-8 b(.)630 -1489 y(When)24 b(an)m(y)h(of)f(the)h(`)p Fs(-w)p Ft(',)h(`)p -Fs(-r)p Ft(',)f(`)p Fs(-a)p Ft(',)h(or)f(`)p Fs(-n)p -Ft(')f(options)g(is)h(used,)g(if)f Fq(\014lename)30 b -Ft(is)24 b(giv)m(en,)j(then)630 1599 y(it)32 b(is)g(used)f(as)h(the)f -(history)h(\014le.)45 b(If)31 b(not,)h(then)g(the)f(v)-5 -b(alue)32 b(of)g(the)g Fs(HISTFILE)d Ft(v)-5 b(ariable)33 -b(is)630 1709 y(used.)150 1961 y Fr(9.3)68 b(History)46 -b(Expansion)150 2120 y Ft(The)f(History)h(library)e(pro)m(vides)i(a)f -(history)g(expansion)g(feature)h(that)g(is)f(similar)h(to)g(the)f -(history)150 2230 y(expansion)g(pro)m(vided)f(b)m(y)h -Fs(csh)p Ft(.)83 b(This)44 b(section)i(describ)s(es)e(the)h(syn)m(tax)h -(used)e(to)i(manipulate)f(the)150 2339 y(history)30 b(information.)275 -2487 y(History)h(expansions)f(in)m(tro)s(duce)g(w)m(ords)g(from)g(the)h +1001 y(When)26 b(an)m(y)h(of)f(the)g Ft(-w)p Fu(,)h Ft(-r)p +Fu(,)g Ft(-a)p Fu(,)g(or)f Ft(-n)f Fu(options)i(is)f(used,)h(if)f +Fr(\014lename)32 b Fu(is)26 b(giv)m(en,)i(then)e(it)h(is)630 +1111 y(used)h(as)g(the)h(history)f(\014le.)40 b(If)28 +b(not,)i(then)e(the)g(v)-5 b(alue)29 b(of)g(the)g Ft(HISTFILE)d +Fu(v)-5 b(ariable)29 b(is)f(used.)150 1332 y Fs(9.3)68 +b(History)46 b(Expansion)150 1492 y Fu(The)f(History)h(library)e(pro)m +(vides)i(a)f(history)g(expansion)g(feature)h(that)g(is)f(similar)h(to)g +(the)f(history)150 1601 y(expansion)g(pro)m(vided)f(b)m(y)h +Ft(csh)p Fu(.)83 b(This)44 b(section)i(describ)s(es)e(the)h(syn)m(tax)h +(used)e(to)i(manipulate)f(the)150 1711 y(history)30 b(information.)275 +1840 y(History)h(expansions)f(in)m(tro)s(duce)g(w)m(ords)g(from)g(the)h (history)f(list)h(in)m(to)g(the)g(input)f(stream,)h(making)150 -2596 y(it)g(easy)g(to)g(rep)s(eat)g(commands,)f(insert)g(the)h(argumen) +1949 y(it)g(easy)g(to)g(rep)s(eat)g(commands,)f(insert)g(the)h(argumen) m(ts)f(to)h(a)g(previous)f(command)g(in)m(to)i(the)e(curren)m(t)150 -2706 y(input)f(line,)i(or)g(\014x)f(errors)f(in)h(previous)g(commands)g -(quic)m(kly)-8 b(.)275 2853 y(History)27 b(expansion)f(tak)m(es)i +2059 y(input)f(line,)i(or)g(\014x)f(errors)f(in)h(previous)g(commands)g +(quic)m(kly)-8 b(.)275 2188 y(History)27 b(expansion)f(tak)m(es)i (place)f(in)f(t)m(w)m(o)i(parts.)39 b(The)26 b(\014rst)g(is)g(to)h -(determine)g(whic)m(h)f(line)h(from)f(the)150 2963 y(history)i(list)g +(determine)g(whic)m(h)f(line)h(from)f(the)150 2297 y(history)i(list)g (should)f(b)s(e)g(used)g(during)g(substitution.)39 b(The)27 b(second)h(is)g(to)h(select)g(p)s(ortions)e(of)h(that)h(line)150 -3072 y(for)d(inclusion)f(in)m(to)i(the)f(curren)m(t)f(one.)40 +2407 y(for)d(inclusion)f(in)m(to)i(the)f(curren)m(t)f(one.)40 b(The)25 b(line)h(selected)h(from)f(the)g(history)f(is)h(called)h(the)f -Fq(ev)m(en)m(t)p Ft(,)j(and)150 3182 y(the)21 b(p)s(ortions)g(of)g +Fr(ev)m(en)m(t)p Fu(,)j(and)150 2517 y(the)21 b(p)s(ortions)g(of)g (that)h(line)f(that)h(are)g(acted)g(up)s(on)e(are)h(called)h -Fq(w)m(ords)p Ft(.)38 b(V)-8 b(arious)21 b Fq(mo)s(di\014ers)j -Ft(are)e(a)m(v)-5 b(ailable)150 3292 y(to)35 b(manipulate)f(the)g +Fr(w)m(ords)p Fu(.)38 b(V)-8 b(arious)21 b Fr(mo)s(di\014ers)j +Fu(are)e(a)m(v)-5 b(ailable)150 2626 y(to)35 b(manipulate)f(the)g (selected)i(w)m(ords.)51 b(The)33 b(line)h(is)g(brok)m(en)g(in)m(to)h -(w)m(ords)e(in)h(the)g(same)h(fashion)e(that)150 3401 +(w)m(ords)e(in)h(the)g(same)h(fashion)e(that)150 2736 y(Bash)i(do)s(es,)h(so)f(that)h(sev)m(eral)g(w)m(ords)e(surrounded)f(b) m(y)i(quotes)g(are)g(considered)g(one)g(w)m(ord.)54 b(History)150 -3511 y(expansions)34 b(are)g(in)m(tro)s(duced)f(b)m(y)h(the)g(app)s +2845 y(expansions)34 b(are)g(in)m(tro)s(duced)f(b)m(y)h(the)g(app)s (earance)g(of)g(the)g(history)g(expansion)g(c)m(haracter,)i(whic)m(h)e -(is)150 3620 y(`)p Fs(!)p Ft(')d(b)m(y)f(default.)41 -b(Only)29 b(`)p Fs(\\)p Ft(')i(and)f(`)p Fs(')p Ft(')g(ma)m(y)h(b)s(e)f +(is)150 2955 y(`)p Ft(!)p Fu(')d(b)m(y)f(default.)41 +b(Only)29 b(`)p Ft(\\)p Fu(')i(and)f(`)p Ft(')p Fu(')g(ma)m(y)h(b)s(e)f (used)g(to)h(escap)s(e)g(the)f(history)g(expansion)h(c)m(haracter.)275 -3768 y(Sev)m(eral)40 b(shell)g(options)g(settable)h(with)e(the)h -Fs(shopt)e Ft(builtin)h(\(see)h(Section)h(4.2)f([Bash)g(Builtins],)150 -3877 y(page)32 b(48\))h(ma)m(y)f(b)s(e)f(used)g(to)i(tailor)g(the)e(b)s +3084 y(Sev)m(eral)40 b(shell)g(options)g(settable)h(with)e(the)h +Ft(shopt)e Fu(builtin)h(\(see)h(Section)h(4.2)f([Bash)g(Builtins],)150 +3194 y(page)32 b(48\))h(ma)m(y)f(b)s(e)f(used)g(to)i(tailor)g(the)e(b)s (eha)m(vior)h(of)g(history)g(expansion.)44 b(If)31 b(the)h -Fs(histverify)d Ft(shell)150 3987 y(option)39 b(is)f(enabled,)i(and)e +Ft(histverify)d Fu(shell)150 3303 y(option)39 b(is)f(enabled,)i(and)e (Readline)g(is)h(b)s(eing)e(used,)j(history)e(substitutions)g(are)g -(not)h(immediately)150 4097 y(passed)30 b(to)h(the)g(shell)g(parser.)40 +(not)h(immediately)150 3413 y(passed)30 b(to)h(the)g(shell)g(parser.)40 b(Instead,)30 b(the)h(expanded)f(line)h(is)f(reloaded)h(in)m(to)h(the)e -(Readline)h(editing)150 4206 y(bu\013er)e(for)i(further)e(mo)s +(Readline)h(editing)150 3522 y(bu\013er)e(for)i(further)e(mo)s (di\014cation.)41 b(If)30 b(Readline)h(is)f(b)s(eing)g(used,)g(and)g -(the)g Fs(histreedit)e Ft(shell)i(option)150 4316 y(is)k(enabled,)h(a)g +(the)g Ft(histreedit)e Fu(shell)i(option)150 3632 y(is)k(enabled,)h(a)g (failed)g(history)f(expansion)g(will)g(b)s(e)g(reloaded)g(in)m(to)h -(the)g(Readline)f(editing)h(bu\013er)e(for)150 4425 y(correction.)74 -b(The)41 b(`)p Fs(-p)p Ft(')g(option)g(to)h(the)f Fs(history)f -Ft(builtin)g(command)h(ma)m(y)h(b)s(e)e(used)h(to)g(see)h(what)150 -4535 y(a)c(history)g(expansion)f(will)h(do)f(b)s(efore)h(using)f(it.)63 -b(The)37 b(`)p Fs(-s)p Ft(')g(option)h(to)h(the)f Fs(history)d -Ft(builtin)i(ma)m(y)150 4645 y(b)s(e)c(used)h(to)g(add)g(commands)f(to) -i(the)f(end)g(of)g(the)g(history)g(list)h(without)f(actually)i -(executing)f(them,)150 4754 y(so)j(that)h(they)f(are)g(a)m(v)-5 -b(ailable)40 b(for)e(subsequen)m(t)f(recall.)65 b(This)37 -b(is)h(most)g(useful)g(in)f(conjunction)h(with)150 4864 -y(Readline.)275 5011 y(The)33 b(shell)h(allo)m(ws)h(con)m(trol)h(of)e -(the)g(v)-5 b(arious)34 b(c)m(haracters)h(used)f(b)m(y)f(the)h(history) -g(expansion)g(mec)m(h-)150 5121 y(anism)h(with)g(the)g -Fs(histchars)d Ft(v)-5 b(ariable,)38 b(as)d(explained)g(ab)s(o)m(v)m(e) -i(\(see)f(Section)f(5.2)i([Bash)e(V)-8 b(ariables],)150 -5230 y(page)32 b(69\).)44 b(The)31 b(shell)g(uses)g(the)g(history)g -(commen)m(t)i(c)m(haracter)f(to)g(mark)f(history)g(timestamps)h(when) -150 5340 y(writing)e(the)h(history)f(\014le.)p eop end -%%Page: 137 143 -TeXDict begin 137 142 bop 150 -116 a Ft(Chapter)30 b(9:)41 -b(Using)30 b(History)h(In)m(teractiv)m(ely)1925 b(137)150 -299 y Fj(9.3.1)63 b(Ev)m(en)m(t)39 b(Designators)150 -446 y Ft(An)32 b(ev)m(en)m(t)j(designator)e(is)g(a)g(reference)g(to)h -(a)f(command)f(line)h(en)m(try)g(in)g(the)g(history)g(list.)48 -b(Unless)33 b(the)150 555 y(reference)e(is)f(absolute,)i(ev)m(en)m(ts)f -(are)g(relativ)m(e)i(to)e(the)f(curren)m(t)g(p)s(osition)h(in)f(the)h -(history)f(list.)150 712 y Fs(!)432 b Ft(Start)34 b(a)f(history)h -(substitution,)g(except)g(when)f(follo)m(w)m(ed)i(b)m(y)e(a)h(space,)h -(tab,)f(the)g(end)f(of)630 822 y(the)i(line,)g(`)p Fs(=)p -Ft(')g(or)f(`)p Fs(\()p Ft(')h(\(when)e(the)i Fs(extglob)d -Ft(shell)j(option)f(is)h(enabled)f(using)g(the)g Fs(shopt)630 -931 y Ft(builtin\).)150 1088 y Fs(!)p Fi(n)384 b Ft(Refer)30 -b(to)i(command)e(line)g Fq(n)p Ft(.)150 1245 y Fs(!-)p -Fi(n)336 b Ft(Refer)30 b(to)i(the)e(command)g Fq(n)g -Ft(lines)h(bac)m(k.)150 1401 y Fs(!!)384 b Ft(Refer)30 -b(to)i(the)e(previous)g(command.)40 b(This)30 b(is)g(a)h(synon)m(ym)f -(for)g(`)p Fs(!-1)p Ft('.)150 1558 y Fs(!)p Fi(string)144 -b Ft(Refer)25 b(to)h(the)f(most)h(recen)m(t)g(command)f(preceding)g -(the)g(curren)m(t)g(p)s(osition)g(in)g(the)g(history)630 -1668 y(list)31 b(starting)g(with)f Fq(string)8 b Ft(.)150 -1824 y Fs(!?)p Fi(string)j Fs([?])630 1934 y Ft(Refer)25 -b(to)h(the)f(most)h(recen)m(t)g(command)f(preceding)g(the)g(curren)m(t) -g(p)s(osition)g(in)g(the)g(history)630 2044 y(list)32 -b(con)m(taining)h Fq(string)8 b Ft(.)43 b(The)31 b(trailing)h(`)p -Fs(?)p Ft(')f(ma)m(y)h(b)s(e)f(omitted)h(if)f(the)h Fq(string)39 -b Ft(is)31 b(follo)m(w)m(ed)630 2153 y(immediately)h(b)m(y)e(a)h -(newline.)150 2310 y Fs(^)p Fi(string1)11 b Fs(^)p Fi(string2)g -Fs(^)630 2420 y Ft(Quic)m(k)31 b(Substitution.)43 b(Rep)s(eat)31 -b(the)g(last)h(command,)g(replacing)f Fq(string1)39 b -Ft(with)31 b Fq(string2)7 b Ft(.)630 2529 y(Equiv)-5 -b(alen)m(t)31 b(to)g Fs(!!:s/)p Fi(string1)11 b Fs(/)p -Fi(string2)g Fs(/)p Ft(.)150 2686 y Fs(!#)384 b Ft(The)30 -b(en)m(tire)h(command)f(line)h(t)m(yp)s(ed)f(so)h(far.)150 -2882 y Fj(9.3.2)63 b(W)-10 b(ord)41 b(Designators)150 -3029 y Ft(W)-8 b(ord)27 b(designators)h(are)g(used)e(to)i(select)h +(the)g(Readline)f(editing)h(bu\013er)e(for)150 3741 y(correction.)68 +b(The)38 b Ft(-p)h Fu(option)g(to)h(the)f Ft(history)e +Fu(builtin)i(command)f(ma)m(y)i(b)s(e)e(used)g(to)i(see)g(what)f(a)150 +3851 y(history)f(expansion)f(will)h(do)g(b)s(efore)f(using)h(it.)63 +b(The)37 b Ft(-s)g Fu(option)i(to)f(the)g Ft(history)e +Fu(builtin)h(ma)m(y)i(b)s(e)150 3961 y(used)21 b(to)i(add)f(commands)g +(to)g(the)h(end)e(of)i(the)f(history)g(list)h(without)f(actually)i +(executing)f(them,)h(so)e(that)150 4070 y(they)31 b(are)f(a)m(v)-5 +b(ailable)33 b(for)d(subsequen)m(t)g(recall.)42 b(This)29 +b(is)i(most)g(useful)e(in)h(conjunction)h(with)f(Readline.)275 +4199 y(The)j(shell)h(allo)m(ws)h(con)m(trol)h(of)e(the)g(v)-5 +b(arious)34 b(c)m(haracters)h(used)f(b)m(y)f(the)h(history)g(expansion) +g(mec)m(h-)150 4309 y(anism)h(with)g(the)g Ft(histchars)d +Fu(v)-5 b(ariable,)38 b(as)d(explained)g(ab)s(o)m(v)m(e)i(\(see)f +(Section)f(5.2)i([Bash)e(V)-8 b(ariables],)150 4418 y(page)32 +b(69\).)44 b(The)31 b(shell)g(uses)g(the)g(history)g(commen)m(t)i(c)m +(haracter)f(to)g(mark)f(history)g(timestamps)h(when)150 +4528 y(writing)e(the)h(history)f(\014le.)150 4716 y Fk(9.3.1)63 +b(Ev)m(en)m(t)39 b(Designators)150 4863 y Fu(An)32 b(ev)m(en)m(t)j +(designator)e(is)g(a)g(reference)g(to)h(a)f(command)f(line)h(en)m(try)g +(in)g(the)g(history)g(list.)48 b(Unless)33 b(the)150 +4973 y(reference)e(is)f(absolute,)i(ev)m(en)m(ts)f(are)g(relativ)m(e)i +(to)e(the)f(curren)m(t)g(p)s(osition)h(in)f(the)h(history)f(list.)150 +5121 y Ft(!)432 b Fu(Start)34 b(a)f(history)h(substitution,)g(except)g +(when)f(follo)m(w)m(ed)i(b)m(y)e(a)h(space,)h(tab,)f(the)g(end)f(of)630 +5230 y(the)i(line,)g(`)p Ft(=)p Fu(')g(or)f(`)p Ft(\()p +Fu(')h(\(when)e(the)i Ft(extglob)d Fu(shell)j(option)f(is)h(enabled)f +(using)g(the)g Ft(shopt)630 5340 y Fu(builtin\).)p eop +end +%%Page: 136 142 +TeXDict begin 136 141 bop 150 -116 a Fu(Chapter)30 b(9:)41 +b(Using)30 b(History)h(In)m(teractiv)m(ely)1925 b(136)150 +299 y Ft(!)p Fj(n)384 b Fu(Refer)30 b(to)i(command)e(line)g +Fr(n)p Fu(.)150 460 y Ft(!-)p Fj(n)336 b Fu(Refer)30 +b(to)i(the)e(command)g Fr(n)g Fu(lines)h(bac)m(k.)150 +622 y Ft(!!)384 b Fu(Refer)30 b(to)i(the)e(previous)g(command.)40 +b(This)30 b(is)g(a)h(synon)m(ym)f(for)g(`)p Ft(!-1)p +Fu('.)150 784 y Ft(!)p Fj(string)144 b Fu(Refer)25 b(to)h(the)f(most)h +(recen)m(t)g(command)f(preceding)g(the)g(curren)m(t)g(p)s(osition)g(in) +g(the)g(history)630 893 y(list)31 b(starting)g(with)f +Fr(string)p Fu(.)150 1055 y Ft(!?)p Fj(string)p Ft([?])630 +1164 y Fu(Refer)25 b(to)h(the)f(most)h(recen)m(t)g(command)f(preceding) +g(the)g(curren)m(t)g(p)s(osition)g(in)g(the)g(history)630 +1274 y(list)32 b(con)m(taining)i Fr(string)p Fu(.)45 +b(The)31 b(trailing)i(`)p Ft(?)p Fu(')f(ma)m(y)g(b)s(e)f(omitted)i(if)f +(the)g Fr(string)39 b Fu(is)32 b(follo)m(w)m(ed)630 1384 +y(immediately)g(b)m(y)e(a)h(newline.)150 1545 y Ft(^)p +Fj(string1)p Ft(^)p Fj(string2)p Ft(^)630 1655 y Fu(Quic)m(k)h +(Substitution.)44 b(Rep)s(eat)32 b(the)g(last)h(command,)f(replacing)g +Fr(string1)40 b Fu(with)31 b Fr(string2)p Fu(.)630 1764 +y(Equiv)-5 b(alen)m(t)31 b(to)g Ft(!!:s/)p Fj(string1)p +Ft(/)p Fj(string2)p Ft(/)p Fu(.)150 1926 y Ft(!#)384 +b Fu(The)30 b(en)m(tire)h(command)f(line)h(t)m(yp)s(ed)f(so)h(far.)150 +2127 y Fk(9.3.2)63 b(W)-10 b(ord)41 b(Designators)150 +2274 y Fu(W)-8 b(ord)27 b(designators)h(are)g(used)e(to)i(select)h (desired)d(w)m(ords)h(from)f(the)i(ev)m(en)m(t.)41 b(A)27 -b(`)p Fs(:)p Ft(')g(separates)h(the)f(ev)m(en)m(t)150 -3139 y(sp)s(eci\014cation)38 b(from)e(the)h(w)m(ord)f(designator.)61 +b(`)p Ft(:)p Fu(')g(separates)h(the)f(ev)m(en)m(t)150 +2384 y(sp)s(eci\014cation)38 b(from)e(the)h(w)m(ord)f(designator.)61 b(It)37 b(ma)m(y)h(b)s(e)e(omitted)i(if)e(the)h(w)m(ord)g(designator)g -(b)s(egins)150 3248 y(with)30 b(a)g(`)p Fs(^)p Ft(',)g(`)p -Fs($)p Ft(',)g(`)p Fs(*)p Ft(',)h(`)p Fs(-)p Ft(',)f(or)g(`)p -Fs(\045)p Ft('.)41 b(W)-8 b(ords)30 b(are)g(n)m(um)m(b)s(ered)e(from)i +(b)s(egins)150 2494 y(with)30 b(a)g(`)p Ft(^)p Fu(',)g(`)p +Ft($)p Fu(',)g(`)p Ft(*)p Fu(',)h(`)p Ft(-)p Fu(',)f(or)g(`)p +Ft(\045)p Fu('.)41 b(W)-8 b(ords)30 b(are)g(n)m(um)m(b)s(ered)e(from)i (the)g(b)s(eginning)f(of)h(the)g(line,)g(with)g(the)150 -3358 y(\014rst)f(w)m(ord)f(b)s(eing)h(denoted)h(b)m(y)f(0)h(\(zero\).) +2603 y(\014rst)f(w)m(ord)f(b)s(eing)h(denoted)h(b)m(y)f(0)h(\(zero\).) 41 b(W)-8 b(ords)30 b(are)g(inserted)f(in)m(to)h(the)g(curren)m(t)f -(line)g(separated)h(b)m(y)150 3468 y(single)h(spaces.)275 -3601 y(F)-8 b(or)31 b(example,)150 3758 y Fs(!!)384 b -Ft(designates)37 b(the)f(preceding)g(command.)57 b(When)35 +(line)g(separated)h(b)m(y)150 2713 y(single)h(spaces.)275 +2849 y(F)-8 b(or)31 b(example,)150 3012 y Ft(!!)384 b +Fu(designates)37 b(the)f(preceding)g(command.)57 b(When)35 b(y)m(ou)i(t)m(yp)s(e)f(this,)h(the)f(preceding)g(com-)630 -3867 y(mand)30 b(is)g(rep)s(eated)g(in)g(toto.)150 4024 -y Fs(!!:$)288 b Ft(designates)23 b(the)g(last)g(argumen)m(t)g(of)f(the) +3122 y(mand)30 b(is)g(rep)s(eated)g(in)g(toto.)150 3283 +y Ft(!!:$)288 b Fu(designates)23 b(the)g(last)g(argumen)m(t)g(of)f(the) h(preceding)f(command.)38 b(This)22 b(ma)m(y)h(b)s(e)e(shortened)630 -4133 y(to)31 b Fs(!$)p Ft(.)150 4290 y Fs(!fi:2)240 b -Ft(designates)30 b(the)g(second)f(argumen)m(t)h(of)f(the)h(most)f -(recen)m(t)i(command)e(starting)h(with)f(the)630 4400 -y(letters)j Fs(fi)p Ft(.)275 4556 y(Here)e(are)h(the)g(w)m(ord)f -(designators:)150 4713 y Fs(0)g(\(zero\))114 b Ft(The)30 -b Fs(0)p Ft(th)g(w)m(ord.)40 b(F)-8 b(or)31 b(man)m(y)g(applications,)h -(this)e(is)g(the)h(command)f(w)m(ord.)150 4870 y Fi(n)432 -b Ft(The)30 b Fq(n)p Ft(th)g(w)m(ord.)150 5027 y Fs(^)432 -b Ft(The)30 b(\014rst)f(argumen)m(t;)j(that)f(is,)f(w)m(ord)g(1.)150 -5183 y Fs($)432 b Ft(The)30 b(last)h(argumen)m(t.)150 -5340 y Fs(\045)432 b Ft(The)30 b(w)m(ord)g(matc)m(hed)h(b)m(y)f(the)h -(most)g(recen)m(t)g(`)p Fs(?)p Fi(string)11 b Fs(?)p -Ft(')28 b(searc)m(h.)p eop end -%%Page: 138 144 -TeXDict begin 138 143 bop 150 -116 a Ft(Chapter)30 b(9:)41 -b(Using)30 b(History)h(In)m(teractiv)m(ely)1925 b(138)150 -299 y Fi(x)11 b Fs(-)p Fi(y)325 b Ft(A)30 b(range)h(of)g(w)m(ords;)f(`) -p Fs(-)p Fi(y)11 b Ft(')30 b(abbreviates)h(`)p Fs(0-)p -Fi(y)11 b Ft('.)150 458 y Fs(*)432 b Ft(All)28 b(of)g(the)g(w)m(ords,)g -(except)h(the)e Fs(0)p Ft(th.)40 b(This)27 b(is)g(a)h(synon)m(ym)f(for) -h(`)p Fs(1-$)p Ft('.)39 b(It)28 b(is)g(not)g(an)f(error)630 -568 y(to)j(use)g(`)p Fs(*)p Ft(')f(if)h(there)g(is)g(just)f(one)h(w)m +3393 y(to)31 b Ft(!$)p Fu(.)150 3555 y Ft(!fi:2)240 b +Fu(designates)30 b(the)g(second)f(argumen)m(t)h(of)f(the)h(most)f +(recen)m(t)i(command)e(starting)h(with)f(the)630 3664 +y(letters)j Ft(fi)p Fu(.)275 3827 y(Here)e(are)h(the)g(w)m(ord)f +(designators:)150 3990 y Ft(0)g(\(zero\))114 b Fu(The)30 +b Ft(0)p Fu(th)g(w)m(ord.)40 b(F)-8 b(or)31 b(man)m(y)g(applications,)h +(this)e(is)g(the)h(command)f(w)m(ord.)150 4151 y Fj(n)432 +b Fu(The)30 b Fr(n)p Fu(th)g(w)m(ord.)150 4313 y Ft(^)432 +b Fu(The)30 b(\014rst)f(argumen)m(t;)j(that)f(is,)f(w)m(ord)g(1.)150 +4474 y Ft($)432 b Fu(The)30 b(last)h(argumen)m(t.)150 +4636 y Ft(\045)432 b Fu(The)30 b(w)m(ord)g(matc)m(hed)h(b)m(y)f(the)h +(most)g(recen)m(t)g(`)p Ft(?)p Fj(string)p Ft(?)p Fu(')e(searc)m(h.)150 +4798 y Fj(x)p Ft(-)p Fj(y)336 b Fu(A)30 b(range)h(of)g(w)m(ords;)f(`)p +Ft(-)p Fj(y)p Fu(')g(abbreviates)h(`)p Ft(0-)p Fj(y)p +Fu('.)150 4959 y Ft(*)432 b Fu(All)28 b(of)g(the)g(w)m(ords,)g(except)h +(the)e Ft(0)p Fu(th.)40 b(This)27 b(is)g(a)h(synon)m(ym)f(for)h(`)p +Ft(1-$)p Fu('.)39 b(It)28 b(is)g(not)g(an)f(error)630 +5069 y(to)j(use)g(`)p Ft(*)p Fu(')f(if)h(there)g(is)g(just)f(one)h(w)m (ord)f(in)g(the)h(ev)m(en)m(t;)i(the)d(empt)m(y)i(string)e(is)h -(returned)e(in)630 677 y(that)j(case.)150 837 y Fi(x)11 -b Fs(*)373 b Ft(Abbreviates)31 b(`)p Fi(x)11 b Fs(-$)p -Ft(')150 996 y Fi(x)g Fs(-)373 b Ft(Abbreviates)31 b(`)p -Fi(x)11 b Fs(-$)p Ft(')29 b(lik)m(e)j(`)p Fi(x)11 b Fs(*)p -Ft(',)30 b(but)g(omits)h(the)f(last)h(w)m(ord.)275 1156 -y(If)i(a)h(w)m(ord)g(designator)g(is)g(supplied)f(without)h(an)g(ev)m -(en)m(t)h(sp)s(eci\014cation,)h(the)e(previous)f(command)150 -1265 y(is)d(used)g(as)h(the)f(ev)m(en)m(t.)150 1465 y -Fj(9.3.3)63 b(Mo)s(di\014ers)150 1611 y Ft(After)29 b(the)g(optional)g -(w)m(ord)g(designator,)g(y)m(ou)g(can)g(add)f(a)h(sequence)g(of)g(one)g -(or)f(more)h(of)g(the)f(follo)m(wing)150 1721 y(mo)s(di\014ers,)h(eac)m -(h)j(preceded)e(b)m(y)g(a)h(`)p Fs(:)p Ft('.)150 1880 -y Fs(h)432 b Ft(Remo)m(v)m(e)32 b(a)f(trailing)g(pathname)g(comp)s -(onen)m(t,)g(lea)m(ving)h(only)e(the)h(head.)150 2040 -y Fs(t)432 b Ft(Remo)m(v)m(e)32 b(all)f(leading)h(pathname)e(comp)s -(onen)m(ts,)h(lea)m(ving)h(the)e(tail.)150 2199 y Fs(r)432 -b Ft(Remo)m(v)m(e)32 b(a)f(trailing)g(su\016x)f(of)g(the)h(form)f(`)p -Fs(.)p Fi(suffix)11 b Ft(',)28 b(lea)m(ving)33 b(the)d(basename.)150 -2359 y Fs(e)432 b Ft(Remo)m(v)m(e)32 b(all)f(but)f(the)h(trailing)g -(su\016x.)150 2518 y Fs(p)432 b Ft(Prin)m(t)30 b(the)h(new)f(command)g -(but)g(do)g(not)g(execute)i(it.)150 2677 y Fs(q)432 b -Ft(Quote)31 b(the)f(substituted)g(w)m(ords,)g(escaping)h(further)e -(substitutions.)150 2837 y Fs(x)432 b Ft(Quote)32 b(the)f(substituted)g -(w)m(ords)f(as)i(with)f(`)p Fs(q)p Ft(',)h(but)e(break)h(in)m(to)i(w)m -(ords)d(at)i(spaces,)h(tabs,)630 2946 y(and)d(newlines.)150 -3106 y Fs(s/)p Fi(old)11 b Fs(/)p Fi(new)g Fs(/)630 3215 -y Ft(Substitute)32 b Fq(new)40 b Ft(for)32 b(the)h(\014rst)f(o)s -(ccurrence)h(of)f Fq(old)37 b Ft(in)32 b(the)h(ev)m(en)m(t)h(line.)48 -b(An)m(y)32 b(delimiter)630 3325 y(ma)m(y)25 b(b)s(e)g(used)f(in)g -(place)i(of)f(`)p Fs(/)p Ft('.)39 b(The)24 b(delimiter)h(ma)m(y)h(b)s -(e)e(quoted)h(in)f Fq(old)29 b Ft(and)24 b Fq(new)32 -b Ft(with)25 b(a)630 3435 y(single)j(bac)m(kslash.)40 -b(If)27 b(`)p Fs(&)p Ft(')g(app)s(ears)g(in)g Fq(new)8 -b Ft(,)27 b(it)h(is)f(replaced)h(b)m(y)f Fq(old)t Ft(.)39 -b(A)27 b(single)h(bac)m(kslash)630 3544 y(will)35 b(quote)g(the)g(`)p -Fs(&)p Ft('.)54 b(The)34 b(\014nal)g(delimiter)i(is)e(optional)i(if)f -(it)g(is)f(the)h(last)h(c)m(haracter)g(on)630 3654 y(the)31 -b(input)e(line.)150 3813 y Fs(&)432 b Ft(Rep)s(eat)31 -b(the)f(previous)g(substitution.)150 3973 y Fs(g)150 -4082 y(a)432 b Ft(Cause)38 b(c)m(hanges)i(to)f(b)s(e)f(applied)h(o)m(v) -m(er)h(the)f(en)m(tire)g(ev)m(en)m(t)h(line.)66 b(Used)39 -b(in)f(conjunction)630 4192 y(with)30 b(`)p Fs(s)p Ft(',)h(as)f(in)h -Fs(gs/)p Fi(old)11 b Fs(/)p Fi(new)g Fs(/)p Ft(,)26 b(or)k(with)h(`)p -Fs(&)p Ft('.)150 4351 y Fs(G)432 b Ft(Apply)30 b(the)g(follo)m(wing)i -(`)p Fs(s)p Ft(')f(mo)s(di\014er)e(once)i(to)g(eac)m(h)h(w)m(ord)e(in)g -(the)g(ev)m(en)m(t.)p eop end -%%Page: 139 145 -TeXDict begin 139 144 bop 150 -116 a Ft(Chapter)30 b(10:)41 -b(Installing)31 b(Bash)2356 b(139)150 299 y Fo(10)80 -b(Installing)52 b(Bash)150 556 y Ft(This)31 b(c)m(hapter)h(pro)m(vides) +(returned)e(in)630 5178 y(that)j(case.)150 5340 y Fj(x)p +Ft(*)384 b Fu(Abbreviates)31 b(`)p Fj(x)p Ft(-$)p Fu(')p +eop end +%%Page: 137 143 +TeXDict begin 137 142 bop 150 -116 a Fu(Chapter)30 b(9:)41 +b(Using)30 b(History)h(In)m(teractiv)m(ely)1925 b(137)150 +299 y Fj(x)p Ft(-)384 b Fu(Abbreviates)31 b(`)p Fj(x)p +Ft(-$)p Fu(')f(lik)m(e)h(`)p Fj(x)p Ft(*)p Fu(',)g(but)f(omits)h(the)f +(last)h(w)m(ord.)275 458 y(If)i(a)h(w)m(ord)g(designator)g(is)g +(supplied)f(without)h(an)g(ev)m(en)m(t)h(sp)s(eci\014cation,)h(the)e +(previous)f(command)150 568 y(is)d(used)g(as)h(the)f(ev)m(en)m(t.)150 +767 y Fk(9.3.3)63 b(Mo)s(di\014ers)150 914 y Fu(After)29 +b(the)g(optional)g(w)m(ord)g(designator,)g(y)m(ou)g(can)g(add)f(a)h +(sequence)g(of)g(one)g(or)f(more)h(of)g(the)f(follo)m(wing)150 +1024 y(mo)s(di\014ers,)h(eac)m(h)j(preceded)e(b)m(y)g(a)h(`)p +Ft(:)p Fu('.)150 1183 y Ft(h)432 b Fu(Remo)m(v)m(e)32 +b(a)f(trailing)g(pathname)g(comp)s(onen)m(t,)g(lea)m(ving)h(only)e(the) +h(head.)150 1342 y Ft(t)432 b Fu(Remo)m(v)m(e)32 b(all)f(leading)h +(pathname)e(comp)s(onen)m(ts,)h(lea)m(ving)h(the)e(tail.)150 +1502 y Ft(r)432 b Fu(Remo)m(v)m(e)32 b(a)f(trailing)g(su\016x)f(of)g +(the)h(form)f(`)p Ft(.)p Fj(suffix)p Fu(',)f(lea)m(ving)j(the)f +(basename.)150 1661 y Ft(e)432 b Fu(Remo)m(v)m(e)32 b(all)f(but)f(the)h +(trailing)g(su\016x.)150 1821 y Ft(p)432 b Fu(Prin)m(t)30 +b(the)h(new)f(command)g(but)g(do)g(not)g(execute)i(it.)150 +1980 y Ft(q)432 b Fu(Quote)31 b(the)f(substituted)g(w)m(ords,)g +(escaping)h(further)e(substitutions.)150 2139 y Ft(x)432 +b Fu(Quote)32 b(the)f(substituted)g(w)m(ords)f(as)i(with)f(`)p +Ft(q)p Fu(',)h(but)e(break)h(in)m(to)i(w)m(ords)d(at)i(spaces,)h(tabs,) +630 2249 y(and)d(newlines.)150 2408 y Ft(s/)p Fj(old)p +Ft(/)p Fj(new)p Ft(/)630 2518 y Fu(Substitute)i Fr(new)40 +b Fu(for)32 b(the)h(\014rst)f(o)s(ccurrence)h(of)f Fr(old)37 +b Fu(in)32 b(the)h(ev)m(en)m(t)h(line.)48 b(An)m(y)32 +b(delimiter)630 2628 y(ma)m(y)25 b(b)s(e)g(used)f(in)g(place)i(of)f(`)p +Ft(/)p Fu('.)39 b(The)24 b(delimiter)h(ma)m(y)h(b)s(e)e(quoted)h(in)f +Fr(old)29 b Fu(and)24 b Fr(new)32 b Fu(with)25 b(a)630 +2737 y(single)k(bac)m(kslash.)40 b(If)28 b(`)p Ft(&)p +Fu(')g(app)s(ears)g(in)f Fr(new)p Fu(,)i(it)f(is)h(replaced)f(b)m(y)g +Fr(old)p Fu(.)40 b(A)28 b(single)h(bac)m(kslash)630 2847 +y(will)35 b(quote)g(the)g(`)p Ft(&)p Fu('.)54 b(The)34 +b(\014nal)g(delimiter)i(is)e(optional)i(if)f(it)g(is)f(the)h(last)h(c)m +(haracter)g(on)630 2956 y(the)31 b(input)e(line.)150 +3116 y Ft(&)432 b Fu(Rep)s(eat)31 b(the)f(previous)g(substitution.)150 +3275 y Ft(g)150 3385 y(a)432 b Fu(Cause)38 b(c)m(hanges)i(to)f(b)s(e)f +(applied)h(o)m(v)m(er)h(the)f(en)m(tire)g(ev)m(en)m(t)h(line.)66 +b(Used)39 b(in)f(conjunction)630 3494 y(with)30 b(`)p +Ft(s)p Fu(',)h(as)f(in)h Ft(gs/)p Fj(old)p Ft(/)p Fj(new)p +Ft(/)p Fu(,)c(or)j(with)h(`)p Ft(&)p Fu('.)150 3654 y +Ft(G)432 b Fu(Apply)30 b(the)g(follo)m(wing)i(`)p Ft(s)p +Fu(')f(mo)s(di\014er)e(once)i(to)g(eac)m(h)h(w)m(ord)e(in)g(the)g(ev)m +(en)m(t.)p eop end +%%Page: 138 144 +TeXDict begin 138 143 bop 150 -116 a Fu(Chapter)30 b(10:)41 +b(Installing)31 b(Bash)2356 b(138)150 299 y Fp(10)80 +b(Installing)52 b(Bash)150 556 y Fu(This)31 b(c)m(hapter)h(pro)m(vides) g(basic)g(instructions)f(for)g(installing)i(Bash)f(on)f(the)h(v)-5 b(arious)31 b(supp)s(orted)f(plat-)150 665 y(forms.)40 -b(The)28 b(distribution)h(supp)s(orts)e(the)j Fl(gnu)f -Ft(op)s(erating)h(systems,)f(nearly)h(ev)m(ery)g(v)m(ersion)f(of)h +b(The)28 b(distribution)h(supp)s(orts)e(the)j Fm(gnu)f +Fu(op)s(erating)h(systems,)f(nearly)h(ev)m(ery)g(v)m(ersion)f(of)h (Unix,)150 775 y(and)d(sev)m(eral)j(non-Unix)d(systems)h(suc)m(h)g(as)g (BeOS)g(and)f(In)m(terix.)40 b(Other)28 b(indep)s(enden)m(t)e(p)s(orts) -h(exist)i(for)150 884 y Fl(ms-dos)p Ft(,)h Fl(os/2)p -Ft(,)g(and)g(Windo)m(ws)g(platforms.)150 1128 y Fr(10.1)68 -b(Basic)45 b(Installation)150 1288 y Ft(These)30 b(are)h(installation)h +h(exist)i(for)150 884 y Fm(ms-dos)p Fu(,)h Fm(os/2)p +Fu(,)g(and)g(Windo)m(ws)g(platforms.)150 1128 y Fs(10.1)68 +b(Basic)45 b(Installation)150 1288 y Fu(These)30 b(are)h(installation)h (instructions)e(for)h(Bash.)275 1430 y(The)e(simplest)i(w)m(a)m(y)g(to) -g(compile)h(Bash)e(is:)199 1572 y(1.)61 b Fs(cd)38 b -Ft(to)h(the)f(directory)h(con)m(taining)h(the)f(source)f(co)s(de)h(and) -f(t)m(yp)s(e)g(`)p Fs(./configure)p Ft(')e(to)j(con\014gure)330 +g(compile)h(Bash)e(is:)199 1572 y(1.)61 b Ft(cd)38 b +Fu(to)h(the)f(directory)h(con)m(taining)h(the)f(source)f(co)s(de)h(and) +f(t)m(yp)s(e)g(`)p Ft(./configure)p Fu(')e(to)j(con\014gure)330 1681 y(Bash)c(for)f(y)m(our)h(system.)54 b(If)34 b(y)m(ou're)h(using)f -Fs(csh)g Ft(on)g(an)h(old)g(v)m(ersion)g(of)g(System)f(V,)h(y)m(ou)g +Ft(csh)g Fu(on)g(an)h(old)g(v)m(ersion)g(of)g(System)f(V,)h(y)m(ou)g (migh)m(t)330 1791 y(need)21 b(to)g(t)m(yp)s(e)g(`)p -Fs(sh)30 b(./configure)p Ft(')18 b(instead)j(to)g(prev)m(en)m(t)h -Fs(csh)e Ft(from)g(trying)h(to)g(execute)h Fs(configure)330 -1901 y Ft(itself.)330 2039 y(Running)30 b Fs(configure)f -Ft(tak)m(es)k(some)e(time.)45 b(While)32 b(running,)e(it)i(prin)m(ts)f +Ft(sh)30 b(./configure)p Fu(')18 b(instead)j(to)g(prev)m(en)m(t)h +Ft(csh)e Fu(from)g(trying)h(to)g(execute)h Ft(configure)330 +1901 y Fu(itself.)330 2039 y(Running)30 b Ft(configure)f +Fu(tak)m(es)k(some)e(time.)45 b(While)32 b(running,)e(it)i(prin)m(ts)f (messages)h(telling)h(whic)m(h)330 2149 y(features)e(it)g(is)f(c)m(hec) m(king)i(for.)199 2287 y(2.)61 b(T)m(yp)s(e)30 b(`)p -Fs(make)p Ft(')g(to)h(compile)g(Bash)g(and)e(build)h(the)g -Fs(bashbug)f Ft(bug)g(rep)s(orting)h(script.)199 2425 -y(3.)61 b(Optionally)-8 b(,)32 b(t)m(yp)s(e)e(`)p Fs(make)g(tests)p -Ft(')f(to)i(run)e(the)h(Bash)h(test)g(suite.)199 2563 -y(4.)61 b(T)m(yp)s(e)36 b(`)p Fs(make)29 b(install)p -Ft(')35 b(to)i(install)h Fs(bash)d Ft(and)h Fs(bashbug)p -Ft(.)57 b(This)35 b(will)i(also)h(install)f(the)g(man)m(ual)330 +Ft(make)p Fu(')g(to)h(compile)g(Bash)g(and)e(build)h(the)g +Ft(bashbug)f Fu(bug)g(rep)s(orting)h(script.)199 2425 +y(3.)61 b(Optionally)-8 b(,)32 b(t)m(yp)s(e)e(`)p Ft(make)g(tests)p +Fu(')f(to)i(run)e(the)h(Bash)h(test)g(suite.)199 2563 +y(4.)61 b(T)m(yp)s(e)36 b(`)p Ft(make)29 b(install)p +Fu(')35 b(to)i(install)h Ft(bash)d Fu(and)h Ft(bashbug)p +Fu(.)57 b(This)35 b(will)i(also)h(install)f(the)g(man)m(ual)330 2673 y(pages)31 b(and)f(Info)g(\014le.)275 2844 y(The)20 -b Fs(configure)f Ft(shell)i(script)g(attempts)h(to)g(guess)f(correct)i +b Ft(configure)f Fu(shell)i(script)g(attempts)h(to)g(guess)f(correct)i (v)-5 b(alues)21 b(for)g(v)-5 b(arious)21 b(system-dep)s(enden)m(t)150 -2953 y(v)-5 b(ariables)44 b(used)f(during)g(compilation.)82 -b(It)43 b(uses)h(those)g(v)-5 b(alues)44 b(to)g(create)h(a)g(`)p -Fs(Makefile)p Ft(')c(in)j(eac)m(h)150 3063 y(directory)25 -b(of)g(the)g(pac)m(k)-5 b(age)27 b(\(the)e(top)g(directory)-8 -b(,)27 b(the)e(`)p Fs(builtins)p Ft(',)f(`)p Fs(doc)p -Ft(',)i(and)e(`)p Fs(support)p Ft(')g(directories,)150 -3172 y(eac)m(h)32 b(directory)f(under)d(`)p Fs(lib)p -Ft(',)j(and)f(sev)m(eral)h(others\).)42 b(It)30 b(also)i(creates)f(a)g -(`)p Fs(config.h)p Ft(')e(\014le)h(con)m(taining)150 -3282 y(system-dep)s(enden)m(t)h(de\014nitions.)44 b(Finally)-8 -b(,)34 b(it)e(creates)h(a)f(shell)g(script)f(named)g -Fs(config.status)d Ft(that)150 3392 y(y)m(ou)k(can)g(run)e(in)h(the)g -(future)g(to)h(recreate)h(the)f(curren)m(t)f(con\014guration,)h(a)g -(\014le)g(`)p Fs(config.cache)p Ft(')c(that)150 3501 -y(sa)m(v)m(es)35 b(the)f(results)f(of)h(its)g(tests)h(to)f(sp)s(eed)f -(up)g(recon\014guring,)h(and)f(a)h(\014le)g(`)p Fs(config.log)p -Ft(')d(con)m(taining)150 3611 y(compiler)25 b(output)g(\(useful)f -(mainly)h(for)g(debugging)f Fs(configure)p Ft(\).)37 -b(If)24 b(at)i(some)f(p)s(oin)m(t)g(`)p Fs(config.cache)p -Ft(')150 3720 y(con)m(tains)32 b(results)e(y)m(ou)g(don't)h(w)m(an)m(t) -g(to)g(k)m(eep,)g(y)m(ou)g(ma)m(y)g(remo)m(v)m(e)h(or)e(edit)h(it.)275 -3862 y(T)-8 b(o)37 b(\014nd)f(out)i(more)f(ab)s(out)h(the)f(options)h -(and)f(argumen)m(ts)g(that)h(the)g Fs(configure)d Ft(script)i(under-) -150 3972 y(stands,)30 b(t)m(yp)s(e)390 4114 y Fs(bash-2.04$)45 -b(./configure)g(--help)150 4256 y Ft(at)31 b(the)g(Bash)f(prompt)g(in)g +2953 y(v)-5 b(ariables)31 b(used)e(during)g(compilation.)42 +b(It)31 b(uses)e(those)i(v)-5 b(alues)30 b(to)h(create)h(a)e +Ft(Makefile)e Fu(in)i(eac)m(h)i(direc-)150 3063 y(tory)k(of)g(the)g +(pac)m(k)-5 b(age)38 b(\(the)e(top)g(directory)-8 b(,)38 +b(the)e Ft(builtins)p Fu(,)f Ft(doc)p Fu(,)i(and)e Ft(support)e +Fu(directories,)39 b(eac)m(h)150 3172 y(directory)29 +b(under)d Ft(lib)p Fu(,)j(and)e(sev)m(eral)j(others\).)40 +b(It)29 b(also)g(creates)h(a)e Ft(config.h)e Fu(\014le)j(con)m(taining) +g(system-)150 3282 y(dep)s(enden)m(t)e(de\014nitions.)40 +b(Finally)-8 b(,)31 b(it)d(creates)i(a)f(shell)g(script)f(named)g +Ft(config.status)d Fu(that)k(y)m(ou)g(can)150 3392 y(run)h(in)h(the)h +(future)f(to)h(recreate)h(the)f(curren)m(t)f(con\014guration,)i(a)f +(\014le)f Ft(config.cache)e Fu(that)j(sa)m(v)m(es)h(the)150 +3501 y(results)39 b(of)g(its)h(tests)g(to)g(sp)s(eed)e(up)g +(recon\014guring,)j(and)e(a)g(\014le)g Ft(config.log)e +Fu(con)m(taining)j(compiler)150 3611 y(output)30 b(\(useful)h(mainly)g +(for)f(debugging)h Ft(configure)p Fu(\).)40 b(If)30 b(at)h(some)h(p)s +(oin)m(t)e Ft(config.cache)e Fu(con)m(tains)150 3720 +y(results)i(y)m(ou)h(don't)f(w)m(an)m(t)h(to)h(k)m(eep,)f(y)m(ou)g(ma)m +(y)g(remo)m(v)m(e)g(or)g(edit)g(it.)275 3862 y(T)-8 b(o)37 +b(\014nd)f(out)i(more)f(ab)s(out)h(the)f(options)h(and)f(argumen)m(ts)g +(that)h(the)g Ft(configure)d Fu(script)i(under-)150 3972 +y(stands,)30 b(t)m(yp)s(e)390 4114 y Ft(bash-2.04$)45 +b(./configure)g(--help)150 4256 y Fu(at)31 b(the)g(Bash)f(prompt)g(in)g (y)m(our)g(Bash)h(source)f(directory)-8 b(.)275 4398 y(If)53 b(y)m(ou)h(need)f(to)i(do)e(un)m(usual)g(things)g(to)i(compile) g(Bash,)k(please)c(try)e(to)i(\014gure)e(out)h(ho)m(w)150 -4508 y Fs(configure)47 b Ft(could)j(c)m(hec)m(k)h(whether)e(or)g(not)h +4508 y Ft(configure)47 b Fu(could)j(c)m(hec)m(k)h(whether)e(or)g(not)h (to)h(do)e(them,)55 b(and)49 b(mail)h(di\013s)f(or)h(instructions)f(to) -150 4617 y Fs(bash-maintainers@gnu.org)24 b Ft(so)30 +150 4617 y Ft(bash-maintainers@gnu.org)24 b Fu(so)30 b(they)h(can)g(b)s(e)e(considered)i(for)f(the)g(next)h(release.)275 -4760 y(The)24 b(\014le)i(`)p Fs(configure.ac)p Ft(')c(is)k(used)e(to)j -(create)g Fs(configure)22 b Ft(b)m(y)k(a)g(program)f(called)h(Auto)s -(conf.)39 b(Y)-8 b(ou)150 4869 y(only)31 b(need)f(`)p -Fs(configure.ac)p Ft(')d(if)k(y)m(ou)f(w)m(an)m(t)i(to)f(c)m(hange)g -(it)g(or)f(regenerate)i Fs(configure)c Ft(using)i(a)h(new)m(er)150 -4979 y(v)m(ersion)25 b(of)f(Auto)s(conf.)39 b(If)24 b(y)m(ou)h(do)f -(this,)i(mak)m(e)f(sure)f(y)m(ou)h(are)f(using)g(Auto)s(conf)h(v)m -(ersion)f(2.50)i(or)f(new)m(er.)275 5121 y(Y)-8 b(ou)29 -b(can)f(remo)m(v)m(e)i(the)f(program)g(binaries)f(and)g(ob)5 -b(ject)29 b(\014les)g(from)f(the)h(source)f(co)s(de)h(directory)g(b)m -(y)150 5230 y(t)m(yping)j(`)p Fs(make)d(clean)p Ft('.)42 -b(T)-8 b(o)32 b(also)g(remo)m(v)m(e)g(the)g(\014les)f(that)g -Fs(configure)e Ft(created)j(\(so)g(y)m(ou)g(can)f(compile)150 +4760 y(The)e(\014le)g Ft(configure.ac)d Fu(is)k(used)e(to)j(create)g +Ft(configure)c Fu(b)m(y)i(a)h(program)f(called)i(Auto)s(conf.)40 +b(Y)-8 b(ou)150 4869 y(only)34 b(need)g Ft(configure.ac)d +Fu(if)i(y)m(ou)i(w)m(an)m(t)g(to)f(c)m(hange)i(it)e(or)g(regenerate)i +Ft(configure)31 b Fu(using)j(a)g(new)m(er)150 4979 y(v)m(ersion)25 +b(of)f(Auto)s(conf.)39 b(If)24 b(y)m(ou)h(do)f(this,)i(mak)m(e)f(sure)f +(y)m(ou)h(are)f(using)g(Auto)s(conf)h(v)m(ersion)f(2.50)i(or)f(new)m +(er.)275 5121 y(Y)-8 b(ou)29 b(can)f(remo)m(v)m(e)i(the)f(program)g +(binaries)f(and)g(ob)5 b(ject)29 b(\014les)g(from)f(the)h(source)f(co)s +(de)h(directory)g(b)m(y)150 5230 y(t)m(yping)j(`)p Ft(make)d(clean)p +Fu('.)42 b(T)-8 b(o)32 b(also)g(remo)m(v)m(e)g(the)g(\014les)f(that)g +Ft(configure)e Fu(created)j(\(so)g(y)m(ou)g(can)f(compile)150 5340 y(Bash)g(for)f(a)g(di\013eren)m(t)h(kind)f(of)g(computer\),)h(t)m -(yp)s(e)g(`)p Fs(make)e(distclean)p Ft('.)p eop end -%%Page: 140 146 -TeXDict begin 140 145 bop 150 -116 a Ft(Chapter)30 b(10:)41 -b(Installing)31 b(Bash)2356 b(140)150 299 y Fr(10.2)68 -b(Compilers)46 b(and)f(Options)150 458 y Ft(Some)28 b(systems)h +(yp)s(e)g(`)p Ft(make)e(distclean)p Fu('.)p eop end +%%Page: 139 145 +TeXDict begin 139 144 bop 150 -116 a Fu(Chapter)30 b(10:)41 +b(Installing)31 b(Bash)2356 b(139)150 299 y Fs(10.2)68 +b(Compilers)46 b(and)f(Options)150 458 y Fu(Some)28 b(systems)h (require)f(un)m(usual)f(options)i(for)f(compilation)i(or)f(linking)f -(that)h(the)g Fs(configure)d Ft(script)150 568 y(do)s(es)32 +(that)h(the)g Ft(configure)d Fu(script)150 568 y(do)s(es)32 b(not)g(kno)m(w)g(ab)s(out.)44 b(Y)-8 b(ou)33 b(can)f(giv)m(e)h -Fs(configure)d Ft(initial)j(v)-5 b(alues)32 b(for)g(v)-5 +Ft(configure)d Fu(initial)j(v)-5 b(alues)32 b(for)g(v)-5 b(ariables)32 b(b)m(y)g(setting)h(them)150 677 y(in)k(the)g(en)m (vironmen)m(t.)62 b(Using)38 b(a)f(Bourne-compatible)i(shell,)g(y)m(ou) f(can)g(do)f(that)h(on)f(the)g(command)150 787 y(line)31 -b(lik)m(e)g(this:)390 920 y Fs(CC=c89)46 b(CFLAGS=-O2)f(LIBS=-lposix)g -(./configure)275 1053 y Ft(On)29 b(systems)h(that)h(ha)m(v)m(e)h(the)f -Fs(env)e Ft(program,)h(y)m(ou)h(can)g(do)f(it)h(lik)m(e)h(this:)390 -1186 y Fs(env)47 b(CPPFLAGS=-I/usr/local/in)o(clud)o(e)42 -b(LDFLAGS=-s)j(./configure)275 1318 y Ft(The)29 b(con\014guration)i +b(lik)m(e)g(this:)390 920 y Ft(CC=c89)46 b(CFLAGS=-O2)f(LIBS=-lposix)g +(./configure)275 1053 y Fu(On)29 b(systems)h(that)h(ha)m(v)m(e)h(the)f +Ft(env)e Fu(program,)h(y)m(ou)h(can)g(do)f(it)h(lik)m(e)h(this:)390 +1186 y Ft(env)47 b(CPPFLAGS=-I/usr/local/in)o(clud)o(e)42 +b(LDFLAGS=-s)j(./configure)275 1318 y Fu(The)29 b(con\014guration)i (pro)s(cess)f(uses)g(GCC)g(to)h(build)e(Bash)i(if)f(it)h(is)g(a)m(v)-5 -b(ailable.)150 1548 y Fr(10.3)68 b(Compiling)46 b(F)-11 -b(or)45 b(Multiple)g(Arc)l(hitectures)150 1707 y Ft(Y)-8 +b(ailable.)150 1548 y Fs(10.3)68 b(Compiling)46 b(F)-11 +b(or)45 b(Multiple)g(Arc)l(hitectures)150 1707 y Fu(Y)-8 b(ou)27 b(can)g(compile)g(Bash)g(for)f(more)h(than)f(one)h(kind)f(of)g (computer)h(at)g(the)g(same)g(time,)h(b)m(y)e(placing)i(the)150 1817 y(ob)5 b(ject)31 b(\014les)f(for)g(eac)m(h)i(arc)m(hitecture)f(in) f(their)g(o)m(wn)h(directory)-8 b(.)41 b(T)-8 b(o)31 b(do)f(this,)g(y)m(ou)h(m)m(ust)f(use)g(a)g(v)m(ersion)150 -1926 y(of)25 b Fs(make)f Ft(that)h(supp)s(orts)f(the)h -Fs(VPATH)e Ft(v)-5 b(ariable,)27 b(suc)m(h)e(as)g(GNU)h -Fs(make)p Ft(.)37 b Fs(cd)25 b Ft(to)h(the)f(directory)g(where)g(y)m +1926 y(of)25 b Ft(make)f Fu(that)h(supp)s(orts)f(the)h +Ft(VPATH)e Fu(v)-5 b(ariable,)27 b(suc)m(h)e(as)g(GNU)h +Ft(make)p Fu(.)37 b Ft(cd)25 b Fu(to)h(the)f(directory)g(where)g(y)m (ou)150 2036 y(w)m(an)m(t)34 b(the)f(ob)5 b(ject)34 b(\014les)f(and)f -(executables)i(to)g(go)g(and)e(run)g(the)h Fs(configure)d -Ft(script)j(from)g(the)g(source)150 2145 y(directory)-8 -b(.)41 b(Y)-8 b(ou)27 b(ma)m(y)h(need)f(to)g(supply)f(the)h(`)p -Fs(--srcdir=PATH)p Ft(')d(argumen)m(t)k(to)g(tell)g Fs(configure)c -Ft(where)150 2255 y(the)36 b(source)g(\014les)f(are.)57 -b Fs(configure)33 b Ft(automatically)39 b(c)m(hec)m(ks)e(for)e(the)h +(executables)i(to)g(go)g(and)e(run)g(the)h Ft(configure)d +Fu(script)j(from)g(the)g(source)150 2145 y(directory)-8 +b(.)44 b(Y)-8 b(ou)32 b(ma)m(y)g(need)f(to)h(supply)e(the)i +Ft(--srcdir=PATH)27 b Fu(argumen)m(t)32 b(to)g(tell)h +Ft(configure)28 b Fu(where)150 2255 y(the)36 b(source)g(\014les)f(are.) +57 b Ft(configure)33 b Fu(automatically)39 b(c)m(hec)m(ks)e(for)e(the)h (source)g(co)s(de)f(in)h(the)f(directory)150 2364 y(that)c -Fs(configure)d Ft(is)i(in)g(and)g(in)g(`..'.)275 2497 -y(If)20 b(y)m(ou)h(ha)m(v)m(e)i(to)e(use)g(a)g Fs(make)f -Ft(that)i(do)s(es)e(not)i(supp)s(orts)d(the)i Fs(VPATH)e -Ft(v)-5 b(ariable,)24 b(y)m(ou)e(can)f(compile)h(Bash)150 +Ft(configure)d Fu(is)i(in)g(and)g(in)g(`..'.)275 2497 +y(If)20 b(y)m(ou)h(ha)m(v)m(e)i(to)e(use)g(a)g Ft(make)f +Fu(that)i(do)s(es)e(not)i(supp)s(orts)d(the)i Ft(VPATH)e +Fu(v)-5 b(ariable,)24 b(y)m(ou)e(can)f(compile)h(Bash)150 2607 y(for)33 b(one)h(arc)m(hitecture)h(at)f(a)g(time)g(in)f(the)h (source)g(co)s(de)f(directory)-8 b(.)51 b(After)34 b(y)m(ou)g(ha)m(v)m (e)h(installed)f(Bash)150 2716 y(for)c(one)h(arc)m(hitecture,)h(use)e -(`)p Fs(make)g(distclean)p Ft(')e(b)s(efore)i(recon\014guring)g(for)g +(`)p Ft(make)g(distclean)p Fu(')e(b)s(efore)i(recon\014guring)g(for)g (another)g(arc)m(hitecture.)275 2849 y(Alternativ)m(ely)-8 -b(,)26 b(if)21 b(y)m(our)h(system)g(supp)s(orts)d(sym)m(b)s(olic)j -(links,)i(y)m(ou)e(can)g(use)f(the)h(`)p Fs(support/mkclone)p -Ft(')150 2959 y(script)h(to)h(create)g(a)f(build)f(tree)i(whic)m(h)f -(has)f(sym)m(b)s(olic)i(links)e(bac)m(k)i(to)g(eac)m(h)g(\014le)f(in)g -(the)g(source)g(directory)-8 b(.)150 3068 y(Here's)41 -b(an)f(example)i(that)f(creates)h(a)e(build)g(directory)h(in)f(the)h -(curren)m(t)f(directory)h(from)f(a)h(source)150 3178 -y(directory)31 b(`)p Fs(/usr/gnu/src/bash-2.0)p Ft(':)390 -3311 y Fs(bash)47 b(/usr/gnu/src/bash-2.0/s)o(uppo)o(rt/)o(mkcl)o(one) -41 b(-s)47 b(/usr/gnu/src/bash-2.0)42 b(.)150 3444 y -Ft(The)c Fs(mkclone)e Ft(script)i(requires)g(Bash,)i(so)f(y)m(ou)f(m)m -(ust)h(ha)m(v)m(e)g(already)g(built)f(Bash)g(for)g(at)h(least)h(one)150 -3553 y(arc)m(hitecture)32 b(b)s(efore)e(y)m(ou)h(can)f(create)i(build)e -(directories)h(for)f(other)h(arc)m(hitectures.)150 3782 -y Fr(10.4)68 b(Installation)47 b(Names)150 3942 y Ft(By)27 -b(default,)h(`)p Fs(make)i(install)p Ft(')25 b(will)j(install)g(in)m -(to)g(`)p Fs(/usr/local/bin)p Ft(',)c(`)p Fs(/usr/local/man)p -Ft(',)h(etc.)40 b(Y)-8 b(ou)150 4051 y(can)31 b(sp)s(ecify)f(an)h -(installation)h(pre\014x)d(other)i(than)g(`)p Fs(/usr/local)p -Ft(')d(b)m(y)i(giving)i Fs(configure)c Ft(the)i(option)150 -4161 y(`)p Fs(--prefix=)p Fi(PATH)11 b Ft(',)35 b(or)h(b)m(y)g(sp)s -(ecifying)g(a)h(v)-5 b(alue)37 b(for)f(the)h Fs(DESTDIR)d -Ft(`)p Fs(make)p Ft(')i(v)-5 b(ariable)37 b(when)f(running)150 -4271 y(`)p Fs(make)29 b(install)p Ft('.)275 4403 y(Y)-8 +b(,)30 b(if)c(y)m(our)g(system)h(supp)s(orts)d(sym)m(b)s(olic)j(links,) +g(y)m(ou)g(can)g(use)f(the)g Ft(support/mkclone)150 2959 +y Fu(script)d(to)h(create)g(a)f(build)f(tree)i(whic)m(h)f(has)f(sym)m +(b)s(olic)i(links)e(bac)m(k)i(to)g(eac)m(h)g(\014le)f(in)g(the)g +(source)g(directory)-8 b(.)150 3068 y(Here's)41 b(an)f(example)i(that)f +(creates)h(a)e(build)g(directory)h(in)f(the)h(curren)m(t)f(directory)h +(from)f(a)h(source)150 3178 y(directory)31 b Ft(/usr/gnu/src/bash-2.0)p +Fu(:)390 3311 y Ft(bash)47 b(/usr/gnu/src/bash-2.0/s)o(uppo)o(rt/)o +(mkcl)o(one)41 b(-s)47 b(/usr/gnu/src/bash-2.0)42 b(.)150 +3444 y Fu(The)c Ft(mkclone)e Fu(script)i(requires)g(Bash,)i(so)f(y)m +(ou)f(m)m(ust)h(ha)m(v)m(e)g(already)g(built)f(Bash)g(for)g(at)h(least) +h(one)150 3553 y(arc)m(hitecture)32 b(b)s(efore)e(y)m(ou)h(can)f +(create)i(build)e(directories)h(for)f(other)h(arc)m(hitectures.)150 +3782 y Fs(10.4)68 b(Installation)47 b(Names)150 3942 +y Fu(By)37 b(default,)i(`)p Ft(make)29 b(install)p Fu(')35 +b(will)j(install)f(in)m(to)h Ft(/usr/local/bin)p Fu(,)d +Ft(/usr/local/man)p Fu(,)f(etc.)61 b(Y)-8 b(ou)150 4051 +y(can)35 b(sp)s(ecify)f(an)h(installation)i(pre\014x)c(other)j(than)e +Ft(/usr/local)e Fu(b)m(y)j(giving)g Ft(configure)e Fu(the)h(option)150 +4161 y Ft(--prefix=)p Fj(PATH)p Fu(,)41 b(or)g(b)m(y)g(sp)s(ecifying)h +(a)f(v)-5 b(alue)42 b(for)f(the)h Ft(DESTDIR)d Fu(`)p +Ft(make)p Fu(')i(v)-5 b(ariable)42 b(when)f(running)150 +4271 y(`)p Ft(make)29 b(install)p Fu('.)275 4403 y(Y)-8 b(ou)71 b(can)h(sp)s(ecify)f(separate)h(installation)h(pre\014xes)d (for)h(arc)m(hitecture-sp)s(eci\014c)i(\014les)f(and)150 -4513 y(arc)m(hitecture-indep)s(enden)m(t)38 b(\014les.)62 -b(If)37 b(y)m(ou)h(giv)m(e)g Fs(configure)d Ft(the)j(option)g(`)p -Fs(--exec-prefix=)p Fi(PATH)11 b Ft(',)150 4623 y(`)p -Fs(make)29 b(install)p Ft(')63 b(will)h(use)f Fq(P)-8 -b(A)g(TH)75 b Ft(as)64 b(the)g(pre\014x)e(for)i(installing)h(programs)e -(and)h(libraries.)150 4732 y(Do)s(cumen)m(tation)32 b(and)e(other)h -(data)g(\014les)f(will)h(still)g(use)f(the)h(regular)f(pre\014x.)150 -4961 y Fr(10.5)68 b(Sp)t(ecifying)45 b(the)g(System)h(T)l(yp)t(e)150 -5121 y Ft(There)f(ma)m(y)g(b)s(e)f(some)i(features)f -Fs(configure)e Ft(can)i(not)g(\014gure)g(out)g(automatically)-8 -b(,)52 b(but)44 b(need)h(to)150 5230 y(determine)36 b(b)m(y)g(the)h(t)m -(yp)s(e)f(of)g(host)h(Bash)f(will)h(run)d(on.)58 b(Usually)37 -b Fs(configure)d Ft(can)i(\014gure)g(that)g(out,)150 -5340 y(but)c(if)h(it)g(prin)m(ts)g(a)g(message)h(sa)m(ying)g(it)f(can)h -(not)f(guess)g(the)g(host)g(t)m(yp)s(e,)h(giv)m(e)g(it)f(the)h(`)p -Fs(--host=TYPE)p Ft(')p eop end -%%Page: 141 147 -TeXDict begin 141 146 bop 150 -116 a Ft(Chapter)30 b(10:)41 -b(Installing)31 b(Bash)2356 b(141)150 299 y(option.)39 -b(`)p Fs(TYPE)p Ft(')25 b(can)g(either)g(b)s(e)g(a)g(short)g(name)g -(for)g(the)g(system)g(t)m(yp)s(e,)h(suc)m(h)f(as)g(`)p -Fs(sun4)p Ft(',)h(or)f(a)g(canonical)150 408 y(name)30 -b(with)g(three)h(\014elds:)40 b(`)p Fs(CPU-COMPANY-SYSTEM)p -Ft(')26 b(\(e.g.,)32 b(`)p Fs(i386-unknown-freebsd4.2)p -Ft('\).)275 539 y(See)e(the)h(\014le)f(`)p Fs(support/config.sub)p -Ft(')c(for)k(the)h(p)s(ossible)f(v)-5 b(alues)30 b(of)h(eac)m(h)g -(\014eld.)150 764 y Fr(10.6)68 b(Sharing)45 b(Defaults)150 -924 y Ft(If)d(y)m(ou)i(w)m(an)m(t)g(to)f(set)h(default)f(v)-5 -b(alues)43 b(for)g Fs(configure)d Ft(scripts)j(to)h(share,)i(y)m(ou)d -(can)g(create)i(a)e(site)150 1033 y(shell)48 b(script)f(called)i -Fs(config.site)44 b Ft(that)k(giv)m(es)h(default)f(v)-5 -b(alues)48 b(for)f(v)-5 b(ariables)48 b(lik)m(e)h Fs(CC)p -Ft(,)j Fs(cache_)150 1143 y(file)p Ft(,)43 b(and)e Fs(prefix)p -Ft(.)73 b Fs(configure)39 b Ft(lo)s(oks)j(for)f(`)p Fs -(PREFIX/share/config.site)p Ft(')35 b(if)42 b(it)g(exists,)j(then)150 -1252 y(`)p Fs(PREFIX/etc/config.site)p Ft(')20 b(if)26 -b(it)g(exists.)40 b(Or,)26 b(y)m(ou)g(can)g(set)g(the)g -Fs(CONFIG_SITE)c Ft(en)m(vironmen)m(t)k(v)-5 b(ari-)150 +4513 y(arc)m(hitecture-indep)s(enden)m(t)44 b(\014les.)80 +b(If)43 b(y)m(ou)h(giv)m(e)h Ft(configure)c Fu(the)j(option)g +Ft(--exec-prefix=)p Fj(PATH)p Fu(,)150 4623 y(`)p Ft(make)29 +b(install)p Fu(')63 b(will)h(use)f Fr(P)-8 b(A)g(TH)75 +b Fu(as)64 b(the)g(pre\014x)e(for)i(installing)h(programs)e(and)h +(libraries.)150 4732 y(Do)s(cumen)m(tation)32 b(and)e(other)h(data)g +(\014les)f(will)h(still)g(use)f(the)h(regular)f(pre\014x.)150 +4961 y Fs(10.5)68 b(Sp)t(ecifying)45 b(the)g(System)h(T)l(yp)t(e)150 +5121 y Fu(There)f(ma)m(y)g(b)s(e)f(some)i(features)f +Ft(configure)e Fu(can)i(not)g(\014gure)g(out)g(automatically)-8 +b(,)52 b(but)44 b(need)h(to)150 5230 y(determine)26 b(b)m(y)g(the)g(t)m +(yp)s(e)g(of)g(host)g(Bash)g(will)g(run)f(on.)39 b(Usually)26 +b Ft(configure)d Fu(can)k(\014gure)e(that)h(out,)i(but)150 +5340 y(if)g(it)g(prin)m(ts)f(a)h(message)g(sa)m(ying)h(it)f(can)g(not)f +(guess)h(the)g(host)f(t)m(yp)s(e,)i(giv)m(e)g(it)f(the)g +Ft(--host=TYPE)c Fu(option.)p eop end +%%Page: 140 146 +TeXDict begin 140 145 bop 150 -116 a Fu(Chapter)30 b(10:)41 +b(Installing)31 b(Bash)2356 b(140)150 299 y(`)p Ft(TYPE)p +Fu(')29 b(can)h(either)g(b)s(e)g(a)g(short)f(name)h(for)f(the)h(system) +g(t)m(yp)s(e,)h(suc)m(h)e(as)h(`)p Ft(sun4)p Fu(',)g(or)f(a)h +(canonical)i(name)150 408 y(with)e(three)h(\014elds:)40 +b(`)p Ft(CPU-COMPANY-SYSTEM)p Fu(')26 b(\(e.g.,)32 b(`)p +Ft(i386-unknown-freebsd4.2)p Fu('\).)275 539 y(See)e(the)h(\014le)f +Ft(support/config.sub)c Fu(for)k(the)g(p)s(ossible)g(v)-5 +b(alues)31 b(of)f(eac)m(h)i(\014eld.)150 764 y Fs(10.6)68 +b(Sharing)45 b(Defaults)150 924 y Fu(If)d(y)m(ou)i(w)m(an)m(t)g(to)f +(set)h(default)f(v)-5 b(alues)43 b(for)g Ft(configure)d +Fu(scripts)j(to)h(share,)i(y)m(ou)d(can)g(create)i(a)e(site)150 +1033 y(shell)48 b(script)f(called)i Ft(config.site)44 +b Fu(that)k(giv)m(es)h(default)f(v)-5 b(alues)48 b(for)f(v)-5 +b(ariables)48 b(lik)m(e)h Ft(CC)p Fu(,)j Ft(cache_)150 +1143 y(file)p Fu(,)c(and)d Ft(prefix)p Fu(.)85 b Ft(configure)43 +b Fu(lo)s(oks)j(for)f Ft(PREFIX/share/config.site)39 +b Fu(if)46 b(it)g(exists,)k(then)150 1252 y Ft(PREFIX/etc/config.site) +24 b Fu(if)31 b(it)g(exists.)42 b(Or,)30 b(y)m(ou)h(can)g(set)g(the)g +Ft(CONFIG_SITE)c Fu(en)m(vironmen)m(t)k(v)-5 b(ari-)150 1362 y(able)40 b(to)g(the)g(lo)s(cation)h(of)e(the)h(site)g(script.)67 -b(A)40 b(w)m(arning:)58 b(the)40 b(Bash)g Fs(configure)c -Ft(lo)s(oks)k(for)f(a)h(site)150 1472 y(script,)31 b(but)e(not)i(all)g -Fs(configure)d Ft(scripts)i(do.)150 1697 y Fr(10.7)68 -b(Op)t(eration)46 b(Con)l(trols)150 1856 y Fs(configure)28 -b Ft(recognizes)k(the)e(follo)m(wing)i(options)f(to)g(con)m(trol)h(ho)m -(w)e(it)h(op)s(erates.)150 2008 y Fs(--cache-file=)p -Fi(file)630 2117 y Ft(Use)k(and)g(sa)m(v)m(e)h(the)f(results)g(of)g -(the)h(tests)f(in)g Fq(\014le)40 b Ft(instead)35 b(of)h(`)p -Fs(./config.cache)p Ft('.)51 b(Set)630 2227 y Fq(\014le)36 -b Ft(to)31 b(`)p Fs(/dev/null)p Ft(')d(to)j(disable)g(cac)m(hing,)h -(for)e(debugging)g Fs(configure)p Ft(.)150 2379 y Fs(--help)192 -b Ft(Prin)m(t)30 b(a)h(summary)e(of)i(the)f(options)h(to)g -Fs(configure)p Ft(,)d(and)i(exit.)150 2531 y Fs(--quiet)150 -2641 y(--silent)150 2750 y(-q)384 b Ft(Do)31 b(not)g(prin)m(t)f +b(A)40 b(w)m(arning:)58 b(the)40 b(Bash)g Ft(configure)c +Fu(lo)s(oks)k(for)f(a)h(site)150 1472 y(script,)31 b(but)e(not)i(all)g +Ft(configure)d Fu(scripts)i(do.)150 1697 y Fs(10.7)68 +b(Op)t(eration)46 b(Con)l(trols)150 1856 y Ft(configure)28 +b Fu(recognizes)k(the)e(follo)m(wing)i(options)f(to)g(con)m(trol)h(ho)m +(w)e(it)h(op)s(erates.)150 2008 y Ft(--cache-file=)p +Fj(file)630 2117 y Fu(Use)d(and)g(sa)m(v)m(e)h(the)f(results)g(of)g +(the)h(tests)f(in)g Fr(\014le)33 b Fu(instead)28 b(of)h +Ft(./config.cache)p Fu(.)36 b(Set)28 b Fr(\014le)630 +2227 y Fu(to)j Ft(/dev/null)d Fu(to)j(disable)g(cac)m(hing,)h(for)e +(debugging)g Ft(configure)p Fu(.)150 2379 y Ft(--help)192 +b Fu(Prin)m(t)30 b(a)h(summary)e(of)i(the)f(options)h(to)g +Ft(configure)p Fu(,)d(and)i(exit.)150 2531 y Ft(--quiet)150 +2641 y(--silent)150 2750 y(-q)384 b Fu(Do)31 b(not)g(prin)m(t)f (messages)h(sa)m(ying)g(whic)m(h)g(c)m(hec)m(ks)g(are)g(b)s(eing)f -(made.)150 2902 y Fs(--srcdir=)p Fi(dir)630 3012 y Ft(Lo)s(ok)i(for)f -(the)h(Bash)g(source)f(co)s(de)h(in)f(directory)h Fq(dir)7 -b Ft(.)44 b(Usually)32 b Fs(configure)d Ft(can)i(deter-)630 -3121 y(mine)f(that)h(directory)g(automatically)-8 b(.)150 -3273 y Fs(--version)630 3383 y Ft(Prin)m(t)29 b(the)h(v)m(ersion)g(of)g -(Auto)s(conf)f(used)g(to)h(generate)h(the)f Fs(configure)d -Ft(script,)j(and)f(exit.)275 3535 y Fs(configure)34 b -Ft(also)k(accepts)g(some)g(other,)h(not)e(widely)g(used,)h(b)s -(oilerplate)g(options.)61 b(`)p Fs(configure)150 3644 -y(--help)p Ft(')29 b(prin)m(ts)h(the)g(complete)i(list.)150 -3869 y Fr(10.8)68 b(Optional)46 b(F)-11 b(eatures)150 -4029 y Ft(The)24 b(Bash)g Fs(configure)e Ft(has)h(a)i(n)m(um)m(b)s(er)e -(of)h(`)p Fs(--enable-)p Fi(feature)11 b Ft(')20 b(options,)26 -b(where)d Fq(feature)30 b Ft(indicates)150 4138 y(an)f(optional)i(part) -e(of)g(Bash.)41 b(There)28 b(are)i(also)g(sev)m(eral)h(`)p -Fs(--with-)p Fi(package)11 b Ft(')25 b(options,)30 b(where)f -Fq(pac)m(k)-5 b(age)150 4248 y Ft(is)32 b(something)h(lik)m(e)h(`)p -Fs(bash-malloc)p Ft(')c(or)i(`)p Fs(purify)p Ft('.)45 +(made.)150 2902 y Ft(--srcdir=)p Fj(dir)630 3012 y Fu(Lo)s(ok)i(for)g +(the)g(Bash)g(source)h(co)s(de)f(in)g(directory)g Fr(dir)p +Fu(.)45 b(Usually)33 b Ft(configure)c Fu(can)j(deter-)630 +3121 y(mine)e(that)h(directory)g(automatically)-8 b(.)150 +3273 y Ft(--version)630 3383 y Fu(Prin)m(t)29 b(the)h(v)m(ersion)g(of)g +(Auto)s(conf)f(used)g(to)h(generate)h(the)f Ft(configure)d +Fu(script,)j(and)f(exit.)275 3535 y Ft(configure)34 b +Fu(also)k(accepts)g(some)g(other,)h(not)e(widely)g(used,)h(b)s +(oilerplate)g(options.)61 b(`)p Ft(configure)150 3644 +y(--help)p Fu(')29 b(prin)m(ts)h(the)g(complete)i(list.)150 +3869 y Fs(10.8)68 b(Optional)46 b(F)-11 b(eatures)150 +4029 y Fu(The)29 b(Bash)h Ft(configure)d Fu(has)j(a)g(n)m(um)m(b)s(er)f +(of)h Ft(--enable-)p Fj(feature)25 b Fu(options,)30 b(where)g +Fr(feature)35 b Fu(indicates)150 4138 y(an)e(optional)i(part)e(of)h +(Bash.)50 b(There)33 b(are)g(also)i(sev)m(eral)g Ft(--with-)p +Fj(package)29 b Fu(options,)35 b(where)e Fr(pac)m(k)-5 +b(age)150 4248 y Fu(is)32 b(something)h(lik)m(e)h(`)p +Ft(bash-malloc)p Fu(')c(or)i(`)p Ft(purify)p Fu('.)45 b(T)-8 b(o)33 b(turn)e(o\013)i(the)f(default)h(use)f(of)g(a)h(pac)m(k) --5 b(age,)35 b(use)150 4357 y(`)p Fs(--without-)p Fi(package)11 -b Ft('.)36 b(T)-8 b(o)29 b(con\014gure)g(Bash)h(without)f(a)g(feature)h -(that)g(is)f(enabled)g(b)m(y)g(default,)h(use)150 4467 -y(`)p Fs(--disable-)p Fi(feature)11 b Ft('.)275 4598 -y(Here)21 b(is)g(a)g(complete)h(list)g(of)f(the)g(`)p -Fs(--enable-)p Ft(')e(and)h(`)p Fs(--with-)p Ft(')g(options)h(that)g -(the)g(Bash)g Fs(configure)150 4707 y Ft(recognizes.)150 -4859 y Fs(--with-afs)630 4969 y Ft(De\014ne)31 b(if)f(y)m(ou)h(are)f -(using)g(the)h(Andrew)e(File)j(System)e(from)g(T)-8 b(ransarc.)150 -5121 y Fs(--with-bash-malloc)630 5230 y Ft(Use)31 b(the)g(Bash)f(v)m -(ersion)i(of)e Fs(malloc)f Ft(in)h(the)h(directory)g(`)p -Fs(lib/malloc)p Ft('.)39 b(This)30 b(is)h(not)g(the)630 -5340 y(same)h Fs(malloc)e Ft(that)j(app)s(ears)e(in)g -Fl(gnu)h Ft(lib)s(c,)g(but)f(an)h(older)f(v)m(ersion)i(originally)g -(deriv)m(ed)p eop end -%%Page: 142 148 -TeXDict begin 142 147 bop 150 -116 a Ft(Chapter)30 b(10:)41 -b(Installing)31 b(Bash)2356 b(142)630 299 y(from)32 b(the)h(4.2)g -Fl(bsd)f Fs(malloc)p Ft(.)45 b(This)31 b Fs(malloc)g -Ft(is)i(v)m(ery)f(fast,)i(but)e(w)m(astes)h(some)g(space)g(on)630 -408 y(eac)m(h)g(allo)s(cation.)48 b(This)31 b(option)i(is)f(enabled)g -(b)m(y)g(default.)46 b(The)31 b(`)p Fs(NOTES)p Ft(')g(\014le)h(con)m -(tains)i(a)630 518 y(list)29 b(of)f(systems)f(for)h(whic)m(h)g(this)g -(should)e(b)s(e)i(turned)e(o\013,)j(and)f Fs(configure)d -Ft(disables)j(this)630 628 y(option)j(automatically)i(for)d(a)h(n)m(um) -m(b)s(er)e(of)i(systems.)150 789 y Fs(--with-curses)630 -899 y Ft(Use)h(the)h(curses)e(library)h(instead)g(of)h(the)f(termcap)g -(library)-8 b(.)46 b(This)32 b(should)f(b)s(e)g(supplied)630 -1008 y(if)f(y)m(our)h(system)f(has)g(an)h(inadequate)g(or)f(incomplete) -i(termcap)e(database.)150 1170 y Fs(--with-gnu-malloc)630 -1279 y Ft(A)g(synon)m(ym)g(for)g Fs(--with-bash-malloc)p -Ft(.)150 1441 y Fs(--with-installed-readlin)o(e[=)p Fi(P)o(REFI)o(X)11 -b Fs(])630 1550 y Ft(De\014ne)26 b(this)f(to)h(mak)m(e)h(Bash)f(link)f -(with)g(a)h(lo)s(cally-installed)i(v)m(ersion)e(of)g(Readline)g(rather) -630 1660 y(than)38 b(the)h(v)m(ersion)g(in)g(`)p Fs(lib/readline)p -Ft('.)62 b(This)38 b(w)m(orks)h(only)f(with)h(Readline)g(5.0)h(and)630 -1769 y(later)29 b(v)m(ersions.)40 b(If)28 b Fq(PREFIX)37 -b Ft(is)28 b Fs(yes)f Ft(or)h(not)g(supplied,)f Fs(configure)f -Ft(uses)h(the)h(v)-5 b(alues)29 b(of)630 1879 y(the)c(mak)m(e)g(v)-5 -b(ariables)25 b Fs(includedir)d Ft(and)h Fs(libdir)p -Ft(,)h(whic)m(h)h(are)f(sub)s(directories)g(of)h Fs(prefix)630 -1989 y Ft(b)m(y)32 b(default,)g(to)h(\014nd)d(the)i(installed)h(v)m -(ersion)f(of)g(Readline)h(if)f(it)g(is)g(not)g(in)g(the)g(standard)630 -2098 y(system)j(include)f(and)g(library)g(directories.)54 -b(If)34 b Fq(PREFIX)43 b Ft(is)35 b Fs(no)p Ft(,)g(Bash)f(links)h(with) -f(the)630 2208 y(v)m(ersion)k(in)f(`)p Fs(lib/readline)p -Ft('.)58 b(If)37 b Fq(PREFIX)46 b Ft(is)38 b(set)g(to)g(an)m(y)f(other) -h(v)-5 b(alue,)39 b Fs(configure)630 2317 y Ft(treats)27 +-5 b(age,)35 b(use)150 4357 y Ft(--without-)p Fj(package)p +Fu(.)46 b(T)-8 b(o)34 b(con\014gure)g(Bash)g(without)f(a)i(feature)f +(that)g(is)g(enabled)g(b)m(y)f(default,)i(use)150 4467 +y Ft(--disable-)p Fj(feature)p Fu(.)275 4598 y(Here)28 +b(is)g(a)h(complete)g(list)g(of)f(the)h Ft(--enable-)c +Fu(and)j Ft(--with-)e Fu(options)i(that)h(the)f(Bash)g +Ft(configure)150 4707 y Fu(recognizes.)150 4859 y Ft(--with-afs)630 +4969 y Fu(De\014ne)j(if)f(y)m(ou)h(are)f(using)g(the)h(Andrew)e(File)j +(System)e(from)g(T)-8 b(ransarc.)150 5121 y Ft(--with-bash-malloc)630 +5230 y Fu(Use)34 b(the)g(Bash)h(v)m(ersion)f(of)g Ft(malloc)e +Fu(in)i(the)g(directory)h Ft(lib/malloc)p Fu(.)48 b(This)34 +b(is)g(not)g(the)630 5340 y(same)e Ft(malloc)e Fu(that)j(app)s(ears)e +(in)g Fm(gnu)h Fu(lib)s(c,)g(but)f(an)h(older)f(v)m(ersion)i +(originally)g(deriv)m(ed)p eop end +%%Page: 141 147 +TeXDict begin 141 146 bop 150 -116 a Fu(Chapter)30 b(10:)41 +b(Installing)31 b(Bash)2356 b(141)630 299 y(from)32 b(the)h(4.2)g +Fm(bsd)f Ft(malloc)p Fu(.)45 b(This)31 b Ft(malloc)g +Fu(is)i(v)m(ery)f(fast,)i(but)e(w)m(astes)h(some)g(space)g(on)630 +408 y(eac)m(h)j(allo)s(cation.)58 b(This)34 b(option)i(is)f(enabled)g +(b)m(y)g(default.)56 b(The)34 b Ft(NOTES)g Fu(\014le)h(con)m(tains)i(a) +630 518 y(list)29 b(of)f(systems)f(for)h(whic)m(h)g(this)g(should)e(b)s +(e)i(turned)e(o\013,)j(and)f Ft(configure)d Fu(disables)j(this)630 +628 y(option)j(automatically)i(for)d(a)h(n)m(um)m(b)s(er)e(of)i +(systems.)150 789 y Ft(--with-curses)630 899 y Fu(Use)h(the)h(curses)e +(library)h(instead)g(of)h(the)f(termcap)g(library)-8 +b(.)46 b(This)32 b(should)f(b)s(e)g(supplied)630 1008 +y(if)f(y)m(our)h(system)f(has)g(an)h(inadequate)g(or)f(incomplete)i +(termcap)e(database.)150 1170 y Ft(--with-gnu-malloc)630 +1279 y Fu(A)g(synon)m(ym)g(for)g Ft(--with-bash-malloc)p +Fu(.)150 1441 y Ft(--with-installed-readlin)o(e[=)p Fj(P)o(REFI)o(X)p +Ft(])630 1550 y Fu(De\014ne)c(this)f(to)h(mak)m(e)h(Bash)f(link)f(with) +g(a)h(lo)s(cally-installed)i(v)m(ersion)e(of)g(Readline)g(rather)630 +1660 y(than)f(the)h(v)m(ersion)g(in)f Ft(lib/readline)p +Fu(.)36 b(This)25 b(w)m(orks)g(only)h(with)f(Readline)h(5.0)h(and)e +(later)630 1769 y(v)m(ersions.)46 b(If)32 b Fr(PREFIX)41 +b Fu(is)32 b Ft(yes)f Fu(or)i(not)f(supplied,)f Ft(configure)f +Fu(uses)i(the)g(v)-5 b(alues)32 b(of)h(the)630 1879 y(mak)m(e)28 +b(v)-5 b(ariables)29 b Ft(includedir)24 b Fu(and)j Ft(libdir)p +Fu(,)g(whic)m(h)g(are)h(sub)s(directories)f(of)g Ft(prefix)f +Fu(b)m(y)630 1989 y(default,)44 b(to)d(\014nd)f(the)h(installed)g(v)m +(ersion)h(of)f(Readline)g(if)g(it)g(is)g(not)g(in)g(the)g(standard)630 +2098 y(system)35 b(include)f(and)g(library)g(directories.)54 +b(If)34 b Fr(PREFIX)43 b Fu(is)35 b Ft(no)p Fu(,)g(Bash)f(links)h(with) +f(the)630 2208 y(v)m(ersion)42 b(in)e Ft(lib/readline)p +Fu(.)70 b(If)40 b Fr(PREFIX)51 b Fu(is)41 b(set)g(to)h(an)m(y)g(other)f +(v)-5 b(alue,)44 b Ft(configure)630 2317 y Fu(treats)27 b(it)g(as)f(a)h(directory)g(pathname)f(and)f(lo)s(oks)i(for)f(the)g (installed)h(v)m(ersion)g(of)f(Readline)630 2427 y(in)34 b(sub)s(directories)f(of)h(that)h(directory)g(\(include)f(\014les)g(in) -g Fq(PREFIX)9 b Ft(/)p Fs(include)32 b Ft(and)i(the)630 -2536 y(library)c(in)g Fq(PREFIX)9 b Ft(/)p Fs(lib)p Ft(\).)150 -2698 y Fs(--with-purify)630 2807 y Ft(De\014ne)23 b(this)g(to)h(use)f +g Fr(PREFIX)9 b Fu(/)p Ft(include)32 b Fu(and)i(the)630 +2536 y(library)c(in)g Fr(PREFIX)9 b Fu(/)p Ft(lib)p Fu(\).)150 +2698 y Ft(--with-purify)630 2807 y Fu(De\014ne)23 b(this)g(to)h(use)f (the)g(Purify)f(memory)h(allo)s(cation)i(c)m(hec)m(k)m(er)g(from)e -(Rational)i(Soft)m(w)m(are.)150 2969 y Fs(--enable-minimal-config)630 -3078 y Ft(This)e(pro)s(duces)f(a)i(shell)g(with)f(minimal)h(features,)h +(Rational)i(Soft)m(w)m(are.)150 2969 y Ft(--enable-minimal-config)630 +3078 y Fu(This)e(pro)s(duces)f(a)i(shell)g(with)f(minimal)h(features,)h (close)g(to)f(the)g(historical)h(Bourne)e(shell.)275 -3241 y(There)g(are)i(sev)m(eral)g(`)p Fs(--enable-)p -Ft(')d(options)j(that)f(alter)h(ho)m(w)g(Bash)f(is)g(compiled)h(and)e -(link)m(ed,)j(rather)150 3350 y(than)k(c)m(hanging)h(run-time)f -(features.)150 3513 y Fs(--enable-largefile)630 3622 -y Ft(Enable)76 b(supp)s(ort)f(for)h(large)h(\014les)f(\()p -Fs(http://www.sas.com/standar)o(ds/l)o(arge)o(_)630 3732 -y(file/x_open.20Mar96.html)o Ft(\))23 b(if)28 b(the)g(op)s(erating)h -(system)f(requires)g(sp)s(ecial)g(compiler)630 3842 y(options)45 -b(to)g(build)e(programs)h(whic)m(h)g(can)g(access)i(large)f(\014les.)82 -b(This)44 b(is)g(enabled)g(b)m(y)630 3951 y(default,)31 -b(if)f(the)h(op)s(erating)g(system)f(pro)m(vides)g(large)i(\014le)e -(supp)s(ort.)150 4113 y Fs(--enable-profiling)630 4222 -y Ft(This)h(builds)f(a)i(Bash)g(binary)f(that)h(pro)s(duces)e +3241 y(There)k(are)i(sev)m(eral)g Ft(--enable-)d Fu(options)i(that)h +(alter)g(ho)m(w)f(Bash)g(is)g(compiled)h(and)e(link)m(ed,)i(rather)150 +3350 y(than)h(c)m(hanging)h(run-time)f(features.)150 +3513 y Ft(--enable-largefile)630 3622 y Fu(Enable)e(supp)s(ort)f(for)h +(large)i(\014les)f(\()p Ft(http://www.sas.com/stand)o(ards)o(/la)o +(rge_)o(file)o(/)630 3732 y(x_open)5 b(.)t(20Mar96)g(.)t(html)p +Fu(\))31 b(if)37 b(the)f(op)s(erating)h(system)g(requires)f(sp)s(ecial) +h(compiler)g(op-)630 3842 y(tions)27 b(to)h(build)e(programs)h(whic)m +(h)g(can)g(access)h(large)h(\014les.)39 b(This)26 b(is)i(enabled)f(b)m +(y)f(default,)630 3951 y(if)k(the)h(op)s(erating)g(system)f(pro)m +(vides)h(large)g(\014le)g(supp)s(ort.)150 4113 y Ft(--enable-profiling) +630 4222 y Fu(This)g(builds)f(a)i(Bash)g(binary)f(that)h(pro)s(duces)e (pro\014ling)h(information)h(to)h(b)s(e)d(pro)s(cessed)630 -4332 y(b)m(y)g Fs(gprof)f Ft(eac)m(h)j(time)f(it)g(is)f(executed.)150 -4493 y Fs(--enable-static-link)630 4603 y Ft(This)37 +4332 y(b)m(y)g Ft(gprof)f Fu(eac)m(h)j(time)f(it)g(is)f(executed.)150 +4493 y Ft(--enable-static-link)630 4603 y Fu(This)37 b(causes)h(Bash)f(to)h(b)s(e)f(link)m(ed)h(statically)-8 -b(,)43 b(if)37 b Fs(gcc)g Ft(is)g(b)s(eing)g(used.)61 +b(,)43 b(if)37 b Ft(gcc)g Fu(is)g(b)s(eing)g(used.)61 b(This)37 b(could)h(b)s(e)630 4712 y(used)30 b(to)h(build)e(a)i(v)m (ersion)g(to)g(use)f(as)g(ro)s(ot's)h(shell.)275 4875 -y(The)f(`)p Fs(minimal-config)p Ft(')d(option)k(can)g(b)s(e)f(used)f +y(The)f(`)p Ft(minimal-config)p Fu(')d(option)k(can)g(b)s(e)f(used)f (to)j(disable)e(all)i(of)f(the)f(follo)m(wing)i(options,)g(but)d(it)150 4984 y(is)h(pro)s(cessed)g(\014rst,)g(so)h(individual)f(options)g(ma)m -(y)h(b)s(e)f(enabled)g(using)g(`)p Fs(enable-)p Fi(feature)11 -b Ft('.)275 5121 y(All)41 b(of)g(the)g(follo)m(wing)i(options)e(except) -h(for)f(`)p Fs(disabled-builtins)p Ft(',)e(`)p Fs(directpand-default)p -Ft(',)150 5230 y(and)45 b(`)p Fs(xpg-echo-default)p Ft(')c(are)k +(y)h(b)s(e)f(enabled)g(using)g(`)p Ft(enable-)p Fj(feature)p +Fu('.)275 5121 y(All)41 b(of)g(the)g(follo)m(wing)i(options)e(except)h +(for)f(`)p Ft(disabled-builtins)p Fu(',)e(`)p Ft(directpand-default)p +Fu(',)150 5230 y(and)45 b(`)p Ft(xpg-echo-default)p Fu(')c(are)k (enabled)h(b)m(y)f(default,)k(unless)44 b(the)i(op)s(erating)f(system)h (do)s(es)f(not)150 5340 y(pro)m(vide)30 b(the)h(necessary)g(supp)s (ort.)p eop end -%%Page: 143 149 -TeXDict begin 143 148 bop 150 -116 a Ft(Chapter)30 b(10:)41 -b(Installing)31 b(Bash)2356 b(143)150 299 y Fs(--enable-alias)630 -408 y Ft(Allo)m(w)41 b(alias)g(expansion)f(and)f(include)g(the)h -Fs(alias)f Ft(and)g Fs(unalias)e Ft(builtins)j(\(see)g(Sec-)630 +%%Page: 142 148 +TeXDict begin 142 147 bop 150 -116 a Fu(Chapter)30 b(10:)41 +b(Installing)31 b(Bash)2356 b(142)150 299 y Ft(--enable-alias)630 +408 y Fu(Allo)m(w)41 b(alias)g(expansion)f(and)f(include)g(the)h +Ft(alias)f Fu(and)g Ft(unalias)e Fu(builtins)j(\(see)g(Sec-)630 518 y(tion)31 b(6.6)g([Aliases],)i(page)e(88\).)150 682 -y Fs(--enable-arith-for-comma)o(nd)630 792 y Ft(Include)21 +y Ft(--enable-arith-for-comma)o(nd)630 792 y Fu(Include)21 b(supp)s(ort)g(for)g(the)i(alternate)g(form)f(of)g(the)g -Fs(for)f Ft(command)h(that)h(b)s(eha)m(v)m(es)f(lik)m(e)i(the)630 -902 y(C)30 b(language)i Fs(for)d Ft(statemen)m(t)j(\(see)g(Section)f +Ft(for)f Fu(command)h(that)h(b)s(eha)m(v)m(es)f(lik)m(e)i(the)630 +902 y(C)30 b(language)i Ft(for)d Fu(statemen)m(t)j(\(see)g(Section)f (3.2.4.1)i([Lo)s(oping)d(Constructs],)h(page)g(10\).)150 -1066 y Fs(--enable-array-variables)630 1176 y Ft(Include)h(supp)s(ort)g +1066 y Ft(--enable-array-variables)630 1176 y Fu(Include)h(supp)s(ort)g (for)h(one-dimensional)h(arra)m(y)f(shell)h(v)-5 b(ariables)33 b(\(see)h(Section)g(6.7)h([Ar-)630 1285 y(ra)m(ys],)c(page)g(89\).)150 -1450 y Fs(--enable-bang-history)630 1559 y Ft(Include)36 -b(supp)s(ort)f(for)h Fs(csh)p Ft(-lik)m(e)h(history)g(substitution)f +1450 y Ft(--enable-bang-history)630 1559 y Fu(Include)36 +b(supp)s(ort)f(for)h Ft(csh)p Fu(-lik)m(e)h(history)g(substitution)f (\(see)h(Section)g(9.3)h([History)f(In-)630 1669 y(teraction],)c(page)e -(136\).)150 1833 y Fs(--enable-brace-expansion)630 1943 -y Ft(Include)40 b Fs(csh)p Ft(-lik)m(e)h(brace)f(expansion)g(\()h -Fs(b{a,b}c)d Fp(7!)i Fs(bac)30 b(bbc)39 b Ft(\).)71 b(See)40 +(135\).)150 1833 y Ft(--enable-brace-expansion)630 1943 +y Fu(Include)40 b Ft(csh)p Fu(-lik)m(e)h(brace)f(expansion)g(\()h +Ft(b{a,b}c)d Fq(7!)i Ft(bac)30 b(bbc)39 b Fu(\).)71 b(See)40 b(Section)h(3.5.1)630 2052 y([Brace)32 b(Expansion],)e(page)h(21,)h -(for)e(a)g(complete)i(description.)150 2217 y Fs -(--enable-casemod-attribu)o(tes)630 2326 y Ft(Include)37 +(for)e(a)g(complete)i(description.)150 2217 y Ft +(--enable-casemod-attribu)o(tes)630 2326 y Fu(Include)37 b(supp)s(ort)g(for)g(case-mo)s(difying)i(attributes)g(in)e(the)h -Fs(declare)e Ft(builtin)i(and)f(as-)630 2436 y(signmen)m(t)29 +Ft(declare)e Fu(builtin)i(and)f(as-)630 2436 y(signmen)m(t)29 b(statemen)m(ts.)41 b(V)-8 b(ariables)30 b(with)e(the)g -Fq(upp)s(ercase)k Ft(attribute,)e(for)e(example,)i(will)630 +Fr(upp)s(ercase)k Fu(attribute,)e(for)e(example,)i(will)630 2545 y(ha)m(v)m(e)i(their)e(v)-5 b(alues)31 b(con)m(v)m(erted)h(to)f -(upp)s(ercase)e(up)s(on)g(assignmen)m(t.)150 2710 y Fs -(--enable-casemod-expansi)o(on)630 2819 y Ft(Include)h(supp)s(ort)e +(upp)s(ercase)e(up)s(on)g(assignmen)m(t.)150 2710 y Ft +(--enable-casemod-expansi)o(on)630 2819 y Fu(Include)h(supp)s(ort)e (for)i(case-mo)s(difying)i(w)m(ord)e(expansions.)150 -2984 y Fs(--enable-command-timing)630 3093 y Ft(Include)43 -b(supp)s(ort)f(for)h(recognizing)i Fs(time)e Ft(as)g(a)h(reserv)m(ed)g +2984 y Ft(--enable-command-timing)630 3093 y Fu(Include)43 +b(supp)s(ort)f(for)h(recognizing)i Ft(time)e Fu(as)g(a)h(reserv)m(ed)g (w)m(ord)f(and)g(for)h(displa)m(ying)630 3203 y(timing)37 b(statistics)h(for)e(the)g(pip)s(eline)g(follo)m(wing)i -Fs(time)d Ft(\(see)i(Section)g(3.2.2)h([Pip)s(elines],)630 +Ft(time)d Fu(\(see)i(Section)g(3.2.2)h([Pip)s(elines],)630 3313 y(page)24 b(8\).)39 b(This)23 b(allo)m(ws)h(pip)s(elines)f(as)h(w) m(ell)g(as)g(shell)f(builtins)g(and)g(functions)g(to)h(b)s(e)e(timed.) -150 3477 y Fs(--enable-cond-command)630 3587 y Ft(Include)33 -b(supp)s(ort)f(for)i(the)g Fs([[)f Ft(conditional)i(command.)51 +150 3477 y Ft(--enable-cond-command)630 3587 y Fu(Include)33 +b(supp)s(ort)f(for)i(the)g Ft([[)f Fu(conditional)i(command.)51 b(\(see)34 b(Section)h(3.2.4.2)h([Condi-)630 3696 y(tional)c -(Constructs],)e(page)h(10\).)150 3861 y Fs(--enable-cond-regexp)630 -3970 y Ft(Include)k(supp)s(ort)f(for)i(matc)m(hing)h -Fl(posix)e Ft(regular)h(expressions)g(using)f(the)h(`)p -Fs(=~)p Ft(')g(binary)630 4080 y(op)s(erator)25 b(in)f(the)h -Fs([[)f Ft(conditional)h(command.)39 b(\(see)25 b(Section)h(3.2.4.2)h +(Constructs],)e(page)h(10\).)150 3861 y Ft(--enable-cond-regexp)630 +3970 y Fu(Include)k(supp)s(ort)f(for)i(matc)m(hing)h +Fm(posix)e Fu(regular)h(expressions)g(using)f(the)h(`)p +Ft(=~)p Fu(')g(binary)630 4080 y(op)s(erator)25 b(in)f(the)h +Ft([[)f Fu(conditional)h(command.)39 b(\(see)25 b(Section)h(3.2.4.2)h ([Conditional)e(Con-)630 4189 y(structs],)31 b(page)g(10\).)150 -4354 y Fs(--enable-coprocesses)630 4463 y Ft(Include)23 -b(supp)s(ort)f(for)i(copro)s(cesses)g(and)f(the)h Fs(coproc)e -Ft(reserv)m(ed)i(w)m(ord)g(\(see)h(Section)f(3.2.2)630 -4573 y([Pip)s(elines],)31 b(page)g(8\).)150 4737 y Fs -(--enable-debugger)630 4847 y Ft(Include)f(supp)s(ort)e(for)i(the)h +4354 y Ft(--enable-coprocesses)630 4463 y Fu(Include)23 +b(supp)s(ort)f(for)i(copro)s(cesses)g(and)f(the)h Ft(coproc)e +Fu(reserv)m(ed)i(w)m(ord)g(\(see)h(Section)f(3.2.2)630 +4573 y([Pip)s(elines],)31 b(page)g(8\).)150 4737 y Ft +(--enable-debugger)630 4847 y Fu(Include)f(supp)s(ort)e(for)i(the)h (bash)f(debugger)g(\(distributed)g(separately\).)150 -5011 y Fs(--enable-direxpand-defau)o(lt)630 5121 y Ft(Cause)53 -b(the)g Fs(direxpand)d Ft(shell)j(option)h(\(see)g(Section)f(4.3.2)i -([The)e(Shopt)f(Builtin],)630 5230 y(page)29 b(63\))g(to)f(b)s(e)f +5011 y Ft(--enable-direxpand-defau)o(lt)630 5121 y Fu(Cause)53 +b(the)g Ft(direxpand)d Fu(shell)j(option)h(\(see)g(Section)f(4.3.2)i +([The)e(Shopt)f(Builtin],)630 5230 y(page)29 b(62\))g(to)f(b)s(e)f (enabled)h(b)m(y)g(default)g(when)e(the)i(shell)g(starts.)41 b(It)27 b(is)h(normally)g(disabled)630 5340 y(b)m(y)i(default.)p eop end -%%Page: 144 150 -TeXDict begin 144 149 bop 150 -116 a Ft(Chapter)30 b(10:)41 -b(Installing)31 b(Bash)2356 b(144)150 299 y Fs -(--enable-directory-stack)630 408 y Ft(Include)33 b(supp)s(ort)g(for)h -(a)g Fs(csh)p Ft(-lik)m(e)h(directory)f(stac)m(k)i(and)d(the)i -Fs(pushd)p Ft(,)f Fs(popd)p Ft(,)g(and)f Fs(dirs)630 -518 y Ft(builtins)d(\(see)h(Section)g(6.8)h([The)e(Directory)i(Stac)m -(k],)g(page)f(91\).)150 673 y Fs(--enable-disabled-builti)o(ns)630 -783 y Ft(Allo)m(w)40 b(builtin)e(commands)g(to)h(b)s(e)f(in)m(v)m(ok)m -(ed)i(via)f(`)p Fs(builtin)29 b(xxx)p Ft(')37 b(ev)m(en)j(after)f -Fs(xxx)e Ft(has)630 892 y(b)s(een)31 b(disabled)g(using)g(`)p -Fs(enable)d(-n)i(xxx)p Ft('.)43 b(See)32 b(Section)g(4.2)h([Bash)e +%%Page: 143 149 +TeXDict begin 143 148 bop 150 -116 a Fu(Chapter)30 b(10:)41 +b(Installing)31 b(Bash)2356 b(143)150 299 y Ft +(--enable-directory-stack)630 408 y Fu(Include)33 b(supp)s(ort)g(for)h +(a)g Ft(csh)p Fu(-lik)m(e)h(directory)f(stac)m(k)i(and)d(the)i +Ft(pushd)p Fu(,)f Ft(popd)p Fu(,)g(and)f Ft(dirs)630 +518 y Fu(builtins)d(\(see)h(Section)g(6.8)h([The)e(Directory)i(Stac)m +(k],)g(page)f(90\).)150 673 y Ft(--enable-disabled-builti)o(ns)630 +783 y Fu(Allo)m(w)40 b(builtin)e(commands)g(to)h(b)s(e)f(in)m(v)m(ok)m +(ed)i(via)f(`)p Ft(builtin)29 b(xxx)p Fu(')37 b(ev)m(en)j(after)f +Ft(xxx)e Fu(has)630 892 y(b)s(een)31 b(disabled)g(using)g(`)p +Ft(enable)d(-n)i(xxx)p Fu('.)43 b(See)32 b(Section)g(4.2)h([Bash)e (Builtins],)i(page)f(48,)630 1002 y(for)e(details)i(of)e(the)h -Fs(builtin)d Ft(and)i Fs(enable)e Ft(builtin)i(commands.)150 -1157 y Fs(--enable-dparen-arithmet)o(ic)630 1267 y Ft(Include)42 -b(supp)s(ort)f(for)h(the)h Fs(\(\(...)o(\)\))f Ft(command)g(\(see)i +Ft(builtin)d Fu(and)i Ft(enable)e Fu(builtin)i(commands.)150 +1157 y Ft(--enable-dparen-arithmet)o(ic)630 1267 y Fu(Include)42 +b(supp)s(ort)f(for)h(the)h Ft(\(\(...)o(\)\))f Fu(command)g(\(see)i (Section)f(3.2.4.2)i([Conditional)630 1377 y(Constructs],)30 -b(page)h(10\).)150 1532 y Fs(--enable-extended-glob)630 -1641 y Ft(Include)40 b(supp)s(ort)e(for)i(the)h(extended)f(pattern)h +b(page)h(10\).)150 1532 y Ft(--enable-extended-glob)630 +1641 y Fu(Include)40 b(supp)s(ort)e(for)i(the)h(extended)f(pattern)h (matc)m(hing)g(features)g(describ)s(ed)e(ab)s(o)m(v)m(e)630 1751 y(under)29 b(Section)i(3.5.8.1)i([P)m(attern)e(Matc)m(hing],)i -(page)e(30.)150 1906 y Fs(--enable-extended-glob-d)o(efau)o(lt)630 -2016 y Ft(Set)40 b(the)g(default)g(v)-5 b(alue)41 b(of)f(the)g -Fq(extglob)j Ft(shell)d(option)g(describ)s(ed)f(ab)s(o)m(v)m(e)i(under) +(page)e(30.)150 1906 y Ft(--enable-extended-glob-d)o(efau)o(lt)630 +2016 y Fu(Set)40 b(the)g(default)g(v)-5 b(alue)41 b(of)f(the)g +Fr(extglob)j Fu(shell)d(option)g(describ)s(ed)f(ab)s(o)m(v)m(e)i(under) d(Sec-)630 2125 y(tion)31 b(4.3.2)h([The)e(Shopt)g(Builtin],)h(page)g -(63)g(to)h(b)s(e)d(enabled.)150 2281 y Fs(--enable-glob-asciirange)o -(-def)o(ault)630 2390 y Ft(Set)i(the)g(default)f(v)-5 -b(alue)31 b(of)g(the)g Fq(globasciiranges)36 b Ft(shell)31 +(62)g(to)h(b)s(e)d(enabled.)150 2281 y Ft(--enable-glob-asciirange)o +(-def)o(ault)630 2390 y Fu(Set)i(the)g(default)f(v)-5 +b(alue)31 b(of)g(the)g Fr(globasciiranges)36 b Fu(shell)31 b(option)g(describ)s(ed)f(ab)s(o)m(v)m(e)h(under)630 2500 y(Section)41 b(4.3.2)h([The)e(Shopt)f(Builtin],)44 -b(page)d(63)g(to)g(b)s(e)f(enabled.)70 b(This)39 b(con)m(trols)j(the) +b(page)d(62)g(to)g(b)s(e)f(enabled.)70 b(This)39 b(con)m(trols)j(the) 630 2609 y(b)s(eha)m(vior)21 b(of)g(c)m(haracter)h(ranges)f(when)f (used)g(in)g(pattern)h(matc)m(hing)h(brac)m(k)m(et)g(expressions.)150 -2765 y Fs(--enable-help-builtin)630 2874 y Ft(Include)i(the)h -Fs(help)f Ft(builtin,)h(whic)m(h)g(displa)m(ys)f(help)h(on)f(shell)h +2765 y Ft(--enable-help-builtin)630 2874 y Fu(Include)i(the)h +Ft(help)f Fu(builtin,)h(whic)m(h)g(displa)m(ys)f(help)h(on)f(shell)h (builtins)f(and)h(v)-5 b(ariables)25 b(\(see)630 2984 y(Section)31 b(4.2)h([Bash)e(Builtins],)i(page)f(48\).)150 -3139 y Fs(--enable-history)630 3249 y Ft(Include)e(command)g(history)h -(and)f(the)h Fs(fc)f Ft(and)g Fs(history)e Ft(builtin)j(commands)f +3139 y Ft(--enable-history)630 3249 y Fu(Include)e(command)g(history)h +(and)f(the)h Ft(fc)f Fu(and)g Ft(history)e Fu(builtin)j(commands)f (\(see)h(Sec-)630 3358 y(tion)h(9.1)g([Bash)g(History)g(F)-8 -b(acilities],)34 b(page)d(134\).)150 3513 y Fs(--enable-job-control)630 -3623 y Ft(This)e(enables)i(the)f(job)g(con)m(trol)h(features)g(\(see)g -(Chapter)f(7)g([Job)g(Con)m(trol],)h(page)g(98\),)h(if)630 +b(acilities],)34 b(page)d(133\).)150 3513 y Ft(--enable-job-control)630 +3623 y Fu(This)e(enables)i(the)f(job)g(con)m(trol)h(features)g(\(see)g +(Chapter)f(7)g([Job)g(Con)m(trol],)h(page)g(97\),)h(if)630 3733 y(the)f(op)s(erating)f(system)h(supp)s(orts)d(them.)150 -3888 y Fs(--enable-multibyte)630 3998 y Ft(This)h(enables)i(supp)s(ort) +3888 y Ft(--enable-multibyte)630 3998 y Fu(This)h(enables)i(supp)s(ort) d(for)i(m)m(ultib)m(yte)h(c)m(haracters)g(if)f(the)g(op)s(erating)h (system)f(pro)m(vides)630 4107 y(the)h(necessary)f(supp)s(ort.)150 -4262 y Fs(--enable-net-redirection)o(s)630 4372 y Ft(This)21 +4262 y Ft(--enable-net-redirection)o(s)630 4372 y Fu(This)23 b(enables)h(the)g(sp)s(ecial)h(handling)e(of)h(\014lenames)g(of)g(the)g -(form)f Fs(/dev/tcp/)p Fi(host)11 b Fs(/)p Fi(port)630 -4482 y Ft(and)29 b Fs(/dev/udp/)p Fi(host)11 b Fs(/)p -Fi(port)34 b Ft(when)28 b(used)g(in)h(redirections)h(\(see)g(Section)g -(3.6)g([Redirec-)630 4591 y(tions],)h(page)g(31\).)150 -4746 y Fs(--enable-process-substit)o(utio)o(n)630 4856 -y Ft(This)49 b(enables)i(pro)s(cess)f(substitution)g(\(see)h(Section)g -(3.5.6)h([Pro)s(cess)e(Substitution],)630 4966 y(page)31 -b(29\))h(if)e(the)h(op)s(erating)f(system)h(pro)m(vides)f(the)h -(necessary)g(supp)s(ort.)150 5121 y Fs(--enable-progcomp)630 -5230 y Ft(Enable)d(the)g(programmable)g(completion)i(facilities)g -(\(see)f(Section)g(8.6)g([Programmable)630 5340 y(Completion],)i(page)h -(125\).)42 b(If)30 b(Readline)h(is)f(not)h(enabled,)f(this)h(option)g -(has)f(no)g(e\013ect.)p eop end -%%Page: 145 151 -TeXDict begin 145 150 bop 150 -116 a Ft(Chapter)30 b(10:)41 -b(Installing)31 b(Bash)2356 b(145)150 299 y Fs -(--enable-prompt-string-d)o(ecod)o(ing)630 408 y Ft(T)-8 +(form)g Ft(/dev/tcp/)p Fj(host)p Ft(/)p Fj(port)630 4482 +y Fu(and)31 b Ft(/dev/udp/)p Fj(host)p Ft(/)p Fj(port)26 +b Fu(when)31 b(used)g(in)g(redirections)h(\(see)g(Section)g(3.6)h +([Redirec-)630 4591 y(tions],)e(page)g(31\).)150 4746 +y Ft(--enable-process-substit)o(utio)o(n)630 4856 y Fu(This)49 +b(enables)i(pro)s(cess)f(substitution)g(\(see)h(Section)g(3.5.6)h([Pro) +s(cess)e(Substitution],)630 4966 y(page)31 b(29\))h(if)e(the)h(op)s +(erating)f(system)h(pro)m(vides)f(the)h(necessary)g(supp)s(ort.)150 +5121 y Ft(--enable-progcomp)630 5230 y Fu(Enable)d(the)g(programmable)g +(completion)i(facilities)g(\(see)f(Section)g(8.6)g([Programmable)630 +5340 y(Completion],)i(page)h(124\).)42 b(If)30 b(Readline)h(is)f(not)h +(enabled,)f(this)h(option)g(has)f(no)g(e\013ect.)p eop +end +%%Page: 144 150 +TeXDict begin 144 149 bop 150 -116 a Fu(Chapter)30 b(10:)41 +b(Installing)31 b(Bash)2356 b(144)150 299 y Ft +(--enable-prompt-string-d)o(ecod)o(ing)630 408 y Fu(T)-8 b(urn)30 b(on)i(the)f(in)m(terpretation)i(of)f(a)g(n)m(um)m(b)s(er)e (of)i(bac)m(kslash-escap)s(ed)g(c)m(haracters)i(in)d(the)630 -518 y Fs($PS1)p Ft(,)36 b Fs($PS2)p Ft(,)g Fs($PS3)p -Ft(,)h(and)e Fs($PS4)f Ft(prompt)h(strings.)57 b(See)36 +518 y Ft($PS1)p Fu(,)36 b Ft($PS2)p Fu(,)g Ft($PS3)p +Fu(,)h(and)e Ft($PS4)f Fu(prompt)h(strings.)57 b(See)36 b(Section)h(6.9)g([Con)m(trolling)g(the)630 628 y(Prompt],)30 b(page)h(92,)h(for)e(a)h(complete)h(list)f(of)f(prompt)g(string)g -(escap)s(e)h(sequences.)150 787 y Fs(--enable-readline)630 -897 y Ft(Include)d(supp)s(ort)f(for)h(command-line)h(editing)g(and)f +(escap)s(e)h(sequences.)150 787 y Ft(--enable-readline)630 +897 y Fu(Include)d(supp)s(ort)f(for)h(command-line)h(editing)g(and)f (history)g(with)g(the)h(Bash)g(v)m(ersion)g(of)630 1006 y(the)i(Readline)g(library)f(\(see)h(Chapter)f(8)g([Command)g(Line)g -(Editing],)h(page)g(102\).)150 1166 y Fs(--enable-restricted)630 -1275 y Ft(Include)41 b(supp)s(ort)f(for)i(a)g Fq(restricted)g(shell)p -Ft(.)75 b(If)42 b(this)f(is)h(enabled,)j(Bash,)g(when)c(called)630 -1385 y(as)f Fs(rbash)p Ft(,)h(en)m(ters)f(a)g(restricted)h(mo)s(de.)68 +(Editing],)h(page)g(101\).)150 1166 y Ft(--enable-restricted)630 +1275 y Fu(Include)41 b(supp)s(ort)f(for)i(a)g Fr(restricted)g(shell)p +Fu(.)75 b(If)42 b(this)f(is)h(enabled,)j(Bash,)g(when)c(called)630 +1385 y(as)f Ft(rbash)p Fu(,)h(en)m(ters)f(a)g(restricted)h(mo)s(de.)68 b(See)40 b(Section)h(6.10)g([The)f(Restricted)h(Shell],)630 1494 y(page)31 b(93,)h(for)e(a)g(description)h(of)f(restricted)h(mo)s -(de.)150 1654 y Fs(--enable-select)630 1763 y Ft(Include)25 -b(the)h Fs(select)f Ft(comp)s(ound)f(command,)j(whic)m(h)e(allo)m(ws)j +(de.)150 1654 y Ft(--enable-select)630 1763 y Fu(Include)25 +b(the)h Ft(select)f Fu(comp)s(ound)f(command,)j(whic)m(h)e(allo)m(ws)j (the)e(generation)h(of)f(simple)630 1873 y(men)m(us)k(\(see)h(Section)g (3.2.4.2)i([Conditional)e(Constructs],)g(page)g(10\).)150 -2032 y Fs(--enable-separate-helpfi)o(les)630 2142 y Ft(Use)h(external)h +2032 y Ft(--enable-separate-helpfi)o(les)630 2142 y Fu(Use)h(external)h (\014les)f(for)g(the)g(do)s(cumen)m(tation)h(displa)m(y)m(ed)f(b)m(y)g -(the)g Fs(help)f Ft(builtin)h(instead)630 2252 y(of)f(storing)f(the)h -(text)g(in)m(ternally)-8 b(.)150 2411 y Fs(--enable-single-help-str)o -(ings)630 2521 y Ft(Store)40 b(the)g(text)h(displa)m(y)m(ed)g(b)m(y)e -(the)i Fs(help)d Ft(builtin)i(as)g(a)g(single)h(string)f(for)f(eac)m(h) +(the)g Ft(help)f Fu(builtin)h(instead)630 2252 y(of)f(storing)f(the)h +(text)g(in)m(ternally)-8 b(.)150 2411 y Ft(--enable-single-help-str)o +(ings)630 2521 y Fu(Store)40 b(the)g(text)h(displa)m(y)m(ed)g(b)m(y)e +(the)i Ft(help)d Fu(builtin)i(as)g(a)g(single)h(string)f(for)f(eac)m(h) i(help)630 2630 y(topic.)54 b(This)33 b(aids)i(in)f(translating)h(the)g (text)g(to)g(di\013eren)m(t)g(languages.)54 b(Y)-8 b(ou)35 b(ma)m(y)g(need)630 2740 y(to)c(disable)g(this)f(if)g(y)m(our)h (compiler)g(cannot)f(handle)g(v)m(ery)h(long)g(string)f(literals.)150 -2899 y Fs(--enable-strict-posix-de)o(faul)o(t)630 3009 -y Ft(Mak)m(e)c(Bash)f Fl(posix)p Ft(-conforman)m(t)g(b)m(y)f(default)h +2899 y Ft(--enable-strict-posix-de)o(faul)o(t)630 3009 +y Fu(Mak)m(e)c(Bash)f Fm(posix)p Fu(-conforman)m(t)g(b)m(y)f(default)h (\(see)g(Section)h(6.11)g([Bash)f(POSIX)e(Mo)s(de],)630 -3118 y(page)31 b(94\).)150 3278 y Fs(--enable-usg-echo-defaul)o(t)630 -3387 y Ft(A)f(synon)m(ym)g(for)g Fs(--enable-xpg-echo-default)p -Ft(.)150 3547 y Fs(--enable-xpg-echo-defaul)o(t)630 3656 -y Ft(Mak)m(e)c(the)f Fs(echo)e Ft(builtin)i(expand)f(bac)m +3118 y(page)31 b(94\).)150 3278 y Ft(--enable-usg-echo-defaul)o(t)630 +3387 y Fu(A)f(synon)m(ym)g(for)g Ft(--enable-xpg-echo-default)p +Fu(.)150 3547 y Ft(--enable-xpg-echo-defaul)o(t)630 3656 +y Fu(Mak)m(e)c(the)f Ft(echo)e Fu(builtin)i(expand)f(bac)m (kslash-escap)s(ed)h(c)m(haracters)h(b)m(y)f(default,)h(without)630 -3766 y(requiring)41 b(the)g(`)p Fs(-e)p Ft(')g(option.)73 -b(This)41 b(sets)g(the)g(default)h(v)-5 b(alue)41 b(of)h(the)f -Fs(xpg_echo)e Ft(shell)630 3875 y(option)26 b(to)g Fs(on)p -Ft(,)g(whic)m(h)g(mak)m(es)g(the)g(Bash)g Fs(echo)e Ft(b)s(eha)m(v)m(e) -i(more)g(lik)m(e)h(the)f(v)m(ersion)g(sp)s(eci\014ed)630 -3985 y(in)41 b(the)h(Single)g(Unix)f(Sp)s(eci\014cation,)k(v)m(ersion)e -(3.)74 b(See)42 b(Section)g(4.2)h([Bash)f(Builtins],)630 -4095 y(page)31 b(48,)h(for)e(a)g(description)h(of)f(the)h(escap)s(e)g -(sequences)f(that)h Fs(echo)f Ft(recognizes.)275 4254 -y(The)23 b(\014le)i(`)p Fs(config-top.h)p Ft(')c(con)m(tains)26 -b(C)e(Prepro)s(cessor)g(`)p Fs(#define)p Ft(')e(statemen)m(ts)k(for)f -(options)f(whic)m(h)150 4364 y(are)35 b(not)g(settable)i(from)d -Fs(configure)p Ft(.)51 b(Some)35 b(of)g(these)g(are)h(not)f(mean)m(t)g -(to)h(b)s(e)e(c)m(hanged;)k(b)s(ew)m(are)d(of)150 4473 -y(the)h(consequences)g(if)f(y)m(ou)h(do.)55 b(Read)36 -b(the)g(commen)m(ts)g(asso)s(ciated)h(with)e(eac)m(h)i(de\014nition)e -(for)g(more)150 4583 y(information)c(ab)s(out)f(its)h(e\013ect.)p -eop end -%%Page: 146 152 -TeXDict begin 146 151 bop 150 -116 a Ft(App)s(endix)29 -b(A:)h(Rep)s(orting)h(Bugs)2299 b(146)150 299 y Fo(App)t(endix)52 -b(A)81 b(Rep)t(orting)53 b(Bugs)150 533 y Ft(Please)33 +3766 y(requiring)d(the)h Ft(-e)f Fu(option.)39 b(This)23 +b(sets)h(the)g(default)g(v)-5 b(alue)24 b(of)g(the)g +Ft(xpg_echo)e Fu(shell)h(option)630 3875 y(to)28 b Ft(on)p +Fu(,)g(whic)m(h)f(mak)m(es)h(the)g(Bash)f Ft(echo)f Fu(b)s(eha)m(v)m(e) +i(more)g(lik)m(e)h(the)e(v)m(ersion)h(sp)s(eci\014ed)f(in)g(the)630 +3985 y(Single)35 b(Unix)f(Sp)s(eci\014cation,)i(v)m(ersion)e(3.)53 +b(See)35 b(Section)g(4.2)g([Bash)g(Builtins],)h(page)f(48,)630 +4095 y(for)30 b(a)h(description)f(of)h(the)f(escap)s(e)h(sequences)g +(that)g Ft(echo)e Fu(recognizes.)275 4254 y(The)f(\014le)i +Ft(config-top.h)c Fu(con)m(tains)31 b(C)d(Prepro)s(cessor)h(`)p +Ft(#define)p Fu(')f(statemen)m(ts)j(for)f(options)f(whic)m(h)150 +4364 y(are)35 b(not)g(settable)i(from)d Ft(configure)p +Fu(.)51 b(Some)35 b(of)g(these)g(are)h(not)f(mean)m(t)g(to)h(b)s(e)e(c) +m(hanged;)k(b)s(ew)m(are)d(of)150 4473 y(the)h(consequences)g(if)f(y)m +(ou)h(do.)55 b(Read)36 b(the)g(commen)m(ts)g(asso)s(ciated)h(with)e +(eac)m(h)i(de\014nition)e(for)g(more)150 4583 y(information)c(ab)s(out) +f(its)h(e\013ect.)p eop end +%%Page: 145 151 +TeXDict begin 145 150 bop 150 -116 a Fu(App)s(endix)29 +b(A:)h(Rep)s(orting)h(Bugs)2299 b(145)150 299 y Fp(App)t(endix)52 +b(A)81 b(Rep)t(orting)53 b(Bugs)150 533 y Fu(Please)33 b(rep)s(ort)e(all)h(bugs)f(y)m(ou)h(\014nd)e(in)i(Bash.)44 b(But)32 b(\014rst,)g(y)m(ou)g(should)e(mak)m(e)j(sure)e(that)h(it)g (really)h(is)f(a)150 643 y(bug,)d(and)g(that)h(it)g(app)s(ears)f(in)g (the)h(latest)h(v)m(ersion)f(of)g(Bash.)40 b(The)29 b(latest)j(v)m (ersion)e(of)f(Bash)h(is)f(alw)m(a)m(ys)150 752 y(a)m(v)-5 -b(ailable)33 b(for)d(FTP)g(from)g Fs(ftp://ftp.gnu.org/pub/gn)o(u/ba)o -(sh/)o Ft(.)275 887 y(Once)41 b(y)m(ou)g(ha)m(v)m(e)h(determined)f -(that)h(a)f(bug)g(actually)h(exists,)j(use)c(the)g Fs(bashbug)e -Ft(command)i(to)150 996 y(submit)25 b(a)h(bug)g(rep)s(ort.)38 +b(ailable)33 b(for)d(FTP)g(from)g Ft(ftp://ftp.gnu.org/pub/gn)o(u/ba)o +(sh/)o Fu(.)275 887 y(Once)41 b(y)m(ou)g(ha)m(v)m(e)h(determined)f +(that)h(a)f(bug)g(actually)h(exists,)j(use)c(the)g Ft(bashbug)e +Fu(command)i(to)150 996 y(submit)25 b(a)h(bug)g(rep)s(ort.)38 b(If)26 b(y)m(ou)g(ha)m(v)m(e)h(a)f(\014x,)h(y)m(ou)f(are)g(encouraged) h(to)f(mail)h(that)f(as)g(w)m(ell!)40 b(Suggestions)150 -1106 y(and)20 b(`philosophical')j(bug)d(rep)s(orts)g(ma)m(y)i(b)s(e)e -(mailed)i(to)g Fs(bug-bash@gnu.org)17 b Ft(or)k(p)s(osted)f(to)i(the)f -(Usenet)150 1215 y(newsgroup)29 b Fs(gnu.bash.bug)p Ft(.)275 -1350 y(All)i(bug)e(rep)s(orts)h(should)f(include:)225 -1484 y Fp(\017)60 b Ft(The)30 b(v)m(ersion)h(n)m(um)m(b)s(er)e(of)h -(Bash.)225 1619 y Fp(\017)60 b Ft(The)30 b(hardw)m(are)g(and)g(op)s -(erating)g(system.)225 1753 y Fp(\017)60 b Ft(The)30 -b(compiler)h(used)e(to)i(compile)h(Bash.)225 1888 y Fp(\017)60 -b Ft(A)30 b(description)h(of)f(the)h(bug)f(b)s(eha)m(viour.)225 -2022 y Fp(\017)60 b Ft(A)30 b(short)h(script)f(or)g(`recip)s(e')h(whic) +1106 y(and)j(`philosophical')i(bug)e(rep)s(orts)g(ma)m(y)i(b)s(e)e +(mailed)h(to)g Ft(bug-bash@gnu)11 b(.)d(org)40 b Fu(or)k(p)s(osted)f +(to)i(the)150 1215 y(Usenet)31 b(newsgroup)e Ft(gnu.bash.bug)p +Fu(.)275 1350 y(All)i(bug)e(rep)s(orts)h(should)f(include:)225 +1484 y Fq(\017)60 b Fu(The)30 b(v)m(ersion)h(n)m(um)m(b)s(er)e(of)h +(Bash.)225 1619 y Fq(\017)60 b Fu(The)30 b(hardw)m(are)g(and)g(op)s +(erating)g(system.)225 1753 y Fq(\017)60 b Fu(The)30 +b(compiler)h(used)e(to)i(compile)h(Bash.)225 1888 y Fq(\017)60 +b Fu(A)30 b(description)h(of)f(the)h(bug)f(b)s(eha)m(viour.)225 +2022 y Fq(\017)60 b Fu(A)30 b(short)h(script)f(or)g(`recip)s(e')h(whic) m(h)f(exercises)i(the)e(bug)g(and)g(ma)m(y)h(b)s(e)f(used)f(to)i(repro) -s(duce)e(it.)150 2182 y Fs(bashbug)d Ft(inserts)i(the)h(\014rst)f +s(duce)e(it.)150 2182 y Ft(bashbug)d Fu(inserts)i(the)h(\014rst)f (three)g(items)h(automatically)i(in)m(to)f(the)e(template)i(it)f(pro)m (vides)f(for)g(\014ling)h(a)150 2291 y(bug)h(rep)s(ort.)275 2426 y(Please)h(send)f(all)h(rep)s(orts)f(concerning)g(this)h(man)m -(ual)f(to)h Fs(bug-bash@gnu.org)p Ft(.)p eop end -%%Page: 147 153 -TeXDict begin 147 152 bop 150 -116 a Ft(App)s(endix)29 +(ual)f(to)h Ft(bug-bash@gnu.org)p Fu(.)p eop end +%%Page: 146 152 +TeXDict begin 146 151 bop 150 -116 a Fu(App)s(endix)29 b(B:)i(Ma)5 b(jor)31 b(Di\013erences)g(F)-8 b(rom)31 -b(The)f(Bourne)g(Shell)1258 b(147)150 141 y Fo(App)t(endix)58 +b(The)f(Bourne)g(Shell)1258 b(146)150 141 y Fp(App)t(endix)58 b(B)81 b(Ma)9 b(jor)54 b(Di\013erences)d(F)-13 b(rom)54 -b(The)g(Bourne)1088 299 y(Shell)150 530 y Ft(Bash)26 +b(The)g(Bourne)1088 299 y(Shell)150 530 y Fu(Bash)26 b(implemen)m(ts)h(essen)m(tially)g(the)g(same)f(grammar,)h(parameter)f (and)g(v)-5 b(ariable)27 b(expansion,)g(redirec-)150 640 y(tion,)i(and)e(quoting)g(as)h(the)g(Bourne)f(Shell.)40 -b(Bash)27 b(uses)g(the)h Fl(posix)f Ft(standard)f(as)i(the)g(sp)s +b(Bash)27 b(uses)g(the)h Fm(posix)f Fu(standard)f(as)i(the)g(sp)s (eci\014cation)g(of)150 749 y(ho)m(w)34 b(these)h(features)g(are)g(to)g (b)s(e)f(implemen)m(ted.)53 b(There)34 b(are)h(some)g(di\013erences)g (b)s(et)m(w)m(een)g(the)g(tradi-)150 859 y(tional)e(Bourne)e(shell)h @@ -17722,34 +18200,34 @@ b(Bash)27 b(uses)g(the)h Fl(posix)f Ft(standard)f(as)i(the)g(sp)s y(n)m(um)m(b)s(er)24 b(of)h(these)h(di\013erences)f(are)h(explained)f (in)g(greater)h(depth)f(in)g(previous)f(sections.)40 b(This)25 b(section)150 1078 y(uses)33 b(the)i(v)m(ersion)f(of)g -Fs(sh)f Ft(included)g(in)h(SVR4.2)h(\(the)f(last)h(v)m(ersion)f(of)g +Ft(sh)f Fu(included)g(in)h(SVR4.2)h(\(the)f(last)h(v)m(ersion)f(of)g (the)g(historical)i(Bourne)d(shell\))150 1188 y(as)e(the)f(baseline)h -(reference.)225 1322 y Fp(\017)60 b Ft(Bash)32 b(is)h -Fl(posix)p Ft(-conforman)m(t,)g(ev)m(en)g(where)f(the)g -Fl(posix)g Ft(sp)s(eci\014cation)h(di\013ers)f(from)g(traditional)330 -1431 y Fs(sh)e Ft(b)s(eha)m(vior)g(\(see)i(Section)f(6.11)h([Bash)e -(POSIX)g(Mo)s(de],)h(page)g(94\).)225 1565 y Fp(\017)60 -b Ft(Bash)26 b(has)g(m)m(ulti-c)m(haracter)i(in)m(v)m(o)s(cation)g +(reference.)225 1322 y Fq(\017)60 b Fu(Bash)32 b(is)h +Fm(posix)p Fu(-conforman)m(t,)g(ev)m(en)g(where)f(the)g +Fm(posix)g Fu(sp)s(eci\014cation)h(di\013ers)f(from)g(traditional)330 +1431 y Ft(sh)e Fu(b)s(eha)m(vior)g(\(see)i(Section)f(6.11)h([Bash)e +(POSIX)g(Mo)s(de],)h(page)g(94\).)225 1565 y Fq(\017)60 +b Fu(Bash)26 b(has)g(m)m(ulti-c)m(haracter)i(in)m(v)m(o)s(cation)g (options)f(\(see)f(Section)h(6.1)g([In)m(v)m(oking)g(Bash],)h(page)e -(80\).)225 1699 y Fp(\017)60 b Ft(Bash)40 b(has)f(command-line)h +(80\).)225 1699 y Fq(\017)60 b Fu(Bash)40 b(has)f(command-line)h (editing)g(\(see)h(Chapter)e(8)h([Command)f(Line)g(Editing],)k(page)d -(102\))330 1809 y(and)30 b(the)g Fs(bind)g Ft(builtin.)225 -1943 y Fp(\017)60 b Ft(Bash)46 b(pro)m(vides)g(a)g(programmable)g(w)m +(101\))330 1809 y(and)30 b(the)g Ft(bind)g Fu(builtin.)225 +1943 y Fq(\017)60 b Fu(Bash)46 b(pro)m(vides)g(a)g(programmable)g(w)m (ord)f(completion)i(mec)m(hanism)f(\(see)h(Section)g(8.6)g([Pro-)330 -2052 y(grammable)39 b(Completion],)i(page)e(125\),)i(and)d(builtin)g -(commands)f Fs(complete)p Ft(,)h Fs(compgen)p Ft(,)h(and)330 -2162 y Fs(compopt)p Ft(,)29 b(to)i(manipulate)g(it.)225 -2296 y Fp(\017)60 b Ft(Bash)26 b(has)f(command)h(history)f(\(see)i +2052 y(grammable)39 b(Completion],)i(page)e(124\),)i(and)d(builtin)g +(commands)f Ft(complete)p Fu(,)h Ft(compgen)p Fu(,)h(and)330 +2162 y Ft(compopt)p Fu(,)29 b(to)i(manipulate)g(it.)225 +2296 y Fq(\017)60 b Fu(Bash)26 b(has)f(command)h(history)f(\(see)i (Section)f(9.1)h([Bash)f(History)h(F)-8 b(acilities],)30 -b(page)c(134\))i(and)d(the)330 2405 y Fs(history)k Ft(and)h -Fs(fc)g Ft(builtins)g(to)h(manipulate)g(it.)42 b(The)30 +b(page)c(133\))i(and)d(the)330 2405 y Ft(history)k Fu(and)h +Ft(fc)g Fu(builtins)g(to)h(manipulate)g(it.)42 b(The)30 b(Bash)h(history)g(list)g(main)m(tains)g(timestamp)330 2515 y(information)g(and)e(uses)h(the)h(v)-5 b(alue)31 -b(of)f(the)h Fs(HISTTIMEFORMAT)26 b Ft(v)-5 b(ariable)32 -b(to)f(displa)m(y)f(it.)225 2649 y Fp(\017)60 b Ft(Bash)48 -b(implemen)m(ts)h Fs(csh)p Ft(-lik)m(e)g(history)f(expansion)g(\(see)h +b(of)f(the)h Ft(HISTTIMEFORMAT)26 b Fu(v)-5 b(ariable)32 +b(to)f(displa)m(y)f(it.)225 2649 y Fq(\017)60 b Fu(Bash)48 +b(implemen)m(ts)h Ft(csh)p Fu(-lik)m(e)g(history)f(expansion)g(\(see)h (Section)g(9.3)h([History)f(In)m(teraction],)330 2759 -y(page)31 b(136\).)225 2892 y Fp(\017)60 b Ft(Bash)33 +y(page)31 b(135\).)225 2892 y Fq(\017)60 b Fu(Bash)33 b(has)g(one-dimensional)h(arra)m(y)f(v)-5 b(ariables)34 b(\(see)g(Section)g(6.7)g([Arra)m(ys],)g(page)g(89\),)h(and)e(the)330 3002 y(appropriate)39 b(v)-5 b(ariable)40 b(expansions)f(and)g @@ -17757,459 +18235,458 @@ b(\(see)g(Section)g(6.7)g([Arra)m(ys],)g(page)g(89\),)h(and)e(the)330 b(of)g(the)330 3112 y(Bash)32 b(builtins)f(tak)m(e)j(options)e(to)h (act)g(on)e(arra)m(ys.)46 b(Bash)32 b(pro)m(vides)g(a)g(n)m(um)m(b)s (er)f(of)h(built-in)f(arra)m(y)330 3221 y(v)-5 b(ariables.)225 -3355 y Fp(\017)60 b Ft(The)37 b Fs($'...)n(')g Ft(quoting)g(syn)m(tax,) +3355 y Fq(\017)60 b Fu(The)37 b Ft($'...)n(')g Fu(quoting)g(syn)m(tax,) j(whic)m(h)d(expands)f(ANSI-C)h(bac)m(kslash-escap)s(ed)h(c)m (haracters)g(in)330 3465 y(the)26 b(text)h(b)s(et)m(w)m(een)g(the)g (single)f(quotes,)i(is)e(supp)s(orted)f(\(see)i(Section)g(3.1.2.4)h ([ANSI-C)e(Quoting],)330 3574 y(page)31 b(6\).)225 3708 -y Fp(\017)60 b Ft(Bash)69 b(supp)s(orts)e(the)i Fs($"...)n(")g -Ft(quoting)g(syn)m(tax)g(to)h(do)e(lo)s(cale-sp)s(eci\014c)j -(translation)f(of)330 3818 y(the)65 b(c)m(haracters)i(b)s(et)m(w)m(een) -f(the)f(double)g(quotes.)145 b(The)65 b(`)p Fs(-D)p Ft(',)74 -b(`)p Fs(--dump-strings)p Ft(',)d(and)330 3927 y(`)p -Fs(--dump-po-strings)p Ft(')27 b(in)m(v)m(o)s(cation)33 -b(options)e(list)h(the)f(translatable)h(strings)f(found)f(in)h(a)g -(script)330 4037 y(\(see)g(Section)h(3.1.2.5)g([Lo)s(cale)g(T)-8 -b(ranslation],)32 b(page)f(7\).)225 4171 y Fp(\017)60 -b Ft(Bash)44 b(implemen)m(ts)g(the)f Fs(!)h Ft(k)m(eyw)m(ord)g(to)g -(negate)h(the)f(return)e(v)-5 b(alue)44 b(of)g(a)g(pip)s(eline)f(\(see) -h(Sec-)330 4281 y(tion)33 b(3.2.2)i([Pip)s(elines],)f(page)g(8\).)49 -b(V)-8 b(ery)33 b(useful)f(when)g(an)h Fs(if)f Ft(statemen)m(t)j(needs) +y Fq(\017)60 b Fu(Bash)30 b(supp)s(orts)f(the)h Ft($"...)o(")f +Fu(quoting)i(syn)m(tax)g(to)f(do)g(lo)s(cale-sp)s(eci\014c)i +(translation)g(of)e(the)g(c)m(har-)330 3818 y(acters)g(b)s(et)m(w)m +(een)f(the)f(double)g(quotes.)41 b(The)28 b Ft(-D)p Fu(,)h +Ft(--dump-strings)p Fu(,)c(and)j Ft(--dump-po-strings)330 +3927 y Fu(in)m(v)m(o)s(cation)42 b(options)d(list)i(the)e(translatable) +i(strings)f(found)e(in)h(a)h(script)g(\(see)g(Section)g(3.1.2.5)330 +4037 y([Lo)s(cale)32 b(T)-8 b(ranslation],)31 b(page)h(7\).)225 +4171 y Fq(\017)60 b Fu(Bash)44 b(implemen)m(ts)g(the)f +Ft(!)h Fu(k)m(eyw)m(ord)g(to)g(negate)h(the)f(return)e(v)-5 +b(alue)44 b(of)g(a)g(pip)s(eline)f(\(see)h(Sec-)330 4281 +y(tion)33 b(3.2.2)i([Pip)s(elines],)f(page)g(8\).)49 +b(V)-8 b(ery)33 b(useful)f(when)g(an)h Ft(if)f Fu(statemen)m(t)j(needs) d(to)i(act)g(only)f(if)330 4390 y(a)k(test)h(fails.)60 -b(The)36 b(Bash)g(`)p Fs(-o)30 b(pipefail)p Ft(')35 b(option)i(to)h -Fs(set)d Ft(will)i(cause)g(a)g(pip)s(eline)g(to)g(return)f(a)330 +b(The)36 b(Bash)g(`)p Ft(-o)30 b(pipefail)p Fu(')35 b(option)i(to)h +Ft(set)d Fu(will)i(cause)g(a)g(pip)s(eline)g(to)g(return)f(a)330 4500 y(failure)31 b(status)f(if)h(an)m(y)f(command)g(fails.)225 -4634 y Fp(\017)60 b Ft(Bash)34 b(has)g(the)g Fs(time)f -Ft(reserv)m(ed)h(w)m(ord)g(and)f(command)h(timing)h(\(see)g(Section)g +4634 y Fq(\017)60 b Fu(Bash)34 b(has)g(the)g Ft(time)f +Fu(reserv)m(ed)h(w)m(ord)g(and)f(command)h(timing)h(\(see)g(Section)g (3.2.2)g([Pip)s(elines],)330 4743 y(page)g(8\).)52 b(The)33 b(displa)m(y)i(of)f(the)g(timing)g(statistics)i(ma)m(y)f(b)s(e)e(con)m -(trolled)j(with)e(the)g Fs(TIMEFORMAT)330 4853 y Ft(v)-5 -b(ariable.)225 4987 y Fp(\017)60 b Ft(Bash)23 b(implemen)m(ts)g(the)h -Fs(for)29 b(\(\()h Fi(expr1)39 b Fs(;)30 b Fi(expr2)40 -b Fs(;)30 b Fi(expr3)39 b Fs(\)\))23 b Ft(arithmetic)h(for)e(command,)j -(sim-)330 5096 y(ilar)31 b(to)g(the)g(C)f(language)h(\(see)h(Section)f -(3.2.4.1)i([Lo)s(oping)d(Constructs],)h(page)g(10\).)225 -5230 y Fp(\017)60 b Ft(Bash)31 b(includes)f(the)g Fs(select)f -Ft(comp)s(ound)g(command,)i(whic)m(h)f(allo)m(ws)i(the)f(generation)g -(of)g(simple)330 5340 y(men)m(us)f(\(see)h(Section)g(3.2.4.2)i -([Conditional)e(Constructs],)g(page)g(10\).)p eop end -%%Page: 148 154 -TeXDict begin 148 153 bop 150 -116 a Ft(App)s(endix)29 +(trolled)j(with)e(the)g Ft(TIMEFORMAT)330 4853 y Fu(v)-5 +b(ariable.)225 4987 y Fq(\017)60 b Fu(Bash)28 b(implemen)m(ts)g(the)f +Ft(for)j(\(\()g Fj(expr1)f Ft(;)h Fj(expr2)f Ft(;)h Fj(expr3)f +Ft(\)\))e Fu(arithmetic)h(for)g(command,)g(sim-)330 5096 +y(ilar)j(to)g(the)g(C)f(language)h(\(see)h(Section)f(3.2.4.1)i([Lo)s +(oping)d(Constructs],)h(page)g(10\).)225 5230 y Fq(\017)60 +b Fu(Bash)31 b(includes)f(the)g Ft(select)f Fu(comp)s(ound)g(command,)i +(whic)m(h)f(allo)m(ws)i(the)f(generation)g(of)g(simple)330 +5340 y(men)m(us)f(\(see)h(Section)g(3.2.4.2)i([Conditional)e +(Constructs],)g(page)g(10\).)p eop end +%%Page: 147 153 +TeXDict begin 147 152 bop 150 -116 a Fu(App)s(endix)29 b(B:)i(Ma)5 b(jor)31 b(Di\013erences)g(F)-8 b(rom)31 -b(The)f(Bourne)g(Shell)1258 b(148)225 299 y Fp(\017)60 -b Ft(Bash)40 b(includes)g(the)g Fs([[)g Ft(comp)s(ound)e(command,)43 +b(The)f(Bourne)g(Shell)1258 b(147)225 299 y Fq(\017)60 +b Fu(Bash)40 b(includes)g(the)g Ft([[)g Fu(comp)s(ound)e(command,)43 b(whic)m(h)c(mak)m(es)i(conditional)h(testing)f(part)f(of)330 408 y(the)f(shell)g(grammar)g(\(see)h(Section)f(3.2.4.2)j([Conditional) d(Constructs],)i(page)f(10\),)i(including)330 518 y(optional)32 -b(regular)e(expression)g(matc)m(hing.)225 653 y Fp(\017)60 -b Ft(Bash)31 b(pro)m(vides)f(optional)h(case-insensitiv)m(e)i(matc)m -(hing)f(for)e(the)g Fs(case)g Ft(and)f Fs([[)h Ft(constructs.)225 -789 y Fp(\017)60 b Ft(Bash)27 b(includes)g(brace)h(expansion)f(\(see)h +b(regular)e(expression)g(matc)m(hing.)225 653 y Fq(\017)60 +b Fu(Bash)31 b(pro)m(vides)f(optional)h(case-insensitiv)m(e)i(matc)m +(hing)f(for)e(the)g Ft(case)g Fu(and)f Ft([[)h Fu(constructs.)225 +789 y Fq(\017)60 b Fu(Bash)27 b(includes)g(brace)h(expansion)f(\(see)h (Section)g(3.5.1)i([Brace)e(Expansion],)g(page)g(21\))h(and)d(tilde)330 898 y(expansion)k(\(see)i(Section)f(3.5.2)h([Tilde)f(Expansion],)f -(page)h(22\).)225 1034 y Fp(\017)60 b Ft(Bash)24 b(implemen)m(ts)h -(command)e(aliases)j(and)d(the)i Fs(alias)d Ft(and)i -Fs(unalias)e Ft(builtins)h(\(see)i(Section)g(6.6)330 -1143 y([Aliases],)32 b(page)f(88\).)225 1279 y Fp(\017)60 -b Ft(Bash)32 b(pro)m(vides)g(shell)g(arithmetic,)i(the)e -Fs(\(\()g Ft(comp)s(ound)e(command)i(\(see)h(Section)f(3.2.4.2)j([Con-) +(page)h(22\).)225 1034 y Fq(\017)60 b Fu(Bash)24 b(implemen)m(ts)h +(command)e(aliases)j(and)d(the)i Ft(alias)d Fu(and)i +Ft(unalias)e Fu(builtins)h(\(see)i(Section)g(6.6)330 +1143 y([Aliases],)32 b(page)f(88\).)225 1279 y Fq(\017)60 +b Fu(Bash)32 b(pro)m(vides)g(shell)g(arithmetic,)i(the)e +Ft(\(\()g Fu(comp)s(ound)e(command)i(\(see)h(Section)f(3.2.4.2)j([Con-) 330 1388 y(ditional)d(Constructs],)e(page)i(10\),)g(and)e(arithmetic)i (expansion)e(\(see)i(Section)f(6.5)h([Shell)f(Arith-)330 -1498 y(metic],)h(page)f(87\).)225 1633 y Fp(\017)60 b -Ft(V)-8 b(ariables)31 b(presen)m(t)e(in)g(the)g(shell's)h(initial)g(en) +1498 y(metic],)h(page)f(87\).)225 1633 y Fq(\017)60 b +Fu(V)-8 b(ariables)31 b(presen)m(t)e(in)g(the)g(shell's)h(initial)g(en) m(vironmen)m(t)g(are)g(automatically)i(exp)s(orted)d(to)h(c)m(hild)330 1743 y(pro)s(cesses.)38 b(The)23 b(Bourne)g(shell)g(do)s(es)g(not)g (normally)g(do)g(this)g(unless)g(the)g(v)-5 b(ariables)24 b(are)f(explicitly)330 1852 y(mark)m(ed)30 b(using)g(the)h -Fs(export)e Ft(command.)225 1988 y Fp(\017)60 b Ft(Bash)26 -b(supp)s(orts)d(the)j(`)p Fs(+=)p Ft(')f(assignmen)m(t)i(op)s(erator,)g +Ft(export)e Fu(command.)225 1988 y Fq(\017)60 b Fu(Bash)26 +b(supp)s(orts)d(the)j(`)p Ft(+=)p Fu(')f(assignmen)m(t)i(op)s(erator,)g (whic)m(h)e(app)s(ends)f(to)i(the)g(v)-5 b(alue)26 b(of)f(the)h(v)-5 b(ariable)330 2097 y(named)30 b(on)g(the)h(left)g(hand)e(side.)225 -2233 y Fp(\017)60 b Ft(Bash)36 b(includes)g(the)g Fl(posix)f -Ft(pattern)h(remo)m(v)-5 b(al)37 b(`)p Fs(\045)p Ft(',)h(`)p -Fs(#)p Ft(',)g(`)p Fs(\045\045)p Ft(')e(and)f(`)p Fs(##)p -Ft(')h(expansions)g(to)g(remo)m(v)m(e)330 2342 y(leading)f(or)f +2233 y Fq(\017)60 b Fu(Bash)36 b(includes)g(the)g Fm(posix)f +Fu(pattern)h(remo)m(v)-5 b(al)37 b(`)p Ft(\045)p Fu(',)h(`)p +Ft(#)p Fu(',)g(`)p Ft(\045\045)p Fu(')e(and)f(`)p Ft(##)p +Fu(')h(expansions)g(to)g(remo)m(v)m(e)330 2342 y(leading)f(or)f (trailing)h(substrings)e(from)g(v)-5 b(ariable)35 b(v)-5 b(alues)35 b(\(see)g(Section)g(3.5.3)g([Shell)g(P)m(arameter)330 -2452 y(Expansion],)30 b(page)h(23\).)225 2587 y Fp(\017)60 -b Ft(The)46 b(expansion)g Fs(${#xx})p Ft(,)j(whic)m(h)d(returns)f(the)i -(length)f(of)h Fs(${xx})p Ft(,)i(is)e(supp)s(orted)d(\(see)j(Sec-)330 +2452 y(Expansion],)30 b(page)h(23\).)225 2587 y Fq(\017)60 +b Fu(The)46 b(expansion)g Ft(${#xx})p Fu(,)j(whic)m(h)d(returns)f(the)i +(length)f(of)h Ft(${xx})p Fu(,)i(is)e(supp)s(orted)d(\(see)j(Sec-)330 2697 y(tion)31 b(3.5.3)h([Shell)f(P)m(arameter)g(Expansion],)f(page)i -(23\).)225 2832 y Fp(\017)60 b Ft(The)30 b(expansion)g -Fs(${var:)p Fq(o\013set)r Fs([:)p Fq(length)p Fs(]})p -Ft(,)g(whic)m(h)g(expands)g(to)h(the)g(substring)e(of)i -Fs(var)p Ft('s)e(v)-5 b(alue)330 2942 y(of)43 b(length)g -Fq(length)p Ft(,)j(b)s(eginning)c(at)i Fq(o\013set)r -Ft(,)j(is)42 b(presen)m(t)h(\(see)h(Section)f(3.5.3)i([Shell)e(P)m +(23\).)225 2832 y Fq(\017)60 b Fu(The)30 b(expansion)g +Ft(${var:)p Fr(o\013set)r Ft([:)p Fr(length)p Ft(]})p +Fu(,)g(whic)m(h)g(expands)g(to)h(the)g(substring)e(of)i +Ft(var)p Fu('s)e(v)-5 b(alue)330 2942 y(of)43 b(length)g +Fr(length)p Fu(,)k(b)s(eginning)42 b(at)i Fr(o\013set)p +Fu(,)j(is)c(presen)m(t)g(\(see)g(Section)h(3.5.3)h([Shell)e(P)m (arameter)330 3051 y(Expansion],)30 b(page)h(23\).)225 -3187 y Fp(\017)60 b Ft(The)21 b(expansion)f Fs(${var/[/])p -Fq(pattern)p Fs([/)p Fq(replacemen)m(t)r Fs(]})p Ft(,)i(whic)m(h)e -(matc)m(hes)j Fq(pattern)e Ft(and)f(replaces)330 3296 -y(it)29 b(with)e Fq(replacemen)m(t)32 b Ft(in)c(the)g(v)-5 -b(alue)29 b(of)f Fs(var)p Ft(,)g(is)g(a)m(v)-5 b(ailable)31 +3187 y Fq(\017)60 b Fu(The)21 b(expansion)f Ft(${var/[/])p +Fr(pattern)p Ft([/)p Fr(replacemen)m(t)r Ft(]})p Fu(,)i(whic)m(h)e +(matc)m(hes)j Fr(pattern)e Fu(and)f(replaces)330 3296 +y(it)29 b(with)e Fr(replacemen)m(t)32 b Fu(in)c(the)g(v)-5 +b(alue)29 b(of)f Ft(var)p Fu(,)g(is)g(a)m(v)-5 b(ailable)31 b(\(see)e(Section)f(3.5.3)i([Shell)f(P)m(arameter)330 -3406 y(Expansion],)h(page)h(23\).)225 3541 y Fp(\017)60 -b Ft(The)32 b(expansion)g Fs(${!)p Fi(prefix)11 b Fs(*})29 -b Ft(expansion,)j(whic)m(h)g(expands)g(to)h(the)f(names)g(of)h(all)g -(shell)f(v)-5 b(ari-)330 3651 y(ables)36 b(whose)f(names)h(b)s(egin)f -(with)g Fq(pre\014x)6 b Ft(,)36 b(is)g(a)m(v)-5 b(ailable)38 -b(\(see)e(Section)h(3.5.3)g([Shell)f(P)m(arameter)330 -3761 y(Expansion],)30 b(page)h(23\).)225 3896 y Fp(\017)60 -b Ft(Bash)22 b(has)f Fq(indirect)j Ft(v)-5 b(ariable)22 -b(expansion)g(using)f Fs(${!word})e Ft(\(see)k(Section)f(3.5.3)i +3406 y(Expansion],)h(page)h(23\).)225 3541 y Fq(\017)60 +b Fu(The)33 b(expansion)g Ft(${!)p Fj(prefix)p Ft(*})d +Fu(expansion,)k(whic)m(h)e(expands)h(to)h(the)f(names)g(of)g(all)h +(shell)f(v)-5 b(ari-)330 3651 y(ables)36 b(whose)g(names)g(b)s(egin)g +(with)g Fr(pre\014x)p Fu(,)g(is)g(a)m(v)-5 b(ailable)39 +b(\(see)e(Section)g(3.5.3)g([Shell)g(P)m(arameter)330 +3761 y(Expansion],)30 b(page)h(23\).)225 3896 y Fq(\017)60 +b Fu(Bash)22 b(has)f Fr(indirect)j Fu(v)-5 b(ariable)22 +b(expansion)g(using)f Ft(${!word})e Fu(\(see)k(Section)f(3.5.3)i ([Shell)e(P)m(arameter)330 4006 y(Expansion],)30 b(page)h(23\).)225 -4141 y Fp(\017)60 b Ft(Bash)31 b(can)f(expand)g(p)s(ositional)h -(parameters)g(b)s(ey)m(ond)e Fs($9)h Ft(using)g Fs(${)p -Fi(num)11 b Fs(})p Ft(.)225 4276 y Fp(\017)60 b Ft(The)27 -b Fl(posix)g Fs($\(\))g Ft(form)g(of)h(command)g(substitution)f(is)h +4141 y Fq(\017)60 b Fu(Bash)31 b(can)f(expand)g(p)s(ositional)h +(parameters)g(b)s(ey)m(ond)e Ft($9)h Fu(using)g Ft(${)p +Fj(num)p Ft(})p Fu(.)225 4276 y Fq(\017)60 b Fu(The)27 +b Fm(posix)g Ft($\(\))g Fu(form)g(of)h(command)g(substitution)f(is)h (implemen)m(ted)g(\(see)h(Section)f(3.5.4)i([Com-)330 4386 y(mand)38 b(Substitution],)k(page)e(28\),)j(and)38 -b(preferred)g(to)i(the)g(Bourne)f(shell's)h Fs(``)e Ft(\(whic)m(h)i(is) +b(preferred)g(to)i(the)g(Bourne)f(shell's)h Ft(``)e Fu(\(whic)m(h)i(is) f(also)330 4495 y(implemen)m(ted)31 b(for)f(bac)m(kw)m(ards)h -(compatibilit)m(y\).)225 4631 y Fp(\017)60 b Ft(Bash)31 +(compatibilit)m(y\).)225 4631 y Fq(\017)60 b Fu(Bash)31 b(has)f(pro)s(cess)g(substitution)g(\(see)h(Section)g(3.5.6)h([Pro)s -(cess)f(Substitution],)f(page)h(29\).)225 4766 y Fp(\017)60 -b Ft(Bash)55 b(automatically)j(assigns)e(v)-5 b(ariables)55 +(cess)f(Substitution],)f(page)h(29\).)225 4766 y Fq(\017)60 +b Fu(Bash)55 b(automatically)j(assigns)e(v)-5 b(ariables)55 b(that)h(pro)m(vide)f(information)h(ab)s(out)f(the)g(curren)m(t)330 -4876 y(user)40 b(\()p Fs(UID)p Ft(,)i Fs(EUID)p Ft(,)g(and)e -Fs(GROUPS)p Ft(\),)h(the)g(curren)m(t)f(host)g(\()p Fs(HOSTTYPE)p -Ft(,)h Fs(OSTYPE)p Ft(,)h Fs(MACHTYPE)p Ft(,)f(and)330 -4985 y Fs(HOSTNAME)p Ft(\),)55 b(and)c(the)g(instance)h(of)g(Bash)f -(that)h(is)f(running)f(\()p Fs(BASH)p Ft(,)56 b Fs(BASH_VERSION)p -Ft(,)e(and)330 5095 y Fs(BASH_VERSINFO)p Ft(\).)37 b(See)31 +4876 y(user)40 b(\()p Ft(UID)p Fu(,)i Ft(EUID)p Fu(,)g(and)e +Ft(GROUPS)p Fu(\),)h(the)g(curren)m(t)f(host)g(\()p Ft(HOSTTYPE)p +Fu(,)h Ft(OSTYPE)p Fu(,)h Ft(MACHTYPE)p Fu(,)f(and)330 +4985 y Ft(HOSTNAME)p Fu(\),)55 b(and)c(the)g(instance)h(of)g(Bash)f +(that)h(is)f(running)f(\()p Ft(BASH)p Fu(,)56 b Ft(BASH_VERSION)p +Fu(,)e(and)330 5095 y Ft(BASH_VERSINFO)p Fu(\).)37 b(See)31 b(Section)g(5.2)h([Bash)e(V)-8 b(ariables],)33 b(page)e(69,)g(for)f -(details.)225 5230 y Fp(\017)60 b Ft(The)44 b Fs(IFS)f -Ft(v)-5 b(ariable)45 b(is)f(used)f(to)i(split)f(only)g(the)g(results)g +(details.)225 5230 y Fq(\017)60 b Fu(The)44 b Ft(IFS)f +Fu(v)-5 b(ariable)45 b(is)f(used)f(to)i(split)f(only)g(the)g(results)g (of)h(expansion,)i(not)d(all)h(w)m(ords)f(\(see)330 5340 y(Section)29 b(3.5.7)h([W)-8 b(ord)29 b(Splitting],)h(page)f(29\).)41 b(This)28 b(closes)h(a)g(longstanding)g(shell)f(securit)m(y)h(hole.)p eop end -%%Page: 149 155 -TeXDict begin 149 154 bop 150 -116 a Ft(App)s(endix)29 +%%Page: 148 154 +TeXDict begin 148 153 bop 150 -116 a Fu(App)s(endix)29 b(B:)i(Ma)5 b(jor)31 b(Di\013erences)g(F)-8 b(rom)31 -b(The)f(Bourne)g(Shell)1258 b(149)225 299 y Fp(\017)60 -b Ft(The)36 b(\014lename)h(expansion)f(brac)m(k)m(et)i(expression)f(co) -s(de)f(uses)g(`)p Fs(!)p Ft(')h(and)f(`)p Fs(^)p Ft(')h(to)g(negate)h +b(The)f(Bourne)g(Shell)1258 b(148)225 299 y Fq(\017)60 +b Fu(The)36 b(\014lename)h(expansion)f(brac)m(k)m(et)i(expression)f(co) +s(de)f(uses)g(`)p Ft(!)p Fu(')h(and)f(`)p Ft(^)p Fu(')h(to)g(negate)h (the)f(set)g(of)330 408 y(c)m(haracters)32 b(b)s(et)m(w)m(een)f(the)f (brac)m(k)m(ets.)43 b(The)29 b(Bourne)i(shell)f(uses)g(only)h(`)p -Fs(!)p Ft('.)225 536 y Fp(\017)60 b Ft(Bash)38 b(implemen)m(ts)g(the)g -(full)g(set)g(of)g Fl(posix)f Ft(\014lename)h(expansion)g(op)s -(erators,)i(including)d Fq(c)m(har-)330 646 y(acter)i(classes)t -Ft(,)h Fq(equiv)-5 b(alence)39 b(classes)t Ft(,)h(and)d -Fq(collating)j(sym)m(b)s(ols)g Ft(\(see)f(Section)f(3.5.8)h([Filename) -330 756 y(Expansion],)30 b(page)h(29\).)225 883 y Fp(\017)60 -b Ft(Bash)35 b(implemen)m(ts)g(extended)g(pattern)g(matc)m(hing)h -(features)f(when)f(the)h Fs(extglob)d Ft(shell)j(option)330 -993 y(is)30 b(enabled)h(\(see)g(Section)g(3.5.8.1)i([P)m(attern)f(Matc) -m(hing],)g(page)f(30\).)225 1121 y Fp(\017)60 b Ft(It)22 -b(is)g(p)s(ossible)g(to)h(ha)m(v)m(e)g(a)f(v)-5 b(ariable)23 -b(and)f(a)g(function)g(with)g(the)g(same)g(name;)j Fs(sh)d -Ft(do)s(es)g(not)g(separate)330 1230 y(the)31 b(t)m(w)m(o)g(name)g -(spaces.)225 1358 y Fp(\017)60 b Ft(Bash)30 b(functions)e(are)i(p)s -(ermitted)f(to)h(ha)m(v)m(e)h(lo)s(cal)g(v)-5 b(ariables)30 -b(using)f(the)g Fs(local)f Ft(builtin,)i(and)e(th)m(us)330 -1468 y(useful)i(recursiv)m(e)g(functions)g(ma)m(y)h(b)s(e)f(written)g -(\(see)i(Section)f(4.2)g([Bash)g(Builtins],)g(page)h(48\).)225 -1596 y Fp(\017)60 b Ft(V)-8 b(ariable)25 b(assignmen)m(ts)g(preceding)e -(commands)h(a\013ect)h(only)f(that)g(command,)h(ev)m(en)f(builtins)g -(and)330 1705 y(functions)36 b(\(see)h(Section)g(3.7.4)h([En)m -(vironmen)m(t],)h(page)e(37\).)60 b(In)35 b Fs(sh)p Ft(,)j(all)f(v)-5 -b(ariable)37 b(assignmen)m(ts)330 1815 y(preceding)30 -b(commands)g(are)h(global)h(unless)d(the)i(command)f(is)h(executed)g -(from)f(the)g(\014le)h(system.)225 1943 y Fp(\017)60 -b Ft(Bash)44 b(p)s(erforms)e(\014lename)i(expansion)f(on)h(\014lenames) -g(sp)s(eci\014ed)f(as)h(op)s(erands)e(to)j(input)e(and)330 -2052 y(output)30 b(redirection)h(op)s(erators)g(\(see)g(Section)g(3.6)h -([Redirections],)g(page)f(31\).)225 2180 y Fp(\017)60 -b Ft(Bash)29 b(con)m(tains)h(the)f(`)p Fs(<>)p Ft(')f(redirection)i(op) -s(erator,)f(allo)m(wing)i(a)e(\014le)g(to)g(b)s(e)f(op)s(ened)g(for)h -(b)s(oth)f(read-)330 2290 y(ing)35 b(and)f(writing,)i(and)e(the)h(`)p -Fs(&>)p Ft(')g(redirection)g(op)s(erator,)h(for)f(directing)g(standard) -f(output)h(and)330 2399 y(standard)30 b(error)g(to)h(the)f(same)h -(\014le)f(\(see)i(Section)f(3.6)g([Redirections],)h(page)g(31\).)225 -2527 y Fp(\017)60 b Ft(Bash)21 b(includes)f(the)h(`)p -Fs(<<<)p Ft(')g(redirection)g(op)s(erator,)i(allo)m(wing)g(a)e(string)f -(to)i(b)s(e)e(used)g(as)h(the)g(standard)330 2637 y(input)29 -b(to)j(a)e(command.)225 2765 y Fp(\017)60 b Ft(Bash)29 -b(implemen)m(ts)h(the)f(`)p Fs([n]<&)p Fi(word)11 b Ft(')26 -b(and)j(`)p Fs([n]>&)p Fi(word)11 b Ft(')26 b(redirection)k(op)s -(erators,)g(whic)m(h)e(mo)m(v)m(e)330 2874 y(one)j(\014le)f(descriptor) -g(to)h(another.)225 3002 y Fp(\017)60 b Ft(Bash)25 b(treats)h(a)f(n)m -(um)m(b)s(er)e(of)i(\014lenames)g(sp)s(ecially)g(when)f(they)h(are)g -(used)f(in)g(redirection)i(op)s(erators)330 3112 y(\(see)31 -b(Section)h(3.6)f([Redirections],)h(page)f(31\).)225 -3240 y Fp(\017)60 b Ft(Bash)33 b(can)f(op)s(en)g(net)m(w)m(ork)i -(connections)f(to)h(arbitrary)e(mac)m(hines)h(and)f(services)h(with)f -(the)h(redi-)330 3349 y(rection)e(op)s(erators)g(\(see)g(Section)g(3.6) -h([Redirections],)g(page)f(31\).)225 3477 y Fp(\017)60 -b Ft(The)29 b Fs(noclobber)e Ft(option)j(is)g(a)m(v)-5 +Ft(!)p Fu('.)225 536 y Fq(\017)60 b Fu(Bash)38 b(implemen)m(ts)g(the)g +(full)g(set)g(of)g Fm(posix)f Fu(\014lename)h(expansion)g(op)s +(erators,)i(including)d Fr(c)m(har-)330 646 y(acter)i(classes)p +Fu(,)j Fr(equiv)-5 b(alence)39 b(classes)p Fu(,)j(and)37 +b Fr(collating)k(sym)m(b)s(ols)g Fu(\(see)e(Section)g(3.5.8)h +([Filename)330 756 y(Expansion],)30 b(page)h(29\).)225 +883 y Fq(\017)60 b Fu(Bash)35 b(implemen)m(ts)g(extended)g(pattern)g +(matc)m(hing)h(features)f(when)f(the)h Ft(extglob)d Fu(shell)j(option) +330 993 y(is)30 b(enabled)h(\(see)g(Section)g(3.5.8.1)i([P)m(attern)f +(Matc)m(hing],)g(page)f(30\).)225 1121 y Fq(\017)60 b +Fu(It)22 b(is)g(p)s(ossible)g(to)h(ha)m(v)m(e)g(a)f(v)-5 +b(ariable)23 b(and)f(a)g(function)g(with)g(the)g(same)g(name;)j +Ft(sh)d Fu(do)s(es)g(not)g(separate)330 1230 y(the)31 +b(t)m(w)m(o)g(name)g(spaces.)225 1358 y Fq(\017)60 b +Fu(Bash)30 b(functions)e(are)i(p)s(ermitted)f(to)h(ha)m(v)m(e)h(lo)s +(cal)g(v)-5 b(ariables)30 b(using)f(the)g Ft(local)f +Fu(builtin,)i(and)e(th)m(us)330 1468 y(useful)i(recursiv)m(e)g +(functions)g(ma)m(y)h(b)s(e)f(written)g(\(see)i(Section)f(4.2)g([Bash)g +(Builtins],)g(page)h(48\).)225 1596 y Fq(\017)60 b Fu(V)-8 +b(ariable)25 b(assignmen)m(ts)g(preceding)e(commands)h(a\013ect)h(only) +f(that)g(command,)h(ev)m(en)f(builtins)g(and)330 1705 +y(functions)36 b(\(see)h(Section)g(3.7.4)h([En)m(vironmen)m(t],)h(page) +e(37\).)60 b(In)35 b Ft(sh)p Fu(,)j(all)f(v)-5 b(ariable)37 +b(assignmen)m(ts)330 1815 y(preceding)30 b(commands)g(are)h(global)h +(unless)d(the)i(command)f(is)h(executed)g(from)f(the)g(\014le)h +(system.)225 1943 y Fq(\017)60 b Fu(Bash)44 b(p)s(erforms)e(\014lename) +i(expansion)f(on)h(\014lenames)g(sp)s(eci\014ed)f(as)h(op)s(erands)e +(to)j(input)e(and)330 2052 y(output)30 b(redirection)h(op)s(erators)g +(\(see)g(Section)g(3.6)h([Redirections],)g(page)f(31\).)225 +2180 y Fq(\017)60 b Fu(Bash)29 b(con)m(tains)h(the)f(`)p +Ft(<>)p Fu(')f(redirection)i(op)s(erator,)f(allo)m(wing)i(a)e(\014le)g +(to)g(b)s(e)f(op)s(ened)g(for)h(b)s(oth)f(read-)330 2290 +y(ing)35 b(and)f(writing,)i(and)e(the)h(`)p Ft(&>)p Fu(')g(redirection) +g(op)s(erator,)h(for)f(directing)g(standard)f(output)h(and)330 +2399 y(standard)30 b(error)g(to)h(the)f(same)h(\014le)f(\(see)i +(Section)f(3.6)g([Redirections],)h(page)g(31\).)225 2527 +y Fq(\017)60 b Fu(Bash)21 b(includes)f(the)h(`)p Ft(<<<)p +Fu(')g(redirection)g(op)s(erator,)i(allo)m(wing)g(a)e(string)f(to)i(b)s +(e)e(used)g(as)h(the)g(standard)330 2637 y(input)29 b(to)j(a)e +(command.)225 2765 y Fq(\017)60 b Fu(Bash)32 b(implemen)m(ts)f(the)h(`) +p Ft([n]<&)p Fj(word)p Fu(')d(and)i(`)p Ft([n]>&)p Fj(word)p +Fu(')e(redirection)j(op)s(erators,)g(whic)m(h)f(mo)m(v)m(e)330 +2874 y(one)g(\014le)f(descriptor)g(to)h(another.)225 +3002 y Fq(\017)60 b Fu(Bash)25 b(treats)h(a)f(n)m(um)m(b)s(er)e(of)i +(\014lenames)g(sp)s(ecially)g(when)f(they)h(are)g(used)f(in)g +(redirection)i(op)s(erators)330 3112 y(\(see)31 b(Section)h(3.6)f +([Redirections],)h(page)f(31\).)225 3240 y Fq(\017)60 +b Fu(Bash)33 b(can)f(op)s(en)g(net)m(w)m(ork)i(connections)f(to)h +(arbitrary)e(mac)m(hines)h(and)f(services)h(with)f(the)h(redi-)330 +3349 y(rection)e(op)s(erators)g(\(see)g(Section)g(3.6)h +([Redirections],)g(page)f(31\).)225 3477 y Fq(\017)60 +b Fu(The)29 b Ft(noclobber)e Fu(option)j(is)g(a)m(v)-5 b(ailable)32 b(to)e(a)m(v)m(oid)h(o)m(v)m(erwriting)g(existing)g (\014les)e(with)h(output)f(redi-)330 3587 y(rection)39 -b(\(see)h(Section)f(4.3.1)h([The)e(Set)h(Builtin],)i(page)e(59\).)66 -b(The)38 b(`)p Fs(>|)p Ft(')h(redirection)g(op)s(erator)330 +b(\(see)h(Section)f(4.3.1)h([The)e(Set)h(Builtin],)i(page)e(58\).)66 +b(The)38 b(`)p Ft(>|)p Fu(')h(redirection)g(op)s(erator)330 3696 y(ma)m(y)31 b(b)s(e)f(used)f(to)i(o)m(v)m(erride)h -Fs(noclobber)p Ft(.)225 3824 y Fp(\017)60 b Ft(The)34 -b(Bash)g Fs(cd)g Ft(and)f Fs(pwd)g Ft(builtins)h(\(see)h(Section)g(4.1) +Ft(noclobber)p Fu(.)225 3824 y Fq(\017)60 b Fu(The)34 +b(Bash)g Ft(cd)g Fu(and)f Ft(pwd)g Fu(builtins)h(\(see)h(Section)g(4.1) g([Bourne)g(Shell)f(Builtins],)h(page)g(41\))h(eac)m(h)330 -3934 y(tak)m(e)c(`)p Fs(-L)p Ft(')e(and)g(`)p Fs(-P)p -Ft(')g(options)h(to)g(switc)m(h)g(b)s(et)m(w)m(een)g(logical)i(and)c -(ph)m(ysical)i(mo)s(des.)225 4061 y Fp(\017)60 b Ft(Bash)25 -b(allo)m(ws)h(a)g(function)e(to)i(o)m(v)m(erride)g(a)g(builtin)e(with)h -(the)g(same)g(name,)i(and)d(pro)m(vides)h(access)h(to)330 -4171 y(that)34 b(builtin's)f(functionalit)m(y)h(within)f(the)g -(function)g(via)h(the)f Fs(builtin)f Ft(and)g Fs(command)g -Ft(builtins)330 4281 y(\(see)f(Section)h(4.2)f([Bash)g(Builtins],)g -(page)g(48\).)225 4408 y Fp(\017)60 b Ft(The)35 b Fs(command)e -Ft(builtin)i(allo)m(ws)i(selectiv)m(e)h(disabling)e(of)f(functions)g -(when)g(command)g(lo)s(okup)g(is)330 4518 y(p)s(erformed)29 -b(\(see)i(Section)g(4.2)h([Bash)f(Builtins],)g(page)g(48\).)225 -4646 y Fp(\017)60 b Ft(Individual)23 b(builtins)g(ma)m(y)i(b)s(e)e -(enabled)h(or)g(disabled)g(using)f(the)h Fs(enable)f -Ft(builtin)g(\(see)i(Section)g(4.2)330 4756 y([Bash)31 -b(Builtins],)g(page)g(48\).)225 4883 y Fp(\017)60 b Ft(The)26 -b(Bash)h Fs(exec)e Ft(builtin)h(tak)m(es)i(additional)f(options)g(that) +3934 y(tak)m(e)c Ft(-L)e Fu(and)f Ft(-P)h Fu(options)h(to)g(switc)m(h)g +(b)s(et)m(w)m(een)g(logical)i(and)c(ph)m(ysical)i(mo)s(des.)225 +4061 y Fq(\017)60 b Fu(Bash)25 b(allo)m(ws)h(a)g(function)e(to)i(o)m(v) +m(erride)g(a)g(builtin)e(with)h(the)g(same)g(name,)i(and)d(pro)m(vides) +h(access)h(to)330 4171 y(that)34 b(builtin's)f(functionalit)m(y)h +(within)f(the)g(function)g(via)h(the)f Ft(builtin)f Fu(and)g +Ft(command)g Fu(builtins)330 4281 y(\(see)f(Section)h(4.2)f([Bash)g +(Builtins],)g(page)g(48\).)225 4408 y Fq(\017)60 b Fu(The)35 +b Ft(command)e Fu(builtin)i(allo)m(ws)i(selectiv)m(e)h(disabling)e(of)f +(functions)g(when)g(command)g(lo)s(okup)g(is)330 4518 +y(p)s(erformed)29 b(\(see)i(Section)g(4.2)h([Bash)f(Builtins],)g(page)g +(48\).)225 4646 y Fq(\017)60 b Fu(Individual)23 b(builtins)g(ma)m(y)i +(b)s(e)e(enabled)h(or)g(disabled)g(using)f(the)h Ft(enable)f +Fu(builtin)g(\(see)i(Section)g(4.2)330 4756 y([Bash)31 +b(Builtins],)g(page)g(48\).)225 4883 y Fq(\017)60 b Fu(The)26 +b(Bash)h Ft(exec)e Fu(builtin)h(tak)m(es)i(additional)f(options)g(that) g(allo)m(w)h(users)d(to)j(con)m(trol)g(the)e(con)m(ten)m(ts)330 4993 y(of)35 b(the)f(en)m(vironmen)m(t)h(passed)f(to)h(the)g(executed)g (command,)h(and)d(what)i(the)f(zeroth)h(argumen)m(t)330 5103 y(to)c(the)g(command)f(is)g(to)h(b)s(e)f(\(see)h(Section)h(4.1)f ([Bourne)f(Shell)h(Builtins],)g(page)g(41\).)225 5230 -y Fp(\017)60 b Ft(Shell)29 b(functions)g(ma)m(y)h(b)s(e)f(exp)s(orted)g +y Fq(\017)60 b Fu(Shell)29 b(functions)g(ma)m(y)h(b)s(e)f(exp)s(orted)g (to)h(c)m(hildren)f(via)h(the)g(en)m(vironmen)m(t)g(using)f -Fs(export)f(-f)h Ft(\(see)330 5340 y(Section)i(3.3)h([Shell)e(F)-8 +Ft(export)f(-f)h Fu(\(see)330 5340 y(Section)i(3.3)h([Shell)e(F)-8 b(unctions],)32 b(page)f(17\).)p eop end -%%Page: 150 156 -TeXDict begin 150 155 bop 150 -116 a Ft(App)s(endix)29 +%%Page: 149 155 +TeXDict begin 149 154 bop 150 -116 a Fu(App)s(endix)29 b(B:)i(Ma)5 b(jor)31 b(Di\013erences)g(F)-8 b(rom)31 -b(The)f(Bourne)g(Shell)1258 b(150)225 299 y Fp(\017)60 -b Ft(The)37 b(Bash)g Fs(export)p Ft(,)h Fs(readonly)p -Ft(,)f(and)f Fs(declare)g Ft(builtins)h(can)g(tak)m(e)i(a)f(`)p -Fs(-f)p Ft(')f(option)h(to)g(act)g(on)330 408 y(shell)26 -b(functions,)g(a)h(`)p Fs(-p)p Ft(')e(option)h(to)h(displa)m(y)f(v)-5 -b(ariables)26 b(with)g(v)-5 b(arious)25 b(attributes)i(set)f(in)f(a)i -(format)330 518 y(that)g(can)f(b)s(e)f(used)h(as)g(shell)g(input,)h(a)f -(`)p Fs(-n)p Ft(')g(option)g(to)h(remo)m(v)m(e)h(v)-5 -b(arious)26 b(v)-5 b(ariable)27 b(attributes,)h(and)330 -628 y(`)p Fs(name=value)p Ft(')g(argumen)m(ts)j(to)g(set)g(v)-5 +b(The)f(Bourne)g(Shell)1258 b(149)225 299 y Fq(\017)60 +b Fu(The)40 b(Bash)h Ft(export)p Fu(,)h Ft(readonly)p +Fu(,)f(and)g Ft(declare)d Fu(builtins)j(can)g(tak)m(e)h(a)f +Ft(-f)f Fu(option)i(to)f(act)h(on)330 408 y(shell)30 +b(functions,)f(a)h Ft(-p)f Fu(option)g(to)i(displa)m(y)e(v)-5 +b(ariables)30 b(with)f(v)-5 b(arious)30 b(attributes)g(set)g(in)f(a)h +(format)330 518 y(that)g(can)g(b)s(e)f(used)g(as)g(shell)h(input,)f(a)h +Ft(-n)f Fu(option)h(to)g(remo)m(v)m(e)h(v)-5 b(arious)30 +b(v)-5 b(ariable)30 b(attributes,)h(and)330 628 y(`)p +Ft(name=value)p Fu(')d(argumen)m(ts)j(to)g(set)g(v)-5 b(ariable)31 b(attributes)g(and)f(v)-5 b(alues)30 b(sim)m(ultaneously) --8 b(.)225 765 y Fp(\017)60 b Ft(The)42 b(Bash)h Fs(hash)f -Ft(builtin)g(allo)m(ws)j(a)e(name)g(to)g(b)s(e)f(asso)s(ciated)j(with)d +-8 b(.)225 765 y Fq(\017)60 b Fu(The)42 b(Bash)h Ft(hash)f +Fu(builtin)g(allo)m(ws)j(a)e(name)g(to)g(b)s(e)f(asso)s(ciated)j(with)d (an)h(arbitrary)f(\014lename,)330 874 y(ev)m(en)30 b(when)e(that)h (\014lename)g(cannot)h(b)s(e)e(found)g(b)m(y)h(searc)m(hing)g(the)g -Fs($PATH)p Ft(,)g(using)f(`)p Fs(hash)h(-p)p Ft(')g(\(see)330 +Ft($PATH)p Fu(,)g(using)f(`)p Ft(hash)h(-p)p Fu(')g(\(see)330 984 y(Section)i(4.1)h([Bourne)e(Shell)g(Builtins],)h(page)h(41\).)225 -1121 y Fp(\017)60 b Ft(Bash)27 b(includes)f(a)i Fs(help)d -Ft(builtin)i(for)f(quic)m(k)h(reference)h(to)f(shell)g(facilities)i +1121 y Fq(\017)60 b Fu(Bash)27 b(includes)f(a)i Ft(help)d +Fu(builtin)i(for)f(quic)m(k)h(reference)h(to)f(shell)g(facilities)i (\(see)f(Section)g(4.2)g([Bash)330 1230 y(Builtins],)j(page)g(48\).)225 -1367 y Fp(\017)60 b Ft(The)42 b Fs(printf)g Ft(builtin)g(is)h(a)m(v)-5 +1367 y Fq(\017)60 b Fu(The)42 b Ft(printf)g Fu(builtin)g(is)h(a)m(v)-5 b(ailable)45 b(to)f(displa)m(y)f(formatted)g(output)g(\(see)h(Section)g (4.2)g([Bash)330 1477 y(Builtins],)31 b(page)g(48\).)225 -1614 y Fp(\017)60 b Ft(The)26 b(Bash)h Fs(read)f Ft(builtin)g(\(see)i +1614 y Fq(\017)60 b Fu(The)26 b(Bash)h Ft(read)f Fu(builtin)g(\(see)i (Section)g(4.2)g([Bash)f(Builtins],)h(page)g(48\))g(will)f(read)g(a)g -(line)g(ending)330 1724 y(in)f(`)p Fs(\\)p Ft(')h(with)f(the)g(`)p -Fs(-r)p Ft(')h(option,)h(and)d(will)i(use)f(the)h Fs(REPLY)e -Ft(v)-5 b(ariable)27 b(as)g(a)f(default)h(if)f(no)h(non-option)330 -1833 y(argumen)m(ts)k(are)h(supplied.)42 b(The)30 b(Bash)i -Fs(read)e Ft(builtin)g(also)j(accepts)f(a)g(prompt)e(string)h(with)g -(the)330 1943 y(`)p Fs(-p)p Ft(')k(option)g(and)f(will)h(use)g -(Readline)g(to)h(obtain)f(the)g(line)g(when)f(giv)m(en)i(the)f(`)p -Fs(-e)p Ft(')g(option.)54 b(The)330 2052 y Fs(read)31 -b Ft(builtin)h(also)i(has)e(additional)h(options)g(to)g(con)m(trol)h -(input:)44 b(the)32 b(`)p Fs(-s)p Ft(')h(option)f(will)h(turn)f(o\013) -330 2162 y(ec)m(hoing)38 b(of)e(input)f(c)m(haracters)j(as)e(they)h -(are)f(read,)i(the)e(`)p Fs(-t)p Ft(')g(option)h(will)g(allo)m(w)g -Fs(read)e Ft(to)i(time)330 2271 y(out)c(if)g(input)f(do)s(es)g(not)h -(arriv)m(e)g(within)g(a)g(sp)s(eci\014ed)f(n)m(um)m(b)s(er)f(of)i -(seconds,)h(the)f(`)p Fs(-n)p Ft(')f(option)i(will)330 -2381 y(allo)m(w)29 b(reading)e(only)h(a)g(sp)s(eci\014ed)e(n)m(um)m(b)s -(er)g(of)i(c)m(haracters)h(rather)e(than)g(a)h(full)f(line,)i(and)d -(the)i(`)p Fs(-d)p Ft(')330 2491 y(option)j(will)g(read)f(un)m(til)g(a) -h(particular)g(c)m(haracter)h(rather)e(than)g(newline.)225 -2628 y Fp(\017)60 b Ft(The)33 b Fs(return)e Ft(builtin)i(ma)m(y)g(b)s -(e)g(used)f(to)i(ab)s(ort)f(execution)h(of)f(scripts)g(executed)h(with) -f(the)g Fs(.)g Ft(or)330 2737 y Fs(source)c Ft(builtins)g(\(see)j -(Section)f(4.1)g([Bourne)g(Shell)f(Builtins],)h(page)g(41\).)225 -2874 y Fp(\017)60 b Ft(Bash)43 b(includes)g(the)g Fs(shopt)f -Ft(builtin,)k(for)d(\014ner)f(con)m(trol)j(of)e(shell)h(optional)g +(line)g(ending)330 1724 y(in)i(`)p Ft(\\)p Fu(')h(with)f(the)g +Ft(-r)g Fu(option,)i(and)d(will)i(use)f(the)h Ft(REPLY)e +Fu(v)-5 b(ariable)30 b(as)g(a)f(default)h(if)f(no)h(non-option)330 +1833 y(argumen)m(ts)h(are)h(supplied.)42 b(The)30 b(Bash)i +Ft(read)e Fu(builtin)g(also)j(accepts)f(a)g(prompt)e(string)h(with)g +(the)330 1943 y Ft(-p)c Fu(option)h(and)f(will)g(use)h(Readline)g(to)g +(obtain)g(the)g(line)f(when)g(giv)m(en)h(the)g Ft(-e)f +Fu(option.)40 b(The)27 b Ft(read)330 2052 y Fu(builtin)h(also)i(has)e +(additional)i(options)f(to)g(con)m(trol)h(input:)39 b(the)29 +b Ft(-s)f Fu(option)h(will)g(turn)e(o\013)j(ec)m(hoing)330 +2162 y(of)f(input)f(c)m(haracters)j(as)e(they)g(are)h(read,)f(the)g +Ft(-t)g Fu(option)g(will)h(allo)m(w)g Ft(read)e Fu(to)i(time)g(out)f +(if)g(input)330 2271 y(do)s(es)i(not)h(arriv)m(e)g(within)f(a)h(sp)s +(eci\014ed)f(n)m(um)m(b)s(er)f(of)i(seconds,)g(the)f +Ft(-n)g Fu(option)h(will)g(allo)m(w)h(reading)330 2381 +y(only)38 b(a)g(sp)s(eci\014ed)f(n)m(um)m(b)s(er)f(of)i(c)m(haracters)h +(rather)e(than)g(a)h(full)g(line,)i(and)d(the)h Ft(-d)f +Fu(option)h(will)330 2491 y(read)30 b(un)m(til)h(a)g(particular)f(c)m +(haracter)i(rather)f(than)f(newline.)225 2628 y Fq(\017)60 +b Fu(The)33 b Ft(return)e Fu(builtin)i(ma)m(y)g(b)s(e)g(used)f(to)i(ab) +s(ort)f(execution)h(of)f(scripts)g(executed)h(with)f(the)g +Ft(.)g Fu(or)330 2737 y Ft(source)c Fu(builtins)g(\(see)j(Section)f +(4.1)g([Bourne)g(Shell)f(Builtins],)h(page)g(41\).)225 +2874 y Fq(\017)60 b Fu(Bash)43 b(includes)g(the)g Ft(shopt)f +Fu(builtin,)k(for)d(\014ner)f(con)m(trol)j(of)e(shell)h(optional)g (capabilities)h(\(see)330 2984 y(Section)c(4.3.2)g([The)f(Shopt)f -(Builtin],)k(page)d(63\),)k(and)39 b(allo)m(ws)i(these)f(options)h(to)f +(Builtin],)k(page)d(62\),)k(and)39 b(allo)m(ws)i(these)f(options)h(to)f (b)s(e)f(set)i(and)330 3093 y(unset)30 b(at)h(shell)g(in)m(v)m(o)s (cation)h(\(see)f(Section)h(6.1)f([In)m(v)m(oking)g(Bash],)g(page)h -(80\).)225 3230 y Fp(\017)60 b Ft(Bash)45 b(has)f(m)m(uc)m(h)g(more)h +(80\).)225 3230 y Fq(\017)60 b Fu(Bash)45 b(has)f(m)m(uc)m(h)g(more)h (optional)h(b)s(eha)m(vior)e(con)m(trollable)j(with)e(the)f -Fs(set)g Ft(builtin)g(\(see)h(Sec-)330 3340 y(tion)31 -b(4.3.1)h([The)e(Set)h(Builtin],)g(page)g(59\).)225 3477 -y Fp(\017)60 b Ft(The)45 b(`)p Fs(-x)p Ft(')g(\(`)p Fs(xtrace)p -Ft('\))g(option)h(displa)m(ys)g(commands)f(other)h(than)f(simple)h -(commands)f(when)330 3587 y(p)s(erforming)29 b(an)h(execution)i(trace)g -(\(see)f(Section)g(4.3.1)h([The)e(Set)h(Builtin],)g(page)g(59\).)225 -3724 y Fp(\017)60 b Ft(The)28 b Fs(test)g Ft(builtin)h(\(see)h(Section) +Ft(set)g Fu(builtin)g(\(see)h(Sec-)330 3340 y(tion)31 +b(4.3.1)h([The)e(Set)h(Builtin],)g(page)g(58\).)225 3477 +y Fq(\017)60 b Fu(The)31 b(`)p Ft(-x)p Fu(')g(\()p Ft(xtrace)p +Fu(\))g(option)h(displa)m(ys)f(commands)h(other)f(than)h(simple)f +(commands)g(when)g(p)s(er-)330 3587 y(forming)f(an)g(execution)i(trace) +f(\(see)h(Section)f(4.3.1)h([The)e(Set)h(Builtin],)g(page)g(58\).)225 +3724 y Fq(\017)60 b Fu(The)28 b Ft(test)g Fu(builtin)h(\(see)h(Section) f(4.1)h([Bourne)f(Shell)g(Builtins],)h(page)g(41\))g(is)f(sligh)m(tly)h (di\013eren)m(t,)330 3833 y(as)23 b(it)g(implemen)m(ts)f(the)h -Fl(posix)f Ft(algorithm,)j(whic)m(h)d(sp)s(eci\014es)g(the)h(b)s(eha)m +Fm(posix)f Fu(algorithm,)j(whic)m(h)d(sp)s(eci\014es)g(the)h(b)s(eha)m (vior)f(based)g(on)h(the)f(n)m(um)m(b)s(er)330 3943 y(of)31 -b(argumen)m(ts.)225 4080 y Fp(\017)60 b Ft(Bash)31 b(includes)g(the)h -Fs(caller)d Ft(builtin,)j(whic)m(h)f(displa)m(ys)g(the)g(con)m(text)i +b(argumen)m(ts.)225 4080 y Fq(\017)60 b Fu(Bash)31 b(includes)g(the)h +Ft(caller)d Fu(builtin,)j(whic)m(h)f(displa)m(ys)g(the)g(con)m(text)i (of)f(an)m(y)g(activ)m(e)h(subroutine)330 4189 y(call)28 b(\(a)f(shell)f(function)h(or)f(a)h(script)f(executed)h(with)f(the)h -Fs(.)f Ft(or)g Fs(source)f Ft(builtins\).)39 b(This)26 +Ft(.)f Fu(or)g Ft(source)f Fu(builtins\).)39 b(This)26 b(supp)s(orts)330 4299 y(the)31 b(bash)e(debugger.)225 -4436 y Fp(\017)60 b Ft(The)42 b Fs(trap)f Ft(builtin)h(\(see)i(Section) +4436 y Fq(\017)60 b Fu(The)42 b Ft(trap)f Fu(builtin)h(\(see)i(Section) f(4.1)h([Bourne)e(Shell)g(Builtins],)47 b(page)c(41\))h(allo)m(ws)g(a)e -Fs(DEBUG)330 4545 y Ft(pseudo-signal)c(sp)s(eci\014cation,)i(similar)e -(to)g Fs(EXIT)p Ft(.)62 b(Commands)36 b(sp)s(eci\014ed)h(with)g(a)h -Fs(DEBUG)e Ft(trap)330 4655 y(are)k(executed)g(b)s(efore)f(ev)m(ery)h -(simple)f(command,)j Fs(for)c Ft(command,)k Fs(case)c -Ft(command,)k Fs(select)330 4765 y Ft(command,)35 b(ev)m(ery)g -(arithmetic)g Fs(for)e Ft(command,)i(and)f(b)s(efore)g(the)g(\014rst)f +Ft(DEBUG)330 4545 y Fu(pseudo-signal)c(sp)s(eci\014cation,)i(similar)e +(to)g Ft(EXIT)p Fu(.)62 b(Commands)36 b(sp)s(eci\014ed)h(with)g(a)h +Ft(DEBUG)e Fu(trap)330 4655 y(are)k(executed)g(b)s(efore)f(ev)m(ery)h +(simple)f(command,)j Ft(for)c Fu(command,)k Ft(case)c +Fu(command,)k Ft(select)330 4765 y Fu(command,)35 b(ev)m(ery)g +(arithmetic)g Ft(for)e Fu(command,)i(and)f(b)s(efore)g(the)g(\014rst)f (command)h(executes)h(in)330 4874 y(a)29 b(shell)g(function.)40 -b(The)28 b Fs(DEBUG)g Ft(trap)g(is)h(not)g(inherited)f(b)m(y)h(shell)g +b(The)28 b Ft(DEBUG)g Fu(trap)g(is)h(not)g(inherited)f(b)m(y)h(shell)g (functions)f(unless)g(the)h(function)330 4984 y(has)35 -b(b)s(een)g(giv)m(en)i(the)f Fs(trace)e Ft(attribute)i(or)g(the)g -Fs(functrace)d Ft(option)j(has)f(b)s(een)g(enabled)g(using)330 -5093 y(the)28 b Fs(shopt)e Ft(builtin.)39 b(The)27 b -Fs(extdebug)f Ft(shell)i(option)g(has)f(additional)h(e\013ects)h(on)f -(the)g Fs(DEBUG)e Ft(trap.)330 5230 y(The)21 b Fs(trap)e -Ft(builtin)i(\(see)h(Section)g(4.1)g([Bourne)f(Shell)g(Builtins],)j -(page)e(41\))g(allo)m(ws)g(an)f Fs(ERR)f Ft(pseudo-)330 +b(b)s(een)g(giv)m(en)i(the)f Ft(trace)e Fu(attribute)i(or)g(the)g +Ft(functrace)d Fu(option)j(has)f(b)s(een)g(enabled)g(using)330 +5093 y(the)28 b Ft(shopt)e Fu(builtin.)39 b(The)27 b +Ft(extdebug)f Fu(shell)i(option)g(has)f(additional)h(e\013ects)h(on)f +(the)g Ft(DEBUG)e Fu(trap.)330 5230 y(The)21 b Ft(trap)e +Fu(builtin)i(\(see)h(Section)g(4.1)g([Bourne)f(Shell)g(Builtins],)j +(page)e(41\))g(allo)m(ws)g(an)f Ft(ERR)f Fu(pseudo-)330 5340 y(signal)30 b(sp)s(eci\014cation,)h(similar)f(to)g -Fs(EXIT)f Ft(and)g Fs(DEBUG)p Ft(.)39 b(Commands)28 b(sp)s(eci\014ed)h -(with)g(an)g Fs(ERR)g Ft(trap)p eop end -%%Page: 151 157 -TeXDict begin 151 156 bop 150 -116 a Ft(App)s(endix)29 +Ft(EXIT)f Fu(and)g Ft(DEBUG)p Fu(.)39 b(Commands)28 b(sp)s(eci\014ed)h +(with)g(an)g Ft(ERR)g Fu(trap)p eop end +%%Page: 150 156 +TeXDict begin 150 155 bop 150 -116 a Fu(App)s(endix)29 b(B:)i(Ma)5 b(jor)31 b(Di\013erences)g(F)-8 b(rom)31 -b(The)f(Bourne)g(Shell)1258 b(151)330 299 y(are)40 b(executed)g(after)g +b(The)f(Bourne)g(Shell)1258 b(150)330 299 y(are)40 b(executed)g(after)g (a)f(simple)h(command)f(fails,)j(with)d(a)h(few)f(exceptions.)68 -b(The)39 b Fs(ERR)g Ft(trap)g(is)330 408 y(not)g(inherited)f(b)m(y)h -(shell)g(functions)f(unless)g(the)h Fs(-o)29 b(errtrace)37 -b Ft(option)i(to)g(the)g Fs(set)f Ft(builtin)g(is)330 -518 y(enabled.)330 650 y(The)g Fs(trap)g Ft(builtin)h(\(see)g(Section)h +b(The)39 b Ft(ERR)g Fu(trap)g(is)330 408 y(not)g(inherited)f(b)m(y)h +(shell)g(functions)f(unless)g(the)h Ft(-o)29 b(errtrace)37 +b Fu(option)i(to)g(the)g Ft(set)f Fu(builtin)g(is)330 +518 y(enabled.)330 650 y(The)g Ft(trap)g Fu(builtin)h(\(see)g(Section)h (4.1)g([Bourne)f(Shell)g(Builtins],)i(page)f(41\))g(allo)m(ws)g(a)g -Fs(RETURN)330 760 y Ft(pseudo-signal)35 b(sp)s(eci\014cation,)j -(similar)d(to)h Fs(EXIT)e Ft(and)g Fs(DEBUG)p Ft(.)54 +Ft(RETURN)330 760 y Fu(pseudo-signal)35 b(sp)s(eci\014cation,)j +(similar)d(to)h Ft(EXIT)e Fu(and)g Ft(DEBUG)p Fu(.)54 b(Commands)34 b(sp)s(eci\014ed)g(with)h(an)330 869 y -Fs(RETURN)k Ft(trap)i(are)g(executed)h(b)s(efore)e(execution)i(resumes) +Ft(RETURN)k Fu(trap)i(are)g(executed)h(b)s(efore)e(execution)i(resumes) e(after)h(a)g(shell)g(function)g(or)g(a)g(shell)330 979 -y(script)36 b(executed)g(with)g Fs(.)f Ft(or)h Fs(source)e -Ft(returns.)56 b(The)35 b Fs(RETURN)f Ft(trap)i(is)g(not)g(inherited)f +y(script)36 b(executed)g(with)g Ft(.)f Fu(or)h Ft(source)e +Fu(returns.)56 b(The)35 b Ft(RETURN)f Fu(trap)i(is)g(not)g(inherited)f (b)m(y)h(shell)330 1088 y(functions)k(unless)h(the)g(function)f(has)h -(b)s(een)f(giv)m(en)i(the)f Fs(trace)e Ft(attribute)j(or)e(the)h -Fs(functrace)330 1198 y Ft(option)31 b(has)f(b)s(een)g(enabled)g(using) -g(the)g Fs(shopt)f Ft(builtin.)225 1330 y Fp(\017)60 -b Ft(The)30 b(Bash)g Fs(type)f Ft(builtin)h(is)g(more)g(extensiv)m(e)i +(b)s(een)f(giv)m(en)i(the)f Ft(trace)e Fu(attribute)j(or)e(the)h +Ft(functrace)330 1198 y Fu(option)31 b(has)f(b)s(een)g(enabled)g(using) +g(the)g Ft(shopt)f Fu(builtin.)225 1330 y Fq(\017)60 +b Fu(The)30 b(Bash)g Ft(type)f Fu(builtin)h(is)g(more)g(extensiv)m(e)i (and)d(giv)m(es)j(more)e(information)h(ab)s(out)f(the)g(names)330 1440 y(it)h(\014nds)e(\(see)i(Section)g(4.2)h([Bash)e(Builtins],)i -(page)f(48\).)225 1571 y Fp(\017)60 b Ft(The)34 b(Bash)h -Fs(umask)e Ft(builtin)h(p)s(ermits)g(a)g(`)p Fs(-p)p -Ft(')h(option)g(to)g(cause)g(the)g(output)f(to)h(b)s(e)f(displa)m(y)m -(ed)h(in)330 1681 y(the)g(form)g(of)g(a)h Fs(umask)e -Ft(command)h(that)g(ma)m(y)h(b)s(e)f(reused)f(as)h(input)g(\(see)h -(Section)g(4.1)g([Bourne)330 1791 y(Shell)30 b(Builtins],)h(page)h -(41\).)225 1923 y Fp(\017)60 b Ft(Bash)34 b(implemen)m(ts)h(a)g -Fs(csh)p Ft(-lik)m(e)g(directory)f(stac)m(k,)j(and)d(pro)m(vides)g(the) -g Fs(pushd)p Ft(,)g Fs(popd)p Ft(,)g(and)g Fs(dirs)330 -2032 y Ft(builtins)g(to)i(manipulate)f(it)h(\(see)f(Section)h(6.8)g -([The)f(Directory)h(Stac)m(k],)i(page)d(91\).)56 b(Bash)35 -b(also)330 2142 y(mak)m(es)c(the)g(directory)g(stac)m(k)g(visible)g(as) -g(the)f(v)-5 b(alue)31 b(of)g(the)f Fs(DIRSTACK)f Ft(shell)h(v)-5 -b(ariable.)225 2274 y Fp(\017)60 b Ft(Bash)28 b(in)m(terprets)h(sp)s -(ecial)g(bac)m(kslash-escap)s(ed)g(c)m(haracters)g(in)f(the)h(prompt)e -(strings)h(when)f(in)m(ter-)330 2383 y(activ)m(e)33 b(\(see)e(Section)g -(6.9)h([Con)m(trolling)f(the)g(Prompt],)f(page)h(92\).)225 -2515 y Fp(\017)60 b Ft(The)46 b(Bash)h(restricted)g(mo)s(de)f(is)h +(page)f(48\).)225 1571 y Fq(\017)60 b Fu(The)27 b(Bash)h +Ft(umask)e Fu(builtin)h(p)s(ermits)g(a)h Ft(-p)f Fu(option)h(to)h +(cause)f(the)g(output)f(to)h(b)s(e)f(displa)m(y)m(ed)h(in)g(the)330 +1681 y(form)i(of)h(a)g Ft(umask)f Fu(command)g(that)i(ma)m(y)f(b)s(e)f +(reused)g(as)h(input)f(\(see)i(Section)f(4.1)h([Bourne)f(Shell)330 +1791 y(Builtins],)g(page)g(41\).)225 1923 y Fq(\017)60 +b Fu(Bash)34 b(implemen)m(ts)h(a)g Ft(csh)p Fu(-lik)m(e)g(directory)f +(stac)m(k,)j(and)d(pro)m(vides)g(the)g Ft(pushd)p Fu(,)g +Ft(popd)p Fu(,)g(and)g Ft(dirs)330 2032 y Fu(builtins)g(to)i +(manipulate)f(it)h(\(see)f(Section)h(6.8)g([The)f(Directory)h(Stac)m +(k],)i(page)d(90\).)56 b(Bash)35 b(also)330 2142 y(mak)m(es)c(the)g +(directory)g(stac)m(k)g(visible)g(as)g(the)f(v)-5 b(alue)31 +b(of)g(the)f Ft(DIRSTACK)f Fu(shell)h(v)-5 b(ariable.)225 +2274 y Fq(\017)60 b Fu(Bash)28 b(in)m(terprets)h(sp)s(ecial)g(bac)m +(kslash-escap)s(ed)g(c)m(haracters)g(in)f(the)h(prompt)e(strings)h +(when)f(in)m(ter-)330 2383 y(activ)m(e)33 b(\(see)e(Section)g(6.9)h +([Con)m(trolling)f(the)g(Prompt],)f(page)h(92\).)225 +2515 y Fq(\017)60 b Fu(The)46 b(Bash)h(restricted)g(mo)s(de)f(is)h (more)f(useful)g(\(see)h(Section)h(6.10)g([The)e(Restricted)i(Shell],) 330 2625 y(page)31 b(93\);)h(the)f(SVR4.2)g(shell)f(restricted)h(mo)s -(de)f(is)h(to)s(o)g(limited.)225 2757 y Fp(\017)60 b -Ft(The)30 b Fs(disown)f Ft(builtin)h(can)h(remo)m(v)m(e)h(a)f(job)f +(de)f(is)h(to)s(o)g(limited.)225 2757 y Fq(\017)60 b +Fu(The)30 b Ft(disown)f Fu(builtin)h(can)h(remo)m(v)m(e)h(a)f(job)f (from)g(the)h(in)m(ternal)g(shell)g(job)f(table)i(\(see)f(Section)h -(7.2)330 2866 y([Job)h(Con)m(trol)h(Builtins],)g(page)g(99\))h(or)e -(suppress)e(the)i(sending)g(of)g Fs(SIGHUP)e Ft(to)j(a)g(job)f(when)f +(7.2)330 2866 y([Job)h(Con)m(trol)h(Builtins],)g(page)g(98\))h(or)e +(suppress)e(the)i(sending)g(of)g Ft(SIGHUP)e Fu(to)j(a)g(job)f(when)f (the)330 2976 y(shell)f(exits)g(as)f(the)h(result)f(of)h(a)f -Fs(SIGHUP)p Ft(.)225 3108 y Fp(\017)60 b Ft(Bash)31 b(includes)f(a)g(n) +Ft(SIGHUP)p Fu(.)225 3108 y Fq(\017)60 b Fu(Bash)31 b(includes)f(a)g(n) m(um)m(b)s(er)f(of)i(features)g(to)g(supp)s(ort)d(a)j(separate)g -(debugger)f(for)h(shell)f(scripts.)225 3240 y Fp(\017)60 -b Ft(The)28 b(SVR4.2)h(shell)f(has)g(t)m(w)m(o)i(privilege-related)g -(builtins)e(\()p Fs(mldmode)e Ft(and)i Fs(priv)p Ft(\))f(not)i(presen)m -(t)f(in)330 3350 y(Bash.)225 3482 y Fp(\017)60 b Ft(Bash)31 -b(do)s(es)f(not)g(ha)m(v)m(e)i(the)e Fs(stop)g Ft(or)g -Fs(newgrp)f Ft(builtins.)225 3613 y Fp(\017)60 b Ft(Bash)31 -b(do)s(es)f(not)g(use)g(the)h Fs(SHACCT)d Ft(v)-5 b(ariable)32 +(debugger)f(for)h(shell)f(scripts.)225 3240 y Fq(\017)60 +b Fu(The)28 b(SVR4.2)h(shell)f(has)g(t)m(w)m(o)i(privilege-related)g +(builtins)e(\()p Ft(mldmode)e Fu(and)i Ft(priv)p Fu(\))f(not)i(presen)m +(t)f(in)330 3350 y(Bash.)225 3482 y Fq(\017)60 b Fu(Bash)31 +b(do)s(es)f(not)g(ha)m(v)m(e)i(the)e Ft(stop)g Fu(or)g +Ft(newgrp)f Fu(builtins.)225 3613 y Fq(\017)60 b Fu(Bash)31 +b(do)s(es)f(not)g(use)g(the)h Ft(SHACCT)d Fu(v)-5 b(ariable)32 b(or)e(p)s(erform)f(shell)i(accoun)m(ting.)225 3745 y -Fp(\017)60 b Ft(The)30 b(SVR4.2)h Fs(sh)f Ft(uses)g(a)g -Fs(TIMEOUT)f Ft(v)-5 b(ariable)31 b(lik)m(e)h(Bash)e(uses)g -Fs(TMOUT)p Ft(.)150 3900 y(More)h(features)g(unique)e(to)i(Bash)g(ma)m +Fq(\017)60 b Fu(The)30 b(SVR4.2)h Ft(sh)f Fu(uses)g(a)g +Ft(TIMEOUT)f Fu(v)-5 b(ariable)31 b(lik)m(e)h(Bash)e(uses)g +Ft(TMOUT)p Fu(.)150 3900 y(More)h(features)g(unique)e(to)i(Bash)g(ma)m (y)g(b)s(e)f(found)f(in)h(Chapter)f(6)i([Bash)g(F)-8 -b(eatures],)32 b(page)f(80.)150 4127 y Fr(B.1)67 b(Implemen)l(tation)48 +b(eatures],)32 b(page)f(80.)150 4127 y Fs(B.1)67 b(Implemen)l(tation)48 b(Di\013erences)e(F)-11 b(rom)44 b(The)h(SVR4.2)g(Shell)150 -4287 y Ft(Since)33 b(Bash)h(is)f(a)g(completely)i(new)e(implemen)m +4287 y Fu(Since)33 b(Bash)h(is)f(a)g(completely)i(new)e(implemen)m (tation,)j(it)e(do)s(es)e(not)i(su\013er)e(from)h(man)m(y)g(of)h(the)f (limi-)150 4396 y(tations)f(of)e(the)h(SVR4.2)g(shell.)41 -b(F)-8 b(or)31 b(instance:)225 4528 y Fp(\017)60 b Ft(Bash)32 +b(F)-8 b(or)31 b(instance:)225 4528 y Fq(\017)60 b Fu(Bash)32 b(do)s(es)f(not)h(fork)f(a)h(subshell)e(when)h(redirecting)h(in)m(to)h (or)e(out)h(of)g(a)g(shell)f(con)m(trol)i(structure)330 -4638 y(suc)m(h)d(as)h(an)f Fs(if)g Ft(or)g Fs(while)f -Ft(statemen)m(t.)225 4770 y Fp(\017)60 b Ft(Bash)29 b(do)s(es)f(not)h +4638 y(suc)m(h)d(as)h(an)f Ft(if)g Fu(or)g Ft(while)f +Fu(statemen)m(t.)225 4770 y Fq(\017)60 b Fu(Bash)29 b(do)s(es)f(not)h (allo)m(w)h(un)m(balanced)f(quotes.)41 b(The)28 b(SVR4.2)h(shell)g (will)g(silen)m(tly)i(insert)d(a)h(needed)330 4879 y(closing)g(quote)g -(at)f Fs(EOF)f Ft(under)g(certain)h(circumstances.)41 +(at)f Ft(EOF)f Fu(under)g(certain)h(circumstances.)41 b(This)27 b(can)h(b)s(e)g(the)g(cause)g(of)g(some)h(hard-)330 -4989 y(to-\014nd)h(errors.)225 5121 y Fp(\017)60 b Ft(The)45 +4989 y(to-\014nd)h(errors.)225 5121 y Fq(\017)60 b Fu(The)45 b(SVR4.2)h(shell)f(uses)g(a)g(baro)s(que)g(memory)g(managemen)m(t)i(sc) -m(heme)e(based)g(on)g(trapping)330 5230 y Fs(SIGSEGV)p -Ft(.)57 b(If)35 b(the)i(shell)f(is)h(started)g(from)e(a)i(pro)s(cess)f -(with)g Fs(SIGSEGV)e Ft(blo)s(c)m(k)m(ed)k(\(e.g.,)h(b)m(y)d(using)330 -5340 y(the)31 b Fs(system\(\))d Ft(C)i(library)g(function)g(call\),)i +m(heme)e(based)g(on)g(trapping)330 5230 y Ft(SIGSEGV)p +Fu(.)57 b(If)35 b(the)i(shell)f(is)h(started)g(from)e(a)i(pro)s(cess)f +(with)g Ft(SIGSEGV)e Fu(blo)s(c)m(k)m(ed)k(\(e.g.,)h(b)m(y)d(using)330 +5340 y(the)31 b Ft(system\(\))d Fu(C)i(library)g(function)g(call\),)i (it)f(misb)s(eha)m(v)m(es)g(badly)-8 b(.)p eop end -%%Page: 152 158 -TeXDict begin 152 157 bop 150 -116 a Ft(App)s(endix)29 +%%Page: 151 157 +TeXDict begin 151 156 bop 150 -116 a Fu(App)s(endix)29 b(B:)i(Ma)5 b(jor)31 b(Di\013erences)g(F)-8 b(rom)31 -b(The)f(Bourne)g(Shell)1258 b(152)225 299 y Fp(\017)60 -b Ft(In)26 b(a)i(questionable)g(attempt)h(at)f(securit)m(y)-8 -b(,)29 b(the)e(SVR4.2)h(shell,)g(when)f(in)m(v)m(ok)m(ed)h(without)g -(the)f(`)p Fs(-p)p Ft(')330 408 y(option,)39 b(will)d(alter)i(its)e -(real)h(and)f(e\013ectiv)m(e)j Fl(uid)d Ft(and)g Fl(gid)h -Ft(if)f(they)h(are)f(less)h(than)f(some)h(magic)330 518 -y(threshold)30 b(v)-5 b(alue,)31 b(commonly)g(100.)42 -b(This)29 b(can)i(lead)g(to)g(unexp)s(ected)f(results.)225 -653 y Fp(\017)60 b Ft(The)30 b(SVR4.2)h(shell)g(do)s(es)f(not)g(allo)m -(w)i(users)e(to)h(trap)f Fs(SIGSEGV)p Ft(,)f Fs(SIGALRM)p -Ft(,)f(or)j Fs(SIGCHLD)p Ft(.)225 787 y Fp(\017)60 b -Ft(The)34 b(SVR4.2)h(shell)g(do)s(es)g(not)f(allo)m(w)j(the)d -Fs(IFS)p Ft(,)h Fs(MAILCHECK)p Ft(,)f Fs(PATH)p Ft(,)h -Fs(PS1)p Ft(,)g(or)f Fs(PS2)g Ft(v)-5 b(ariables)35 b(to)330 -897 y(b)s(e)30 b(unset.)225 1031 y Fp(\017)60 b Ft(The)30 -b(SVR4.2)h(shell)g(treats)g(`)p Fs(^)p Ft(')f(as)h(the)g(undo)s(cumen)m -(ted)e(equiv)-5 b(alen)m(t)31 b(of)g(`)p Fs(|)p Ft('.)225 -1166 y Fp(\017)60 b Ft(Bash)37 b(allo)m(ws)h(m)m(ultiple)f(option)g -(argumen)m(ts)g(when)e(it)i(is)g(in)m(v)m(ok)m(ed)h(\()p -Fs(-x)30 b(-v)p Ft(\);)40 b(the)c(SVR4.2)i(shell)330 +b(The)f(Bourne)g(Shell)1258 b(151)225 299 y Fq(\017)60 +b Fu(In)30 b(a)i(questionable)g(attempt)g(at)g(securit)m(y)-8 +b(,)33 b(the)e(SVR4.2)h(shell,)g(when)e(in)m(v)m(ok)m(ed)j(without)e +(the)h Ft(-p)330 408 y Fu(option,)39 b(will)d(alter)i(its)e(real)h(and) +f(e\013ectiv)m(e)j Fm(uid)d Fu(and)g Fm(gid)h Fu(if)f(they)h(are)f +(less)h(than)f(some)h(magic)330 518 y(threshold)30 b(v)-5 +b(alue,)31 b(commonly)g(100.)42 b(This)29 b(can)i(lead)g(to)g(unexp)s +(ected)f(results.)225 653 y Fq(\017)60 b Fu(The)30 b(SVR4.2)h(shell)g +(do)s(es)f(not)g(allo)m(w)i(users)e(to)h(trap)f Ft(SIGSEGV)p +Fu(,)f Ft(SIGALRM)p Fu(,)f(or)j Ft(SIGCHLD)p Fu(.)225 +787 y Fq(\017)60 b Fu(The)34 b(SVR4.2)h(shell)g(do)s(es)g(not)f(allo)m +(w)j(the)d Ft(IFS)p Fu(,)h Ft(MAILCHECK)p Fu(,)f Ft(PATH)p +Fu(,)h Ft(PS1)p Fu(,)g(or)f Ft(PS2)g Fu(v)-5 b(ariables)35 +b(to)330 897 y(b)s(e)30 b(unset.)225 1031 y Fq(\017)60 +b Fu(The)30 b(SVR4.2)h(shell)g(treats)g(`)p Ft(^)p Fu(')f(as)h(the)g +(undo)s(cumen)m(ted)e(equiv)-5 b(alen)m(t)31 b(of)g(`)p +Ft(|)p Fu('.)225 1166 y Fq(\017)60 b Fu(Bash)37 b(allo)m(ws)h(m)m +(ultiple)f(option)g(argumen)m(ts)g(when)e(it)i(is)g(in)m(v)m(ok)m(ed)h +(\()p Ft(-x)30 b(-v)p Fu(\);)40 b(the)c(SVR4.2)i(shell)330 1275 y(allo)m(ws)c(only)f(one)g(option)g(argumen)m(t)g(\()p -Fs(-xv)p Ft(\).)47 b(In)32 b(fact,)i(some)f(v)m(ersions)g(of)g(the)g +Ft(-xv)p Fu(\).)47 b(In)32 b(fact,)i(some)f(v)m(ersions)g(of)g(the)g (shell)f(dump)f(core)330 1385 y(if)f(the)h(second)f(argumen)m(t)h(b)s -(egins)f(with)g(a)h(`)p Fs(-)p Ft('.)225 1519 y Fp(\017)60 -b Ft(The)26 b(SVR4.2)i(shell)f(exits)g(a)g(script)g(if)g(an)m(y)g +(egins)f(with)g(a)h(`)p Ft(-)p Fu('.)225 1519 y Fq(\017)60 +b Fu(The)26 b(SVR4.2)i(shell)f(exits)g(a)g(script)g(if)g(an)m(y)g (builtin)f(fails;)j(Bash)e(exits)g(a)g(script)g(only)g(if)g(one)g(of)g -(the)330 1629 y Fl(posix)34 b Ft(sp)s(ecial)h(builtins)f(fails,)i(and)e +(the)330 1629 y Fm(posix)34 b Fu(sp)s(ecial)h(builtins)f(fails,)i(and)e (only)h(for)f(certain)h(failures,)h(as)f(en)m(umerated)g(in)f(the)h -Fl(posix)330 1738 y Ft(standard.)225 1873 y Fp(\017)60 -b Ft(The)30 b(SVR4.2)h(shell)g(b)s(eha)m(v)m(es)f(di\013eren)m(tly)h -(when)f(in)m(v)m(ok)m(ed)i(as)e Fs(jsh)g Ft(\(it)h(turns)e(on)h(job)g +Fm(posix)330 1738 y Fu(standard.)225 1873 y Fq(\017)60 +b Fu(The)30 b(SVR4.2)h(shell)g(b)s(eha)m(v)m(es)f(di\013eren)m(tly)h +(when)f(in)m(v)m(ok)m(ed)i(as)e Ft(jsh)g Fu(\(it)h(turns)e(on)h(job)g (con)m(trol\).)p eop end -%%Page: 153 159 -TeXDict begin 153 158 bop 150 -116 a Ft(App)s(endix)29 +%%Page: 152 158 +TeXDict begin 152 157 bop 150 -116 a Fu(App)s(endix)29 b(C:)h(GNU)h(F)-8 b(ree)31 b(Do)s(cumen)m(tation)i(License)1560 -b(153)150 299 y Fo(App)t(endix)52 b(C)81 b(GNU)54 b(F)-13 -b(ree)53 b(Do)t(cumen)l(tation)e(License)1359 502 y Ft(V)-8 +b(152)150 299 y Fp(App)t(endix)52 b(C)81 b(GNU)54 b(F)-13 +b(ree)53 b(Do)t(cumen)l(tation)e(License)1359 502 y Fu(V)-8 b(ersion)31 b(1.3,)g(3)g(No)m(v)m(em)m(b)s(er)h(2008)390 -635 y(Cop)m(yrigh)m(t)842 632 y(c)817 635 y Fp(\015)e -Ft(2000,)j(2001,)f(2002,)g(2007,)h(2008)f(F)-8 b(ree)31 +635 y(Cop)m(yrigh)m(t)842 632 y(c)817 635 y Fq(\015)e +Fu(2000,)j(2001,)f(2002,)g(2007,)h(2008)f(F)-8 b(ree)31 b(Soft)m(w)m(are)h(F)-8 b(oundation,)31 b(Inc.)390 745 -y Fs(http://fsf.org/)390 964 y Ft(Ev)m(ery)m(one)g(is)g(p)s(ermitted)f +y Ft(http://fsf.org/)390 964 y Fu(Ev)m(ery)m(one)g(is)g(p)s(ermitted)f (to)h(cop)m(y)g(and)f(distribute)g(v)m(erbatim)h(copies)390 1074 y(of)g(this)f(license)h(do)s(cumen)m(t,)g(but)e(c)m(hanging)j(it)f (is)f(not)h(allo)m(w)m(ed.)199 1207 y(0.)61 b(PREAMBLE)330 1340 y(The)37 b(purp)s(ose)e(of)i(this)g(License)h(is)f(to)h(mak)m(e)g (a)g(man)m(ual,)h(textb)s(o)s(ok,)h(or)d(other)g(functional)h(and)330 -1450 y(useful)29 b(do)s(cumen)m(t)h Fq(free)36 b Ft(in)29 +1450 y(useful)29 b(do)s(cumen)m(t)h Fr(free)36 b Fu(in)29 b(the)i(sense)f(of)g(freedom:)41 b(to)31 b(assure)e(ev)m(ery)m(one)j (the)e(e\013ectiv)m(e)j(freedom)330 1559 y(to)f(cop)m(y)g(and)f (redistribute)g(it,)h(with)g(or)f(without)g(mo)s(difying)g(it,)i @@ -18278,10 +18755,10 @@ b(\\In)m(v)-5 b(arian)m(t)27 b(Sections")g(are)f(certain)g(Secondary)g 5340 y(b)s(eing)e(those)h(of)g(In)m(v)-5 b(arian)m(t)27 b(Sections,)i(in)d(the)h(notice)h(that)f(sa)m(ys)g(that)g(the)g(Do)s (cumen)m(t)g(is)g(released)p eop end -%%Page: 154 160 -TeXDict begin 154 159 bop 150 -116 a Ft(App)s(endix)29 +%%Page: 153 159 +TeXDict begin 153 158 bop 150 -116 a Fu(App)s(endix)29 b(C:)h(GNU)h(F)-8 b(ree)31 b(Do)s(cumen)m(tation)i(License)1560 -b(154)330 299 y(under)26 b(this)i(License.)40 b(If)27 +b(153)330 299 y(under)26 b(this)i(License.)40 b(If)27 b(a)h(section)h(do)s(es)f(not)f(\014t)h(the)g(ab)s(o)m(v)m(e)h (de\014nition)e(of)h(Secondary)f(then)h(it)g(is)330 408 y(not)k(allo)m(w)m(ed)i(to)e(b)s(e)g(designated)g(as)g(In)m(v)-5 @@ -18319,63 +18796,63 @@ b(is)f(not)h(T)-8 b(ransparen)m(t)34 b(if)g(used)g(for)g(an)m(y)g (substan)m(tial)h(amoun)m(t)g(of)g(text.)53 b(A)35 b(cop)m(y)g(that)g (is)330 2134 y(not)c(\\T)-8 b(ransparen)m(t")31 b(is)f(called)i (\\Opaque".)330 2285 y(Examples)53 b(of)g(suitable)h(formats)f(for)g(T) --8 b(ransparen)m(t)53 b(copies)h(include)f(plain)g Fl(asci)r(i)g -Ft(without)330 2395 y(markup,)37 b(T)-8 b(exinfo)36 b(input)f(format,)j +-8 b(ransparen)m(t)53 b(copies)h(include)f(plain)g Fm(asci)r(i)g +Fu(without)330 2395 y(markup,)37 b(T)-8 b(exinfo)36 b(input)f(format,)j (LaT)1759 2414 y(E)1810 2395 y(X)e(input)f(format,)j -Ff(SGML)f Ft(or)f Ff(XML)g Ft(using)g(a)g(publicly)330 -2504 y(a)m(v)-5 b(ailable)42 b Ff(DTD)p Ft(,)g(and)d -(standard-conforming)h(simple)g Ff(HTML)p Ft(,)g(P)m(ostScript)h(or)f -Ff(PDF)g Ft(designed)330 2614 y(for)e(h)m(uman)g(mo)s(di\014cation.)65 -b(Examples)38 b(of)h(transparen)m(t)f(image)i(formats)e(include)g -Ff(PNG)p Ft(,)h Ff(X)n(CF)330 2724 y Ft(and)h Ff(JPG)p -Ft(.)g(Opaque)h(formats)g(include)f(proprietary)g(formats)h(that)h(can) -f(b)s(e)f(read)g(and)h(edited)330 2833 y(only)54 b(b)m(y)f(proprietary) -h(w)m(ord)f(pro)s(cessors,)59 b Ff(SGML)54 b Ft(or)f -Ff(XML)h Ft(for)g(whic)m(h)f(the)h Ff(DTD)g Ft(and/or)330 -2943 y(pro)s(cessing)61 b(to)s(ols)h(are)f(not)g(generally)i(a)m(v)-5 -b(ailable,)71 b(and)60 b(the)h(mac)m(hine-generated)j -Ff(HTML)p Ft(,)330 3052 y(P)m(ostScript)31 b(or)f Ff(PDF)h -Ft(pro)s(duced)d(b)m(y)j(some)f(w)m(ord)g(pro)s(cessors)g(for)g(output) -g(purp)s(oses)f(only)-8 b(.)330 3203 y(The)34 b(\\Title)h(P)m(age")i -(means,)e(for)f(a)h(prin)m(ted)f(b)s(o)s(ok,)h(the)f(title)i(page)f -(itself,)h(plus)e(suc)m(h)f(follo)m(wing)330 3313 y(pages)28 -b(as)g(are)g(needed)g(to)g(hold,)g(legibly)-8 b(,)30 -b(the)e(material)h(this)e(License)i(requires)e(to)h(app)s(ear)f(in)h -(the)330 3422 y(title)g(page.)40 b(F)-8 b(or)28 b(w)m(orks)e(in)g -(formats)h(whic)m(h)g(do)f(not)h(ha)m(v)m(e)h(an)m(y)e(title)j(page)e -(as)g(suc)m(h,)g(\\Title)h(P)m(age")330 3532 y(means)j(the)f(text)i -(near)e(the)h(most)g(prominen)m(t)g(app)s(earance)f(of)h(the)g(w)m -(ork's)g(title,)h(preceding)f(the)330 3641 y(b)s(eginning)f(of)g(the)h -(b)s(o)s(dy)e(of)h(the)h(text.)330 3792 y(The)j(\\publisher")g(means)h -(an)m(y)f(p)s(erson)g(or)h(en)m(tit)m(y)h(that)f(distributes)f(copies)i -(of)e(the)h(Do)s(cumen)m(t)330 3902 y(to)c(the)g(public.)330 -4052 y(A)f(section)h(\\En)m(titled)g(XYZ")f(means)f(a)h(named)g -(subunit)e(of)h(the)h(Do)s(cumen)m(t)h(whose)e(title)i(either)330 -4162 y(is)d(precisely)g(XYZ)g(or)f(con)m(tains)i(XYZ)f(in)f(paren)m -(theses)i(follo)m(wing)g(text)g(that)f(translates)h(XYZ)e(in)330 -4271 y(another)e(language.)40 b(\(Here)26 b(XYZ)f(stands)f(for)h(a)g -(sp)s(eci\014c)g(section)h(name)f(men)m(tioned)h(b)s(elo)m(w,)g(suc)m -(h)330 4381 y(as)i(\\Ac)m(kno)m(wledgemen)m(ts",)33 b(\\Dedications",)e -(\\Endorsemen)m(ts",)e(or)f(\\History".\))42 b(T)-8 b(o)29 -b(\\Preserv)m(e)330 4491 y(the)34 b(Title")h(of)e(suc)m(h)h(a)g -(section)g(when)f(y)m(ou)h(mo)s(dify)e(the)i(Do)s(cumen)m(t)h(means)e -(that)h(it)g(remains)g(a)330 4600 y(section)e(\\En)m(titled)f(XYZ")g -(according)g(to)g(this)g(de\014nition.)330 4751 y(The)c(Do)s(cumen)m(t) -i(ma)m(y)f(include)f(W)-8 b(arran)m(t)m(y)30 b(Disclaimers)f(next)f(to) -g(the)g(notice)h(whic)m(h)e(states)i(that)330 4861 y(this)34 -b(License)g(applies)g(to)h(the)f(Do)s(cumen)m(t.)52 b(These)33 -b(W)-8 b(arran)m(t)m(y)36 b(Disclaimers)f(are)g(considered)e(to)330 -4970 y(b)s(e)k(included)g(b)m(y)g(reference)h(in)g(this)f(License,)j -(but)d(only)h(as)g(regards)f(disclaiming)i(w)m(arran)m(ties:)330 -5080 y(an)m(y)e(other)g(implication)i(that)e(these)g(W)-8 -b(arran)m(t)m(y)39 b(Disclaimers)f(ma)m(y)g(ha)m(v)m(e)g(is)f(v)m(oid)g -(and)f(has)h(no)330 5189 y(e\013ect)32 b(on)e(the)h(meaning)f(of)h -(this)f(License.)199 5340 y(2.)61 b(VERBA)-8 b(TIM)31 -b(COPYING)p eop end -%%Page: 155 161 -TeXDict begin 155 160 bop 150 -116 a Ft(App)s(endix)29 +Ff(SGML)f Fu(or)f Ff(XML)g Fu(using)g(a)g(publicly)330 +2504 y(a)m(v)-5 b(ailable)42 b Ff(DTD)p Fu(,)h(and)c +(standard-conforming)g(simple)h Ff(HTML)p Fu(,)i(P)m(ostScript)e(or)f +Ff(PDF)h Fu(designed)330 2614 y(for)e(h)m(uman)f(mo)s(di\014cation.)65 +b(Examples)38 b(of)h(transparen)m(t)f(image)h(formats)g(include)f +Ff(PNG)p Fu(,)i Ff(X)n(CF)330 2724 y Fu(and)e Ff(JPG)p +Fu(.)64 b(Opaque)38 b(formats)h(include)f(proprietary)h(formats)f(that) +h(can)g(b)s(e)f(read)h(and)f(edited)330 2833 y(only)54 +b(b)m(y)f(proprietary)h(w)m(ord)f(pro)s(cessors,)59 b +Ff(SGML)54 b Fu(or)f Ff(XML)h Fu(for)g(whic)m(h)f(the)h +Ff(DTD)g Fu(and/or)330 2943 y(pro)s(cessing)61 b(to)s(ols)h(are)f(not)g +(generally)i(a)m(v)-5 b(ailable,)71 b(and)60 b(the)h(mac)m +(hine-generated)j Ff(HTML)p Fu(,)330 3052 y(P)m(ostScript)31 +b(or)f Ff(PDF)h Fu(pro)s(duced)d(b)m(y)j(some)f(w)m(ord)g(pro)s +(cessors)g(for)g(output)g(purp)s(oses)f(only)-8 b(.)330 +3203 y(The)34 b(\\Title)h(P)m(age")i(means,)e(for)f(a)h(prin)m(ted)f(b) +s(o)s(ok,)h(the)f(title)i(page)f(itself,)h(plus)e(suc)m(h)f(follo)m +(wing)330 3313 y(pages)28 b(as)g(are)g(needed)g(to)g(hold,)g(legibly)-8 +b(,)30 b(the)e(material)h(this)e(License)i(requires)e(to)h(app)s(ear)f +(in)h(the)330 3422 y(title)g(page.)40 b(F)-8 b(or)28 +b(w)m(orks)e(in)g(formats)h(whic)m(h)g(do)f(not)h(ha)m(v)m(e)h(an)m(y)e +(title)j(page)e(as)g(suc)m(h,)g(\\Title)h(P)m(age")330 +3532 y(means)j(the)f(text)i(near)e(the)h(most)g(prominen)m(t)g(app)s +(earance)f(of)h(the)g(w)m(ork's)g(title,)h(preceding)f(the)330 +3641 y(b)s(eginning)f(of)g(the)h(b)s(o)s(dy)e(of)h(the)h(text.)330 +3792 y(The)j(\\publisher")g(means)h(an)m(y)f(p)s(erson)g(or)h(en)m(tit) +m(y)h(that)f(distributes)f(copies)i(of)e(the)h(Do)s(cumen)m(t)330 +3902 y(to)c(the)g(public.)330 4052 y(A)f(section)h(\\En)m(titled)g +(XYZ")f(means)f(a)h(named)g(subunit)e(of)h(the)h(Do)s(cumen)m(t)h +(whose)e(title)i(either)330 4162 y(is)d(precisely)g(XYZ)g(or)f(con)m +(tains)i(XYZ)f(in)f(paren)m(theses)i(follo)m(wing)g(text)g(that)f +(translates)h(XYZ)e(in)330 4271 y(another)e(language.)40 +b(\(Here)26 b(XYZ)f(stands)f(for)h(a)g(sp)s(eci\014c)g(section)h(name)f +(men)m(tioned)h(b)s(elo)m(w,)g(suc)m(h)330 4381 y(as)i(\\Ac)m(kno)m +(wledgemen)m(ts",)33 b(\\Dedications",)e(\\Endorsemen)m(ts",)e(or)f +(\\History".\))42 b(T)-8 b(o)29 b(\\Preserv)m(e)330 4491 +y(the)34 b(Title")h(of)e(suc)m(h)h(a)g(section)g(when)f(y)m(ou)h(mo)s +(dify)e(the)i(Do)s(cumen)m(t)h(means)e(that)h(it)g(remains)g(a)330 +4600 y(section)e(\\En)m(titled)f(XYZ")g(according)g(to)g(this)g +(de\014nition.)330 4751 y(The)c(Do)s(cumen)m(t)i(ma)m(y)f(include)f(W) +-8 b(arran)m(t)m(y)30 b(Disclaimers)f(next)f(to)g(the)g(notice)h(whic)m +(h)e(states)i(that)330 4861 y(this)34 b(License)g(applies)g(to)h(the)f +(Do)s(cumen)m(t.)52 b(These)33 b(W)-8 b(arran)m(t)m(y)36 +b(Disclaimers)f(are)g(considered)e(to)330 4970 y(b)s(e)k(included)g(b)m +(y)g(reference)h(in)g(this)f(License,)j(but)d(only)h(as)g(regards)f +(disclaiming)i(w)m(arran)m(ties:)330 5080 y(an)m(y)e(other)g +(implication)i(that)e(these)g(W)-8 b(arran)m(t)m(y)39 +b(Disclaimers)f(ma)m(y)g(ha)m(v)m(e)g(is)f(v)m(oid)g(and)f(has)h(no)330 +5189 y(e\013ect)32 b(on)e(the)h(meaning)f(of)h(this)f(License.)199 +5340 y(2.)61 b(VERBA)-8 b(TIM)31 b(COPYING)p eop end +%%Page: 154 160 +TeXDict begin 154 159 bop 150 -116 a Fu(App)s(endix)29 b(C:)h(GNU)h(F)-8 b(ree)31 b(Do)s(cumen)m(tation)i(License)1560 -b(155)330 299 y(Y)-8 b(ou)39 b(ma)m(y)f(cop)m(y)h(and)e(distribute)h +b(154)330 299 y(Y)-8 b(ou)39 b(ma)m(y)f(cop)m(y)h(and)e(distribute)h (the)g(Do)s(cumen)m(t)h(in)f(an)m(y)g(medium,)h(either)g(commercially)h (or)330 408 y(noncommercially)-8 b(,)48 b(pro)m(vided)42 b(that)h(this)f(License,)47 b(the)42 b(cop)m(yrigh)m(t)i(notices,)j @@ -18465,10 +18942,10 @@ b(in)f(the)h(Title)h(P)m(age)g(\(and)f(on)f(the)h(co)m(v)m(ers,)i(if)e 5340 y(Do)s(cumen)m(t,)j(and)d(from)g(those)i(of)f(previous)f(v)m (ersions)h(\(whic)m(h)g(should,)g(if)g(there)g(w)m(ere)g(an)m(y)-8 b(,)p eop end -%%Page: 156 162 -TeXDict begin 156 161 bop 150 -116 a Ft(App)s(endix)29 +%%Page: 155 161 +TeXDict begin 155 160 bop 150 -116 a Fu(App)s(endix)29 b(C:)h(GNU)h(F)-8 b(ree)31 b(Do)s(cumen)m(tation)i(License)1560 -b(156)510 299 y(b)s(e)31 b(listed)h(in)f(the)g(History)h(section)g(of)g +b(155)510 299 y(b)s(e)31 b(listed)h(in)f(the)g(History)h(section)g(of)g (the)f(Do)s(cumen)m(t\).)45 b(Y)-8 b(ou)32 b(ma)m(y)g(use)f(the)g(same) h(title)h(as)510 408 y(a)e(previous)f(v)m(ersion)g(if)h(the)f(original) i(publisher)d(of)h(that)h(v)m(ersion)g(giv)m(es)h(p)s(ermission.)360 @@ -18547,10 +19024,10 @@ b(arran)m(t)m(y)32 b(Disclaimers.)330 5121 y(If)h(the)g(Mo)s(di\014ed)g (designate)h(some)e(or)h(all)g(of)f(these)h(sections)h(as)e(in)m(v)-5 b(arian)m(t.)48 b(T)-8 b(o)33 b(do)f(this,)h(add)f(their)p eop end -%%Page: 157 163 -TeXDict begin 157 162 bop 150 -116 a Ft(App)s(endix)29 +%%Page: 156 162 +TeXDict begin 156 161 bop 150 -116 a Fu(App)s(endix)29 b(C:)h(GNU)h(F)-8 b(ree)31 b(Do)s(cumen)m(tation)i(License)1560 -b(157)330 299 y(titles)37 b(to)f(the)f(list)h(of)g(In)m(v)-5 +b(156)330 299 y(titles)37 b(to)f(the)f(list)h(of)g(In)m(v)-5 b(arian)m(t)36 b(Sections)g(in)f(the)h(Mo)s(di\014ed)f(V)-8 b(ersion's)36 b(license)g(notice.)57 b(These)330 408 y(titles)32 b(m)m(ust)e(b)s(e)g(distinct)h(from)e(an)m(y)i(other)g @@ -18635,10 +19112,10 @@ b(ma)m(y)g(extract)h(a)f(single)g(do)s(cumen)m(t)f(from)g(suc)m(h)g(a)h 5230 y(do)s(cumen)m(t,)d(and)f(follo)m(w)i(this)e(License)h(in)g(all)g (other)g(resp)s(ects)f(regarding)h(v)m(erbatim)g(cop)m(ying)h(of)330 5340 y(that)d(do)s(cumen)m(t.)p eop end -%%Page: 158 164 -TeXDict begin 158 163 bop 150 -116 a Ft(App)s(endix)29 +%%Page: 157 163 +TeXDict begin 157 162 bop 150 -116 a Fu(App)s(endix)29 b(C:)h(GNU)h(F)-8 b(ree)31 b(Do)s(cumen)m(tation)i(License)1560 -b(158)199 299 y(7.)61 b(A)m(GGREGA)-8 b(TION)32 b(WITH)e(INDEPENDENT)h +b(157)199 299 y(7.)61 b(A)m(GGREGA)-8 b(TION)32 b(WITH)e(INDEPENDENT)h (W)m(ORKS)330 441 y(A)d(compilation)i(of)e(the)g(Do)s(cumen)m(t)h(or)f (its)g(deriv)-5 b(ativ)m(es)30 b(with)d(other)i(separate)g(and)e(indep) s(enden)m(t)330 551 y(do)s(cumen)m(ts)33 b(or)g(w)m(orks,)h(in)f(or)h @@ -18723,10 +19200,10 @@ b(ha)m(v)m(e)h(receiv)m(ed)h(copies)e(or)h(righ)m(ts)f(from)g(y)m(ou)g (reinstated,)i(receipt)f(of)f(a)g(cop)m(y)h(of)f(some)h(or)f(all)h(of)f (the)330 5340 y(same)31 b(material)h(do)s(es)e(not)g(giv)m(e)i(y)m(ou)f (an)m(y)g(righ)m(ts)f(to)i(use)e(it.)p eop end -%%Page: 159 165 -TeXDict begin 159 164 bop 150 -116 a Ft(App)s(endix)29 +%%Page: 158 164 +TeXDict begin 158 163 bop 150 -116 a Fu(App)s(endix)29 b(C:)h(GNU)h(F)-8 b(ree)31 b(Do)s(cumen)m(tation)i(License)1560 -b(159)154 299 y(10.)61 b(FUTURE)30 b(REVISIONS)f(OF)i(THIS)e(LICENSE) +b(158)154 299 y(10.)61 b(FUTURE)30 b(REVISIONS)f(OF)i(THIS)e(LICENSE) 330 433 y(The)41 b(F)-8 b(ree)43 b(Soft)m(w)m(are)f(F)-8 b(oundation)43 b(ma)m(y)f(publish)e(new,)k(revised)d(v)m(ersions)h(of)g (the)g(GNU)g(F)-8 b(ree)330 543 y(Do)s(cumen)m(tation)34 @@ -18734,7 +19211,7 @@ b(License)e(from)g(time)h(to)g(time.)46 b(Suc)m(h)31 b(new)h(v)m(ersions)g(will)h(b)s(e)e(similar)h(in)g(spirit)330 653 y(to)j(the)g(presen)m(t)f(v)m(ersion,)i(but)e(ma)m(y)h(di\013er)f (in)g(detail)h(to)g(address)f(new)g(problems)f(or)i(concerns.)330 -762 y(See)c Fs(http://www.gnu.org/copy)o(left)o(/)p Ft(.)330 +762 y(See)c Ft(http://www.gnu.org/copy)o(left)o(/)p Fu(.)330 897 y(Eac)m(h)f(v)m(ersion)g(of)g(the)f(License)h(is)g(giv)m(en)g(a)g (distinguishing)f(v)m(ersion)h(n)m(um)m(b)s(er.)39 b(If)29 b(the)g(Do)s(cumen)m(t)330 1006 y(sp)s(eci\014es)45 b(that)h(a)g @@ -18790,17 +19267,17 @@ f(of)g(that)330 2944 y(license)31 b(published)e(b)m(y)h(that)h(same)g g(under)330 3895 y(CC-BY-SA)30 b(on)g(the)h(same)f(site)h(at)g(an)m(y)g (time)g(b)s(efore)e(August)h(1,)h(2009,)h(pro)m(vided)e(the)g(MMC)h(is) 330 4005 y(eligible)h(for)e(relicensing.)p eop end -%%Page: 160 166 -TeXDict begin 160 165 bop 150 -116 a Ft(App)s(endix)29 +%%Page: 159 165 +TeXDict begin 159 164 bop 150 -116 a Fu(App)s(endix)29 b(C:)h(GNU)h(F)-8 b(ree)31 b(Do)s(cumen)m(tation)i(License)1560 -b(160)150 299 y Fr(ADDENDUM:)45 b(Ho)l(w)h(to)f(use)g(this)h(License)f -(for)g(y)l(our)g(do)t(cumen)l(ts)150 458 y Ft(T)-8 b(o)35 +b(159)150 299 y Fs(ADDENDUM:)45 b(Ho)l(w)h(to)f(use)g(this)h(License)f +(for)g(y)l(our)g(do)t(cumen)l(ts)150 458 y Fu(T)-8 b(o)35 b(use)f(this)h(License)g(in)f(a)h(do)s(cumen)m(t)g(y)m(ou)f(ha)m(v)m(e) i(written,)g(include)f(a)f(cop)m(y)i(of)f(the)f(License)h(in)g(the)150 568 y(do)s(cumen)m(t)30 b(and)g(put)g(the)g(follo)m(wing)i(cop)m(yrigh) m(t)g(and)e(license)h(notices)g(just)f(after)h(the)g(title)h(page:)468 -680 y Fe(Copyright)42 b(\(C\))79 b Fd(year)88 b(your)40 -b(name)9 b Fe(.)468 767 y(Permission)42 b(is)e(granted)g(to)g(copy,)h +680 y Fe(Copyright)42 b(\(C\))79 b Fd(year)g(your)40 +b(name)p Fe(.)468 767 y(Permission)i(is)e(granted)g(to)g(copy,)h (distribute)g(and/or)g(modify)f(this)g(document)468 854 y(under)h(the)f(terms)g(of)g(the)g(GNU)g(Free)g(Documentation)i (License,)f(Version)g(1.3)468 941 y(or)f(any)g(later)g(version)h @@ -18808,48 +19285,48 @@ y(under)h(the)f(terms)g(of)g(the)g(GNU)g(Free)g(Documentation)i 1029 y(with)g(no)e(Invariant)j(Sections,)f(no)f(Front-Cover)h(Texts,)g (and)f(no)f(Back-Cover)468 1116 y(Texts.)80 b(A)40 b(copy)g(of)g(the)f (license)i(is)f(included)h(in)f(the)g(section)g(entitled)h(``GNU)468 -1203 y(Free)g(Documentation)h(License''.)275 1337 y Ft(If)d(y)m(ou)h +1203 y(Free)g(Documentation)h(License''.)275 1337 y Fu(If)d(y)m(ou)h (ha)m(v)m(e)h(In)m(v)-5 b(arian)m(t)41 b(Sections,)i(F)-8 b(ron)m(t-Co)m(v)m(er)42 b(T)-8 b(exts)41 b(and)e(Bac)m(k-Co)m(v)m(er)k (T)-8 b(exts,)43 b(replace)e(the)150 1447 y(\\with)6 b(.)22 b(.)g(.)12 b(T)-8 b(exts.")41 b(line)31 b(with)f(this:)547 1559 y Fe(with)40 b(the)g(Invariant)h(Sections)g(being)g -Fd(list)f(their)g(titles)9 b Fe(,)41 b(with)547 1646 -y(the)f(Front-Cover)i(Texts)e(being)g Fd(list)9 b Fe(,)40 -b(and)g(with)g(the)g(Back-Cover)i(Texts)547 1733 y(being)e -Fd(list)9 b Fe(.)275 1868 y Ft(If)34 b(y)m(ou)i(ha)m(v)m(e)g(In)m(v)-5 -b(arian)m(t)36 b(Sections)g(without)f(Co)m(v)m(er)h(T)-8 -b(exts,)38 b(or)d(some)g(other)h(com)m(bination)g(of)g(the)150 -1978 y(three,)31 b(merge)g(those)g(t)m(w)m(o)g(alternativ)m(es)i(to)e -(suit)f(the)h(situation.)275 2112 y(If)23 b(y)m(our)h(do)s(cumen)m(t)f -(con)m(tains)i(non)m(trivial)g(examples)g(of)f(program)f(co)s(de,)j(w)m -(e)e(recommend)g(releasing)150 2222 y(these)44 b(examples)f(in)g -(parallel)h(under)e(y)m(our)h(c)m(hoice)i(of)e(free)g(soft)m(w)m(are)h -(license,)k(suc)m(h)43 b(as)g(the)g(GNU)150 2331 y(General)31 -b(Public)f(License,)i(to)f(p)s(ermit)e(their)i(use)f(in)g(free)g(soft)m -(w)m(are.)p eop end -%%Page: 161 167 -TeXDict begin 161 166 bop 150 -116 a Ft(App)s(endix)29 -b(D:)i(Indexes)2623 b(161)150 299 y Fo(App)t(endix)52 -b(D)81 b(Indexes)150 631 y Fr(D.1)68 b(Index)45 b(of)g(Shell)g(Builtin) +Fd(list)f(their)g(titles)p Fe(,)h(with)547 1646 y(the)f(Front-Cover)i +(Texts)e(being)g Fd(list)p Fe(,)h(and)f(with)g(the)g(Back-Cover)h +(Texts)547 1733 y(being)f Fd(list)p Fe(.)275 1868 y Fu(If)34 +b(y)m(ou)i(ha)m(v)m(e)g(In)m(v)-5 b(arian)m(t)36 b(Sections)g(without)f +(Co)m(v)m(er)h(T)-8 b(exts,)38 b(or)d(some)g(other)h(com)m(bination)g +(of)g(the)150 1978 y(three,)31 b(merge)g(those)g(t)m(w)m(o)g +(alternativ)m(es)i(to)e(suit)f(the)h(situation.)275 2112 +y(If)23 b(y)m(our)h(do)s(cumen)m(t)f(con)m(tains)i(non)m(trivial)g +(examples)g(of)f(program)f(co)s(de,)j(w)m(e)e(recommend)g(releasing)150 +2222 y(these)44 b(examples)f(in)g(parallel)h(under)e(y)m(our)h(c)m +(hoice)i(of)e(free)g(soft)m(w)m(are)h(license,)k(suc)m(h)43 +b(as)g(the)g(GNU)150 2331 y(General)31 b(Public)f(License,)i(to)f(p)s +(ermit)e(their)i(use)f(in)g(free)g(soft)m(w)m(are.)p +eop end +%%Page: 160 166 +TeXDict begin 160 165 bop 150 -116 a Fu(App)s(endix)29 +b(D:)i(Indexes)2623 b(160)150 299 y Fp(App)t(endix)52 +b(D)81 b(Indexes)150 631 y Fs(D.1)68 b(Index)45 b(of)g(Shell)g(Builtin) g(Commands)150 868 y(.)150 984 y Fe(.)13 b Fc(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)39 b Fb(41)150 1218 y Fr(:)150 1335 +(:)h(:)f(:)g(:)g(:)39 b Fb(41)150 1218 y Fs(:)150 1335 y Fe(:)13 b Fc(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)39 -b Fb(41)150 1579 y Fr([)150 1695 y Fe([)13 b Fc(:)g(:)g(:)g(:)h(:)f(:)g +b Fb(41)150 1579 y Fs([)150 1695 y Fe([)13 b Fc(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)39 b Fb(45)150 1938 y Fr(A)150 2055 +(:)h(:)f(:)g(:)g(:)39 b Fb(45)150 1938 y Fs(A)150 2055 y Fe(alias)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)46 b Fb(48)150 -2289 y Fr(B)150 2405 y Fe(bg)10 b Fc(:)k(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:) +2289 y Fs(B)150 2405 y Fe(bg)10 b Fc(:)k(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -g(:)37 b Fb(99)150 2493 y Fe(bind)23 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:) +g(:)37 b Fb(98)150 2493 y Fe(bind)23 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) 49 b Fb(48)150 2580 y Fe(break)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f @@ -18858,7 +19335,7 @@ g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)46 b Fb(41)150 2668 y Fe(builtin)15 b Fc(:)f(:)f(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)41 -b Fb(49)150 2902 y Fr(C)150 3019 y Fe(caller)17 b Fc(:)e(:)e(:)g(:)g(:) +b Fb(49)150 2902 y Fs(C)150 3019 y Fe(caller)17 b Fc(:)e(:)e(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) 43 b Fb(50)150 3106 y Fe(cd)10 b Fc(:)k(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g @@ -18870,25 +19347,25 @@ g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)41 b Fb(50)150 3281 y Fe(compgen)12 b Fc(:)j(:)e(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)39 b -Fb(127)150 3368 y Fe(complete)10 b Fc(:)15 b(:)e(:)g(:)g(:)g(:)g(:)h(:) +Fb(126)150 3368 y Fe(complete)10 b Fc(:)15 b(:)e(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)37 b Fb(128)150 +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)37 b Fb(127)150 3456 y Fe(compopt)12 b Fc(:)j(:)e(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)39 b Fb(131)150 3543 +g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)39 b Fb(130)150 3543 y Fe(continue)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)38 b Fb(42)150 3778 y -Fr(D)150 3894 y Fe(declare)15 b Fc(:)f(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g +Fs(D)150 3894 y Fe(declare)15 b Fc(:)f(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)41 b Fb(50)150 3982 y Fe(dirs)23 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)49 -b Fb(91)150 4069 y Fe(disown)15 b Fc(:)f(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f -(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)42 -b Fb(100)150 4303 y Fr(E)150 4420 y Fe(echo)23 b Fc(:)13 +b Fb(90)150 4069 y Fe(disown)17 b Fc(:)e(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)43 +b Fb(99)150 4303 y Fs(E)150 4420 y Fe(echo)23 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)49 b Fb(52)150 4507 y Fe(enable)17 @@ -18907,17 +19384,17 @@ g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)49 b Fb(43)150 4857 y Fe(export)17 b Fc(:)e(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)43 -b Fb(43)150 5110 y Fr(F)150 5227 y Fe(fc)8 b Fc(:)14 +b Fb(43)150 5110 y Fs(F)150 5227 y Fe(fc)8 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) -g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)35 b Fb(134)150 5314 +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)35 b Fb(133)150 5314 y Fe(fg)10 b Fc(:)k(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)37 -b Fb(99)2025 868 y Fr(G)2025 988 y Fe(getopts)15 b Fc(:)f(:)f(:)g(:)g +b Fb(98)2025 868 y Fs(G)2025 988 y Fe(getopts)15 b Fc(:)f(:)f(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)41 -b Fb(43)2025 1250 y Fr(H)2025 1370 y Fe(hash)23 b Fc(:)13 +b Fb(43)2025 1250 y Fs(H)2025 1370 y Fe(hash)23 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(44)2025 1459 y Fe(help)23 @@ -18926,14 +19403,14 @@ b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(53)2025 1549 y Fe(history)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f -(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)39 b Fb(135)2025 1811 -y Fr(J)2025 1931 y Fe(jobs)23 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)39 b Fb(134)2025 1811 +y Fs(J)2025 1931 y Fe(jobs)23 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 -b Fb(99)2025 2193 y Fr(K)2025 2313 y Fe(kill)21 b Fc(:)13 -b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)47 b Fb(100)2025 2557 y Fr(L)2025 +b Fb(98)2025 2193 y Fs(K)2025 2313 y Fe(kill)23 b Fc(:)13 +b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(99)2025 2557 y Fs(L)2025 2677 y Fe(let)8 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)34 @@ -18943,10 +19420,10 @@ g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fb(53)2025 2856 y Fe(logout)17 b Fc(:)d(:)g(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 -b Fb(54)2025 3118 y Fr(M)2025 3238 y Fe(mapfile)15 b +b Fb(53)2025 3118 y Fs(M)2025 3238 y Fe(mapfile)15 b Fc(:)f(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)41 b Fb(54)2025 3500 y Fr(P)2025 3620 +h(:)f(:)g(:)g(:)41 b Fb(53)2025 3500 y Fs(P)2025 3620 y Fe(popd)23 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(91)2025 @@ -18956,10 +19433,10 @@ g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g 3799 y Fe(pushd)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b -Fb(92)2025 3888 y Fe(pwd)8 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +Fb(91)2025 3888 y Fe(pwd)8 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)34 -b Fb(44)2025 4150 y Fr(R)2025 4270 y Fe(read)23 b Fc(:)13 +b Fb(44)2025 4150 y Fs(R)2025 4270 y Fe(read)23 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(55)2025 4360 y Fe(readarray)9 @@ -18971,26 +19448,26 @@ g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)39 b Fb(44)2025 4538 y Fe(return)17 b Fc(:)d(:)g(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 -b Fb(45)2025 4782 y Fr(S)2025 4902 y Fe(set)8 b Fc(:)13 +b Fb(45)2025 4782 y Fs(S)2025 4902 y Fe(set)8 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)34 b Fb(59)2025 4991 +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)34 b Fb(58)2025 4991 y Fe(shift)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fb(45)2025 5080 y Fe(shopt)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b -Fb(63)2025 5169 y Fe(source)17 b Fc(:)d(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)g +Fb(62)2025 5169 y Fe(source)17 b Fc(:)d(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 -b Fb(57)2025 5259 y Fe(suspend)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)h(:)f(:)g -(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) -g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)39 b -Fb(100)p eop end -%%Page: 162 168 -TeXDict begin 162 167 bop 150 -116 a Ft(App)s(endix)29 -b(D:)i(Indexes)2623 b(162)150 299 y Fr(T)150 428 y Fe(test)23 +b Fb(56)2025 5259 y Fe(suspend)15 b Fc(:)f(:)f(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)41 +b Fb(99)p eop end +%%Page: 161 167 +TeXDict begin 161 166 bop 150 -116 a Fu(App)s(endix)29 +b(D:)i(Indexes)2623 b(161)150 299 y Fs(T)150 428 y Fe(test)23 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)49 b Fb(45)150 522 y @@ -19003,10 +19480,10 @@ f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g b Fb(47)150 709 y Fe(type)23 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)49 -b Fb(57)150 803 y Fe(typeset)15 b Fc(:)f(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:) +b Fb(56)150 803 y Fe(typeset)15 b Fc(:)f(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)41 -b Fb(57)2025 299 y Fr(U)2025 415 y Fe(ulimit)17 b Fc(:)d(:)g(:)f(:)g(:) +b Fb(57)2025 299 y Fs(U)2025 415 y Fe(ulimit)17 b Fc(:)d(:)g(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) 44 b Fb(57)2025 502 y Fe(umask)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g @@ -19018,1071 +19495,1098 @@ g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)41 b Fb(58)2025 677 y Fe(unset)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 -b Fb(48)2025 910 y Fr(W)2025 1026 y Fe(wait)21 b Fc(:)13 -b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)47 b Fb(100)150 1259 y Fr(D.2)68 +b Fb(48)2025 910 y Fs(W)2025 1026 y Fe(wait)23 b Fc(:)13 +b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(99)150 1259 y Fs(D.2)68 b(Index)45 b(of)g(Shell)g(Reserv)l(ed)h(W)-11 b(ords)150 -1495 y(!)150 1612 y Fe(!)15 b Fc(:)e(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +1495 y(!)150 1611 y Fe(!)15 b Fc(:)e(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)g(:)42 b Fb(8)150 1855 y Fr([)150 1971 y Fe([[)10 +g(:)g(:)42 b Fb(8)150 1855 y Fs([)150 1971 y Fe([[)10 b Fc(:)k(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)37 b Fb(12)150 -2220 y Fr(])150 2337 y Fe(]])10 b Fc(:)k(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:) +2220 y Fs(])150 2336 y Fe(]])10 b Fc(:)k(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -g(:)37 b Fb(12)150 2579 y Fa({)150 2695 y Fe({)13 b Fc(:)g(:)g(:)g(:)h +g(:)37 b Fb(12)150 2579 y Fa(|)150 2695 y Fe({)13 b Fc(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)h(:)f(:)g(:)g(:)39 b Fb(14)150 2938 y Fa(})150 -3054 y Fe(})13 b Fc(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)g(:)39 b Fb(14)150 2782 y Fe(})13 +b Fc(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)39 b Fb(14)150 +3024 y Fs(C)150 3140 y Fe(case)23 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)49 +b Fb(11)150 3374 y Fs(D)150 3490 y Fe(do)10 b Fc(:)k(:)f(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)39 -b Fb(14)150 3296 y Fr(C)150 3412 y Fe(case)23 b Fc(:)13 +g(:)g(:)g(:)g(:)37 b Fb(10)150 3577 y Fe(done)23 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)g(:)49 b Fb(11)150 3646 y Fr(D)150 -3762 y Fe(do)10 b Fc(:)k(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f -(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)37 -b Fb(10)150 3849 y Fe(done)23 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g +g(:)g(:)g(:)g(:)g(:)g(:)49 b Fb(10)150 3810 y Fs(E)150 +3926 y Fe(elif)23 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)49 +b Fb(10)150 4014 y Fe(else)23 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)49 -b Fb(10)150 4083 y Fr(E)150 4199 y Fe(elif)23 b Fc(:)13 -b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)g(:)49 b Fb(10)2025 1495 y Fe(else)23 -b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +b Fb(10)2025 1495 y Fe(esac)23 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 +b Fb(11)2025 1737 y Fs(F)2025 1856 y Fe(fi)10 b Fc(:)k(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)37 b Fb(10)2025 1945 y Fe(for)8 b +Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)34 b Fb(10)2025 +2033 y Fe(function)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(10)2025 1586 -y Fe(esac)23 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g -(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(11)2025 -1838 y Fr(F)2025 1961 y Fe(fi)10 b Fc(:)k(:)f(:)g(:)g(:)g(:)g(:)g(:)h +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)39 b Fb(17)2025 2275 +y Fs(I)2025 2394 y Fe(if)10 b Fc(:)k(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +37 b Fb(10)2025 2483 y Fe(in)10 b Fc(:)k(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)37 b Fb(11)2025 2724 y Fs(S)2025 2843 y Fe(select)17 +b Fc(:)d(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(12)2025 3085 y Fs(T)2025 +3204 y Fe(then)23 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 +b Fb(10)2025 3293 y Fe(time)7 b Fc(:)14 b(:)f(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h +(:)34 b Fb(8)2025 3534 y Fs(U)2025 3653 y Fe(until)21 +b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fb(10)2025 3894 y Fs(W)2025 +4014 y Fe(while)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b +Fb(10)150 4246 y Fs(D.3)68 b(P)l(arameter)47 b(and)d(V)-11 +b(ariable)46 b(Index)150 4483 y(!)150 4603 y Fe(!)13 +b Fc(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)39 b Fb(20)150 +4846 y Fs(#)150 4967 y Fe(#)13 b Fc(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)39 b Fb(20)150 5220 y Fs($)150 5340 y Fe($)13 +b Fc(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)39 b Fb(20)2025 +4483 y Fe($!)10 b Fc(:)k(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 +b Fb(20)2025 4574 y Fe($#)10 b Fc(:)k(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)37 b Fb(20)2025 4665 y Fe($$)10 b Fc(:)k(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)37 b Fb(10)2025 2052 y Fe(for)8 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g -(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)34 b Fb(10)2025 2143 y Fe(function)12 b Fc(:)j(:)e(:)g(:)g -(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)39 -b Fb(17)2025 2394 y Fr(I)2025 2518 y Fe(if)10 b Fc(:)k(:)f(:)g(:)g(:)g +(:)g(:)37 b Fb(20)2025 4756 y Fe($*)10 b Fc(:)k(:)f(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)37 b Fb(20)2025 4847 y Fe($-)10 b Fc(:)k(:)f(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)37 b Fb(20)2025 4938 y Fe($?)10 b Fc(:)k(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f -(:)g(:)g(:)g(:)g(:)37 b Fb(10)2025 2608 y Fe(in)10 b +(:)g(:)g(:)g(:)g(:)37 b Fb(20)2025 5029 y Fe($@)10 b Fc(:)k(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fb(11)2025 -2860 y Fr(S)2025 2983 y Fe(select)17 b Fc(:)d(:)g(:)f(:)g(:)g(:)g(:)g -(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 -b Fb(12)2025 3235 y Fr(T)2025 3358 y Fe(then)23 b Fc(:)13 -b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(10)2025 3449 y Fe(time)7 -b Fc(:)14 b(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)34 b Fb(8)2025 -3701 y Fr(U)2025 3824 y Fe(until)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 -b Fb(10)2025 4076 y Fr(W)2025 4199 y Fe(while)21 b Fc(:)13 -b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g -(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) -g(:)g(:)h(:)f(:)g(:)46 b Fb(10)150 4431 y Fr(D.3)68 b(P)l(arameter)47 -b(and)d(V)-11 b(ariable)46 b(Index)150 4668 y(!)150 4794 -y Fe(!)13 b Fc(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g -(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) -g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)39 -b Fb(20)150 5054 y Fr(#)150 5180 y Fe(#)13 b Fc(:)g(:)g(:)g(:)h(:)f(:)g -(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fb(20)2025 +5120 y Fe($_)10 b Fc(:)k(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)39 b Fb(20)2025 4668 y Fr($)2025 4794 -y Fe($)13 b Fc(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)39 -b Fb(20)2025 5067 y Fr(*)2025 5192 y Fe(*)13 b Fc(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)39 b Fb(20)p eop end -%%Page: 163 169 -TeXDict begin 163 168 bop 150 -116 a Ft(App)s(endix)29 -b(D:)i(Indexes)2623 b(163)150 299 y Fr(-)150 415 y Fe(-)13 +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 +b Fb(20)2025 5211 y Fe($0)10 b Fc(:)k(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)37 b Fb(20)p eop end +%%Page: 162 168 +TeXDict begin 162 167 bop 150 -116 a Fu(App)s(endix)29 +b(D:)i(Indexes)2623 b(162)150 299 y Fs(*)150 415 y Fe(*)13 b Fc(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)39 b Fb(20)150 -649 y Fr(?)150 765 y Fe(?)13 b Fc(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +649 y Fs(-)150 765 y Fe(-)13 b Fc(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g -(:)g(:)39 b Fb(20)150 999 y Fr(@)150 1115 y Fe(@)13 b +(:)g(:)39 b Fb(20)150 999 y Fs(?)150 1115 y Fe(?)13 b Fc(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)39 b Fb(20)p -159 1349 41 6 v 150 1465 a Fe(_)13 b Fc(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f -(:)g(:)g(:)39 b Fb(20)150 1699 y Fr(0)150 1815 y Fe(0)13 +h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)39 b Fb(20)150 +1349 y Fs(@)150 1465 y Fe(@)13 b Fc(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)39 b Fb(20)p 159 1699 41 6 v 150 1815 a Fe(_)13 b Fc(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)39 b Fb(20)150 -2049 y Fr(A)150 2166 y Fe(auto_resume)22 b Fc(:)13 b(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g -(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)46 b Fb(101)150 -2409 y Fr(B)150 2525 y Fe(BASH)23 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)49 -b Fb(69)150 2612 y Fe(BASH_ALIASES)22 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fb(70)150 2700 -y Fe(BASH_ARGC)9 b Fc(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fb(70)150 2787 y -Fe(BASH_ARGV)9 b Fc(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fb(70)150 2874 y Fe(BASH_CMDS)9 -b Fc(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)36 b Fb(70)150 2962 y Fe(BASH_COMMAND)22 +2049 y Fs(0)150 2165 y Fe(0)13 b Fc(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)39 b Fb(20)150 2399 y Fs(A)150 2515 y Fe(auto_resume)22 +b Fc(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)46 +b Fb(100)150 2758 y Fs(B)150 2875 y Fe(BASH)23 b Fc(:)13 +b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)g(:)49 b Fb(69)150 2962 y Fe(BASH_ALIASES)22 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 -b Fb(70)150 3049 y Fe(BASH_COMPAT)24 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fb(70)150 -3137 y Fe(BASH_ENV)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) -f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)38 b Fb(71)150 3224 -y Fe(BASH_EXECUTION_STRING)13 b Fc(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)39 -b Fb(71)150 3311 y Fe(BASH_LINENO)24 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fb(71)150 -3399 y Fe(BASH_REMATCH)22 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +b Fb(70)150 3049 y Fe(BASH_ARGC)9 b Fc(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b +Fb(70)150 3137 y Fe(BASH_ARGV)9 b Fc(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fb(70)150 +3224 y Fe(BASH_CMDS)9 b Fc(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) -g(:)g(:)g(:)h(:)f(:)g(:)45 b Fb(71)150 3486 y Fe(BASH_SOURCE)24 +g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fb(70)150 3311 +y Fe(BASH_COMMAND)22 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) +g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)45 b Fb(70)150 3399 y Fe(BASH_COMPAT)24 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -48 b Fb(71)150 3573 y Fe(BASH_SUBSHELL)16 b Fc(:)g(:)e(:)f(:)g(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 b Fb(71)150 3661 y -Fe(BASH_VERSINFO)16 b Fc(:)g(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)43 b Fb(71)150 3748 y Fe(BASH_VERSION)22 b -Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +48 b Fb(70)150 3486 y Fe(BASH_ENV)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) +g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)38 +b Fb(71)150 3574 y Fe(BASH_EXECUTION_STRING)13 b Fc(:)18 +b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)g(:)h(:)f(:)39 b Fb(71)150 3661 y Fe(BASH_LINENO)24 +b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +48 b Fb(71)150 3748 y Fe(BASH_REMATCH)22 b Fc(:)13 b(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fb(71)150 +3836 y Fe(BASH_SOURCE)24 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fb(71)150 3923 y Fe(BASH_SUBSHELL)16 +b Fc(:)g(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 +b Fb(71)150 4010 y Fe(BASH_VERSINFO)16 b Fc(:)g(:)e(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 b Fb(71)150 4098 y Fe(BASH_VERSION)22 +b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 -b Fb(72)150 3835 y Fe(BASH_XTRACEFD)16 b Fc(:)g(:)e(:)f(:)g(:)g(:)g(:)g +b Fb(72)150 4185 y Fe(BASH_XTRACEFD)16 b Fc(:)g(:)e(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 b Fb(72)150 3923 y Fe(BASHOPTS)12 +h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 b Fb(72)150 4272 y Fe(BASHOPTS)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)38 b Fb(70)150 4010 y Fe(BASHPID)15 b +(:)g(:)h(:)f(:)38 b Fb(70)150 4360 y Fe(BASHPID)15 b Fc(:)f(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) -f(:)g(:)g(:)g(:)41 b Fb(70)150 4098 y Fe(bell-style)24 +f(:)g(:)g(:)g(:)41 b Fb(70)150 4447 y Fe(bell-style)24 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) -49 b Fb(106)150 4185 y Fe(bind-tty-special-chars)8 b +49 b Fb(105)150 4534 y Fe(bind-tty-special-chars)8 b Fc(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)35 b Fb(106)150 4437 y Fr(C)150 4554 +(:)h(:)f(:)g(:)g(:)35 b Fb(105)150 4787 y Fs(C)150 4903 y Fe(CDPATH)17 b Fc(:)e(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)43 b Fb(69)150 4641 +h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)43 b Fb(69)150 4991 y Fe(CHILD_MAX)9 b Fc(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fb(72)150 4728 y +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fb(72)150 5078 y Fe(colored-stats)14 b Fc(:)i(:)d(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g -(:)g(:)41 b Fb(106)150 4816 y Fe(COLUMNS)15 b Fc(:)f(:)f(:)h(:)f(:)g(:) +(:)g(:)41 b Fb(105)150 5165 y Fe(COLUMNS)15 b Fc(:)f(:)f(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)41 -b Fb(72)150 4903 y Fe(comment-begin)14 b Fc(:)i(:)d(:)h(:)f(:)g(:)g(:)g +b Fb(72)150 5253 y Fe(comment-begin)14 b Fc(:)i(:)d(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)g(:)41 b Fb(106)150 4991 y Fe(COMP_CWORD)7 +g(:)h(:)f(:)g(:)g(:)g(:)41 b Fb(105)150 5340 y Fe(COMP_CWORD)7 b Fc(:)15 b(:)e(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) -f(:)g(:)33 b Fb(72)150 5078 y Fe(COMP_KEY)12 b Fc(:)j(:)e(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)38 -b Fb(73)150 5165 y Fe(COMP_LINE)9 b Fc(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b -Fb(72)150 5253 y Fe(COMP_POINT)7 b Fc(:)15 b(:)e(:)h(:)f(:)g(:)g(:)g(:) -g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)33 b Fb(72)150 -5340 y Fe(COMP_TYPE)9 b Fc(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g -(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) -g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fb(73)2025 299 +f(:)g(:)33 b Fb(72)2025 299 y Fe(COMP_KEY)12 b Fc(:)j(:)e(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)39 +b Fb(73)2025 386 y Fe(COMP_LINE)9 b Fc(:)15 b(:)f(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)36 b +Fb(72)2025 474 y Fe(COMP_POINT)7 b Fc(:)15 b(:)e(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fb(72)2025 +561 y Fe(COMP_TYPE)9 b Fc(:)15 b(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)36 b Fb(73)2025 649 y Fe(COMP_WORDBREAKS)11 b Fc(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)g(:)38 b Fb(73)2025 387 y Fe(COMP_WORDS)7 b Fc(:)15 +g(:)g(:)38 b Fb(73)2025 736 y Fe(COMP_WORDS)7 b Fc(:)15 b(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) -33 b Fb(73)2025 474 y Fe(completion-display-width)26 +33 b Fb(73)2025 824 y Fe(completion-display-width)26 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f -(:)g(:)47 b Fb(106)2025 562 y Fe(completion-ignore-case)8 +(:)g(:)47 b Fb(105)2025 911 y Fe(completion-ignore-case)8 b Fc(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)35 b Fb(106)2025 649 y Fe(completion-map-case)16 +(:)g(:)g(:)g(:)h(:)f(:)35 b Fb(105)2025 999 y Fe(completion-map-case)16 b Fc(:)h(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fb(106)2025 737 y Fe +g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fb(105)2025 1086 y Fe (completion-prefix-display-leng)q(th)17 b Fc(:)i(:)13 -b(:)g(:)h(:)f(:)g(:)g(:)g(:)44 b Fb(107)2025 825 y Fe +b(:)g(:)h(:)f(:)g(:)g(:)g(:)44 b Fb(106)2025 1174 y Fe (completion-query-items)8 b Fc(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35 b -Fb(107)2025 912 y Fe(COMPREPLY)9 b Fc(:)15 b(:)f(:)f(:)g(:)g(:)g(:)g(:) -g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)36 b Fb(73)2025 -1000 y Fe(convert-meta)17 b Fc(:)e(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)g(:)44 b Fb(107)2025 1088 y Fe(COPROC)17 +Fb(106)2025 1261 y Fe(COMPREPLY)9 b Fc(:)15 b(:)f(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)36 b +Fb(73)2025 1349 y Fe(convert-meta)17 b Fc(:)e(:)f(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(106)2025 1436 y Fe(COPROC)17 b Fc(:)d(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f -(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(73)2025 1323 y Fr(D)2025 -1440 y Fe(DIRSTACK)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(73)2025 1671 y Fs(D)2025 +1788 y Fe(DIRSTACK)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)39 b Fb(73)2025 1527 +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)39 b Fb(73)2025 1875 y Fe(disable-completion)22 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)45 -b Fb(107)2025 1781 y Fr(E)2025 1898 y Fe(editing-mode)17 +b Fb(106)2025 2128 y Fs(E)2025 2245 y Fe(editing-mode)17 b Fc(:)e(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 -b Fb(107)2025 1985 y Fe(EMACS)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:) +b Fb(106)2025 2332 y Fe(EMACS)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 -b Fb(73)2025 2073 y Fe(enable-keypad)14 b Fc(:)i(:)d(:)g(:)g(:)h(:)f(:) +b Fb(73)2025 2420 y Fe(enable-keypad)14 b Fc(:)i(:)d(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)g(:)41 b Fb(107)2025 2161 y Fe(ENV)8 +(:)g(:)g(:)g(:)h(:)f(:)g(:)41 b Fb(106)2025 2507 y Fe(ENV)8 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)34 b Fb(73)2025 -2248 y Fe(EUID)23 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +2595 y Fe(EUID)23 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 -b Fb(73)2025 2336 y Fe(expand-tilde)17 b Fc(:)e(:)f(:)f(:)g(:)g(:)g(:)g +b Fb(73)2025 2682 y Fe(expand-tilde)17 b Fc(:)e(:)f(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(107)2025 2590 y Fr(F)2025 -2707 y Fe(FCEDIT)17 b Fc(:)d(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(106)2025 2936 y Fs(F)2025 +3052 y Fe(FCEDIT)17 b Fc(:)d(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(73)2025 -2794 y Fe(FIGNORE)15 b Fc(:)f(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +3140 y Fe(FIGNORE)15 b Fc(:)f(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)41 b Fb(74)2025 -2882 y Fe(FUNCNAME)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +3227 y Fe(FUNCNAME)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)39 b Fb(74)2025 2970 +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)39 b Fb(74)2025 3315 y Fe(FUNCNEST)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)39 b Fb(74)2025 3205 -y Fr(G)2025 3322 y Fe(GLOBIGNORE)7 b Fc(:)15 b(:)e(:)g(:)g(:)h(:)f(:)g +h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)39 b Fb(74)2025 3549 +y Fs(G)2025 3666 y Fe(GLOBIGNORE)7 b Fc(:)15 b(:)e(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fb(74)2025 -3409 y Fe(GROUPS)17 b Fc(:)d(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +3753 y Fe(GROUPS)17 b Fc(:)d(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(74)2025 -3644 y Fr(H)2025 3761 y Fe(histchars)9 b Fc(:)15 b(:)f(:)f(:)g(:)g(:)g +3988 y Fs(H)2025 4104 y Fe(histchars)9 b Fc(:)15 b(:)f(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)36 -b Fb(74)2025 3849 y Fe(HISTCMD)15 b Fc(:)f(:)f(:)g(:)g(:)h(:)f(:)g(:)g +b Fb(74)2025 4192 y Fe(HISTCMD)15 b Fc(:)f(:)f(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)41 -b Fb(74)2025 3936 y Fe(HISTCONTROL)24 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g +b Fb(74)2025 4279 y Fe(HISTCONTROL)24 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)48 b Fb(74)2025 -4024 y Fe(HISTFILE)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +4367 y Fe(HISTFILE)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)39 b Fb(75)2025 4112 +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)39 b Fb(75)2025 4454 y Fe(HISTFILESIZE)21 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)g(:)h(:)45 b Fb(75)2025 4199 y Fe(HISTIGNORE)7 +(:)g(:)g(:)g(:)h(:)45 b Fb(75)2025 4542 y Fe(HISTIGNORE)7 b Fc(:)15 b(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -g(:)h(:)33 b Fb(75)2025 4287 y Fe(history-preserve-point)8 +g(:)h(:)33 b Fb(75)2025 4630 y Fe(history-preserve-point)8 b Fc(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)35 b Fb(108)2025 4375 y Fe(history-size)17 +(:)g(:)g(:)g(:)h(:)f(:)35 b Fb(107)2025 4717 y Fe(history-size)17 b Fc(:)e(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 -b Fb(108)2025 4462 y Fe(HISTSIZE)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)g(:)h(:) +b Fb(107)2025 4805 y Fe(HISTSIZE)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)39 -b Fb(75)2025 4550 y Fe(HISTTIMEFORMAT)14 b Fc(:)i(:)d(:)g(:)g(:)g(:)h +b Fb(75)2025 4892 y Fe(HISTTIMEFORMAT)14 b Fc(:)i(:)d(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fb(75)2025 4637 y Fe(HOME)23 +g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fb(75)2025 4980 y Fe(HOME)23 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(69)2025 4725 +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(69)2025 5067 y Fe(horizontal-scroll-mode)8 b Fc(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35 -b Fb(108)2025 4813 y Fe(HOSTFILE)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)g(:)h(:) +b Fb(107)2025 5155 y Fe(HOSTFILE)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)39 -b Fb(75)2025 4900 y Fe(HOSTNAME)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)g(:)h(:)f +b Fb(75)2025 5242 y Fe(HOSTNAME)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)39 b -Fb(76)2025 4988 y Fe(HOSTTYPE)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)g(:)h(:)f +Fb(76)2025 5330 y Fe(HOSTTYPE)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)39 b -Fb(76)2025 5223 y Fr(I)2025 5340 y Fe(IFS)8 b Fc(:)13 -b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)34 b Fb(69)p eop end -%%Page: 164 170 -TeXDict begin 164 169 bop 150 -116 a Ft(App)s(endix)29 -b(D:)i(Indexes)2623 b(164)150 299 y Fe(IGNOREEOF)9 b -Fc(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)36 b Fb(76)150 387 y Fe(input-meta)24 b Fc(:)13 -b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)49 -b Fb(108)150 475 y Fe(INPUTRC)15 b Fc(:)f(:)f(:)h(:)f(:)g(:)g(:)g(:)g -(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)41 -b Fb(76)150 563 y Fe(isearch-terminators)16 b Fc(:)h(:)d(:)f(:)g(:)g(:) -g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)43 b Fb(108)150 800 y Fr(K)150 918 y Fe(keymap)15 -b Fc(:)f(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g -(:)g(:)g(:)g(:)g(:)42 b Fb(108)150 1173 y Fr(L)150 1291 -y Fe(LANG)23 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)49 b Fb(76)150 -1379 y Fe(LC_ALL)17 b Fc(:)e(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)43 b Fb(76)150 -1467 y Fe(LC_COLLATE)7 b Fc(:)15 b(:)e(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)33 b Fb(76)150 1555 y -Fe(LC_CTYPE)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)38 b Fb(76)150 1643 y Fe(LC_MESSAGES)13 -b Fc(:)j(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) -f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)40 -b Fb(7,)26 b(76)150 1731 y Fe(LC_NUMERIC)7 b Fc(:)15 -b(:)e(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h +Fb(76)p eop end +%%Page: 163 169 +TeXDict begin 163 168 bop 150 -116 a Fu(App)s(endix)29 +b(D:)i(Indexes)2623 b(163)150 299 y Fs(I)150 415 y Fe(IFS)8 +b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)34 b Fb(69)150 +502 y Fe(IGNOREEOF)9 b Fc(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fb(76)150 590 +y Fe(input-meta)24 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -33 b Fb(76)150 1819 y Fe(LINENO)17 b Fc(:)e(:)e(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)43 -b Fb(76)150 1907 y Fe(LINES)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g +g(:)g(:)g(:)g(:)g(:)49 b Fb(107)150 677 y Fe(INPUTRC)15 +b Fc(:)f(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)41 b Fb(76)150 764 y Fe(isearch-terminators)16 +b Fc(:)h(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 b Fb(107)150 997 y Fs(K)150 +1114 y Fe(keymap)15 b Fc(:)f(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)42 b Fb(107)150 +1366 y Fs(L)150 1482 y Fe(LANG)23 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)49 +b Fb(76)150 1569 y Fe(LC_ALL)17 b Fc(:)e(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)43 +b Fb(76)150 1656 y Fe(LC_COLLATE)7 b Fc(:)15 b(:)e(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)33 b Fb(76)150 +1743 y Fe(LC_CTYPE)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)38 b Fb(76)150 1831 +y Fe(LC_MESSAGES)13 b Fc(:)j(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)40 b Fb(7,)26 b(76)150 1918 y Fe(LC_NUMERIC)7 +b Fc(:)15 b(:)e(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)33 b Fb(76)150 2005 y Fe(LINENO)17 b Fc(:)e(:)e(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)43 +b Fb(76)150 2093 y Fe(LINES)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)46 -b Fb(76)150 2144 y Fr(M)150 2262 y Fe(MACHTYPE)12 b Fc(:)j(:)e(:)g(:)g +b Fb(76)150 2326 y Fs(M)150 2442 y Fe(MACHTYPE)12 b Fc(:)j(:)e(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)38 -b Fb(76)150 2350 y Fe(MAIL)23 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g +b Fb(76)150 2529 y Fe(MAIL)23 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)49 -b Fb(69)150 2438 y Fe(MAILCHECK)9 b Fc(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g +b Fb(69)150 2617 y Fe(MAILCHECK)9 b Fc(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b -Fb(77)150 2526 y Fe(MAILPATH)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:) +Fb(77)150 2704 y Fe(MAILPATH)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)38 b Fb(69)150 -2614 y Fe(MAPFILE)15 b Fc(:)f(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h +2791 y Fe(MAPFILE)15 b Fc(:)f(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)41 b Fb(77)150 -2702 y Fe(mark-modified-lines)16 b Fc(:)h(:)d(:)f(:)g(:)g(:)g(:)g(:)g +2878 y Fe(mark-modified-lines)16 b Fc(:)h(:)d(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)43 -b Fb(109)150 2790 y Fe(mark-symlinked-directories)16 +b Fb(108)150 2966 y Fe(mark-symlinked-directories)16 b Fc(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) -42 b Fb(109)150 2878 y Fe(match-hidden-files)23 b Fc(:)13 +42 b Fb(108)150 3053 y Fe(match-hidden-files)23 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fb(109)150 2966 y Fe +(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fb(108)150 3140 y Fe (menu-complete-display-prefix)11 b Fc(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fb(109)150 3054 y Fe(meta-flag)7 +(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fb(108)150 3227 y Fe(meta-flag)7 b Fc(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)34 b Fb(108)150 3309 y Fr(O)150 3427 y Fe(OLDPWD)17 +g(:)g(:)34 b Fb(107)150 3479 y Fs(O)150 3596 y Fe(OLDPWD)17 b Fc(:)e(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g -(:)g(:)g(:)g(:)g(:)h(:)43 b Fb(77)150 3515 y Fe(OPTARG)17 +(:)g(:)g(:)g(:)g(:)h(:)43 b Fb(77)150 3683 y Fe(OPTARG)17 b Fc(:)e(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g -(:)g(:)g(:)g(:)g(:)h(:)43 b Fb(69)150 3603 y Fe(OPTERR)17 +(:)g(:)g(:)g(:)g(:)h(:)43 b Fb(69)150 3770 y Fe(OPTERR)17 b Fc(:)e(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g -(:)g(:)g(:)g(:)g(:)h(:)43 b Fb(77)150 3691 y Fe(OPTIND)17 +(:)g(:)g(:)g(:)g(:)h(:)43 b Fb(77)150 3857 y Fe(OPTIND)17 b Fc(:)e(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g -(:)g(:)g(:)g(:)g(:)h(:)43 b Fb(69)150 3779 y Fe(OSTYPE)17 +(:)g(:)g(:)g(:)g(:)h(:)43 b Fb(69)150 3945 y Fe(OSTYPE)17 b Fc(:)e(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g -(:)g(:)g(:)g(:)g(:)h(:)43 b Fb(77)150 3867 y Fe(output-meta)22 +(:)g(:)g(:)g(:)g(:)h(:)43 b Fb(77)150 4032 y Fe(output-meta)22 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)46 -b Fb(109)150 4123 y Fr(P)150 4240 y Fe(page-completions)7 +b Fb(108)150 4284 y Fs(P)150 4400 y Fe(page-completions)7 b Fc(:)16 b(:)d(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33 b Fb(109)2025 +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33 b Fb(108)2025 299 y Fe(PATH)23 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 -b Fb(69)2025 386 y Fe(PIPESTATUS)7 b Fc(:)15 b(:)e(:)g(:)g(:)h(:)f(:)g +b Fb(69)2025 389 y Fe(PIPESTATUS)7 b Fc(:)15 b(:)e(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fb(77)2025 -473 y Fe(POSIXLY_CORRECT)11 b Fc(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h +478 y Fe(POSIXLY_CORRECT)11 b Fc(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)38 b Fb(77)2025 560 y Fe(PPID)23 b Fc(:)13 +g(:)g(:)g(:)38 b Fb(77)2025 568 y Fe(PPID)23 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(77)2025 648 y Fe(PROMPT_COMMAND)14 +h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(77)2025 658 y Fe(PROMPT_COMMAND)14 b Fc(:)i(:)d(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 -b Fb(77)2025 735 y Fe(PROMPT_DIRTRIM)14 b Fc(:)i(:)d(:)g(:)g(:)g(:)h(:) +b Fb(77)2025 748 y Fe(PROMPT_DIRTRIM)14 b Fc(:)i(:)d(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g -(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fb(77)2025 822 y Fe(PS1)8 +(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fb(77)2025 837 y Fe(PS1)8 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)34 b Fb(69)2025 -909 y Fe(PS2)8 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +927 y Fe(PS2)8 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)34 -b Fb(69)2025 996 y Fe(PS3)8 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) -f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)34 -b Fb(77)2025 1083 y Fe(PS4)8 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +b Fb(69)2025 1017 y Fe(PS3)8 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -34 b Fb(77)2025 1171 y Fe(PWD)8 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g +34 b Fb(77)2025 1107 y Fe(PS4)8 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g -(:)34 b Fb(77)2025 1403 y Fr(R)2025 1519 y Fe(RANDOM)17 +(:)34 b Fb(77)2025 1197 y Fe(PWD)8 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)34 b Fb(77)2025 1443 y Fs(R)2025 1564 y Fe(RANDOM)17 b Fc(:)d(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f -(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(77)2025 1606 y Fe(READLINE_LINE)16 +(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(77)2025 1654 y Fe(READLINE_LINE)16 b Fc(:)g(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 -b Fb(78)2025 1694 y Fe(READLINE_POINT)14 b Fc(:)i(:)d(:)g(:)g(:)g(:)h +b Fb(78)2025 1744 y Fe(READLINE_POINT)14 b Fc(:)i(:)d(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fb(78)2025 1781 y Fe(REPLY)21 +g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fb(78)2025 1834 y Fe(REPLY)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fb(78)2025 1868 y Fe +g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fb(78)2025 1923 y Fe (revert-all-at-newline)11 b Fc(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)38 -b Fb(109)2025 2101 y Fr(S)2025 2217 y Fe(SECONDS)15 b +b Fb(108)2025 2170 y Fs(S)2025 2291 y Fe(SECONDS)15 b Fc(:)f(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)41 b Fb(78)2025 2304 y Fe(SHELL)21 b +h(:)f(:)g(:)g(:)41 b Fb(78)2025 2381 y Fe(SHELL)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fb(78)2025 2391 y Fe(SHELLOPTS)9 +g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fb(78)2025 2471 y Fe(SHELLOPTS)9 b Fc(:)15 b(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) -f(:)g(:)g(:)36 b Fb(78)2025 2478 y Fe(SHLVL)21 b Fc(:)13 +f(:)g(:)g(:)36 b Fb(78)2025 2560 y Fe(SHLVL)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) -g(:)g(:)h(:)f(:)g(:)46 b Fb(78)2025 2565 y Fe(show-all-if-ambiguous)11 +g(:)g(:)h(:)f(:)g(:)46 b Fb(78)2025 2650 y Fe(show-all-if-ambiguous)11 b Fc(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)38 b Fb(109)2025 2653 y Fe +(:)h(:)f(:)g(:)g(:)g(:)g(:)38 b Fb(108)2025 2740 y Fe (show-all-if-unmodified)8 b Fc(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35 b -Fb(110)2025 2740 y Fe(show-mode-in-prompt)16 b Fc(:)h(:)c(:)g(:)h(:)f +Fb(109)2025 2830 y Fe(show-mode-in-prompt)16 b Fc(:)h(:)c(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)43 b Fb(110)2025 2827 y Fe(skip-completed-text)16 +g(:)43 b Fb(109)2025 2919 y Fe(skip-completed-text)16 b Fc(:)h(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fb(110)2025 3078 y Fr(T)2025 -3194 y Fe(TEXTDOMAIN)9 b Fc(:)15 b(:)e(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fb(109)2025 3184 y Fs(T)2025 +3306 y Fe(TEXTDOMAIN)9 b Fc(:)15 b(:)e(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)36 b Fb(7)2025 3282 +g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)36 b Fb(7)2025 3395 y Fe(TEXTDOMAINDIR)21 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)46 b Fb(7)2025 3369 y Fe(TIMEFORMAT)7 +g(:)g(:)g(:)g(:)g(:)46 b Fb(7)2025 3485 y Fe(TIMEFORMAT)7 b Fc(:)15 b(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -g(:)h(:)33 b Fb(78)2025 3456 y Fe(TMOUT)21 b Fc(:)13 +g(:)h(:)33 b Fb(78)2025 3575 y Fe(TMOUT)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) -g(:)g(:)h(:)f(:)g(:)46 b Fb(79)2025 3543 y Fe(TMPDIR)17 +g(:)g(:)h(:)f(:)g(:)46 b Fb(79)2025 3665 y Fe(TMPDIR)17 b Fc(:)d(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f -(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(79)2025 3776 y Fr(U)2025 -3892 y Fe(UID)8 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(79)2025 3911 y Fs(U)2025 +4032 y Fe(UID)8 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)34 -b Fb(79)2025 4124 y Fr(V)2025 4240 y Fe(visible-stats)14 +b Fb(79)2025 4279 y Fs(V)2025 4400 y Fe(visible-stats)14 b Fc(:)i(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)41 -b Fb(110)150 4489 y Fr(D.4)68 b(F)-11 b(unction)44 b(Index)150 -4726 y(A)150 4860 y Fe(abort)27 b(\(C-g\))9 b Fc(:)14 +b Fb(109)150 4649 y Fs(D.4)68 b(F)-11 b(unction)44 b(Index)150 +4886 y(A)150 5010 y Fe(abort)27 b(\(C-g\))9 b Fc(:)14 b(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 -b Fb(123)150 4956 y Fe(accept-line)28 b(\(Newline)g(or)e(Return\))e +b Fb(122)150 5102 y Fe(accept-line)28 b(\(Newline)g(or)e(Return\))e Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)50 b -Fb(117)150 5051 y Fe(alias-expand-line)29 b(\(\))21 b +Fb(116)150 5193 y Fe(alias-expand-line)29 b(\(\))21 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fb(125)2025 4726 y Fr(B)2025 -4860 y Fe(backward-char)28 b(\(C-b\))c Fc(:)13 b(:)h(:)f(:)g(:)g(:)g(:) +(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fb(124)2025 4886 y Fs(B)2025 +5033 y Fe(backward-char)28 b(\(C-b\))c Fc(:)13 b(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)50 -b Fb(116)2025 4956 y Fe(backward-delete-char)30 b(\(Rubout\))14 +b Fb(115)2025 5135 y Fe(backward-delete-char)30 b(\(Rubout\))14 b Fc(:)h(:)e(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)41 -b Fb(118)2025 5052 y Fe(backward-kill-line)29 b(\(C-x)e(Rubout\))16 -b Fc(:)f(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)43 b Fb(119)2025 -5148 y Fe(backward-kill-word)29 b(\(M-DEL\))24 b Fc(:)13 +b Fb(117)2025 5238 y Fe(backward-kill-line)29 b(\(C-x)e(Rubout\))16 +b Fc(:)f(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)43 b Fb(118)2025 +5340 y Fe(backward-kill-word)29 b(\(M-DEL\))24 b Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)49 -b Fb(120)2025 5244 y Fe(backward-word)28 b(\(M-b\))c -Fc(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)50 b Fb(116)2025 5340 -y Fe(beginning-of-history)30 b(\(M-<\))23 b Fc(:)13 b(:)g(:)g(:)h(:)f -(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)49 b Fb(117)p -eop end -%%Page: 165 171 -TeXDict begin 165 170 bop 150 -116 a Ft(App)s(endix)29 -b(D:)i(Indexes)2623 b(165)150 299 y Fe(beginning-of-line)29 -b(\(C-a\))13 b Fc(:)h(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g -(:)g(:)g(:)g(:)g(:)h(:)f(:)39 b Fb(116)150 558 y Fr(C)150 -677 y Fe(call-last-kbd-macro)30 b(\(C-x)c(e\))9 b Fc(:)14 -b(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)36 -b Fb(122)150 765 y Fe(capitalize-word)29 b(\(M-c\))18 -b Fc(:)c(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)g(:)g(:)g(:)h(:)44 b Fb(119)150 854 y Fe(character-search)29 -b(\(C-]\))15 b Fc(:)g(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)42 b Fb(123)150 943 y -Fe(character-search-backward)31 b(\(M-C-]\))23 b Fc(:)13 -b(:)g(:)h(:)f(:)g(:)g(:)g(:)48 b Fb(123)150 1031 y Fe(clear-screen)28 -b(\(C-l\))8 b Fc(:)15 b(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)35 -b Fb(116)150 1120 y Fe(complete)27 b(\(TAB\))20 b Fc(:)13 -b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fb(121)150 -1208 y Fe(complete-command)29 b(\(M-!\))15 b Fc(:)g(:)e(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)42 -b Fb(122)150 1297 y Fe(complete-filename)29 b(\(M-/\))13 +b Fb(119)p eop end +%%Page: 164 170 +TeXDict begin 164 169 bop 150 -116 a Fu(App)s(endix)29 +b(D:)i(Indexes)2623 b(164)150 299 y Fe(backward-word)29 +b(\(M-b\))23 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)49 b Fb(115)150 +387 y Fe(beginning-of-history)30 b(\(M-<\))23 b Fc(:)13 +b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 +b Fb(116)150 475 y Fe(beginning-of-line)29 b(\(C-a\))13 b Fc(:)h(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)39 b Fb(121)150 1386 y Fe(complete-hostname)29 -b(\(M-@\))13 b Fc(:)h(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g -(:)g(:)g(:)g(:)g(:)h(:)f(:)39 b Fb(122)150 1474 y Fe -(complete-into-braces)30 b(\(M-{\))23 b Fc(:)13 b(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(122)150 -1563 y Fe(complete-username)29 b(\(M-~\))13 b Fc(:)h(:)f(:)h(:)f(:)g(:) -g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)39 -b Fb(122)150 1652 y Fe(complete-variable)29 b(\(M-$\))13 +g(:)h(:)f(:)39 b Fb(115)150 732 y Fs(C)150 851 y Fe +(call-last-kbd-macro)30 b(\(C-x)c(e\))9 b Fc(:)14 b(:)f(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)36 b Fb(121)150 +939 y Fe(capitalize-word)29 b(\(M-c\))18 b Fc(:)c(:)f(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)44 +b Fb(118)150 1027 y Fe(character-search)29 b(\(C-]\))15 +b Fc(:)g(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)42 b Fb(122)150 1115 y Fe(character-search-backward)31 +b(\(M-C-]\))23 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)48 +b Fb(122)150 1204 y Fe(clear-screen)28 b(\(C-l\))8 b +Fc(:)15 b(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)35 b Fb(115)150 +1292 y Fe(complete)27 b(\(TAB\))20 b Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)45 b Fb(120)150 1380 y Fe(complete-command)29 +b(\(M-!\))15 b Fc(:)g(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)42 b Fb(121)150 1468 y +Fe(complete-filename)29 b(\(M-/\))13 b Fc(:)h(:)f(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)39 +b Fb(120)150 1556 y Fe(complete-hostname)29 b(\(M-@\))13 b Fc(:)h(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)39 b Fb(122)150 1740 y Fe(copy-backward-word)30 -b(\(\))18 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)44 b Fb(120)150 1829 -y Fe(copy-forward-word)29 b(\(\))21 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 -b Fb(120)150 1917 y Fe(copy-region-as-kill)30 b(\(\))15 -b Fc(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)42 b Fb(120)150 2176 y Fr(D)150 2295 -y Fe(dabbrev-expand)29 b(\(\))11 b Fc(:)i(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -g(:)38 b Fb(122)150 2384 y Fe(delete-char)28 b(\(C-d\))11 -b Fc(:)j(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fb(118)150 -2472 y Fe(delete-char-or-list)30 b(\(\))15 b Fc(:)f(:)f(:)g(:)g(:)g(:)g +g(:)h(:)f(:)39 b Fb(121)150 1645 y Fe(complete-into-braces)30 +b(\(M-{\))23 b Fc(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)49 b Fb(121)150 1733 y Fe(complete-username)29 +b(\(M-~\))13 b Fc(:)h(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)39 b Fb(121)150 1821 y Fe(complete-variable) +29 b(\(M-$\))13 b Fc(:)h(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)39 b Fb(121)150 1909 y Fe +(copy-backward-word)30 b(\(\))18 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)44 +b Fb(119)150 1998 y Fe(copy-forward-word)29 b(\(\))21 +b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fb(119)150 2086 y Fe +(copy-region-as-kill)30 b(\(\))15 b Fc(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)42 +b Fb(119)150 2343 y Fs(D)150 2461 y Fe(dabbrev-expand)29 +b(\(\))11 b Fc(:)i(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 +b Fb(121)150 2549 y Fe(delete-char)28 b(\(C-d\))11 b +Fc(:)j(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fb(117)150 +2638 y Fe(delete-char-or-list)30 b(\(\))15 b Fc(:)f(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)42 -b Fb(121)150 2561 y Fe(delete-horizontal-space)31 b(\(\))22 +b Fb(120)150 2726 y Fe(delete-horizontal-space)31 b(\(\))22 b Fc(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -49 b Fb(120)150 2650 y Fe(digit-argument)29 b(\()p Fd(M-0)p +49 b Fb(119)150 2814 y Fe(digit-argument)29 b(\()p Fd(M-0)p Fe(,)e Fd(M-1)p Fe(,)f(...)g Fd(M--)p Fe(\))d Fc(:)13 -b(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(120)150 2738 y Fe +b(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(119)150 2902 y Fe (display-shell-version)30 b(\(C-x)d(C-v\))16 b Fc(:)e(:)f(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)43 b Fb(124)150 2827 y Fe(do-uppercase-version) -30 b(\(M-a,)d(M-b,)f(M-)p Fd(x)9 b Fe(,)27 b(...\))325 -2914 y Fc(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +(:)f(:)g(:)g(:)g(:)g(:)43 b Fb(123)150 2991 y Fe(do-uppercase-version) +30 b(\(M-a,)d(M-b,)f(M-)p Fd(x)p Fe(,)h(...)q(\))325 +3078 y Fc(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)48 b Fb(123)150 3003 +(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)48 b Fb(122)150 3166 y Fe(downcase-word)29 b(\(M-l\))23 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)49 -b Fb(119)150 3091 y Fe(dump-functions)29 b(\(\))11 b +b Fb(118)150 3254 y Fe(dump-functions)29 b(\(\))11 b Fc(:)i(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fb(124)150 -3180 y Fe(dump-macros)28 b(\(\))19 b Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fb(123)150 +3342 y Fe(dump-macros)28 b(\(\))19 b Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)g(:)h(:)f(:)g(:)45 b Fb(124)150 3269 y Fe(dump-variables)29 +g(:)g(:)h(:)f(:)g(:)45 b Fb(123)150 3431 y Fe(dump-variables)29 b(\(\))11 b Fc(:)i(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 -b Fb(124)150 3357 y Fe(dynamic-complete-history)31 b(\(M-TAB\))7 -b Fc(:)15 b(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fb(122)150 -3616 y Fr(E)150 3735 y Fe(edit-and-execute-command)e(\(C-xC-e\))23 -b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)48 b Fb(125)150 -3824 y Fe(end-kbd-macro)29 b(\(C-x)d(\)\))7 b Fc(:)14 +b Fb(123)150 3519 y Fe(dynamic-complete-history)31 b(\(M-TAB\))7 +b Fc(:)15 b(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fb(121)150 +3776 y Fs(E)150 3894 y Fe(edit-and-execute-command)e(\(C-xC-e\))23 +b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)48 b Fb(124)150 +3982 y Fe(end-kbd-macro)29 b(\(C-x)d(\)\))7 b Fc(:)14 b(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)34 b Fb(122)150 3912 y Fe(end-of-history)29 +(:)g(:)h(:)f(:)g(:)34 b Fb(121)150 4071 y Fe(end-of-history)29 b(\(M->\))21 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fb(117)150 -4001 y Fe(end-of-line)28 b(\(C-e\))11 b Fc(:)j(:)f(:)g(:)h(:)f(:)g(:)g +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fb(116)150 +4159 y Fe(end-of-line)28 b(\(C-e\))11 b Fc(:)j(:)f(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)g(:)38 b Fb(116)150 4090 y Fe(exchange-point-and-mark)31 +g(:)g(:)38 b Fb(115)150 4247 y Fe(exchange-point-and-mark)31 b(\(C-x)26 b(C-x\))11 b Fc(:)j(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)38 -b Fb(123)150 4349 y Fr(F)150 4467 y Fe(forward-backward-delete-char)32 +b Fb(122)150 4504 y Fs(F)150 4622 y Fe(forward-backward-delete-char)32 b(\(\))9 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)36 -b Fb(118)150 4556 y Fe(forward-char)28 b(\(C-f\))8 b +b Fb(117)150 4710 y Fe(forward-char)28 b(\(C-f\))8 b Fc(:)15 b(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g -(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)35 b Fb(116)150 -4645 y Fe(forward-search-history)c(\(C-s\))17 b Fc(:)d(:)f(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(117)150 4733 +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)35 b Fb(115)150 +4799 y Fe(forward-search-history)c(\(C-s\))17 b Fc(:)d(:)f(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(116)150 4887 y Fe(forward-word)28 b(\(M-f\))8 b Fc(:)15 b(:)e(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)35 b Fb(116)150 4982 y Fr(G)150 5101 y Fe(glob-complete-word)30 +(:)35 b Fb(115)150 5134 y Fs(G)150 5252 y Fe(glob-complete-word)30 b(\(M-g\))10 b Fc(:)k(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)37 b Fb(124)150 5189 y Fe(glob-expand-word)29 +(:)f(:)g(:)g(:)g(:)g(:)37 b Fb(123)150 5340 y Fe(glob-expand-word)29 b(\(C-x)e(*\))17 b Fc(:)c(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f -(:)g(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(124)150 5278 y Fe -(glob-list-expansions)30 b(\(C-x)d(g\))7 b Fc(:)13 b(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fb(124)2025 -299 y Fr(H)2025 419 y Fe(history-and-alias-expand-line)f(\(\))7 -b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)34 b Fb(125)2025 -508 y Fe(history-expand-line)c(\(M-^\))8 b Fc(:)13 b(:)h(:)f(:)g(:)g(:) +(:)g(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(123)2025 299 y Fe +(glob-list-expansions)30 b(\(C-x)c(g\))7 b Fc(:)14 b(:)f(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)34 b Fb(123)2025 +566 y Fs(H)2025 688 y Fe(history-and-alias-expand-line)e(\(\))7 +b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)34 b Fb(124)2025 +778 y Fe(history-expand-line)c(\(M-^\))8 b Fc(:)13 b(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)34 b -Fb(124)2025 597 y Fe(history-search-backward)d(\(\))22 +Fb(123)2025 868 y Fe(history-search-backward)d(\(\))22 b Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) -49 b Fb(117)2025 686 y Fe(history-search-forward)30 b(\(\))8 +49 b Fb(116)2025 958 y Fe(history-search-forward)30 b(\(\))8 b Fc(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g -(:)h(:)34 b Fb(117)2025 775 y Fe(history-substr-search-backward)e(\(\)) -22 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)48 b Fb(118)2025 -864 y Fe(history-substr-search-forward)32 b(\(\))7 b -Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)34 b Fb(117)2025 -1125 y Fr(I)2025 1244 y Fe(insert-comment)29 b(\(M-#\))21 +(:)h(:)34 b Fb(116)2025 1048 y Fe(history-substr-search-backward)e +(\(\))22 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)48 b Fb(117)2025 +1139 y Fe(history-substr-search-forward)32 b(\(\))7 b +Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)34 b Fb(116)2025 +1406 y Fs(I)2025 1528 y Fe(insert-comment)29 b(\(M-#\))21 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fb(124)2025 1333 y Fe +(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fb(123)2025 1618 y Fe (insert-completions)29 b(\(M-*\))10 b Fc(:)15 b(:)e(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)37 b Fb(121)2025 -1422 y Fe(insert-last-argument)30 b(\(M-.)c(or)g(M-_\))18 -b Fc(:)c(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)45 b Fb(125)2025 -1683 y Fr(K)2025 1803 y Fe(kill-line)27 b(\(C-k\))16 +(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)37 b Fb(120)2025 +1708 y Fe(insert-last-argument)30 b(\(M-.)c(or)g(M-_\))18 +b Fc(:)c(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)45 b Fb(124)2025 +1975 y Fs(K)2025 2097 y Fe(kill-line)27 b(\(C-k\))16 b Fc(:)f(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b -Fb(119)2025 1892 y Fe(kill-region)28 b(\(\))19 b Fc(:)13 +Fb(118)2025 2187 y Fe(kill-region)28 b(\(\))19 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g -(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)45 b Fb(120)2025 -1981 y Fe(kill-whole-line)29 b(\(\))8 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)45 b Fb(119)2025 +2277 y Fe(kill-whole-line)29 b(\(\))8 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) -f(:)g(:)35 b Fb(119)2025 2070 y Fe(kill-word)27 b(\(M-d\))16 +f(:)g(:)35 b Fb(118)2025 2367 y Fe(kill-word)27 b(\(M-d\))16 b Fc(:)f(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b -Fb(119)2025 2321 y Fr(M)2025 2440 y Fe(magic-space)28 +Fb(118)2025 2624 y Fs(M)2025 2746 y Fe(magic-space)28 b(\(\))19 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)45 -b Fb(125)2025 2529 y Fe(menu-complete)28 b(\(\))13 b +b Fb(124)2025 2836 y Fe(menu-complete)28 b(\(\))13 b Fc(:)h(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fb(121)2025 -2618 y Fe(menu-complete-backward)30 b(\(\))8 b Fc(:)13 +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fb(120)2025 +2926 y Fe(menu-complete-backward)30 b(\(\))8 b Fc(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)34 -b Fb(121)2025 2880 y Fr(N)2025 2999 y Fe(next-history)28 +b Fb(120)2025 3193 y Fs(N)2025 3315 y Fe(next-history)28 b(\(C-n\))8 b Fc(:)15 b(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)35 -b Fb(117)2025 3088 y Fe(non-incremental-forward-search)q(-hist)q(ory)d -(\(M-n\))2200 3175 y Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h +b Fb(116)2025 3405 y Fe(non-incremental-forward-search)q(-hist)q(ory)d +(\(M-n\))2200 3493 y Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)49 b -Fb(117)2025 3264 y Fe(non-incremental-reverse-search)q(-hist)q(ory)32 -b(\(M-p\))2200 3352 y Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h +Fb(116)2025 3583 y Fe(non-incremental-reverse-search)q(-hist)q(ory)32 +b(\(M-p\))2200 3670 y Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)49 b -Fb(117)2025 3594 y Fr(O)2025 3714 y Fe(operate-and-get-next)30 +Fb(116)2025 3918 y Fs(O)2025 4040 y Fe(operate-and-get-next)30 b(\(C-o\))23 b Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)49 b Fb(125)2025 3803 y Fe(overwrite-mode)29 +g(:)g(:)g(:)49 b Fb(124)2025 4130 y Fe(overwrite-mode)29 b(\(\))11 b Fc(:)i(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)38 -b Fb(119)2025 4053 y Fr(P)2025 4173 y Fe(possible-command-completions) +b Fb(118)2025 4387 y Fs(P)2025 4509 y Fe(possible-command-completions) 32 b(\(C-x)26 b(!\))21 b Fc(:)13 b(:)g(:)h(:)f(:)47 b -Fb(122)2025 4262 y Fe(possible-completions)30 b(\(M-?\))23 +Fb(121)2025 4599 y Fe(possible-completions)30 b(\(M-?\))23 b Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) -49 b Fb(121)2025 4351 y Fe(possible-filename-completions)32 -b(\(C-x)26 b(/\))18 b Fc(:)c(:)f(:)g(:)45 b Fb(121)2025 -4440 y Fe(possible-hostname-completions)32 b(\(C-x)26 -b(@\))18 b Fc(:)c(:)f(:)g(:)45 b Fb(122)2025 4529 y Fe +49 b Fb(120)2025 4689 y Fe(possible-filename-completions)32 +b(\(C-x)26 b(/\))18 b Fc(:)c(:)f(:)g(:)45 b Fb(120)2025 +4779 y Fe(possible-hostname-completions)32 b(\(C-x)26 +b(@\))18 b Fc(:)c(:)f(:)g(:)45 b Fb(121)2025 4870 y Fe (possible-username-completions)32 b(\(C-x)26 b(~\))18 -b Fc(:)c(:)f(:)g(:)45 b Fb(122)2025 4618 y Fe +b Fc(:)c(:)f(:)g(:)45 b Fb(121)2025 4960 y Fe (possible-variable-completions)32 b(\(C-x)26 b($\))18 -b Fc(:)c(:)f(:)g(:)45 b Fb(122)2025 4707 y Fe(prefix-meta)28 +b Fc(:)c(:)f(:)g(:)45 b Fb(121)2025 5050 y Fe(prefix-meta)28 b(\(ESC\))11 b Fc(:)j(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)38 -b Fb(123)2025 4796 y Fe(previous-history)29 b(\(C-p\))15 +b Fb(122)2025 5140 y Fe(previous-history)29 b(\(C-p\))15 b Fc(:)f(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)42 b Fb(117)2025 4885 y Fe(print-last-kbd-macro)30 +h(:)f(:)g(:)g(:)42 b Fb(116)2025 5230 y Fe(print-last-kbd-macro)30 b(\(\))13 b Fc(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g -(:)g(:)g(:)g(:)g(:)g(:)40 b Fb(123)2025 5146 y Fr(Q)2025 -5266 y Fe(quoted-insert)28 b(\(C-q)f(or)f(C-v\))19 b -Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g -(:)46 b Fb(118)p eop end -%%Page: 166 172 -TeXDict begin 166 171 bop 150 -116 a Ft(App)s(endix)29 -b(D:)i(Indexes)2623 b(166)150 299 y Fr(R)150 426 y Fe -(re-read-init-file)29 b(\(C-x)e(C-r\))9 b Fc(:)14 b(:)f(:)h(:)f(:)g(:)g -(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)36 b Fb(123)150 -519 y Fe(redraw-current-line)30 b(\(\))15 b Fc(:)f(:)f(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)42 -b Fb(116)150 612 y Fe(reverse-search-history)31 b(\(C-r\))17 -b Fc(:)d(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 -b Fb(117)150 705 y Fe(revert-line)28 b(\(M-r\))11 b Fc(:)j(:)f(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)g(:)g(:)38 b Fb(123)150 975 y Fr(S)150 1103 -y Fe(self-insert)28 b(\(a,)e(b,)g(A,)g(1,)h(!,)f(...\))7 -b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)33 -b Fb(118)150 1195 y Fe(set-mark)27 b(\(C-@\))20 b Fc(:)13 +(:)g(:)g(:)g(:)g(:)g(:)40 b Fb(122)p eop end +%%Page: 165 171 +TeXDict begin 165 170 bop 150 -116 a Fu(App)s(endix)29 +b(D:)i(Indexes)2623 b(165)150 299 y Fs(Q)150 416 y Fe(quoted-insert)29 +b(\(C-q)d(or)g(C-v\))20 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)45 b Fb(117)150 670 y Fs(R)150 +787 y Fe(re-read-init-file)29 b(\(C-x)e(C-r\))9 b Fc(:)14 +b(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)36 +b Fb(122)150 875 y Fe(redraw-current-line)30 b(\(\))15 +b Fc(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)42 b Fb(115)150 963 y Fe(reverse-search-history)31 +b(\(C-r\))17 b Fc(:)d(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)44 b Fb(116)150 1051 y Fe(revert-line)28 b(\(M-r\))11 +b Fc(:)j(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fb(122)150 +1294 y Fs(S)150 1412 y Fe(self-insert)28 b(\(a,)e(b,)g(A,)g(1,)h(!,)f +(...\))7 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)33 +b Fb(117)150 1499 y Fe(set-mark)27 b(\(C-@\))20 b Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fb(123)150 -1288 y Fe(shell-backward-kill-word)31 b(\(\))20 b Fc(:)13 +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fb(122)150 +1587 y Fe(shell-backward-kill-word)31 b(\(\))20 b Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 -b Fb(120)150 1381 y Fe(shell-backward-word)30 b(\(\))15 +b Fb(119)150 1675 y Fe(shell-backward-word)30 b(\(\))15 b Fc(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)42 b Fb(116)150 1474 y Fe(shell-expand-line)29 +g(:)g(:)g(:)g(:)42 b Fb(115)150 1762 y Fe(shell-expand-line)29 b(\(M-C-e\))8 b Fc(:)15 b(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)h(:)f(:)g(:)34 b Fb(124)150 1567 y Fe(shell-forward-word)c +(:)g(:)g(:)h(:)f(:)g(:)34 b Fb(123)150 1850 y Fe(shell-forward-word)c (\(\))18 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) -f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)44 b Fb(116)150 1659 +f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)44 b Fb(115)150 1938 y Fe(shell-kill-word)29 b(\(\))8 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)35 b Fb(120)150 1752 y Fe(skip-csi-sequence)29 b(\(\))21 +(:)35 b Fb(119)150 2026 y Fe(skip-csi-sequence)29 b(\(\))21 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fb(123)150 1845 y Fe(start-kbd-macro)29 +(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fb(122)150 2113 y Fe(start-kbd-macro)29 b(\(C-x)e(\(\))19 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g -(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fb(122)2025 299 -y Fr(T)2025 415 y Fe(tilde-expand)28 b(\(M-&\))8 b Fc(:)15 +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fb(121)2025 299 +y Fs(T)2025 424 y Fe(tilde-expand)28 b(\(M-&\))8 b Fc(:)15 b(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g -(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)35 b Fb(123)2025 503 y +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)35 b Fb(122)2025 515 y Fe(transpose-chars)29 b(\(C-t\))18 b Fc(:)c(:)f(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 -b Fb(119)2025 590 y Fe(transpose-words)29 b(\(M-t\))18 +b Fb(118)2025 607 y Fe(transpose-words)29 b(\(M-t\))18 b Fc(:)c(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)45 b Fb(119)2025 843 y Fr(U)2025 -959 y Fe(undo)26 b(\(C-_)h(or)f(C-x)g(C-u\))c Fc(:)13 +g(:)g(:)g(:)g(:)g(:)45 b Fb(118)2025 881 y Fs(U)2025 +1006 y Fe(undo)26 b(\(C-_)h(or)f(C-x)g(C-u\))c Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)48 b Fb(123)2025 1047 y Fe(universal-argument)29 +(:)h(:)f(:)g(:)g(:)48 b Fb(122)2025 1097 y Fe(universal-argument)29 b(\(\))18 b Fc(:)c(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 b Fb(120)2025 1134 +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 b Fb(119)2025 1189 y Fe(unix-filename-rubout)30 b(\(\))13 b Fc(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)40 -b Fb(120)2025 1222 y Fe(unix-line-discard)29 b(\(C-u\))13 +b Fb(119)2025 1280 y Fe(unix-line-discard)29 b(\(C-u\))13 b Fc(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) -g(:)g(:)g(:)40 b Fb(119)2025 1309 y Fe(unix-word-rubout)29 +g(:)g(:)g(:)40 b Fb(118)2025 1372 y Fe(unix-word-rubout)29 b(\(C-w\))15 b Fc(:)f(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)42 b Fb(120)2025 1396 +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)42 b Fb(119)2025 1463 y Fe(upcase-word)28 b(\(M-u\))11 b Fc(:)j(:)f(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) -g(:)38 b Fb(119)2025 1649 y Fr(Y)2025 1766 y Fe(yank)26 +g(:)38 b Fb(118)2025 1737 y Fs(Y)2025 1862 y Fe(yank)26 b(\(C-y\))12 b Fc(:)i(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)g(:)g(:)g(:)39 b Fb(120)2025 1853 y Fe(yank-last-arg)28 +g(:)g(:)g(:)g(:)39 b Fb(119)2025 1954 y Fe(yank-last-arg)28 b(\(M-.)f(or)f(M-_\))19 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f -(:)g(:)g(:)g(:)g(:)g(:)g(:)46 b Fb(118)2025 1940 y Fe(yank-nth-arg)28 +(:)g(:)g(:)g(:)g(:)g(:)g(:)46 b Fb(117)2025 2045 y Fe(yank-nth-arg)28 b(\(M-C-y\))22 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fb(118)2025 -2028 y Fe(yank-pop)27 b(\(M-y\))20 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f +(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fb(117)2025 +2137 y Fe(yank-pop)27 b(\(M-y\))20 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)g(:)g(:)g(:)h(:)45 b Fb(120)150 2260 y Fr(D.5)68 -b(Concept)45 b(Index)150 2520 y(A)150 2640 y Fb(alias)27 +g(:)g(:)g(:)g(:)h(:)45 b Fb(119)150 2369 y Fs(D.5)68 +b(Concept)45 b(Index)150 2629 y(A)150 2748 y Fb(alias)27 b(expansion)18 b Fc(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) -h(:)44 b Fb(88)150 2729 y(arithmetic)26 b(ev)l(aluation)16 +h(:)44 b Fb(88)150 2836 y(arithmetic)26 b(ev)l(aluation)16 b Fc(:)e(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)43 b Fb(87)150 2818 +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)43 b Fb(87)150 2925 y(arithmetic)26 b(expansion)d Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 -b Fb(28)150 2907 y(arithmetic,)27 b(shell)17 b Fc(:)d(:)f(:)g(:)g(:)g +b Fb(28)150 3013 y(arithmetic,)27 b(shell)17 b Fc(:)d(:)f(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) -f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)43 b Fb(87)150 2996 y(arra)n(ys)15 +f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)43 b Fb(87)150 3102 y(arra)n(ys)15 b Fc(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g -(:)g(:)g(:)g(:)g(:)h(:)f(:)41 b Fb(89)150 3255 y Fr(B)150 -3375 y Fb(bac)n(kground)9 b Fc(:)j(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h +(:)g(:)g(:)g(:)g(:)h(:)f(:)41 b Fb(89)150 3358 y Fs(B)150 +3477 y Fb(bac)n(kground)9 b Fc(:)j(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)35 b Fb(98)150 3464 y(Bash)26 +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)35 b Fb(97)150 3565 y(Bash)26 b(con\014guration)d Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)49 -b Fb(139)150 3553 y(Bash)26 b(installation)c Fc(:)13 +b Fb(138)150 3654 y(Bash)26 b(installation)c Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)46 b Fb(139)150 -3642 y(Bourne)26 b(shell)13 b Fc(:)h(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)46 b Fb(138)150 +3742 y(Bourne)26 b(shell)13 b Fc(:)h(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f -(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fb(5)150 3731 +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 b Fb(5)150 3831 y(brace)26 b(expansion)20 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)g(:)47 b Fb(21)150 3820 y(builtin)9 b Fc(:)k(:)g(:)g(:)g(:) +g(:)g(:)g(:)g(:)47 b Fb(21)150 3919 y(builtin)9 b Fc(:)k(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)g(:)36 b Fb(3)150 4063 y Fr(C)150 4182 y Fb(command)26 +g(:)g(:)36 b Fb(3)150 4159 y Fs(C)150 4278 y Fb(command)26 b(editing)13 b Fc(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)40 -b Fb(103)150 4272 y(command)26 b(execution)d Fc(:)13 +b Fb(102)150 4366 y(command)26 b(execution)d Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g -(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)49 b Fb(36)150 4361 +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)49 b Fb(36)150 4455 y(command)26 b(expansion)16 b Fc(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)42 -b Fb(35)150 4450 y(command)26 b(history)12 b Fc(:)h(:)g(:)g(:)g(:)g(:)h +b Fb(35)150 4543 y(command)26 b(history)12 b Fc(:)h(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)g(:)g(:)39 b Fb(134)150 4539 y(command)26 +g(:)g(:)g(:)g(:)g(:)39 b Fb(133)150 4632 y(command)26 b(searc)n(h)10 b Fc(:)j(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -36 b Fb(36)150 4628 y(command)26 b(substitution)15 b +36 b Fb(36)150 4720 y(command)26 b(substitution)15 b Fc(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g -(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)41 b Fb(28)150 4717 y(command)26 +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)41 b Fb(28)150 4809 y(command)26 b(timing)7 b Fc(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)34 b Fb(8)150 4806 y(commands,)26 b(comp)r(ound)18 +g(:)34 b Fb(8)150 4897 y(commands,)26 b(comp)r(ound)18 b Fc(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) -f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fb(9)150 4895 +f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fb(9)150 4986 y(commands,)26 b(conditional)d Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 -b Fb(10)150 4984 y(commands,)26 b(grouping)9 b Fc(:)14 +b Fb(10)150 5074 y(commands,)26 b(grouping)9 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)35 b Fb(14)150 5073 +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)35 b Fb(14)150 5163 y(commands,)26 b(lists)6 b Fc(:)15 b(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)33 b Fb(9)150 5162 y(commands,)26 +(:)g(:)h(:)f(:)g(:)g(:)33 b Fb(9)150 5251 y(commands,)26 b(lo)r(oping)16 b Fc(:)f(:)e(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)42 -b Fb(10)150 5251 y(commands,)26 b(pip)r(elines)12 b Fc(:)i(:)f(:)g(:)g +b Fb(10)150 5340 y(commands,)26 b(pip)r(elines)12 b Fc(:)i(:)f(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)g(:)39 b Fb(8)150 5340 y(commands,)26 -b(shell)15 b Fc(:)f(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -42 b Fb(8)2025 2520 y(commands,)26 b(simple)17 b Fc(:)d(:)f(:)g(:)h(:)f +g(:)g(:)g(:)g(:)g(:)g(:)39 b Fb(8)2025 2629 y(commands,)26 +b(shell)15 b Fc(:)f(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) +42 b Fb(8)2025 2720 y(commands,)26 b(simple)17 b Fc(:)d(:)f(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)g(:)g(:)g(:)h(:)f(:)g(:)44 b Fb(8)2025 2609 y(commen)n(ts,)26 +g(:)g(:)g(:)g(:)h(:)f(:)g(:)44 b Fb(8)2025 2810 y(commen)n(ts,)26 b(shell)7 b Fc(:)14 b(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)g(:)35 b Fb(7)2025 2698 y(completion)26 b(builtins)15 +g(:)g(:)35 b Fb(7)2025 2901 y(completion)26 b(builtins)15 b Fc(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)42 b Fb(127)2025 -2787 y(con\014guration)15 b Fc(:)f(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)42 b Fb(126)2025 +2991 y(con\014guration)15 b Fc(:)f(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)g(:)h(:)f(:)g(:)42 b Fb(139)2025 2875 y(con)n(trol)26 +g(:)g(:)h(:)f(:)g(:)42 b Fb(138)2025 3082 y(con)n(trol)26 b(op)r(erator)20 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g -(:)g(:)h(:)46 b Fb(3)2025 2964 y(copro)r(cess)12 b Fc(:)i(:)f(:)g(:)h +(:)g(:)h(:)46 b Fb(3)2025 3172 y(copro)r(cess)12 b Fc(:)i(:)f(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)38 -b Fb(15)2025 3222 y Fr(D)2025 3342 y Fb(directory)26 +b Fb(15)2025 3439 y Fs(D)2025 3562 y Fb(directory)26 b(stac)n(k)c Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)49 b Fb(91)2025 3600 y Fr(E)2025 3719 y Fb(editing)26 +g(:)49 b Fb(90)2025 3829 y Fs(E)2025 3952 y Fb(editing)26 b(command)g(lines)11 b Fc(:)i(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)38 -b Fb(103)2025 3808 y(en)n(vironmen)n(t)12 b Fc(:)g(:)h(:)g(:)h(:)f(:)g +b Fb(102)2025 4043 y(en)n(vironmen)n(t)12 b Fc(:)g(:)h(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)39 b Fb(37)2025 -3897 y(ev)l(aluation,)26 b(arithmetic)e Fc(:)13 b(:)g(:)g(:)g(:)g(:)g +4133 y(ev)l(aluation,)26 b(arithmetic)e Fc(:)13 b(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)49 b Fb(87)2025 3985 y(ev)n(en)n(t)24 b(designators)14 +g(:)49 b Fb(87)2025 4224 y(ev)n(en)n(t)24 b(designators)14 b Fc(:)h(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)41 b -Fb(137)2025 4074 y(execution)25 b(en)n(vironmen)n(t)11 +Fb(135)2025 4314 y(execution)25 b(en)n(vironmen)n(t)11 b Fc(:)i(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)37 b Fb(36)2025 4163 +h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)37 b Fb(36)2025 4405 y(exit)25 b(status)18 b Fc(:)c(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)g(:)45 b Fb(3,)26 b(38)2025 4252 y(expansion)20 +h(:)f(:)g(:)g(:)g(:)45 b Fb(3,)26 b(38)2025 4495 y(expansion)20 b Fc(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)47 b Fb(21)2025 4341 y(expansion,)26 b(arithmetic)12 +g(:)g(:)g(:)47 b Fb(21)2025 4586 y(expansion,)26 b(arithmetic)12 b Fc(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)38 b Fb(28)2025 4430 +h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)38 b Fb(28)2025 4676 y(expansion,)26 b(brace)10 b Fc(:)j(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)g(:)36 b Fb(21)2025 4518 y(expansion,)26 b(\014lename)12 +h(:)f(:)g(:)36 b Fb(21)2025 4767 y(expansion,)26 b(\014lename)12 b Fc(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)38 b Fb(29)2025 -4607 y(expansion,)26 b(parameter)14 b Fc(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:) +4857 y(expansion,)26 b(parameter)14 b Fc(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h -(:)40 b Fb(23)2025 4696 y(expansion,)26 b(pathname)18 +(:)40 b Fb(23)2025 4948 y(expansion,)26 b(pathname)18 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)45 b Fb(29)2025 -4785 y(expansion,)26 b(tilde)8 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g +5038 y(expansion,)26 b(tilde)8 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) -g(:)g(:)g(:)h(:)f(:)g(:)34 b Fb(22)2025 4874 y(expressions,)27 +g(:)g(:)g(:)h(:)f(:)g(:)34 b Fb(22)2025 5129 y(expressions,)27 b(arithmetic)7 b Fc(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34 -b Fb(87)2025 4963 y(expressions,)27 b(conditional)11 +b Fb(87)2025 5220 y(expressions,)27 b(conditional)11 b Fc(:)j(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)g(:)h(:)f(:)g(:)g(:)g(:)38 b Fb(85)2025 5221 y Fr(F)2025 -5340 y Fb(\014eld)15 b Fc(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) -f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)42 -b Fb(3)p eop end -%%Page: 167 173 -TeXDict begin 167 172 bop 150 -116 a Ft(App)s(endix)29 -b(D:)i(Indexes)2623 b(167)150 299 y Fb(\014lename)15 -b Fc(:)f(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)h(:)f(:)g(:)42 b Fb(3)150 386 y(\014lename)26 -b(expansion)d Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 -b Fb(29)150 473 y(foreground)24 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)49 b Fb(98)150 -561 y(functions,)26 b(shell)21 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)g(:)47 b Fb(17)150 811 y Fr(H)150 -927 y Fb(history)26 b(builtins)14 b Fc(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f +g(:)g(:)h(:)f(:)g(:)g(:)g(:)38 b Fb(85)p eop end +%%Page: 166 172 +TeXDict begin 166 171 bop 150 -116 a Fu(App)s(endix)29 +b(D:)i(Indexes)2623 b(166)150 299 y Fs(F)150 415 y Fb(\014eld)15 +b Fc(:)e(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)42 b Fb(3)150 +502 y(\014lename)15 b Fc(:)f(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)42 b Fb(3)150 +589 y(\014lename)26 b(expansion)d Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)g(:)g(:)g(:)h(:)40 b Fb(134)150 1014 y(history)26 -b(ev)n(en)n(ts)18 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)46 b Fb(137)150 1101 y(history)26 b(expansion)8 -b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)35 -b Fb(136)150 1189 y(history)26 b(list)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f -(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fb(134)150 -1276 y(History)-6 b(,)26 b(ho)n(w)g(to)f(use)13 b Fc(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)g(:)h(:)39 b Fb(133)150 1526 y Fr(I)150 1642 -y Fb(iden)n(ti\014er)22 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f -(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)50 b Fb(3)150 -1729 y(initialization)28 b(\014le,)e(readline)11 b Fc(:)j(:)f(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)38 -b Fb(105)150 1816 y(installation)13 b Fc(:)i(:)e(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)40 b Fb(139)150 -1904 y(in)n(teraction,)27 b(readline)18 b Fc(:)c(:)f(:)g(:)g(:)g(:)h(:) -f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g -(:)g(:)45 b Fb(102)150 1991 y(in)n(teractiv)n(e)26 b(shell)14 -b Fc(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) -f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)41 b Fb(82,)26 -b(83)150 2078 y(in)n(ternationalization)14 b Fc(:)h(:)f(:)f(:)g(:)g(:)g +g(:)g(:)49 b Fb(29)150 676 y(foreground)24 b Fc(:)13 +b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +49 b Fb(97)150 764 y(functions,)26 b(shell)21 b Fc(:)14 +b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)47 +b Fb(17)150 1013 y Fs(H)150 1129 y Fb(history)26 b(builtins)14 +b Fc(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)40 +b Fb(133)150 1216 y(history)26 b(ev)n(en)n(ts)18 b Fc(:)13 +b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)46 +b Fb(135)150 1304 y(history)26 b(expansion)8 b Fc(:)13 +b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)35 b Fb(135)150 +1391 y(history)26 b(list)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fb(133)150 1478 +y(History)-6 b(,)26 b(ho)n(w)g(to)f(use)13 b Fc(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)g(:)h(:)39 b Fb(132)150 1728 y Fs(I)150 1843 y Fb(iden)n(ti\014er) +22 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)g(:)50 b Fb(3)150 1931 y(initialization)28 +b(\014le,)e(readline)11 b Fc(:)j(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)38 b Fb(104)150 +2018 y(installation)13 b Fc(:)i(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)g(:)g(:)g(:)g(:)40 b Fb(138)150 2105 y(in)n(teraction,)27 +b(readline)18 b Fc(:)c(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)45 +b Fb(101)150 2192 y(in)n(teractiv)n(e)26 b(shell)14 b +Fc(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)41 b Fb(81,)26 +b(83)150 2279 y(in)n(ternationalization)14 b Fc(:)h(:)f(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)41 b Fb(7)150 2311 y Fr(J)150 2428 +g(:)h(:)f(:)g(:)g(:)41 b Fb(7)150 2512 y Fs(J)150 2628 y Fb(job)16 b Fc(:)e(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)43 -b Fb(3)150 2515 y(job)26 b(con)n(trol)13 b Fc(:)h(:)f(:)g(:)g(:)h(:)f +b Fb(3)150 2716 y(job)26 b(con)n(trol)13 b Fc(:)h(:)f(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)40 b Fb(3,)26 -b(98)150 2765 y Fr(K)150 2881 y Fb(kill)g(ring)19 b Fc(:)13 +b(97)150 2965 y Fs(K)150 3081 y Fb(kill)g(ring)19 b Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) -f(:)g(:)45 b Fb(104)150 2968 y(killing)27 b(text)17 b +f(:)g(:)45 b Fb(103)150 3168 y(killing)27 b(text)17 b Fc(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -44 b Fb(104)150 3218 y Fr(L)150 3334 y Fb(lo)r(calization)14 +44 b Fb(103)150 3418 y Fs(L)150 3534 y Fb(lo)r(calization)14 b Fc(:)i(:)d(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)41 b Fb(7)150 3421 y(login)27 b(shell)17 b +(:)f(:)g(:)41 b Fb(7)150 3621 y(login)27 b(shell)17 b Fc(:)d(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)g(:)44 b Fb(82)150 3671 y Fr(M)150 3788 y Fb(matc)n(hing,)26 +g(:)g(:)44 b Fb(81)150 3871 y Fs(M)150 3987 y Fb(matc)n(hing,)26 b(pattern)20 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 -b Fb(30)150 3875 y(metac)n(haracter)18 b Fc(:)d(:)e(:)g(:)g(:)g(:)g(:)g +b Fb(30)150 4074 y(metac)n(haracter)18 b Fc(:)d(:)e(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) -f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fb(3)150 4108 -y Fr(N)150 4224 y Fb(name)13 b Fc(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h +f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fb(3)150 4307 +y Fs(N)150 4423 y Fb(name)13 b Fc(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)40 -b Fb(3)150 4311 y(nativ)n(e)25 b(languages)13 b Fc(:)i(:)e(:)g(:)h(:)f +b Fb(3)150 4510 y(nativ)n(e)25 b(languages)13 b Fc(:)i(:)e(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)40 b Fb(7)150 4399 +g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)40 b Fb(7)150 4597 y(notation,)27 b(readline)7 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -g(:)h(:)33 b Fb(103)150 4649 y Fr(O)150 4765 y Fb(op)r(erator,)27 +g(:)h(:)33 b Fb(102)150 4847 y Fs(O)150 4963 y Fb(op)r(erator,)27 b(shell)16 b Fc(:)e(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)43 b Fb(3)150 5015 y Fr(P)150 5131 y Fb(parameter)26 +g(:)g(:)43 b Fb(3)150 5212 y Fs(P)150 5328 y Fb(parameter)26 b(expansion)7 b Fc(:)14 b(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)34 -b Fb(23)150 5218 y(parameters)17 b Fc(:)d(:)f(:)g(:)h(:)f(:)g(:)g(:)g +b Fb(23)150 5415 y(parameters)17 b Fc(:)d(:)f(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)43 b Fb(18)150 -5305 y(parameters,)27 b(p)r(ositional)18 b Fc(:)d(:)e(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)44 b Fb(19)2025 299 y(parameters,)27 b(sp)r(ecial)18 +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)43 b Fb(18)2025 +299 y(parameters,)27 b(p)r(ositional)18 b Fc(:)d(:)e(:)g(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h +(:)44 b Fb(19)2025 387 y(parameters,)27 b(sp)r(ecial)18 b Fc(:)c(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)44 b Fb(20)2025 -386 y(pathname)25 b(expansion)12 b Fc(:)h(:)g(:)h(:)f(:)g(:)g(:)g(:)g +474 y(pathname)25 b(expansion)12 b Fc(:)h(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) -h(:)38 b Fb(29)2025 474 y(pattern)25 b(matc)n(hing)14 +h(:)38 b Fb(29)2025 562 y(pattern)25 b(matc)n(hing)14 b Fc(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)41 -b Fb(30)2025 561 y(pip)r(eline)23 b Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g +b Fb(30)2025 650 y(pip)r(eline)23 b Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)50 -b Fb(8)2025 649 y(POSIX)17 b Fc(:)12 b(:)h(:)g(:)g(:)g(:)g(:)h(:)f(:)g +b Fb(8)2025 738 y(POSIX)17 b Fc(:)12 b(:)h(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)44 -b Fb(3)2025 736 y(POSIX)24 b(Mo)r(de)11 b Fc(:)j(:)f(:)g(:)g(:)g(:)g(:) +b Fb(3)2025 825 y(POSIX)24 b(Mo)r(de)11 b Fc(:)j(:)f(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)37 b Fb(94)2025 -824 y(pro)r(cess)26 b(group)9 b Fc(:)14 b(:)f(:)g(:)h(:)f(:)g(:)g(:)g +913 y(pro)r(cess)26 b(group)9 b Fc(:)14 b(:)f(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)37 b Fb(3)2025 911 +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)37 b Fb(3)2025 1001 y(pro)r(cess)26 b(group)g(ID)21 b Fc(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) -f(:)g(:)g(:)g(:)g(:)49 b Fb(3)2025 999 y(pro)r(cess)26 +f(:)g(:)g(:)g(:)g(:)49 b Fb(3)2025 1089 y(pro)r(cess)26 b(substitution)c Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)48 -b Fb(29)2025 1086 y(programmable)27 b(completion)20 b +b Fb(29)2025 1177 y(programmable)27 b(completion)20 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)46 b Fb(125)2025 1174 y(prompting)11 b +(:)g(:)h(:)f(:)46 b Fb(124)2025 1264 y(prompting)11 b Fc(:)i(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)g(:)38 b Fb(92)2025 1425 y Fr(Q)2025 1541 y Fb(quoting)10 +g(:)g(:)38 b Fb(92)2025 1517 y Fs(Q)2025 1634 y Fb(quoting)10 b Fc(:)j(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)g(:)h(:)f(:)g(:)37 b Fb(6)2025 1629 y(quoting,)26 +(:)g(:)g(:)g(:)h(:)f(:)g(:)37 b Fb(6)2025 1722 y(quoting,)26 b(ANSI)13 b Fc(:)e(:)j(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -h(:)f(:)40 b Fb(6)2025 1880 y Fr(R)2025 1997 y Fb(Readline,)26 +h(:)f(:)40 b Fb(6)2025 1974 y Fs(R)2025 2091 y Fb(Readline,)26 b(ho)n(w)g(to)g(use)c Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)49 -b Fb(101)2025 2084 y(redirection)7 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g +b Fb(100)2025 2179 y(redirection)7 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)33 b -Fb(31)2025 2172 y(reserv)n(ed)25 b(w)n(ord)7 b Fc(:)14 +Fb(31)2025 2267 y(reserv)n(ed)25 b(w)n(ord)7 b Fc(:)14 b(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)34 -b Fb(3)2025 2259 y(restricted)26 b(shell)8 b Fc(:)14 +b Fb(3)2025 2355 y(restricted)26 b(shell)8 b Fc(:)14 b(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)35 -b Fb(93)2025 2346 y(return)25 b(status)c Fc(:)13 b(:)h(:)f(:)g(:)g(:)g +b Fb(93)2025 2443 y(return)25 b(status)c Fc(:)13 b(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)48 b Fb(4)2025 -2581 y Fr(S)2025 2697 y Fb(shell)26 b(arithmetic)11 b +2678 y Fs(S)2025 2796 y Fb(shell)26 b(arithmetic)11 b Fc(:)j(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)37 -b Fb(87)2025 2785 y(shell)26 b(function)12 b Fc(:)h(:)g(:)h(:)f(:)g(:)g +b Fb(87)2025 2883 y(shell)26 b(function)12 b Fc(:)h(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)38 b Fb(17)2025 -2872 y(shell)26 b(script)c Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +2971 y(shell)26 b(script)c Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g -(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fb(39)2025 2960 +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fb(39)2025 3059 y(shell)26 b(v)l(ariable)18 b Fc(:)c(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)45 b Fb(18)2025 3047 y(shell,)26 +(:)h(:)f(:)g(:)g(:)g(:)g(:)45 b Fb(18)2025 3147 y(shell,)26 b(in)n(teractiv)n(e)14 b Fc(:)g(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)h(:)40 b Fb(83)2025 3135 y(signal)7 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)h +g(:)h(:)40 b Fb(83)2025 3234 y(signal)7 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)34 b Fb(4)2025 3222 y(signal)27 b(handling)17 +(:)g(:)34 b Fb(4)2025 3322 y(signal)27 b(handling)17 b Fc(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)44 -b Fb(38)2025 3310 y(sp)r(ecial)27 b(builtin)10 b Fc(:)j(:)g(:)g(:)g(:)g +b Fb(38)2025 3410 y(sp)r(ecial)27 b(builtin)10 b Fc(:)j(:)g(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)37 b Fb(4,)26 b(68)2025 -3397 y(startup)f(\014les)d Fc(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) +3498 y(startup)f(\014les)d Fc(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fb(82)2025 3485 y(susp)r(ending)25 +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fb(82)2025 3585 y(susp)r(ending)25 b(jobs)6 b Fc(:)14 b(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g -(:)33 b Fb(98)2025 3736 y Fr(T)2025 3853 y Fb(tilde)26 +(:)33 b Fb(97)2025 3838 y Fs(T)2025 3955 y Fb(tilde)26 b(expansion)18 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)g(:)45 b Fb(22)2025 3940 y(tok)n(en)11 b Fc(:)h(:)i(:)f(:)g(:)g(:)g +g(:)g(:)45 b Fb(22)2025 4043 y(tok)n(en)11 b Fc(:)h(:)i(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f -(:)g(:)38 b Fb(4)2025 4027 y(translation,)27 b(nativ)n(e)e(languages)13 +(:)g(:)38 b Fb(4)2025 4131 y(translation,)27 b(nativ)n(e)e(languages)13 b Fc(:)i(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)40 b Fb(7)2025 4279 y Fr(V)2025 4395 y Fb(v)l(ariable,)26 +g(:)g(:)g(:)40 b Fb(7)2025 4383 y Fs(V)2025 4500 y Fb(v)l(ariable,)26 b(shell)8 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) -f(:)g(:)g(:)34 b Fb(18)2025 4483 y(v)l(ariables,)27 b(readline)18 +f(:)g(:)g(:)34 b Fb(18)2025 4588 y(v)l(ariables,)27 b(readline)18 b Fc(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) -f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)45 b Fb(106)2025 -4734 y Fr(W)2025 4850 y Fb(w)n(ord)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)h +f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)45 b Fb(105)2025 +4841 y Fs(W)2025 4958 y Fb(w)n(ord)21 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)48 b Fb(4)2025 4938 y(w)n(ord)26 b(splitting)21 +(:)g(:)48 b Fb(4)2025 5046 y(w)n(ord)26 b(splitting)21 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 -b Fb(29)2025 5189 y Fr(Y)2025 5305 y Fb(y)n(anking)25 +b Fb(29)2025 5298 y Fs(Y)2025 5415 y Fb(y)n(anking)25 b(text)7 b Fc(:)12 b(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g -(:)g(:)g(:)34 b Fb(104)p eop end +(:)g(:)g(:)34 b Fb(103)p eop end %%Trailer userdict /end-hook known{end-hook}if diff --git a/doc/bashref.rw b/doc/bashref.rw index 3a9b0603c..19aa65faf 100644 --- a/doc/bashref.rw +++ b/doc/bashref.rw @@ -16,6 +16,6 @@ \entry{select}{12}{\code {select}} \entry{[[}{12}{\code {[[}} \entry{]]}{12}{\code {]]}} -\entry{{\tt \char 123}}{14}{\code {{\tt \char 123}}} -\entry{{\tt \char 125}}{14}{\code {{\tt \char 125}}} +\entry{|a}{14}{\code {{\tt \char 123}}} +\entry{|b}{14}{\code {{\tt \char 125}}} \entry{function}{17}{\code {function}} diff --git a/doc/bashref.rws b/doc/bashref.rws index ca24ba1fe..edbd5d23b 100644 --- a/doc/bashref.rws +++ b/doc/bashref.rws @@ -4,9 +4,8 @@ \entry {\code {[[}}{12} \initial {]} \entry {\code {]]}}{12} -\initial {{\tt \char 123}} +\initial {|} \entry {\code {{\tt \char 123}}}{14} -\initial {{\tt \char 125}} \entry {\code {{\tt \char 125}}}{14} \initial {C} \entry {\code {case}}{11} diff --git a/doc/bashref.tmp b/doc/bashref.tmp index e37dd0c98..fabeb2472 100644 --- a/doc/bashref.tmp +++ b/doc/bashref.tmp @@ -16,4 +16,4 @@ Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. @end quotation -@endinput +@empty diff --git a/doc/bashref.toc b/doc/bashref.toc index e2b05cf39..227f0ace7 100644 --- a/doc/bashref.toc +++ b/doc/bashref.toc @@ -59,9 +59,9 @@ @numchapentry{Shell Builtin Commands}{4}{Shell Builtin Commands}{41} @numsecentry{Bourne Shell Builtins}{4.1}{Bourne Shell Builtins}{41} @numsecentry{Bash Builtin Commands}{4.2}{Bash Builtins}{48} -@numsecentry{Modifying Shell Behavior}{4.3}{Modifying Shell Behavior}{59} -@numsubsecentry{The Set Builtin}{4.3.1}{The Set Builtin}{59} -@numsubsecentry{The Shopt Builtin}{4.3.2}{The Shopt Builtin}{63} +@numsecentry{Modifying Shell Behavior}{4.3}{Modifying Shell Behavior}{58} +@numsubsecentry{The Set Builtin}{4.3.1}{The Set Builtin}{58} +@numsubsecentry{The Shopt Builtin}{4.3.2}{The Shopt Builtin}{62} @numsecentry{Special Builtins}{4.4}{Special Builtins}{68} @numchapentry{Shell Variables}{5}{Shell Variables}{69} @numsecentry{Bourne Shell Variables}{5.1}{Bourne Shell Variables}{69} @@ -70,70 +70,70 @@ @numsecentry{Invoking Bash}{6.1}{Invoking Bash}{80} @numsecentry{Bash Startup Files}{6.2}{Bash Startup Files}{82} @numsecentry{Interactive Shells}{6.3}{Interactive Shells}{83} -@numsubsecentry{What is an Interactive Shell?}{6.3.1}{What is an Interactive Shell?}{84} +@numsubsecentry{What is an Interactive Shell?}{6.3.1}{What is an Interactive Shell?}{83} @numsubsecentry{Is this Shell Interactive?}{6.3.2}{Is this Shell Interactive?}{84} @numsubsecentry{Interactive Shell Behavior}{6.3.3}{Interactive Shell Behavior}{84} @numsecentry{Bash Conditional Expressions}{6.4}{Bash Conditional Expressions}{85} @numsecentry{Shell Arithmetic}{6.5}{Shell Arithmetic}{87} @numsecentry{Aliases}{6.6}{Aliases}{88} @numsecentry{Arrays}{6.7}{Arrays}{89} -@numsecentry{The Directory Stack}{6.8}{The Directory Stack}{91} -@numsubsecentry{Directory Stack Builtins}{6.8.1}{Directory Stack Builtins}{91} +@numsecentry{The Directory Stack}{6.8}{The Directory Stack}{90} +@numsubsecentry{Directory Stack Builtins}{6.8.1}{Directory Stack Builtins}{90} @numsecentry{Controlling the Prompt}{6.9}{Controlling the Prompt}{92} @numsecentry{The Restricted Shell}{6.10}{The Restricted Shell}{93} @numsecentry{Bash POSIX Mode}{6.11}{Bash POSIX Mode}{94} -@numchapentry{Job Control}{7}{Job Control}{98} -@numsecentry{Job Control Basics}{7.1}{Job Control Basics}{98} -@numsecentry{Job Control Builtins}{7.2}{Job Control Builtins}{99} -@numsecentry{Job Control Variables}{7.3}{Job Control Variables}{101} -@numchapentry{Command Line Editing}{8}{Command Line Editing}{102} -@numsecentry{Introduction to Line Editing}{8.1}{Introduction and Notation}{102} -@numsecentry{Readline Interaction}{8.2}{Readline Interaction}{102} -@numsubsecentry{Readline Bare Essentials}{8.2.1}{Readline Bare Essentials}{103} -@numsubsecentry{Readline Movement Commands}{8.2.2}{Readline Movement Commands}{103} -@numsubsecentry{Readline Killing Commands}{8.2.3}{Readline Killing Commands}{104} -@numsubsecentry{Readline Arguments}{8.2.4}{Readline Arguments}{104} -@numsubsecentry{Searching for Commands in the History}{8.2.5}{Searching}{104} -@numsecentry{Readline Init File}{8.3}{Readline Init File}{105} -@numsubsecentry{Readline Init File Syntax}{8.3.1}{Readline Init File Syntax}{105} -@numsubsecentry{Conditional Init Constructs}{8.3.2}{Conditional Init Constructs}{112} -@numsubsecentry{Sample Init File}{8.3.3}{Sample Init File}{113} -@numsecentry{Bindable Readline Commands}{8.4}{Bindable Readline Commands}{116} -@numsubsecentry{Commands For Moving}{8.4.1}{Commands For Moving}{116} -@numsubsecentry{Commands For Manipulating The History}{8.4.2}{Commands For History}{117} -@numsubsecentry{Commands For Changing Text}{8.4.3}{Commands For Text}{118} -@numsubsecentry{Killing And Yanking}{8.4.4}{Commands For Killing}{119} -@numsubsecentry{Specifying Numeric Arguments}{8.4.5}{Numeric Arguments}{120} -@numsubsecentry{Letting Readline Type For You}{8.4.6}{Commands For Completion}{121} -@numsubsecentry{Keyboard Macros}{8.4.7}{Keyboard Macros}{122} -@numsubsecentry{Some Miscellaneous Commands}{8.4.8}{Miscellaneous Commands}{123} -@numsecentry{Readline vi Mode}{8.5}{Readline vi Mode}{125} -@numsecentry{Programmable Completion}{8.6}{Programmable Completion}{125} -@numsecentry{Programmable Completion Builtins}{8.7}{Programmable Completion Builtins}{127} -@numsecentry{A Programmable Completion Example}{8.8}{A Programmable Completion Example}{131} -@numchapentry{Using History Interactively}{9}{Using History Interactively}{134} -@numsecentry{Bash History Facilities}{9.1}{Bash History Facilities}{134} -@numsecentry{Bash History Builtins}{9.2}{Bash History Builtins}{134} -@numsecentry{History Expansion}{9.3}{History Interaction}{136} -@numsubsecentry{Event Designators}{9.3.1}{Event Designators}{137} -@numsubsecentry{Word Designators}{9.3.2}{Word Designators}{137} -@numsubsecentry{Modifiers}{9.3.3}{Modifiers}{138} -@numchapentry{Installing Bash}{10}{Installing Bash}{139} -@numsecentry{Basic Installation}{10.1}{Basic Installation}{139} -@numsecentry{Compilers and Options}{10.2}{Compilers and Options}{140} -@numsecentry{Compiling For Multiple Architectures}{10.3}{Compiling For Multiple Architectures}{140} -@numsecentry{Installation Names}{10.4}{Installation Names}{140} -@numsecentry{Specifying the System Type}{10.5}{Specifying the System Type}{140} -@numsecentry{Sharing Defaults}{10.6}{Sharing Defaults}{141} -@numsecentry{Operation Controls}{10.7}{Operation Controls}{141} -@numsecentry{Optional Features}{10.8}{Optional Features}{141} -@appentry{Reporting Bugs}{A}{Reporting Bugs}{146} -@appentry{Major Differences From The Bourne Shell}{B}{Major Differences From The Bourne Shell}{147} -@appsecentry{Implementation Differences From The SVR4.2 Shell}{B.1}{}{151} -@appentry{GNU Free Documentation License}{C}{GNU Free Documentation License}{153} -@appentry{Indexes}{D}{Indexes}{161} -@appsecentry{Index of Shell Builtin Commands}{D.1}{Builtin Index}{161} -@appsecentry{Index of Shell Reserved Words}{D.2}{Reserved Word Index}{162} -@appsecentry{Parameter and Variable Index}{D.3}{Variable Index}{162} -@appsecentry{Function Index}{D.4}{Function Index}{164} -@appsecentry{Concept Index}{D.5}{Concept Index}{166} +@numchapentry{Job Control}{7}{Job Control}{97} +@numsecentry{Job Control Basics}{7.1}{Job Control Basics}{97} +@numsecentry{Job Control Builtins}{7.2}{Job Control Builtins}{98} +@numsecentry{Job Control Variables}{7.3}{Job Control Variables}{100} +@numchapentry{Command Line Editing}{8}{Command Line Editing}{101} +@numsecentry{Introduction to Line Editing}{8.1}{Introduction and Notation}{101} +@numsecentry{Readline Interaction}{8.2}{Readline Interaction}{101} +@numsubsecentry{Readline Bare Essentials}{8.2.1}{Readline Bare Essentials}{102} +@numsubsecentry{Readline Movement Commands}{8.2.2}{Readline Movement Commands}{102} +@numsubsecentry{Readline Killing Commands}{8.2.3}{Readline Killing Commands}{103} +@numsubsecentry{Readline Arguments}{8.2.4}{Readline Arguments}{103} +@numsubsecentry{Searching for Commands in the History}{8.2.5}{Searching}{103} +@numsecentry{Readline Init File}{8.3}{Readline Init File}{104} +@numsubsecentry{Readline Init File Syntax}{8.3.1}{Readline Init File Syntax}{104} +@numsubsecentry{Conditional Init Constructs}{8.3.2}{Conditional Init Constructs}{111} +@numsubsecentry{Sample Init File}{8.3.3}{Sample Init File}{112} +@numsecentry{Bindable Readline Commands}{8.4}{Bindable Readline Commands}{115} +@numsubsecentry{Commands For Moving}{8.4.1}{Commands For Moving}{115} +@numsubsecentry{Commands For Manipulating The History}{8.4.2}{Commands For History}{116} +@numsubsecentry{Commands For Changing Text}{8.4.3}{Commands For Text}{117} +@numsubsecentry{Killing And Yanking}{8.4.4}{Commands For Killing}{118} +@numsubsecentry{Specifying Numeric Arguments}{8.4.5}{Numeric Arguments}{119} +@numsubsecentry{Letting Readline Type For You}{8.4.6}{Commands For Completion}{120} +@numsubsecentry{Keyboard Macros}{8.4.7}{Keyboard Macros}{121} +@numsubsecentry{Some Miscellaneous Commands}{8.4.8}{Miscellaneous Commands}{122} +@numsecentry{Readline vi Mode}{8.5}{Readline vi Mode}{124} +@numsecentry{Programmable Completion}{8.6}{Programmable Completion}{124} +@numsecentry{Programmable Completion Builtins}{8.7}{Programmable Completion Builtins}{126} +@numsecentry{A Programmable Completion Example}{8.8}{A Programmable Completion Example}{130} +@numchapentry{Using History Interactively}{9}{Using History Interactively}{133} +@numsecentry{Bash History Facilities}{9.1}{Bash History Facilities}{133} +@numsecentry{Bash History Builtins}{9.2}{Bash History Builtins}{133} +@numsecentry{History Expansion}{9.3}{History Interaction}{135} +@numsubsecentry{Event Designators}{9.3.1}{Event Designators}{135} +@numsubsecentry{Word Designators}{9.3.2}{Word Designators}{136} +@numsubsecentry{Modifiers}{9.3.3}{Modifiers}{137} +@numchapentry{Installing Bash}{10}{Installing Bash}{138} +@numsecentry{Basic Installation}{10.1}{Basic Installation}{138} +@numsecentry{Compilers and Options}{10.2}{Compilers and Options}{139} +@numsecentry{Compiling For Multiple Architectures}{10.3}{Compiling For Multiple Architectures}{139} +@numsecentry{Installation Names}{10.4}{Installation Names}{139} +@numsecentry{Specifying the System Type}{10.5}{Specifying the System Type}{139} +@numsecentry{Sharing Defaults}{10.6}{Sharing Defaults}{140} +@numsecentry{Operation Controls}{10.7}{Operation Controls}{140} +@numsecentry{Optional Features}{10.8}{Optional Features}{140} +@appentry{Reporting Bugs}{A}{Reporting Bugs}{145} +@appentry{Major Differences From The Bourne Shell}{B}{Major Differences From The Bourne Shell}{146} +@appsecentry{Implementation Differences From The SVR4.2 Shell}{B.1}{}{150} +@appentry{GNU Free Documentation License}{C}{GNU Free Documentation License}{152} +@appentry{Indexes}{D}{Indexes}{160} +@appsecentry{Index of Shell Builtin Commands}{D.1}{Builtin Index}{160} +@appsecentry{Index of Shell Reserved Words}{D.2}{Reserved Word Index}{161} +@appsecentry{Parameter and Variable Index}{D.3}{Variable Index}{161} +@appsecentry{Function Index}{D.4}{Function Index}{163} +@appsecentry{Concept Index}{D.5}{Concept Index}{165} diff --git a/doc/bashref.vr b/doc/bashref.vr index 8d3982a54..fff2f1328 100644 --- a/doc/bashref.vr +++ b/doc/bashref.vr @@ -2,14 +2,23 @@ \entry{TEXTDOMAIN}{7}{\code {TEXTDOMAIN}} \entry{TEXTDOMAINDIR}{7}{\code {TEXTDOMAINDIR}} \entry{*}{20}{\code {*}} +\entry{$*}{20}{\code {$*}} \entry{@}{20}{\code {@}} +\entry{$@}{20}{\code {$@}} \entry{#}{20}{\code {#}} +\entry{$#}{20}{\code {$#}} \entry{?}{20}{\code {?}} +\entry{$?}{20}{\code {$?}} \entry{-}{20}{\code {-}} +\entry{$-}{20}{\code {$-}} \entry{$}{20}{\code {$}} +\entry{$$}{20}{\code {$$}} \entry{!}{20}{\code {!}} +\entry{$!}{20}{\code {$!}} \entry{0}{20}{\code {0}} +\entry{$0}{20}{\code {$0}} \entry{_}{20}{\code {_}} +\entry{$_}{20}{\code {$_}} \entry{CDPATH}{69}{\code {CDPATH}} \entry{HOME}{69}{\code {HOME}} \entry{IFS}{69}{\code {IFS}} @@ -106,37 +115,37 @@ \entry{TMOUT}{79}{\code {TMOUT}} \entry{TMPDIR}{79}{\code {TMPDIR}} \entry{UID}{79}{\code {UID}} -\entry{auto_resume}{101}{\code {auto_resume}} -\entry{bell-style}{106}{\code {bell-style}} -\entry{bind-tty-special-chars}{106}{\code {bind-tty-special-chars}} -\entry{colored-stats}{106}{\code {colored-stats}} -\entry{comment-begin}{106}{\code {comment-begin}} -\entry{completion-display-width}{106}{\code {completion-display-width}} -\entry{completion-ignore-case}{106}{\code {completion-ignore-case}} -\entry{completion-map-case}{106}{\code {completion-map-case}} -\entry{completion-prefix-display-length}{107}{\code {completion-prefix-display-length}} -\entry{completion-query-items}{107}{\code {completion-query-items}} -\entry{convert-meta}{107}{\code {convert-meta}} -\entry{disable-completion}{107}{\code {disable-completion}} -\entry{editing-mode}{107}{\code {editing-mode}} -\entry{enable-keypad}{107}{\code {enable-keypad}} -\entry{expand-tilde}{107}{\code {expand-tilde}} -\entry{history-preserve-point}{108}{\code {history-preserve-point}} -\entry{history-size}{108}{\code {history-size}} -\entry{horizontal-scroll-mode}{108}{\code {horizontal-scroll-mode}} -\entry{input-meta}{108}{\code {input-meta}} -\entry{meta-flag}{108}{\code {meta-flag}} -\entry{isearch-terminators}{108}{\code {isearch-terminators}} -\entry{keymap}{108}{\code {keymap}} -\entry{mark-modified-lines}{109}{\code {mark-modified-lines}} -\entry{mark-symlinked-directories}{109}{\code {mark-symlinked-directories}} -\entry{match-hidden-files}{109}{\code {match-hidden-files}} -\entry{menu-complete-display-prefix}{109}{\code {menu-complete-display-prefix}} -\entry{output-meta}{109}{\code {output-meta}} -\entry{page-completions}{109}{\code {page-completions}} -\entry{revert-all-at-newline}{109}{\code {revert-all-at-newline}} -\entry{show-all-if-ambiguous}{109}{\code {show-all-if-ambiguous}} -\entry{show-all-if-unmodified}{110}{\code {show-all-if-unmodified}} -\entry{show-mode-in-prompt}{110}{\code {show-mode-in-prompt}} -\entry{skip-completed-text}{110}{\code {skip-completed-text}} -\entry{visible-stats}{110}{\code {visible-stats}} +\entry{auto_resume}{100}{\code {auto_resume}} +\entry{bell-style}{105}{\code {bell-style}} +\entry{bind-tty-special-chars}{105}{\code {bind-tty-special-chars}} +\entry{colored-stats}{105}{\code {colored-stats}} +\entry{comment-begin}{105}{\code {comment-begin}} +\entry{completion-display-width}{105}{\code {completion-display-width}} +\entry{completion-ignore-case}{105}{\code {completion-ignore-case}} +\entry{completion-map-case}{105}{\code {completion-map-case}} +\entry{completion-prefix-display-length}{106}{\code {completion-prefix-display-length}} +\entry{completion-query-items}{106}{\code {completion-query-items}} +\entry{convert-meta}{106}{\code {convert-meta}} +\entry{disable-completion}{106}{\code {disable-completion}} +\entry{editing-mode}{106}{\code {editing-mode}} +\entry{enable-keypad}{106}{\code {enable-keypad}} +\entry{expand-tilde}{106}{\code {expand-tilde}} +\entry{history-preserve-point}{107}{\code {history-preserve-point}} +\entry{history-size}{107}{\code {history-size}} +\entry{horizontal-scroll-mode}{107}{\code {horizontal-scroll-mode}} +\entry{input-meta}{107}{\code {input-meta}} +\entry{meta-flag}{107}{\code {meta-flag}} +\entry{isearch-terminators}{107}{\code {isearch-terminators}} +\entry{keymap}{107}{\code {keymap}} +\entry{mark-modified-lines}{108}{\code {mark-modified-lines}} +\entry{mark-symlinked-directories}{108}{\code {mark-symlinked-directories}} +\entry{match-hidden-files}{108}{\code {match-hidden-files}} +\entry{menu-complete-display-prefix}{108}{\code {menu-complete-display-prefix}} +\entry{output-meta}{108}{\code {output-meta}} +\entry{page-completions}{108}{\code {page-completions}} +\entry{revert-all-at-newline}{108}{\code {revert-all-at-newline}} +\entry{show-all-if-ambiguous}{108}{\code {show-all-if-ambiguous}} +\entry{show-all-if-unmodified}{109}{\code {show-all-if-unmodified}} +\entry{show-mode-in-prompt}{109}{\code {show-mode-in-prompt}} +\entry{skip-completed-text}{109}{\code {skip-completed-text}} +\entry{visible-stats}{109}{\code {visible-stats}} diff --git a/doc/bashref.vrs b/doc/bashref.vrs index 1bcbf6213..7a8914760 100644 --- a/doc/bashref.vrs +++ b/doc/bashref.vrs @@ -4,6 +4,15 @@ \entry {\code {#}}{20} \initial {$} \entry {\code {$}}{20} +\entry {\code {$!}}{20} +\entry {\code {$#}}{20} +\entry {\code {$$}}{20} +\entry {\code {$*}}{20} +\entry {\code {$-}}{20} +\entry {\code {$?}}{20} +\entry {\code {$@}}{20} +\entry {\code {$_}}{20} +\entry {\code {$0}}{20} \initial {*} \entry {\code {*}}{20} \initial {-} @@ -17,7 +26,7 @@ \initial {0} \entry {\code {0}}{20} \initial {A} -\entry {\code {auto_resume}}{101} +\entry {\code {auto_resume}}{100} \initial {B} \entry {\code {BASH}}{69} \entry {\code {BASH_ALIASES}}{70} @@ -37,14 +46,14 @@ \entry {\code {BASH_XTRACEFD}}{72} \entry {\code {BASHOPTS}}{70} \entry {\code {BASHPID}}{70} -\entry {\code {bell-style}}{106} -\entry {\code {bind-tty-special-chars}}{106} +\entry {\code {bell-style}}{105} +\entry {\code {bind-tty-special-chars}}{105} \initial {C} \entry {\code {CDPATH}}{69} \entry {\code {CHILD_MAX}}{72} -\entry {\code {colored-stats}}{106} +\entry {\code {colored-stats}}{105} \entry {\code {COLUMNS}}{72} -\entry {\code {comment-begin}}{106} +\entry {\code {comment-begin}}{105} \entry {\code {COMP_CWORD}}{72} \entry {\code {COMP_KEY}}{73} \entry {\code {COMP_LINE}}{72} @@ -52,24 +61,24 @@ \entry {\code {COMP_TYPE}}{73} \entry {\code {COMP_WORDBREAKS}}{73} \entry {\code {COMP_WORDS}}{73} -\entry {\code {completion-display-width}}{106} -\entry {\code {completion-ignore-case}}{106} -\entry {\code {completion-map-case}}{106} -\entry {\code {completion-prefix-display-length}}{107} -\entry {\code {completion-query-items}}{107} +\entry {\code {completion-display-width}}{105} +\entry {\code {completion-ignore-case}}{105} +\entry {\code {completion-map-case}}{105} +\entry {\code {completion-prefix-display-length}}{106} +\entry {\code {completion-query-items}}{106} \entry {\code {COMPREPLY}}{73} -\entry {\code {convert-meta}}{107} +\entry {\code {convert-meta}}{106} \entry {\code {COPROC}}{73} \initial {D} \entry {\code {DIRSTACK}}{73} -\entry {\code {disable-completion}}{107} +\entry {\code {disable-completion}}{106} \initial {E} -\entry {\code {editing-mode}}{107} +\entry {\code {editing-mode}}{106} \entry {\code {EMACS}}{73} -\entry {\code {enable-keypad}}{107} +\entry {\code {enable-keypad}}{106} \entry {\code {ENV}}{73} \entry {\code {EUID}}{73} -\entry {\code {expand-tilde}}{107} +\entry {\code {expand-tilde}}{106} \initial {F} \entry {\code {FCEDIT}}{73} \entry {\code {FIGNORE}}{74} @@ -85,23 +94,23 @@ \entry {\code {HISTFILE}}{75} \entry {\code {HISTFILESIZE}}{75} \entry {\code {HISTIGNORE}}{75} -\entry {\code {history-preserve-point}}{108} -\entry {\code {history-size}}{108} +\entry {\code {history-preserve-point}}{107} +\entry {\code {history-size}}{107} \entry {\code {HISTSIZE}}{75} \entry {\code {HISTTIMEFORMAT}}{75} \entry {\code {HOME}}{69} -\entry {\code {horizontal-scroll-mode}}{108} +\entry {\code {horizontal-scroll-mode}}{107} \entry {\code {HOSTFILE}}{75} \entry {\code {HOSTNAME}}{76} \entry {\code {HOSTTYPE}}{76} \initial {I} \entry {\code {IFS}}{69} \entry {\code {IGNOREEOF}}{76} -\entry {\code {input-meta}}{108} +\entry {\code {input-meta}}{107} \entry {\code {INPUTRC}}{76} -\entry {\code {isearch-terminators}}{108} +\entry {\code {isearch-terminators}}{107} \initial {K} -\entry {\code {keymap}}{108} +\entry {\code {keymap}}{107} \initial {L} \entry {\code {LANG}}{76} \entry {\code {LC_ALL}}{76} @@ -117,20 +126,20 @@ \entry {\code {MAILCHECK}}{77} \entry {\code {MAILPATH}}{69} \entry {\code {MAPFILE}}{77} -\entry {\code {mark-modified-lines}}{109} -\entry {\code {mark-symlinked-directories}}{109} -\entry {\code {match-hidden-files}}{109} -\entry {\code {menu-complete-display-prefix}}{109} -\entry {\code {meta-flag}}{108} +\entry {\code {mark-modified-lines}}{108} +\entry {\code {mark-symlinked-directories}}{108} +\entry {\code {match-hidden-files}}{108} +\entry {\code {menu-complete-display-prefix}}{108} +\entry {\code {meta-flag}}{107} \initial {O} \entry {\code {OLDPWD}}{77} \entry {\code {OPTARG}}{69} \entry {\code {OPTERR}}{77} \entry {\code {OPTIND}}{69} \entry {\code {OSTYPE}}{77} -\entry {\code {output-meta}}{109} +\entry {\code {output-meta}}{108} \initial {P} -\entry {\code {page-completions}}{109} +\entry {\code {page-completions}}{108} \entry {\code {PATH}}{69} \entry {\code {PIPESTATUS}}{77} \entry {\code {POSIXLY_CORRECT}}{77} @@ -147,16 +156,16 @@ \entry {\code {READLINE_LINE}}{78} \entry {\code {READLINE_POINT}}{78} \entry {\code {REPLY}}{78} -\entry {\code {revert-all-at-newline}}{109} +\entry {\code {revert-all-at-newline}}{108} \initial {S} \entry {\code {SECONDS}}{78} \entry {\code {SHELL}}{78} \entry {\code {SHELLOPTS}}{78} \entry {\code {SHLVL}}{78} -\entry {\code {show-all-if-ambiguous}}{109} -\entry {\code {show-all-if-unmodified}}{110} -\entry {\code {show-mode-in-prompt}}{110} -\entry {\code {skip-completed-text}}{110} +\entry {\code {show-all-if-ambiguous}}{108} +\entry {\code {show-all-if-unmodified}}{109} +\entry {\code {show-mode-in-prompt}}{109} +\entry {\code {skip-completed-text}}{109} \initial {T} \entry {\code {TEXTDOMAIN}}{7} \entry {\code {TEXTDOMAINDIR}}{7} @@ -166,4 +175,4 @@ \initial {U} \entry {\code {UID}}{79} \initial {V} -\entry {\code {visible-stats}}{110} +\entry {\code {visible-stats}}{109} diff --git a/doc/texinfo.tex b/doc/texinfo.tex index 03c29989c..bfd765dd2 100644 --- a/doc/texinfo.tex +++ b/doc/texinfo.tex @@ -1,13 +1,13 @@ % texinfo.tex -- TeX macros to handle Texinfo files. -% +% % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % -\def\texinfoversion{2009-01-18.17} +\def\texinfoversion{2013-09-11.11} % % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, -% 2007, 2008, 2009 Free Software Foundation, Inc. +% 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. % % This texinfo.tex file is free software: you can redistribute it and/or % modify it under the terms of the GNU General Public License as @@ -24,13 +24,14 @@ % % As a special exception, when this file is read by TeX when processing % a Texinfo source document, you may use the result without -% restriction. (This has been our intent since Texinfo was invented.) +% restriction. This Exception is an additional permission under section 7 +% of the GNU General Public License, version 3 ("GPLv3"). % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: -% http://www.gnu.org/software/texinfo/ (the Texinfo home page), or -% ftp://tug.org/tex/texinfo.tex -% (and all CTAN mirrors, see http://www.ctan.org). +% http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or +% http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or +% http://www.gnu.org/software/texinfo/ (the Texinfo home page) % The texinfo.tex in any given distribution could well be out % of date, so if that's what you're using, please check. % @@ -65,7 +66,6 @@ \everyjob{\message{[Texinfo version \texinfoversion]}% \catcode`+=\active \catcode`\_=\active} - \chardef\other=12 % We never want plain's \outer definition of \+ in Texinfo. @@ -93,14 +93,13 @@ \let\ptexnewwrite\newwrite \let\ptexnoindent=\noindent \let\ptexplus=+ +\let\ptexraggedright=\raggedright \let\ptexrbrace=\} \let\ptexslash=\/ \let\ptexstar=\* \let\ptext=\t \let\ptextop=\top -{\catcode`\'=\active -\global\let\ptexquoteright'}% Math-mode def from plain.tex. -\let\ptexraggedright=\raggedright +{\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode % If this character appears in an error message or help string, it % starts a new line in the output. @@ -118,10 +117,11 @@ % Set up fixed words for English if not already set. \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi \ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi +\ifx\putworderror\undefined \gdef\putworderror{error}\fi \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi \ifx\putwordin\undefined \gdef\putwordin{in}\fi -\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi -\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi +\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi +\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi @@ -160,15 +160,18 @@ \def\spaceisspace{\catcode`\ =\spacecat} % sometimes characters are active, so we need control sequences. +\chardef\ampChar = `\& \chardef\colonChar = `\: \chardef\commaChar = `\, \chardef\dashChar = `\- \chardef\dotChar = `\. \chardef\exclamChar= `\! +\chardef\hashChar = `\# \chardef\lquoteChar= `\` \chardef\questChar = `\? \chardef\rquoteChar= `\' \chardef\semiChar = `\; +\chardef\slashChar = `\/ \chardef\underChar = `\_ % Ignore a token. @@ -199,36 +202,7 @@ % that mark overfull boxes (in case you have decided % that the text looks ok even though it passes the margin). % -\def\finalout{\overfullrule=0pt} - -% @| inserts a changebar to the left of the current line. It should -% surround any changed text. This approach does *not* work if the -% change spans more than two lines of output. To handle that, we would -% have adopt a much more difficult approach (putting marks into the main -% vertical list for the beginning and end of each change). -% -\def\|{% - % \vadjust can only be used in horizontal mode. - \leavevmode - % - % Append this vertical mode material after the current line in the output. - \vadjust{% - % We want to insert a rule with the height and depth of the current - % leading; that is exactly what \strutbox is supposed to record. - \vskip-\baselineskip - % - % \vadjust-items are inserted at the left edge of the type. So - % the \llap here moves out into the left-hand margin. - \llap{% - % - % For a thicker or thinner bar, change the `1pt'. - \vrule height\baselineskip width1pt - % - % This is the space between the bar and the text. - \hskip 12pt - }% - }% -} +\def\finalout{\overfullrule=0pt } % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, @@ -246,7 +220,7 @@ \tracingmacros2 \tracingrestores1 \showboxbreadth\maxdimen \showboxdepth\maxdimen - \ifx\eTeXversion\undefined\else % etex gives us more logging + \ifx\eTeXversion\thisisundefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 @@ -257,6 +231,13 @@ \errorcontextlines16 }% +% @errormsg{MSG}. Do the index-like expansions on MSG, but if things +% aren't perfect, it's not the end of the world, being an error message, +% after all. +% +\def\errormsg{\begingroup \indexnofonts \doerrormsg} +\def\doerrormsg#1{\errmessage{#1}} + % add check for \lastpenalty to plain's definitions. If the last thing % we did was a \nobreak, we don't want to insert more space. % @@ -267,7 +248,6 @@ \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount \removelastskip\penalty-200\bigskip\fi\fi} -% For @cropmarks command. % Do @cropmarks to get crop marks. % \newif\ifcropmarks @@ -301,9 +281,9 @@ \toks6=\expandafter{\prevsectiondefs}% \toks8=\expandafter{\lastcolordefs}% \mark{% - \the\toks0 \the\toks2 - \noexpand\or \the\toks4 \the\toks6 - \noexpand\else \the\toks8 + \the\toks0 \the\toks2 % 0: top marks (\last...) + \noexpand\or \the\toks4 \the\toks6 % 1: bottom marks (default, \prev...) + \noexpand\else \the\toks8 % 2: color marks }% } % \topmark doesn't work for the very first chapter (after the title @@ -342,10 +322,13 @@ % % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). + \def\commmonheadfootline{\let\hsize=\pagewidth \texinfochars} + % \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi - \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% + \global\setbox\headlinebox = \vbox{\commmonheadfootline \makeheadline}% + % \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi - \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% + \global\setbox\footlinebox = \vbox{\commmonheadfootline \makefootline}% % {% % Have to do this stuff outside the \shipout because we want it to @@ -358,7 +341,7 @@ % We don't want .vr (or whatever) entries like this: % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} % "\acronym" won't work when it's read back in; - % it needs to be + % it needs to be % {\code {{\tt \backslashcurfont }acronym} \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. @@ -577,7 +560,7 @@ } \def\inenvironment#1{% \ifx#1\empty - out of any environment% + outside of any environment% \else in environment \expandafter\string#1% \fi @@ -589,7 +572,7 @@ \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else - % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03 + % The general wording of \badenverr may not be ideal. \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup @@ -599,85 +582,6 @@ \newhelp\EMsimple{Press RETURN to continue.} -%% Simple single-character @ commands - -% @@ prints an @ -% Kludge this until the fonts are right (grr). -\def\@{{\tt\char64}} - -% This is turned off because it was never documented -% and you can use @w{...} around a quote to suppress ligatures. -%% Define @` and @' to be the same as ` and ' -%% but suppressing ligatures. -%\def\`{{`}} -%\def\'{{'}} - -% Used to generate quoted braces. -\def\mylbrace {{\tt\char123}} -\def\myrbrace {{\tt\char125}} -\let\{=\mylbrace -\let\}=\myrbrace -\begingroup - % Definitions to produce \{ and \} commands for indices, - % and @{ and @} for the aux/toc files. - \catcode`\{ = \other \catcode`\} = \other - \catcode`\[ = 1 \catcode`\] = 2 - \catcode`\! = 0 \catcode`\\ = \other - !gdef!lbracecmd[\{]% - !gdef!rbracecmd[\}]% - !gdef!lbraceatcmd[@{]% - !gdef!rbraceatcmd[@}]% -!endgroup - -% @comma{} to avoid , parsing problems. -\let\comma = , - -% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent -% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. -\let\, = \c -\let\dotaccent = \. -\def\ringaccent#1{{\accent23 #1}} -\let\tieaccent = \t -\let\ubaraccent = \b -\let\udotaccent = \d - -% Other special characters: @questiondown @exclamdown @ordf @ordm -% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. -\def\questiondown{?`} -\def\exclamdown{!`} -\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} -\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} - -% Dotless i and dotless j, used for accents. -\def\imacro{i} -\def\jmacro{j} -\def\dotless#1{% - \def\temp{#1}% - \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi - \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi - \else \errmessage{@dotless can be used only with i or j}% - \fi\fi -} - -% The \TeX{} logo, as in plain, but resetting the spacing so that a -% period following counts as ending a sentence. (Idea found in latex.) -% -\edef\TeX{\TeX \spacefactor=1000 } - -% @LaTeX{} logo. Not quite the same results as the definition in -% latex.ltx, since we use a different font for the raised A; it's most -% convenient for us to use an explicitly smaller font, rather than using -% the \scriptstyle font (since we don't reset \scriptstyle and -% \scriptscriptstyle). -% -\def\LaTeX{% - L\kern-.36em - {\setbox0=\hbox{T}% - \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}% - \kern-.15em - \TeX -} - % Be sure we're in horizontal mode when doing a tie, since we make space % equivalent to this in @example-like environments. Otherwise, a space % at the beginning of a line will start with \penalty -- and @@ -694,7 +598,7 @@ \def\:{\spacefactor=1000 } % @* forces a line break. -\def\*{\hfil\break\hbox{}\ignorespaces} +\def\*{\unskip\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak @@ -709,7 +613,7 @@ \def\?{?\spacefactor=\endofsentencespacefactor\space} % @frenchspacing on|off says whether to put extra space after punctuation. -% +% \def\onword{on} \def\offword{off} % @@ -719,7 +623,7 @@ \else\ifx\temp\offword \plainnonfrenchspacing \else \errhelp = \EMsimple - \errmessage{Unknown @frenchspacing option `\temp', must be on/off}% + \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% \fi\fi } @@ -801,15 +705,6 @@ where each line of input produces a line of output.} \newdimen\mil \mil=0.001in -% Old definition--didn't work. -%\parseargdef\need{\par % -%% This method tries to make TeX break the page naturally -%% if the depth of the box does not fit. -%{\baselineskip=0pt% -%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak -%\prevdepth=-1000pt -%}} - \parseargdef\need{% % Ensure vertical mode, so we don't make a big box in the middle of a % paragraph. @@ -873,7 +768,7 @@ where each line of input produces a line of output.} % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current % paragraph. For more general purposes, use the \margin insertion -% class. WHICH is `l' or `r'. +% class. WHICH is `l' or `r'. Not documented, written for gawk manual. % \newskip\inmarginspacing \inmarginspacing=1cm \def\strutdepth{\dp\strutbox} @@ -920,6 +815,36 @@ where each line of input produces a line of output.} \temp } +% @| inserts a changebar to the left of the current line. It should +% surround any changed text. This approach does *not* work if the +% change spans more than two lines of output. To handle that, we would +% have adopt a much more difficult approach (putting marks into the main +% vertical list for the beginning and end of each change). This command +% is not documented, not supported, and doesn't work. +% +\def\|{% + % \vadjust can only be used in horizontal mode. + \leavevmode + % + % Append this vertical mode material after the current line in the output. + \vadjust{% + % We want to insert a rule with the height and depth of the current + % leading; that is exactly what \strutbox is supposed to record. + \vskip-\baselineskip + % + % \vadjust-items are inserted at the left edge of the type. So + % the \llap here moves out into the left-hand margin. + \llap{% + % + % For a thicker or thinner bar, change the `1pt'. + \vrule height\baselineskip width1pt + % + % This is the space between the bar and the text. + \hskip 12pt + }% + }% +} + % @include FILE -- \input text of FILE. % \def\include{\parseargusing\filenamecatcodes\includezzz} @@ -930,6 +855,7 @@ where each line of input produces a line of output.} \makevalueexpandable % we want to expand any @value in FILE. \turnoffactive % and allow special characters in the expansion \indexnofonts % Allow `@@' and other weird things in file names. + \wlog{texinfo.tex: doing @include of #1^^J}% \edef\temp{\noexpand\input #1 }% % % This trickery is to read FILE outside of a group, in case it makes @@ -965,7 +891,7 @@ where each line of input produces a line of output.} \def\popthisfilestack{\errthisfilestackempty} \def\errthisfilestackempty{\errmessage{Internal error: the stack of filenames is empty.}} - +% \def\thisfile{} % @center line @@ -973,36 +899,46 @@ where each line of input produces a line of output.} % \parseargdef\center{% \ifhmode - \let\next\centerH + \let\centersub\centerH \else - \let\next\centerV + \let\centersub\centerV \fi - \next{\hfil \ignorespaces#1\unskip \hfil}% + \centersub{\hfil \ignorespaces#1\unskip \hfil}% + \let\centersub\relax % don't let the definition persist, just in case } -\def\centerH#1{% - {% - \hfil\break - \advance\hsize by -\leftskip - \advance\hsize by -\rightskip - \line{#1}% - \break - }% +\def\centerH#1{{% + \hfil\break + \advance\hsize by -\leftskip + \advance\hsize by -\rightskip + \line{#1}% + \break +}} +% +\newcount\centerpenalty +\def\centerV#1{% + % The idea here is the same as in \startdefun, \cartouche, etc.: if + % @center is the first thing after a section heading, we need to wipe + % out the negative parskip inserted by \sectionheading, but still + % prevent a page break here. + \centerpenalty = \lastpenalty + \ifnum\centerpenalty>10000 \vskip\parskip \fi + \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi + \line{\kern\leftskip #1\kern\rightskip}% } -\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}} % @sp n outputs n lines of vertical space - +% \parseargdef\sp{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment - +% \def\comment{\begingroup \catcode`\^^M=\other% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \commentxxx} {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} - +% \let\c=\comment % @paragraphindent NCHARS @@ -1095,109 +1031,6 @@ where each line of input produces a line of output.} } -% @asis just yields its argument. Used with @table, for example. -% -\def\asis#1{#1} - -% @math outputs its argument in math mode. -% -% One complication: _ usually means subscripts, but it could also mean -% an actual _ character, as in @math{@var{some_variable} + 1}. So make -% _ active, and distinguish by seeing if the current family is \slfam, -% which is what @var uses. -{ - \catcode`\_ = \active - \gdef\mathunderscore{% - \catcode`\_=\active - \def_{\ifnum\fam=\slfam \_\else\sb\fi}% - } -} -% Another complication: we want \\ (and @\) to output a \ character. -% FYI, plain.tex uses \\ as a temporary control sequence (why?), but -% this is not advertised and we don't care. Texinfo does not -% otherwise define @\. -% -% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. -\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} -% -\def\math{% - \tex - \mathunderscore - \let\\ = \mathbackslash - \mathactive - % make the texinfo accent commands work in math mode - \let\"=\ddot - \let\'=\acute - \let\==\bar - \let\^=\hat - \let\`=\grave - \let\u=\breve - \let\v=\check - \let\~=\tilde - \let\dotaccent=\dot - $\finishmath -} -\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. - -% Some active characters (such as <) are spaced differently in math. -% We have to reset their definitions in case the @math was an argument -% to a command which sets the catcodes (such as @item or @section). -% -{ - \catcode`^ = \active - \catcode`< = \active - \catcode`> = \active - \catcode`+ = \active - \catcode`' = \active - \gdef\mathactive{% - \let^ = \ptexhat - \let< = \ptexless - \let> = \ptexgtr - \let+ = \ptexplus - \let' = \ptexquoteright - } -} - -% Some math mode symbols. -\def\bullet{$\ptexbullet$} -\def\geq{\ifmmode \ge\else $\ge$\fi} -\def\leq{\ifmmode \le\else $\le$\fi} -\def\minus{\ifmmode -\else $-$\fi} - -% @dots{} outputs an ellipsis using the current font. -% We do .5em per period so that it has the same spacing in the cm -% typewriter fonts as three actual period characters; on the other hand, -% in other typewriter fonts three periods are wider than 1.5em. So do -% whichever is larger. -% -\def\dots{% - \leavevmode - \setbox0=\hbox{...}% get width of three periods - \ifdim\wd0 > 1.5em - \dimen0 = \wd0 - \else - \dimen0 = 1.5em - \fi - \hbox to \dimen0{% - \hskip 0pt plus.25fil - .\hskip 0pt plus1fil - .\hskip 0pt plus1fil - .\hskip 0pt plus.5fil - }% -} - -% @enddots{} is an end-of-sentence ellipsis. -% -\def\enddots{% - \dots - \spacefactor=\endofsentencespacefactor -} - -% @comma{} is so commas can be inserted into text without messing up -% Texinfo's parsing. -% -\let\comma = , - % @refill is a no-op. \let\refill=\relax @@ -1262,9 +1095,8 @@ where each line of input produces a line of output.} \newif\ifpdfmakepagedest % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 -% can be set). So we test for \relax and 0 as well as \undefined, -% borrowed from ifpdf.sty. -\ifx\pdfoutput\undefined +% can be set). So we test for \relax and 0 as well as being undefined. +\ifx\pdfoutput\thisisundefined \else \ifx\pdfoutput\relax \else @@ -1279,50 +1111,24 @@ where each line of input produces a line of output.} % for display in the outlines, and in other places. Thus, we have to % double any backslashes. Otherwise, a name like "\node" will be % interpreted as a newline (\n), followed by o, d, e. Not good. -% http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html -% (and related messages, the final outcome is that it is up to the TeX -% user to double the backslashes and otherwise make the string valid, so -% that's what we do). - -% double active backslashes. -% -{\catcode`\@=0 \catcode`\\=\active - @gdef@activebackslashdouble{% - @catcode`@\=@active - @let\=@doublebackslash} -} - -% To handle parens, we must adopt a different approach, since parens are -% not active characters. hyperref.dtx (which has the same problem as -% us) handles it with this amazing macro to replace tokens, with minor -% changes for Texinfo. It is included here under the GPL by permission -% from the author, Heiko Oberdiek. -% -% #1 is the tokens to replace. -% #2 is the replacement. -% #3 is the control sequence with the string. % -\def\HyPsdSubst#1#2#3{% - \def\HyPsdReplace##1#1##2\END{% - ##1% - \ifx\\##2\\% - \else - #2% - \HyReturnAfterFi{% - \HyPsdReplace##2\END - }% - \fi - }% - \xdef#3{\expandafter\HyPsdReplace#3#1\END}% -} -\long\def\HyReturnAfterFi#1\fi{\fi#1} - -% #1 is a control sequence in which to do the replacements. -\def\backslashparens#1{% - \xdef#1{#1}% redefine it as its expansion; the definition is simply - % \lastnode when called from \setref -> \pdfmkdest. - \HyPsdSubst{(}{\realbackslash(}{#1}% - \HyPsdSubst{)}{\realbackslash)}{#1}% +% See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and +% related messages. The final outcome is that it is up to the TeX user +% to double the backslashes and otherwise make the string valid, so +% that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to +% do this reliably, so we use it. + +% #1 is a control sequence in which to do the replacements, +% which we \xdef. +\def\txiescapepdf#1{% + \ifx\pdfescapestring\thisisundefined + % No primitive available; should we give a warning or log? + % Many times it won't matter. + \else + % The expandable \pdfescapestring primitive escapes parentheses, + % backslashes, and other special chars. + \xdef#1{\pdfescapestring{#1}}% + \fi } \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images @@ -1332,13 +1138,16 @@ output) for that.)} \ifpdf % - % Color manipulation macros based on pdfcolor.tex. - \def\cmykDarkRed{0.28 1 1 0.35} - \def\cmykBlack{0 0 0 1} + % Color manipulation macros based on pdfcolor.tex, + % except using rgb instead of cmyk; the latter is said to render as a + % very dark gray on-screen and a very dark halftone in print, instead + % of actual black. + \def\rgbDarkRed{0.50 0.09 0.12} + \def\rgbBlack{0 0 0} % % k sets the color for filling (usual text, etc.); % K sets the color for stroking (thin rules, e.g., normal _'s). - \def\pdfsetcolor#1{\pdfliteral{#1 k #1 K}} + \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. @@ -1348,7 +1157,7 @@ output) for that.)} \pdfsetcolor{#1}% } % - \def\maincolor{\cmykBlack} + \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\lastcolordefs{} @@ -1378,32 +1187,34 @@ output) for that.)} % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\dopdfimage#1#2#3{% - \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% - \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% + \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% + \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % - % pdftex (and the PDF format) support .png, .jpg, .pdf (among - % others). Let's try in that order. + % pdftex (and the PDF format) support .pdf, .png, .jpg (among + % others). Let's try in that order, PDF first since if + % someone has a scalable image, presumably better to use that than a + % bitmap. \let\pdfimgext=\empty \begingroup - \openin 1 #1.png \ifeof 1 - \openin 1 #1.jpg \ifeof 1 - \openin 1 #1.jpeg \ifeof 1 - \openin 1 #1.JPG \ifeof 1 - \openin 1 #1.pdf \ifeof 1 - \openin 1 #1.PDF \ifeof 1 + \openin 1 #1.pdf \ifeof 1 + \openin 1 #1.PDF \ifeof 1 + \openin 1 #1.png \ifeof 1 + \openin 1 #1.jpg \ifeof 1 + \openin 1 #1.jpeg \ifeof 1 + \openin 1 #1.JPG \ifeof 1 \errhelp = \nopdfimagehelp \errmessage{Could not find image file #1 for pdf}% - \else \gdef\pdfimgext{PDF}% + \else \gdef\pdfimgext{JPG}% \fi - \else \gdef\pdfimgext{pdf}% + \else \gdef\pdfimgext{jpeg}% \fi - \else \gdef\pdfimgext{JPG}% + \else \gdef\pdfimgext{jpg}% \fi - \else \gdef\pdfimgext{jpeg}% + \else \gdef\pdfimgext{png}% \fi - \else \gdef\pdfimgext{jpg}% + \else \gdef\pdfimgext{PDF}% \fi - \else \gdef\pdfimgext{png}% + \else \gdef\pdfimgext{pdf}% \fi \closein 1 \endgroup @@ -1415,8 +1226,8 @@ output) for that.)} \else \immediate\pdfximage \fi - \ifdim \wd0 >0pt width \imagewidth \fi - \ifdim \wd2 >0pt height \imageheight \fi + \ifdim \wd0 >0pt width \pdfimagewidth \fi + \ifdim \wd2 >0pt height \pdfimageheight \fi \ifnum\pdftexversion<13 #1.\pdfimgext \else @@ -1431,10 +1242,9 @@ output) for that.)} % such as \, aren't expanded when present in a section title. \indexnofonts \turnoffactive - \activebackslashdouble \makevalueexpandable \def\pdfdestname{#1}% - \backslashparens\pdfdestname + \txiescapepdf\pdfdestname \safewhatsit{\pdfdest name{\pdfdestname} xyz}% }} % @@ -1443,8 +1253,8 @@ output) for that.)} % % by default, use a color that is dark enough to print on paper as % nearly black, but still distinguishable for online viewing. - \def\urlcolor{\cmykDarkRed} - \def\linkcolor{\cmykDarkRed} + \def\urlcolor{\rgbDarkRed} + \def\linkcolor{\rgbDarkRed} \def\endlink{\setcolor{\maincolor}\pdfendlink} % % Adding outlines to PDF; macros for calculating structure of outlines @@ -1466,29 +1276,24 @@ output) for that.)} % page number. We could generate a destination for the section % text in the case where a section has no node, but it doesn't % seem worth the trouble, since most documents are normally structured. - \def\pdfoutlinedest{#3}% + \edef\pdfoutlinedest{#3}% \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}% \else - % Doubled backslashes in the name. - {\activebackslashdouble \xdef\pdfoutlinedest{#3}% - \backslashparens\pdfoutlinedest}% + \txiescapepdf\pdfoutlinedest \fi % - % Also double the backslashes in the display string. - {\activebackslashdouble \xdef\pdfoutlinetext{#1}% - \backslashparens\pdfoutlinetext}% + % Also escape PDF chars in the display string. + \edef\pdfoutlinetext{#1}% + \txiescapepdf\pdfoutlinetext % \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup - % Thanh's hack / proper braces in bookmarks - \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace - \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace - % % Read toc silently, to get counts of subentries for \pdfoutline. + \def\partentry##1##2##3##4{}% ignore parts in the outlines \def\numchapentry##1##2##3##4{% \def\thischapnum{##2}% \def\thissecnum{0}% @@ -1542,25 +1347,41 @@ output) for that.)} % Latin 2 (0xea) gets translated to a | character. Info from % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. % - % xx to do this right, we have to translate 8-bit characters to - % their "best" equivalent, based on the @documentencoding. Right - % now, I guess we'll just let the pdf reader have its way. + % TODO this right, we have to translate 8-bit characters to + % their "best" equivalent, based on the @documentencoding. Too + % much work for too little return. Just use the ASCII equivalents + % we use for the index sort strings. + % \indexnofonts \setupdatafile + % We can have normal brace characters in the PDF outlines, unlike + % Texinfo index files. So set that up. + \def\{{\lbracecharliteral}% + \def\}{\rbracecharliteral}% \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } + {\catcode`[=1 \catcode`]=2 + \catcode`{=\other \catcode`}=\other + \gdef\lbracecharliteral[{]% + \gdef\rbracecharliteral[}]% + ] % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces - \ifx\p\space\else\addtokens{\filename}{\PP}% - \advance\filenamelength by 1 - \fi + \addtokens{\filename}{\PP}% + \advance\filenamelength by 1 \fi \nextsp} - \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} + \def\getfilename#1{% + \filenamelength=0 + % If we don't expand the argument now, \skipspaces will get + % snagged on things like "@value{foo}". + \edef\temp{#1}% + \expandafter\skipspaces\temp|\relax + } \ifnum\pdftexversion < 14 \let \startlink \pdfannotlink \else @@ -1573,7 +1394,7 @@ output) for that.)} % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. - % + % \normalturnoffactive \def\@{@}% \let\/=\empty @@ -1657,9 +1478,6 @@ output) for that.)} \def\ttsl{\setfontstyle{ttsl}} -% Default leading. -\newdimen\textleading \textleading = 13.2pt - % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. @@ -1671,6 +1489,7 @@ output) for that.)} % can get a sort of poor man's double spacing by redefining this. \def\baselinefactor{1} % +\newdimen\textleading \def\setleading#1{% \dimen0 = #1\relax \normalbaselineskip = \baselinefactor\dimen0 @@ -1692,7 +1511,7 @@ output) for that.)} % if we are producing pdf, and we have \pdffontattr, then define cmaps. % (\pdffontattr was introduced many years ago, but people still run % older pdftex's; it's easy to conditionalize, so we do.) -\ifpdf \ifx\pdffontattr\undefined \else +\ifpdf \ifx\pdffontattr\thisisundefined \else \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap @@ -1943,28 +1762,34 @@ end \fi\fi -% Set the font macro #1 to the font named #2, adding on the -% specified font prefix (normally `cm'). +% Set the font macro #1 to the font named \fontprefix#2. % #3 is the font's design size, #4 is a scale factor, #5 is the CMap -% encoding (currently only OT1, OT1IT and OT1TT are allowed, pass -% empty to omit). +% encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit). +% Example: +% #1 = \textrm +% #2 = \rmshape +% #3 = 10 +% #4 = \mainmagstep +% #5 = OT1 +% \def\setfont#1#2#3#4#5{% \font#1=\fontprefix#2#3 scaled #4 \csname cmap#5\endcsname#1% } % This is what gets called when #5 of \setfont is empty. \let\cmap\gobble -% emacs-page end of cmaps +% +% (end of cmaps) % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. -\ifx\fontprefix\undefined +\ifx\fontprefix\thisisundefined \def\fontprefix{cm} \fi % Support font families that don't use the same naming scheme as CM. \def\rmshape{r} -\def\rmbshape{bx} %where the normal face is bold +\def\rmbshape{bx} % where the normal face is bold \def\bfshape{b} \def\bxshape{bx} \def\ttshape{tt} @@ -1979,9 +1804,8 @@ end \def\scshape{csc} \def\scbshape{csc} -% Definitions for a main text size of 11pt. This is the default in -% Texinfo. -% +% Definitions for a main text size of 11pt. (The default in Texinfo.) +% \def\definetextfontsizexi{% % Text fonts (11.2pt, magstep1). \def\textnominalsize{11pt} @@ -2102,17 +1926,17 @@ end \font\reducedsy=cmsy10 \def\reducedecsize{1000} -% reset the current fonts -\textfonts +\textleading = 13.2pt % line spacing for 11pt CM +\textfonts % reset the current fonts \rm -} % end of 11pt text font size definitions +} % end of 11pt text font size definitions, \definetextfontsizexi % Definitions to make the main text be 10pt Computer Modern, with % section, chapter, etc., sizes following suit. This is for the GNU % Press printing of the Emacs 22 manual. Maybe other manuals in the % future. Used with @smallbook, which sets the leading to 12pt. -% +% \def\definetextfontsizex{% % Text fonts (10pt). \def\textnominalsize{10pt} @@ -2201,7 +2025,7 @@ end \setfont\secsf\sfbshape{12}{1000}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep1}{OT1} -\font\seci=cmmi12 +\font\seci=cmmi12 \font\secsy=cmsy10 scaled \magstep1 \def\sececsize{1200} @@ -2233,29 +2057,28 @@ end \font\reducedsy=cmsy9 \def\reducedecsize{0900} -% reduce space between paragraphs -\divide\parskip by 2 - -% reset the current fonts -\textfonts +\divide\parskip by 2 % reduce space between paragraphs +\textleading = 12pt % line spacing for 10pt CM +\textfonts % reset the current fonts \rm -} % end of 10pt text font size definitions +} % end of 10pt text font size definitions, \definetextfontsizex % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. -% -\def\xword{10} +% \def\xiword{11} +\def\xword{10} +\def\xwordpt{10pt} % \parseargdef\fonttextsize{% \def\textsizearg{#1}% - \wlog{doing @fonttextsize \textsizearg}% + %\wlog{doing @fonttextsize \textsizearg}% % % Set \globaldefs so that documents can use this inside @tex, since % makeinfo 4.8 does not support it, but we need it nonetheless. - % + % \begingroup \globaldefs=1 \ifx\textsizearg\xword \definetextfontsizex \else \ifx\textsizearg\xiword \definetextfontsizexi @@ -2305,7 +2128,7 @@ end \let\tenttsl=\titlettsl \def\curfontsize{title}% \def\lsize{chap}\def\lllsize{subsec}% - \resetmathfonts \setleading{25pt}} + \resetmathfonts \setleading{27pt}} \def\titlefont#1{{\titlefonts\rmisbold #1}} \def\chapfonts{% \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl @@ -2433,12 +2256,14 @@ end % Markup style setup for left and right quotes. \defmarkupstylesetup\markupsetuplq{% - \expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname + \expandafter\let\expandafter \temp + \csname markupsetuplq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuplqdefault \else \temp \fi } \defmarkupstylesetup\markupsetuprq{% - \expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname + \expandafter\let\expandafter \temp + \csname markupsetuprq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuprqdefault \else \temp \fi } @@ -2451,29 +2276,32 @@ end \gdef\markupsetcodequoteleft{\let`\codequoteleft} \gdef\markupsetcodequoteright{\let'\codequoteright} - -\gdef\markupsetnoligaturesquoteleft{\let`\noligaturesquoteleft} } \let\markupsetuplqcode \markupsetcodequoteleft \let\markupsetuprqcode \markupsetcodequoteright +% \let\markupsetuplqexample \markupsetcodequoteleft \let\markupsetuprqexample \markupsetcodequoteright +% +\let\markupsetuplqkbd \markupsetcodequoteleft +\let\markupsetuprqkbd \markupsetcodequoteright +% +\let\markupsetuplqsamp \markupsetcodequoteleft +\let\markupsetuprqsamp \markupsetcodequoteright +% \let\markupsetuplqverb \markupsetcodequoteleft \let\markupsetuprqverb \markupsetcodequoteright +% \let\markupsetuplqverbatim \markupsetcodequoteleft \let\markupsetuprqverbatim \markupsetcodequoteright -\let\markupsetuplqsamp \markupsetnoligaturesquoteleft -\let\markupsetuplqkbd \markupsetnoligaturesquoteleft - -% Allow an option to not replace quotes with a regular directed right -% quote/apostrophe (char 0x27), but instead use the undirected quote -% from cmtt (char 0x0d). The undirected quote is ugly, so don't make it -% the default, but it works for pasting with more pdf viewers (at least -% evince), the lilypond developers report. xpdf does work with the -% regular 0x27. -% +% Allow an option to not use regular directed right quote/apostrophe +% (char 0x27), but instead the undirected quote from cmtt (char 0x0d). +% The undirected quote is ugly, so don't make it the default, but it +% works for pasting with more pdf viewers (at least evince), the +% lilypond developers report. xpdf does work with the regular 0x27. +% \def\codequoteright{% \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax @@ -2485,7 +2313,7 @@ end % and a similar option for the left quote char vs. a grave accent. % Modern fonts display ASCII 0x60 as a grave accent, so some people like % the code environments to do likewise. -% +% \def\codequoteleft{% \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax @@ -2496,33 +2324,85 @@ end \else \char'22 \fi } +% Commands to set the quote options. +% +\parseargdef\codequoteundirected{% + \def\temp{#1}% + \ifx\temp\onword + \expandafter\let\csname SETtxicodequoteundirected\endcsname + = t% + \else\ifx\temp\offword + \expandafter\let\csname SETtxicodequoteundirected\endcsname + = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% + \fi\fi +} +% +\parseargdef\codequotebacktick{% + \def\temp{#1}% + \ifx\temp\onword + \expandafter\let\csname SETtxicodequotebacktick\endcsname + = t% + \else\ifx\temp\offword + \expandafter\let\csname SETtxicodequotebacktick\endcsname + = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% + \fi\fi +} + % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. \def\noligaturesquoteleft{\relax\lq} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 -%% Add scribe-like font environments, plus @l for inline lisp (usually sans -%% serif) and @ii for TeX italic +% Font commands. -% \smartitalic{ARG} outputs arg in italics, followed by an italic correction -% unless the following character is such as not to need one. -\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else - \ptexslash\fi\fi\fi} -\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx} -\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx} +% #1 is the font command (\sl or \it), #2 is the text to slant. +% If we are in a monospaced environment, however, 1) always use \ttsl, +% and 2) do not add an italic correction. +\def\dosmartslant#1#2{% + \ifusingtt + {{\ttsl #2}\let\next=\relax}% + {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% + \next +} +\def\smartslanted{\dosmartslant\sl} +\def\smartitalic{\dosmartslant\it} -% like \smartslanted except unconditionally uses \ttsl. -% @var is set to this for defun arguments. -\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx} +% Output an italic correction unless \next (presumed to be the following +% character) is such as not to need one. +\def\smartitaliccorrection{% + \ifx\next,% + \else\ifx\next-% + \else\ifx\next.% + \else\ifx\next\.% + \else\ifx\next\comma% + \else\ptexslash + \fi\fi\fi\fi\fi + \aftersmartic +} + +% Unconditional use \ttsl, and no ic. @var is set to this for defuns. +\def\ttslanted#1{{\ttsl #1}} % @cite is like \smartslanted except unconditionally use \sl. We never want % ttsl for book titles, do we? -\def\cite#1{{\sl #1}\futurelet\next\smartitalicx} +\def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} + +\def\aftersmartic{} +\def\var#1{% + \let\saveaftersmartic = \aftersmartic + \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% + \smartslanted{#1}% +} \let\i=\smartitalic \let\slanted=\smartslanted -\def\var#1{{\setupmarkupstyle{var}\smartslanted{#1}}} \let\dfn=\smartslanted \let\emph=\smartitalic @@ -2572,34 +2452,12 @@ end % @samp. \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} -% definition of @key that produces a lozenge. Doesn't adjust to text size. -%\setfont\keyrm\rmshape{8}{1000}{OT1} -%\font\keysy=cmsy9 -%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% -% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% -% \vbox{\hrule\kern-0.4pt -% \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% -% \kern-0.4pt\hrule}% -% \kern-.06em\raise0.4pt\hbox{\angleright}}}} +% @indicateurl is \samp, that is, with quotes. +\let\indicateurl=\samp -% definition of @key with no lozenge. If the current font is already -% monospace, don't change it; that way, we respect @kbdinputstyle. But -% if it isn't monospace, then use \tt. -% -\def\key#1{{\setupmarkupstyle{key}% - \nohyphenation - \ifmonospace\else\tt\fi - #1}\null} - -% ctrl is no longer a Texinfo command. -\def\ctrl #1{{\tt \rawbackslash \hat}#1} - -% @file, @option are the same as @samp. -\let\file=\samp -\let\option=\samp - -% @code is a modification of @t, -% which makes spaces the same size as normal in the surrounding text. +% @code (and similar) prints in typewriter, but with spaces the same +% size as normal in the surrounding text, without hyphenation, etc. +% This is a subroutine for that. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. @@ -2618,18 +2476,18 @@ end \plainfrenchspacing #1% }% - \null + \null % reset spacefactor to 1000 } % We *must* turn on hyphenation at `-' and `_' in @code. +% (But see \codedashfinish below.) % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. - +% % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) -% and arrange explicitly to hyphenate at a dash. -% -- rms. +% and arrange explicitly to hyphenate at a dash. -- rms. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active @@ -2643,15 +2501,38 @@ end \let-\codedash \let_\codeunder \else - \let-\realdash + \let-\normaldash \let_\realunder \fi + % Given -foo (with a single dash), we do not want to allow a break + % after the hyphen. + \global\let\codedashprev=\codedash + % \codex } + % + \gdef\codedash{\futurelet\next\codedashfinish} + \gdef\codedashfinish{% + \normaldash % always output the dash character itself. + % + % Now, output a discretionary to allow a line break, unless + % (a) the next character is a -, or + % (b) the preceding character is a -. + % E.g., given --posix, we do not want to allow a break after either -. + % Given --foo-bar, we do want to allow a break between the - and the b. + \ifx\next\codedash \else + \ifx\codedashprev\codedash + \else \discretionary{}{}{}\fi + \fi + % we need the space after the = for the case when \next itself is a + % space token; it would get swallowed otherwise. As in @code{- a}. + \global\let\codedashprev= \next + } } +\def\normaldash{-} +% +\def\codex #1{\tclose{#1}\endgroup} -\def\realdash{-} -\def\codedash{-\discretionary{}{}{}} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) @@ -2663,13 +2544,12 @@ end \discretionary{}{}{}}% {\_}% } -\def\codex #1{\tclose{#1}\endgroup} % An additional complication: the above will allow breaks after, e.g., -% each of the four underscores in __typeof__. This is undesirable in -% some manuals, especially if they don't have long identifiers in -% general. @allowcodebreaks provides a way to control this. -% +% each of the four underscores in __typeof__. This is bad. +% @allowcodebreaks provides a document-level way to turn breaking at - +% and _ on and off. +% \newif\ifallowcodebreaks \allowcodebreakstrue \def\keywordtrue{true} @@ -2683,13 +2563,162 @@ end \allowcodebreaksfalse \else \errhelp = \EMsimple - \errmessage{Unknown @allowcodebreaks option `\txiarg'}% + \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% \fi\fi } -% @kbd is like @code, except that if the argument is just one @key command, -% then @kbd has no effect. -\def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}} +% For @command, @env, @file, @option quotes seem unnecessary, +% so use \code rather than \samp. +\let\command=\code +\let\env=\code +\let\file=\code +\let\option=\code + +% @uref (abbreviation for `urlref') takes an optional (comma-separated) +% second argument specifying the text to display and an optional third +% arg as text to display instead of (rather than in addition to) the url +% itself. First (mandatory) arg is the url. +% (This \urefnobreak definition isn't used now, leaving it for a while +% for comparison.) +\def\urefnobreak#1{\dourefnobreak #1,,,\finish} +\def\dourefnobreak#1,#2,#3,#4\finish{\begingroup + \unsepspaces + \pdfurl{#1}% + \setbox0 = \hbox{\ignorespaces #3}% + \ifdim\wd0 > 0pt + \unhbox0 % third arg given, show only that + \else + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \ifpdf + \unhbox0 % PDF: 2nd arg given, show only it + \else + \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url + \fi + \else + \code{#1}% only url given, so show it + \fi + \fi + \endlink +\endgroup} + +% This \urefbreak definition is the active one. +\def\urefbreak{\begingroup \urefcatcodes \dourefbreak} +\let\uref=\urefbreak +\def\dourefbreak#1{\urefbreakfinish #1,,,\finish} +\def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example + \unsepspaces + \pdfurl{#1}% + \setbox0 = \hbox{\ignorespaces #3}% + \ifdim\wd0 > 0pt + \unhbox0 % third arg given, show only that + \else + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \ifpdf + \unhbox0 % PDF: 2nd arg given, show only it + \else + \unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url + \fi + \else + \urefcode{#1}% only url given, so show it + \fi + \fi + \endlink +\endgroup} + +% Allow line breaks around only a few characters (only). +\def\urefcatcodes{% + \catcode\ampChar=\active \catcode\dotChar=\active + \catcode\hashChar=\active \catcode\questChar=\active + \catcode\slashChar=\active +} +{ + \urefcatcodes + % + \global\def\urefcode{\begingroup + \setupmarkupstyle{code}% + \urefcatcodes + \let&\urefcodeamp + \let.\urefcodedot + \let#\urefcodehash + \let?\urefcodequest + \let/\urefcodeslash + \codex + } + % + % By default, they are just regular characters. + \global\def&{\normalamp} + \global\def.{\normaldot} + \global\def#{\normalhash} + \global\def?{\normalquest} + \global\def/{\normalslash} +} + +% we put a little stretch before and after the breakable chars, to help +% line breaking of long url's. The unequal skips make look better in +% cmtt at least, especially for dots. +\def\urefprestretch{\urefprebreak \hskip0pt plus.13em } +\def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em } +% +\def\urefcodeamp{\urefprestretch \&\urefpoststretch} +\def\urefcodedot{\urefprestretch .\urefpoststretch} +\def\urefcodehash{\urefprestretch \#\urefpoststretch} +\def\urefcodequest{\urefprestretch ?\urefpoststretch} +\def\urefcodeslash{\futurelet\next\urefcodeslashfinish} +{ + \catcode`\/=\active + \global\def\urefcodeslashfinish{% + \urefprestretch \slashChar + % Allow line break only after the final / in a sequence of + % slashes, to avoid line break between the slashes in http://. + \ifx\next/\else \urefpoststretch \fi + } +} + +% One more complication: by default we'll break after the special +% characters, but some people like to break before the special chars, so +% allow that. Also allow no breaking at all, for manual control. +% +\parseargdef\urefbreakstyle{% + \def\txiarg{#1}% + \ifx\txiarg\wordnone + \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} + \else\ifx\txiarg\wordbefore + \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak} + \else\ifx\txiarg\wordafter + \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak} + \else + \errhelp = \EMsimple + \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% + \fi\fi\fi +} +\def\wordafter{after} +\def\wordbefore{before} +\def\wordnone{none} + +\urefbreakstyle after + +% @url synonym for @uref, since that's how everyone uses it. +% +\let\url=\uref + +% rms does not like angle brackets --karl, 17may97. +% So now @email is just like @uref, unless we are pdf. +% +%\def\email#1{\angleleft{\tt #1}\angleright} +\ifpdf + \def\email#1{\doemail#1,,\finish} + \def\doemail#1,#2,#3\finish{\begingroup + \unsepspaces + \pdfurl{mailto:#1}% + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi + \endlink + \endgroup} +\else + \let\email=\uref +\fi % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), @@ -2704,7 +2733,7 @@ end \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \else \errhelp = \EMsimple - \errmessage{Unknown @kbdinputstyle option `\txiarg'}% + \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} @@ -2714,111 +2743,321 @@ end % Default is `distinct'. \kbdinputstyle distinct -\def\xkey{\key} -\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% -\ifx\one\xkey\ifx\threex\three \key{#2}% -\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi -\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi} +% @kbd is like @code, except that if the argument is just one @key command, +% then @kbd has no effect. +\def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}} + +\def\xkey{\key} +\def\kbdsub#1#2#3\par{% + \def\one{#1}\def\three{#3}\def\threex{??}% + \ifx\one\xkey\ifx\threex\three \key{#2}% + \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi + \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi +} + +% definition of @key that produces a lozenge. Doesn't adjust to text size. +%\setfont\keyrm\rmshape{8}{1000}{OT1} +%\font\keysy=cmsy9 +%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% +% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% +% \vbox{\hrule\kern-0.4pt +% \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% +% \kern-0.4pt\hrule}% +% \kern-.06em\raise0.4pt\hbox{\angleright}}}} + +% definition of @key with no lozenge. If the current font is already +% monospace, don't change it; that way, we respect @kbdinputstyle. But +% if it isn't monospace, then use \tt. +% +\def\key#1{{\setupmarkupstyle{key}% + \nohyphenation + \ifmonospace\else\tt\fi + #1}\null} + +% @clicksequence{File @click{} Open ...} +\def\clicksequence#1{\begingroup #1\endgroup} + +% @clickstyle @arrow (by default) +\parseargdef\clickstyle{\def\click{#1}} +\def\click{\arrow} + +% Typeset a dimension, e.g., `in' or `pt'. The only reason for the +% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. +% +\def\dmn#1{\thinspace #1} + +% @l was never documented to mean ``switch to the Lisp font'', +% and it is not used as such in any manual I can find. We need it for +% Polish suppressed-l. --karl, 22sep96. +%\def\l#1{{\li #1}\null} + +% @acronym for "FBI", "NATO", and the like. +% We print this one point size smaller, since it's intended for +% all-uppercase. +% +\def\acronym#1{\doacronym #1,,\finish} +\def\doacronym#1,#2,#3\finish{% + {\selectfonts\lsize #1}% + \def\temp{#2}% + \ifx\temp\empty \else + \space ({\unsepspaces \ignorespaces \temp \unskip})% + \fi + \null % reset \spacefactor=1000 +} + +% @abbr for "Comput. J." and the like. +% No font change, but don't do end-of-sentence spacing. +% +\def\abbr#1{\doabbr #1,,\finish} +\def\doabbr#1,#2,#3\finish{% + {\plainfrenchspacing #1}% + \def\temp{#2}% + \ifx\temp\empty \else + \space ({\unsepspaces \ignorespaces \temp \unskip})% + \fi + \null % reset \spacefactor=1000 +} + +% @asis just yields its argument. Used with @table, for example. +% +\def\asis#1{#1} + +% @math outputs its argument in math mode. +% +% One complication: _ usually means subscripts, but it could also mean +% an actual _ character, as in @math{@var{some_variable} + 1}. So make +% _ active, and distinguish by seeing if the current family is \slfam, +% which is what @var uses. +{ + \catcode`\_ = \active + \gdef\mathunderscore{% + \catcode`\_=\active + \def_{\ifnum\fam=\slfam \_\else\sb\fi}% + } +} +% Another complication: we want \\ (and @\) to output a math (or tt) \. +% FYI, plain.tex uses \\ as a temporary control sequence (for no +% particular reason), but this is not advertised and we don't care. +% +% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. +\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} +% +\def\math{% + \tex + \mathunderscore + \let\\ = \mathbackslash + \mathactive + % make the texinfo accent commands work in math mode + \let\"=\ddot + \let\'=\acute + \let\==\bar + \let\^=\hat + \let\`=\grave + \let\u=\breve + \let\v=\check + \let\~=\tilde + \let\dotaccent=\dot + $\finishmath +} +\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. + +% Some active characters (such as <) are spaced differently in math. +% We have to reset their definitions in case the @math was an argument +% to a command which sets the catcodes (such as @item or @section). +% +{ + \catcode`^ = \active + \catcode`< = \active + \catcode`> = \active + \catcode`+ = \active + \catcode`' = \active + \gdef\mathactive{% + \let^ = \ptexhat + \let< = \ptexless + \let> = \ptexgtr + \let+ = \ptexplus + \let' = \ptexquoteright + } +} + +% ctrl is no longer a Texinfo command, but leave this definition for fun. +\def\ctrl #1{{\tt \rawbackslash \hat}#1} + +% @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. +% Ignore unless FMTNAME == tex; then it is like @iftex and @tex, +% except specified as a normal braced arg, so no newlines to worry about. +% +\def\outfmtnametex{tex} +% +\long\def\inlinefmt#1{\doinlinefmt #1,\finish} +\long\def\doinlinefmt#1,#2,\finish{% + \def\inlinefmtname{#1}% + \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi +} +% +% @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if +% FMTNAME is tex, else ELSE-TEXT. +\long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish} +\long\def\doinlinefmtifelse#1,#2,#3,#4,\finish{% + \def\inlinefmtname{#1}% + \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\else \ignorespaces #3\fi +} +% +% For raw, must switch into @tex before parsing the argument, to avoid +% setting catcodes prematurely. Doing it this way means that, for +% example, @inlineraw{html, foo{bar} gets a parse error instead of being +% ignored. But this isn't important because if people want a literal +% *right* brace they would have to use a command anyway, so they may as +% well use a command to get a left brace too. We could re-use the +% delimiter character idea from \verb, but it seems like overkill. +% +\long\def\inlineraw{\tex \doinlineraw} +\long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} +\def\doinlinerawtwo#1,#2,\finish{% + \def\inlinerawname{#1}% + \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi + \endgroup % close group opened by \tex. +} + +% @inlineifset{VAR, TEXT} expands TEXT if VAR is @set. +% +\long\def\inlineifset#1{\doinlineifset #1,\finish} +\long\def\doinlineifset#1,#2,\finish{% + \def\inlinevarname{#1}% + \expandafter\ifx\csname SET\inlinevarname\endcsname\relax + \else\ignorespaces#2\fi +} + +% @inlineifclear{VAR, TEXT} expands TEXT if VAR is not @set. +% +\long\def\inlineifclear#1{\doinlineifclear #1,\finish} +\long\def\doinlineifclear#1,#2,\finish{% + \def\inlinevarname{#1}% + \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \ignorespaces#2\fi +} + + +\message{glyphs,} +% and logos. + +% @@ prints an @, as does @atchar{}. +\def\@{\char64 } +\let\atchar=\@ + +% @{ @} @lbracechar{} @rbracechar{} all generate brace characters. +% Unless we're in typewriter, use \ecfont because the CM text fonts do +% not have braces, and we don't want to switch into math. +\def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} +\def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} +\let\{=\mylbrace \let\lbracechar=\{ +\let\}=\myrbrace \let\rbracechar=\} +\begingroup + % Definitions to produce \{ and \} commands for indices, + % and @{ and @} for the aux/toc files. + \catcode`\{ = \other \catcode`\} = \other + \catcode`\[ = 1 \catcode`\] = 2 + \catcode`\! = 0 \catcode`\\ = \other + !gdef!lbracecmd[\{]% + !gdef!rbracecmd[\}]% + !gdef!lbraceatcmd[@{]% + !gdef!rbraceatcmd[@}]% +!endgroup + +% @comma{} to avoid , parsing problems. +\let\comma = , -% For @indicateurl, @env, @command quotes seem unnecessary, so use \code. -\let\indicateurl=\code -\let\env=\code -\let\command=\code +% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent +% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. +\let\, = \ptexc +\let\dotaccent = \ptexdot +\def\ringaccent#1{{\accent23 #1}} +\let\tieaccent = \ptext +\let\ubaraccent = \ptexb +\let\udotaccent = \d -% @clicksequence{File @click{} Open ...} -\def\clicksequence#1{\begingroup #1\endgroup} +% Other special characters: @questiondown @exclamdown @ordf @ordm +% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. +\def\questiondown{?`} +\def\exclamdown{!`} +\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} +\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} -% @clickstyle @arrow (by default) -\parseargdef\clickstyle{\def\click{#1}} -\def\click{\arrow} +% Dotless i and dotless j, used for accents. +\def\imacro{i} +\def\jmacro{j} +\def\dotless#1{% + \def\temp{#1}% + \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi + \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi + \else \errmessage{@dotless can be used only with i or j}% + \fi\fi +} -% @uref (abbreviation for `urlref') takes an optional (comma-separated) -% second argument specifying the text to display and an optional third -% arg as text to display instead of (rather than in addition to) the url -% itself. First (mandatory) arg is the url. Perhaps eventually put in -% a hypertex \special here. +% The \TeX{} logo, as in plain, but resetting the spacing so that a +% period following counts as ending a sentence. (Idea found in latex.) % -\def\uref#1{\douref #1,,,\finish} -\def\douref#1,#2,#3,#4\finish{\begingroup - \unsepspaces - \pdfurl{#1}% - \setbox0 = \hbox{\ignorespaces #3}% - \ifdim\wd0 > 0pt - \unhbox0 % third arg given, show only that - \else - \setbox0 = \hbox{\ignorespaces #2}% - \ifdim\wd0 > 0pt - \ifpdf - \unhbox0 % PDF: 2nd arg given, show only it - \else - \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url - \fi - \else - \code{#1}% only url given, so show it - \fi - \fi - \endlink -\endgroup} +\edef\TeX{\TeX \spacefactor=1000 } -% @url synonym for @uref, since that's how everyone uses it. +% @LaTeX{} logo. Not quite the same results as the definition in +% latex.ltx, since we use a different font for the raised A; it's most +% convenient for us to use an explicitly smaller font, rather than using +% the \scriptstyle font (since we don't reset \scriptstyle and +% \scriptscriptstyle). % -\let\url=\uref +\def\LaTeX{% + L\kern-.36em + {\setbox0=\hbox{T}% + \vbox to \ht0{\hbox{% + \ifx\textnominalsize\xwordpt + % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX. + % Revert to plain's \scriptsize, which is 7pt. + \count255=\the\fam $\fam\count255 \scriptstyle A$% + \else + % For 11pt, we can use our lllsize. + \selectfonts\lllsize A% + \fi + }% + \vss + }}% + \kern-.15em + \TeX +} -% rms does not like angle brackets --karl, 17may97. -% So now @email is just like @uref, unless we are pdf. -% -%\def\email#1{\angleleft{\tt #1}\angleright} -\ifpdf - \def\email#1{\doemail#1,,\finish} - \def\doemail#1,#2,#3\finish{\begingroup - \unsepspaces - \pdfurl{mailto:#1}% - \setbox0 = \hbox{\ignorespaces #2}% - \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi - \endlink - \endgroup} -\else - \let\email=\uref -\fi +% Some math mode symbols. +\def\bullet{$\ptexbullet$} +\def\geq{\ifmmode \ge\else $\ge$\fi} +\def\leq{\ifmmode \le\else $\le$\fi} +\def\minus{\ifmmode -\else $-$\fi} -% Typeset a dimension, e.g., `in' or `pt'. The only reason for the -% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. +% @dots{} outputs an ellipsis using the current font. +% We do .5em per period so that it has the same spacing in the cm +% typewriter fonts as three actual period characters; on the other hand, +% in other typewriter fonts three periods are wider than 1.5em. So do +% whichever is larger. % -\def\dmn#1{\thinspace #1} - -% @l was never documented to mean ``switch to the Lisp font'', -% and it is not used as such in any manual I can find. We need it for -% Polish suppressed-l. --karl, 22sep96. -%\def\l#1{{\li #1}\null} - -% @acronym for "FBI", "NATO", and the like. -% We print this one point size smaller, since it's intended for -% all-uppercase. -% -\def\acronym#1{\doacronym #1,,\finish} -\def\doacronym#1,#2,#3\finish{% - {\selectfonts\lsize #1}% - \def\temp{#2}% - \ifx\temp\empty \else - \space ({\unsepspaces \ignorespaces \temp \unskip})% +\def\dots{% + \leavevmode + \setbox0=\hbox{...}% get width of three periods + \ifdim\wd0 > 1.5em + \dimen0 = \wd0 + \else + \dimen0 = 1.5em \fi + \hbox to \dimen0{% + \hskip 0pt plus.25fil + .\hskip 0pt plus1fil + .\hskip 0pt plus1fil + .\hskip 0pt plus.5fil + }% } -% @abbr for "Comput. J." and the like. -% No font change, but don't do end-of-sentence spacing. -% -\def\abbr#1{\doabbr #1,,\finish} -\def\doabbr#1,#2,#3\finish{% - {\plainfrenchspacing #1}% - \def\temp{#2}% - \ifx\temp\empty \else - \space ({\unsepspaces \ignorespaces \temp \unskip})% - \fi +% @enddots{} is an end-of-sentence ellipsis. +% +\def\enddots{% + \dots + \spacefactor=\endofsentencespacefactor } - -\message{glyphs,} - % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. % % Since these characters are used in examples, they should be an even number of @@ -2839,7 +3078,7 @@ end {\tentt \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) -\setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt} +\setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} % \setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. @@ -2863,52 +3102,59 @@ end % Theiling, which support regular, slanted, bold and bold slanted (and % "outlined" (blackboard board, sort of) versions, which we don't need). % It is available from http://www.ctan.org/tex-archive/fonts/eurosym. -% +% % Although only regular is the truly official Euro symbol, we ignore % that. The Euro is designed to be slightly taller than the regular % font height. -% +% % feymr - regular % feymo - slanted % feybr - bold % feybo - bold slanted -% +% % There is no good (free) typewriter version, to my knowledge. % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. % Hmm. -% +% % Also doesn't work in math. Do we need to do math with euro symbols? % Hope not. -% -% +% +% \def\euro{{\eurofont e}} \def\eurofont{% % We set the font at each command, rather than predefining it in % \textfonts and the other font-switching commands, so that % installations which never need the symbol don't have to have the % font installed. - % + % % There is only one designed size (nominal 10pt), so we always scale % that to the current nominal size. - % + % % By the way, simply using "at 1em" works for cmr10 and the like, but % does not work for cmbx10 and other extended/shrunken fonts. - % + % \def\eurosize{\csname\curfontsize nominalsize\endcsname}% % - \ifx\curfontstyle\bfstylename + \ifx\curfontstyle\bfstylename % bold: \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize - \else + \else % regular: \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize \fi \thiseurofont } -% Hacks for glyphs from the EC fonts similar to \euro. We don't -% use \let for the aliases, because sometimes we redefine the original -% macro, and the alias should reflect the redefinition. +% Glyphs from the EC fonts. We don't use \let for the aliases, because +% sometimes we redefine the original macro, and the alias should reflect +% the redefinition. +% +% Use LaTeX names for the Icelandic letters. +\def\DH{{\ecfont \char"D0}} % Eth +\def\dh{{\ecfont \char"F0}} % eth +\def\TH{{\ecfont \char"DE}} % Thorn +\def\th{{\ecfont \char"FE}} % thorn +% \def\guillemetleft{{\ecfont \char"13}} \def\guillemotleft{\guillemetleft} \def\guillemetright{{\ecfont \char"14}} @@ -2922,7 +3168,7 @@ end % we have the precomposed glyphs for the most common cases. We put the % tests to use those glyphs in the single \ogonek macro so we have fewer % dummy definitions to worry about for index entries, etc. -% +% % ogonek is also used with other letters in Lithuanian (IOU), but using % the precomposed glyphs for those is not so easy since they aren't in % the same EC font. @@ -2945,6 +3191,7 @@ end \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} % +% Use the ec* fonts (cm-super in outline format) for non-CM glyphs. \def\ecfont{% % We can't distinguish serif/sans and italic/slanted, but this % is used for crude hacks anyway (like adding French and German @@ -2952,12 +3199,17 @@ end % hopefully nobody will notice/care. \edef\ecsize{\csname\curfontsize ecsize\endcsname}% \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% - \ifx\curfontstyle\bfstylename - % bold: - \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize + \ifmonospace + % typewriter: + \font\thisecfont = ectt\ecsize \space at \nominalsize \else - % regular: - \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize + \ifx\curfontstyle\bfstylename + % bold: + \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize + \else + % regular: + \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize + \fi \fi \thisecfont } @@ -2979,8 +3231,8 @@ end % Laurent Siebenmann reports \Orb undefined with: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 % so we'll define it if necessary. -% -\ifx\Orb\undefined +% +\ifx\Orb\thisisundefined \def\Orb{\mathhexbox20D} \fi @@ -3008,8 +3260,9 @@ end \newif\ifsetshortcontentsaftertitlepage \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue -\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% - \endgroup\page\hbox{}\page} +\parseargdef\shorttitlepage{% + \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% + \endgroup\page\hbox{}\page} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. @@ -3069,14 +3322,28 @@ end \finishedtitlepagetrue } -%%% Macros to be used within @titlepage: +% Settings used for typesetting titles: no hyphenation, no indentation, +% don't worry much about spacing, ragged right. This should be used +% inside a \vbox, and fonts need to be set appropriately first. Because +% it is always used for titles, nothing else, we call \rmisbold. \par +% should be specified before the end of the \vbox, since a vbox is a group. +% +\def\raggedtitlesettings{% + \rmisbold + \hyphenpenalty=10000 + \parindent=0pt + \tolerance=5000 + \ptexraggedright +} + +% Macros to be used within @titlepage: \let\subtitlerm=\tenrm \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \parseargdef\title{% \checkenv\titlepage - \leftline{\titlefonts\rmisbold #1} + \vbox{\titlefonts \raggedtitlesettings #1\par}% % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt @@ -3102,7 +3369,7 @@ end } -%%% Set up page headings and footings. +% Set up page headings and footings. \let\thispage=\folio @@ -3196,10 +3463,14 @@ end \def\headings #1 {\csname HEADINGS#1\endcsname} -\def\HEADINGSoff{% -\global\evenheadline={\hfil} \global\evenfootline={\hfil} -\global\oddheadline={\hfil} \global\oddfootline={\hfil}} -\HEADINGSoff +\def\headingsoff{% non-global headings elimination + \evenheadline={\hfil}\evenfootline={\hfil}% + \oddheadline={\hfil}\oddfootline={\hfil}% +} + +\def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting +\HEADINGSoff % it's the default + % When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document @@ -3250,7 +3521,7 @@ end % This produces Day Month Year style of output. % Only define if not already defined, in case a txi-??.tex file has set % up a different format (e.g., txi-cs.tex does this). -\ifx\today\undefined +\ifx\today\thisisundefined \def\today{% \number\day\space \ifcase\month @@ -3311,7 +3582,7 @@ end \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent - \advance\rightskip by0pt plus1fil + \advance\rightskip by0pt plus1fil\relax \leavevmode\unhbox0\par \endgroup % @@ -3325,7 +3596,7 @@ end % cause the example and the item to crash together. So we use this % bizarre value of 10001 as a signal to \aboveenvbreak to insert % \parskip glue after all. Section titles are handled this way also. - % + % \penalty 10001 \endgroup \itemxneedsnegativevskipfalse @@ -3797,18 +4068,18 @@ end \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip \global\advance\multitablelinespace by-\ht0 \fi -%% Test to see if parskip is larger than space between lines of -%% table. If not, do nothing. -%% If so, set to same dimension as multitablelinespace. +% Test to see if parskip is larger than space between lines of +% table. If not, do nothing. +% If so, set to same dimension as multitablelinespace. \ifdim\multitableparskip>\multitablelinespace \global\multitableparskip=\multitablelinespace -\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller - %% than skip between lines in the table. +\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller + % than skip between lines in the table. \fi% \ifdim\multitableparskip=0pt \global\multitableparskip=\multitablelinespace -\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller - %% than skip between lines in the table. +\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller + % than skip between lines in the table. \fi} @@ -3960,7 +4231,7 @@ end \def\value{\begingroup\makevalueexpandable\valuexxx} \def\valuexxx#1{\expandablevalue{#1}\endgroup} { - \catcode`\- = \active \catcode`\_ = \active + \catcode`\-=\active \catcode`\_=\active % \gdef\makevalueexpandable{% \let\value = \expandablevalue @@ -3969,7 +4240,7 @@ end % ..., but we might end up with active ones in the argument if % we're called from @code, as @code{@value{foo-bar_}}, though. % So \let them to their normal equivalents. - \let-\realdash \let_\normalunderscore + \let-\normaldash \let_\normalunderscore } } @@ -3980,7 +4251,12 @@ end % variable's value contains other Texinfo commands, it's almost certain % it will fail (although perhaps we could fix that with sufficient work % to do a one-level expansion on the result, instead of complete). -% +% +% Unfortunately, this has the consequence that when _ is in the *value* +% of an @set, it does not print properly in the roman fonts (get the cmr +% dot accent at position 126 instead). No fix comes to mind, and it's +% been this way since 2003 or earlier, so just ignore it. +% \def\expandablevalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax {[No value for ``#1'']}% @@ -3992,8 +4268,9 @@ end % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. -% -% To get special treatment of `@end ifset,' call \makeond and the redefine. +% +% To get the special treatment we need for `@end ifset,' we call +% \makecond and then redefine. % \makecond{ifset} \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} @@ -4009,7 +4286,7 @@ end } \def\ifsetfail{\doignore{ifset}} -% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been +% @ifclear VAR ... @end executes the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % % The `\else' inside the `\doifset' parameter is a trick to reuse the @@ -4020,6 +4297,35 @@ end \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} \def\ifclearfail{\doignore{ifclear}} +% @ifcommandisdefined CMD ... @end executes the `...' if CMD (written +% without the @) is in fact defined. We can only feasibly check at the +% TeX level, so something like `mathcode' is going to considered +% defined even though it is not a Texinfo command. +% +\makecond{ifcommanddefined} +\def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}} +% +\def\doifcmddefined#1#2{{% + \makevalueexpandable + \let\next=\empty + \expandafter\ifx\csname #2\endcsname\relax + #1% If not defined, \let\next as above. + \fi + \expandafter + }\next +} +\def\ifcmddefinedfail{\doignore{ifcommanddefined}} + +% @ifcommandnotdefined CMD ... handled similar to @ifclear above. +\makecond{ifcommandnotdefined} +\def\ifcommandnotdefined{% + \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}} +\def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}} + +% Set the `txicommandconditionals' variable, so documents have a way to +% test if the @ifcommand...defined conditionals are available. +\set txicommandconditionals + % @dircategory CATEGORY -- specify a category of the dir file % which this file should belong to. Ignore this in TeX. \let\dircategory=\comment @@ -4123,11 +4429,14 @@ end \def\@{@}% change to @@ when we switch to @ as escape char in index files. \def\ {\realbackslash\space }% % - % Need these in case \tex is in effect and \{ is a \delimiter again. - % But can't use \lbracecmd and \rbracecmd because texindex assumes - % braces and backslashes are used only as delimiters. - \let\{ = \mylbrace - \let\} = \myrbrace + % Need these unexpandable (because we define \tt as a dummy) + % definitions when @{ or @} appear in index entry text. Also, more + % complicated, when \tex is in effect and \{ is a \delimiter again. + % We can't use \lbracecmd and \rbracecmd because texindex assumes + % braces and backslashes are used only as delimiters. Perhaps we + % should define @lbrace and @rbrace commands a la @comma. + \def\{{{\tt\char123}}% + \def\}{{\tt\char125}}% % % I don't entirely understand this, but when an index entry is % generated from a macro call, the \endinput which \scanmacro inserts @@ -4138,7 +4447,7 @@ end % processing continues to some further point. On the other hand, it % seems \endinput does not hurt in the printed index arg, since that % is still getting written without apparent harm. - % + % % Sample source (mac-idx3.tex, reported by Graham Percival to % help-texinfo, 22may06): % @macro funindex {WORD} @@ -4146,12 +4455,12 @@ end % @end macro % ... % @funindex commtest - % + % % The above is not enough to reproduce the bug, but it gives the flavor. - % + % % Sample whatsit resulting: % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} - % + % % So: \let\endinput = \empty % @@ -4180,7 +4489,7 @@ end \def\commondummies{% % % \definedummyword defines \#1 as \string\#1\space, thus effectively - % preventing its expansion. This is used only for control% words, + % preventing its expansion. This is used only for control words, % not control letters, because the \space would be incorrect for % control characters, but is needed to separate the control word % from whatever follows. @@ -4199,23 +4508,28 @@ end \commondummiesnofonts % \definedummyletter\_% + \definedummyletter\-% % % Non-English letters. \definedummyword\AA \definedummyword\AE + \definedummyword\DH \definedummyword\L - \definedummyword\OE \definedummyword\O + \definedummyword\OE + \definedummyword\TH \definedummyword\aa \definedummyword\ae + \definedummyword\dh + \definedummyword\exclamdown \definedummyword\l - \definedummyword\oe \definedummyword\o - \definedummyword\ss - \definedummyword\exclamdown - \definedummyword\questiondown + \definedummyword\oe \definedummyword\ordf \definedummyword\ordm + \definedummyword\questiondown + \definedummyword\ss + \definedummyword\th % % Although these internal commands shouldn't show up, sometimes they do. \definedummyword\bf @@ -4231,20 +4545,25 @@ end \definedummyword\TeX % % Assorted special characters. + \definedummyword\arrow \definedummyword\bullet \definedummyword\comma \definedummyword\copyright \definedummyword\registeredsymbol \definedummyword\dots \definedummyword\enddots + \definedummyword\entrybreak \definedummyword\equiv \definedummyword\error \definedummyword\euro + \definedummyword\expansion + \definedummyword\geq \definedummyword\guillemetleft \definedummyword\guillemetright \definedummyword\guilsinglleft \definedummyword\guilsinglright - \definedummyword\expansion + \definedummyword\lbracechar + \definedummyword\leq \definedummyword\minus \definedummyword\ogonek \definedummyword\pounds @@ -4256,6 +4575,7 @@ end \definedummyword\quoteleft \definedummyword\quoteright \definedummyword\quotesinglbase + \definedummyword\rbracechar \definedummyword\result \definedummyword\textdegree % @@ -4301,18 +4621,27 @@ end \definedummyword\b \definedummyword\i \definedummyword\r + \definedummyword\sansserif \definedummyword\sc + \definedummyword\slanted \definedummyword\t % % Commands that take arguments. + \definedummyword\abbr \definedummyword\acronym + \definedummyword\anchor \definedummyword\cite \definedummyword\code \definedummyword\command \definedummyword\dfn + \definedummyword\dmn + \definedummyword\email \definedummyword\emph \definedummyword\env \definedummyword\file + \definedummyword\image + \definedummyword\indicateurl + \definedummyword\inforef \definedummyword\kbd \definedummyword\key \definedummyword\math @@ -4340,7 +4669,7 @@ end \def\definedummyaccent##1{\let##1\asis}% % We can just ignore other control letters. \def\definedummyletter##1{\let##1\empty}% - % Hopefully, all control words can become @asis. + % All control words become @asis by default; overrides below. \let\definedummyword\definedummyaccent % \commondummiesnofonts @@ -4352,48 +4681,63 @@ end % \def\ { }% \def\@{@}% - % how to handle braces? \def\_{\normalunderscore}% + \def\-{}% @- shouldn't affect sorting + % + % Unfortunately, texindex is not prepared to handle braces in the + % content at all. So for index sorting, we map @{ and @} to strings + % starting with |, since that ASCII character is between ASCII { and }. + \def\{{|a}% + \def\lbracechar{|a}% + % + \def\}{|b}% + \def\rbracechar{|b}% % % Non-English letters. \def\AA{AA}% \def\AE{AE}% + \def\DH{DZZ}% \def\L{L}% \def\OE{OE}% \def\O{O}% + \def\TH{ZZZ}% \def\aa{aa}% \def\ae{ae}% + \def\dh{dzz}% + \def\exclamdown{!}% \def\l{l}% \def\oe{oe}% - \def\o{o}% - \def\ss{ss}% - \def\exclamdown{!}% - \def\questiondown{?}% \def\ordf{a}% \def\ordm{o}% + \def\o{o}% + \def\questiondown{?}% + \def\ss{ss}% + \def\th{zzz}% % \def\LaTeX{LaTeX}% \def\TeX{TeX}% % % Assorted special characters. % (The following {} will end up in the sort string, but that's ok.) + \def\arrow{->}% \def\bullet{bullet}% \def\comma{,}% \def\copyright{copyright}% - \def\registeredsymbol{R}% \def\dots{...}% \def\enddots{...}% \def\equiv{==}% \def\error{error}% \def\euro{euro}% + \def\expansion{==>}% + \def\geq{>=}% \def\guillemetleft{<<}% \def\guillemetright{>>}% \def\guilsinglleft{<}% \def\guilsinglright{>}% - \def\expansion{==>}% + \def\leq{<=}% \def\minus{-}% - \def\pounds{pounds}% \def\point{.}% + \def\pounds{pounds}% \def\print{-|}% \def\quotedblbase{"}% \def\quotedblleft{"}% @@ -4401,22 +4745,31 @@ end \def\quoteleft{`}% \def\quoteright{'}% \def\quotesinglbase{,}% + \def\registeredsymbol{R}% \def\result{=>}% - \def\textdegree{degrees}% + \def\textdegree{o}% + % + \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax + \else \indexlquoteignore \fi % % We need to get rid of all macros, leaving only the arguments (if present). % Of course this is not nearly correct, but it is the best we can do for now. % makeinfo does not expand macros in the argument to @deffn, which ends up % writing an index entry, and texindex isn't prepared for an index sort entry % that starts with \. - % + % % Since macro invocations are followed by braces, we can just redefine them % to take a single TeX argument. The case of a macro invocation that % goes to end-of-line is not handled. - % + % \macrolist } +% Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us +% ignore left quotes in the sort term. +{\catcode`\`=\active + \gdef\indexlquoteignore{\let`=\empty}} + \let\indexbackslash=0 %overridden during \printindex. \let\SETmarginindex=\relax % put index entries in margin (undocumented)? @@ -4514,10 +4867,9 @@ end % % ..., ready, GO: % -\def\safewhatsit#1{% -\ifhmode +\def\safewhatsit#1{\ifhmode #1% -\else + \else % \lastskip and \lastpenalty cannot both be nonzero simultaneously. \whatsitskip = \lastskip \edef\lastskipmacro{\the\lastskip}% @@ -4541,7 +4893,6 @@ end % to re-insert the same penalty (values >10000 are used for various % signals); since we just inserted a non-discardable item, any % following glue (such as a \parskip) would be a breakpoint. For example: - % % @deffn deffn-whatever % @vindex index-whatever % Description. @@ -4554,8 +4905,7 @@ end % (the whatsit from the \write), so we must insert a \nobreak. \nobreak\vskip\whatsitskip \fi -\fi -} +\fi} % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} @@ -4674,7 +5024,6 @@ end % But this freezes the catcodes in the argument, and can cause problems to % @code, which sets - active. This problem was fixed by a kludge--- % ``-'' was active throughout whole index, but this isn't really right. -% % The right solution is to prevent \entry from swallowing the whole text. % --kasal, 21nov03 \def\entry{% @@ -4711,10 +5060,17 @@ end % columns. \vskip 0pt plus1pt % + % When reading the text of entry, convert explicit line breaks + % from @* into spaces. The user might give these in long section + % titles, for instance. + \def\*{\unskip\space\ignorespaces}% + \def\entrybreak{\hfil\break}% + % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } +\def\entrybreak{\unskip\space\ignorespaces}% \def\doentry{% \bgroup % Instead of the swallowed brace. \noindent @@ -4947,7 +5303,22 @@ end \message{sectioning,} % Chapters, sections, etc. -% \unnumberedno is an oxymoron, of course. But we count the unnumbered +% Let's start with @part. +\outer\parseargdef\part{\partzzz{#1}} +\def\partzzz#1{% + \chapoddpage + \null + \vskip.3\vsize % move it down on the page a bit + \begingroup + \noindent \titlefonts\rmisbold #1\par % the text + \let\lastnode=\empty % no node to associate with + \writetocentry{part}{#1}{}% but put it in the toc + \headingsoff % no headline or footline on the part page + \chapoddpage + \endgroup +} + +% \unnumberedno is an oxymoron. But we count the unnumbered % sections so that we can refer to them unambiguously in the pdf % outlines by their "section number". We avoid collisions with chapter % numbers by starting them at 10000. (If a document ever has 10000 @@ -5026,8 +5397,8 @@ end \chardef\maxseclevel = 3 % % A numbered section within an unnumbered changes to unnumbered too. -% To achive this, remember the "biggest" unnum. sec. we are currently in: -\chardef\unmlevel = \maxseclevel +% To achieve this, remember the "biggest" unnum. sec. we are currently in: +\chardef\unnlevel = \maxseclevel % % Trace whether the current chapter is an appendix or not: % \chapheadtype is "N" or "A", unnumbered chapters are ignored. @@ -5052,8 +5423,8 @@ end % The heading type: \def\headtype{#1}% \if \headtype U% - \ifnum \absseclevel < \unmlevel - \chardef\unmlevel = \absseclevel + \ifnum \absseclevel < \unnlevel + \chardef\unnlevel = \absseclevel \fi \else % Check for appendix sections: @@ -5065,10 +5436,10 @@ end \fi\fi \fi % Check for numbered within unnumbered: - \ifnum \absseclevel > \unmlevel + \ifnum \absseclevel > \unnlevel \def\headtype{U}% \else - \chardef\unmlevel = 3 + \chardef\unnlevel = 3 \fi \fi % Now print the heading: @@ -5122,7 +5493,9 @@ end \gdef\chaplevelprefix{\the\chapno.}% \resetallfloatnos % - \message{\putwordChapter\space \the\chapno}% + % \putwordChapter can contain complex things in translations. + \toks0=\expandafter{\putwordChapter}% + \message{\the\toks0 \space \the\chapno}% % % Write the actual heading. \chapmacro{#1}{Ynumbered}{\the\chapno}% @@ -5133,15 +5506,17 @@ end \global\let\subsubsection = \numberedsubsubsec } -\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz +\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz +% \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % - \def\appendixnum{\putwordAppendix\space \appendixletter}% - \message{\appendixnum}% + % \putwordAppendix can contain complex things in translations. + \toks0=\expandafter{\putwordAppendix}% + \message{\the\toks0 \space \appendixletter}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % @@ -5150,7 +5525,8 @@ end \global\let\subsubsection = \appendixsubsubsec } -\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz +% normally unnmhead0 calls unnumberedzzz: +\outer\parseargdef\unnumbered{\unnmhead0{#1}} \def\unnumberedzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\unnumberedno by 1 @@ -5194,40 +5570,47 @@ end \let\top\unnumbered % Sections. +% \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz \def\seczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% } -\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz +% normally calls appendixsectionzzz: +\outer\parseargdef\appendixsection{\apphead1{#1}} \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection -\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz +% normally calls unnumberedseczzz: +\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. -\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz +% +% normally calls numberedsubseczzz: +\outer\parseargdef\numberedsubsec{\numhead2{#1}} \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } -\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz +% normally calls appendixsubseczzz: +\outer\parseargdef\appendixsubsec{\apphead2{#1}} \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } -\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz +% normally calls unnumberedsubseczzz: +\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% @@ -5235,21 +5618,25 @@ end } % Subsubsections. -\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz +% +% normally numberedsubsubseczzz: +\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } -\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz +% normally appendixsubsubseczzz: +\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } -\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz +% normally unnumberedsubsubseczzz: +\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} \def\unnumberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynothing}% @@ -5265,14 +5652,6 @@ end % Define @majorheading, @heading and @subheading -% NOTE on use of \vbox for chapter headings, section headings, and such: -% 1) We use \vbox rather than the earlier \line to permit -% overlong headings to fold. -% 2) \hyphenpenalty is set to 10000 because hyphenation in a -% heading is obnoxious; this forbids it. -% 3) Likewise, headings look best if no \parindent is used, and -% if justification is not attempted. Hence \raggedright. - \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz @@ -5280,10 +5659,8 @@ end \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% - {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\ptexraggedright - \rmisbold #1\hfill}}% - \bigskip \par\penalty 200\relax + \vbox{\chapfonts \raggedtitlesettings #1\par}% + \nobreak\bigskip \nobreak \suppressfirstparagraphindent } @@ -5299,14 +5676,13 @@ end % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. -%%% Args are the skip and penalty (usually negative) +% Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} -%%% Define plain chapter starts, and page on/off switching for it % Parameter controlling skip before chapter headings (if needed) - \newskip\chapheadingskip +% Define plain chapter starts, and page on/off switching for it. \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} % Because \domark is called before \chapoddpage, the filler page will @@ -5316,9 +5692,8 @@ end \chappager \ifodd\pageno \else \begingroup - \evenheadline={\hfil}\evenfootline={\hfil}% - \oddheadline={\hfil}\oddfootline={\hfil}% - \hbox to 0pt{}% + \headingsoff + \null \chappager \endgroup \fi @@ -5374,7 +5749,10 @@ end \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% - \gdef\noexpand\thischapter{\putwordAppendix{} \noexpand\thischapternum: + % \noexpand\putwordAppendix avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} + \noexpand\thischapternum: \noexpand\thischaptername}% }% \else @@ -5382,7 +5760,10 @@ end \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% - \gdef\noexpand\thischapter{\putwordChapter{} \noexpand\thischapternum: + % \noexpand\putwordChapter avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thischapter{\noexpand\putwordChapter{} + \noexpand\thischapternum: \noexpand\thischaptername}% }% \fi\fi\fi @@ -5438,8 +5819,7 @@ end % % Typeset the actual heading. \nobreak % Avoid page breaks at the interline glue. - \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright - \hangindent=\wd0 \centerparametersmaybe + \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title @@ -5461,18 +5841,18 @@ end \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} % \def\unnchfopen #1{% -\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\ptexraggedright - \rmisbold #1\hfill}}\bigskip \par\nobreak + \chapoddpage + \vbox{\chapfonts \raggedtitlesettings #1\par}% + \nobreak\bigskip\nobreak } \def\chfopen #1#2{\chapoddpage {\chapfonts \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% \par\penalty 5000 % } \def\centerchfopen #1{% -\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt - \hfill {\rmisbold #1}\hfill}}\bigskip \par\nobreak + \chapoddpage + \vbox{\chapfonts \raggedtitlesettings \hfill #1\hfill}% + \nobreak\bigskip \nobreak } \def\CHAPFopen{% \global\let\chapmacro=\chfopen @@ -5504,6 +5884,8 @@ end % \def\sectionheading#1#2#3#4{% {% + \checkenv{}% should not be in an environment. + % % Switch to the right set of fonts. \csname #2fonts\endcsname \rmisbold % @@ -5525,7 +5907,10 @@ end \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% - \gdef\noexpand\thissection{\putwordSection{} \noexpand\thissectionnum: + % \noexpand\putwordSection avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thissection{\noexpand\putwordSection{} + \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi @@ -5535,7 +5920,10 @@ end \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% - \gdef\noexpand\thissection{\putwordSection{} \noexpand\thissectionnum: + % \noexpand\putwordSection avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thissection{\noexpand\putwordSection{} + \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi @@ -5555,7 +5943,7 @@ end % % Now the second mark, after the heading break. No break points % between here and the heading. - \let\prevsectiondefs=\lastsectiondefs + \global\let\prevsectiondefs=\lastsectiondefs \domark % % Only insert the space after the number if we have a section number. @@ -5609,15 +5997,15 @@ end % % We'll almost certainly start a paragraph next, so don't let that % glue accumulate. (Not a breakpoint because it's preceded by a - % discardable item.) + % discardable item.) However, when a paragraph is not started next + % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out + % or the negative glue will cause weirdly wrong output, typically + % obscuring the section heading with something else. \vskip-\parskip - % - % This is purely so the last item on the list is a known \penalty > - % 10000. This is so \startdefun can avoid allowing breakpoints after - % section headings. Otherwise, it would insert a valid breakpoint between: - % - % @section sec-whatever - % @deffn def-whatever + % + % This is so the last item on the main vertical list is a known + % \penalty > 10000, so \startdefun, etc., can recognize the situation + % and do the needful. \penalty 10001 } @@ -5673,7 +6061,7 @@ end % These characters do not print properly in the Computer Modern roman % fonts, so we must take special care. This is more or less redundant % with the Texinfo input format setup at the end of this file. -% +% \def\activecatcodes{% \catcode`\"=\active \catcode`\$=\active @@ -5723,7 +6111,7 @@ end % redefined for the two-volume lispref. We always output on % \jobname.toc even if this is redefined. -% +% \def\tocreadfilename{\jobname.toc} % Normal (long) toc. @@ -5749,6 +6137,7 @@ end \def\summarycontents{% \startcontents{\putwordShortTOC}% % + \let\partentry = \shortpartentry \let\numchapentry = \shortchapentry \let\appentry = \shortchapentry \let\unnchapentry = \shortunnchapentry @@ -5804,6 +6193,19 @@ end % The last argument is the page number. % The arguments in between are the chapter number, section number, ... +% Parts, in the main contents. Replace the part number, which doesn't +% exist, with an empty box. Let's hope all the numbers have the same width. +% Also ignore the page number, which is conventionally not printed. +\def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} +\def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} +% +% Parts, in the short toc. +\def\shortpartentry#1#2#3#4{% + \penalty-300 + \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip + \shortchapentry{{\bf #1}}{\numeralbox}{}{}% +} + % Chapters, in the main contents. \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} % @@ -5893,9 +6295,9 @@ end \message{environments,} % @foo ... @end foo. -% @tex ... @end tex escapes into raw Tex temporarily. +% @tex ... @end tex escapes into raw TeX temporarily. % One exception: @ is still an escape character, so that @end tex works. -% But \@ or @@ will get a plain tex @ character. +% But \@ or @@ will get a plain @ character. \envdef\tex{% \setupmarkupstyle{tex}% @@ -5908,10 +6310,14 @@ end \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other - \catcode`\`=\other - \catcode`\'=\other + \catcode `\`=\other + \catcode `\'=\other \escapechar=`\\ % + % ' is active in math mode (mathcode"8000). So reset it, and all our + % other math active characters (just in case), to plain's definitions. + \mathactive + % \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc @@ -5929,7 +6335,7 @@ end \let\/=\ptexslash \let\*=\ptexstar \let\t=\ptext - \expandafter \let\csname top\endcsname=\ptextop % outer + \expandafter \let\csname top\endcsname=\ptextop % we've made it outer \let\frenchspacing=\plainfrenchspacing % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% @@ -6015,6 +6421,12 @@ end \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % Flag to tell @lisp, etc., not to narrow margin. \let\nonarrowing = t% + % + % If this cartouche directly follows a sectioning command, we need the + % \parskip glue (backspaced over by default) or the cartouche can + % collide with the section heading. + \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi + % \vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop @@ -6028,7 +6440,7 @@ end \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip - \comment % For explanation, see the end of \def\group. + \comment % For explanation, see the end of def\group. } \def\Ecartouche{% \ifhmode\par\fi @@ -6048,7 +6460,7 @@ end \newdimen\nonfillparindent \def\nonfillstart{% \aboveenvbreak - \hfuzz = 12pt % Don't be fussy + \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output @@ -6114,41 +6526,42 @@ end } % We often define two environments, @foo and @smallfoo. -% Let's do it by one command: -\def\makedispenv #1#2{ - \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2} - \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2} +% Let's do it in one command. #1 is the env name, #2 the definition. +\def\makedispenvdef#1#2{% + \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% + \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% \expandafter\let\csname E#1\endcsname \afterenvbreak \expandafter\let\csname Esmall#1\endcsname \afterenvbreak } -% Define two synonyms: -\def\maketwodispenvs #1#2#3{ - \makedispenv{#1}{#3} - \makedispenv{#2}{#3} +% Define two environment synonyms (#1 and #2) for an environment. +\def\maketwodispenvdef#1#2#3{% + \makedispenvdef{#1}{#3}% + \makedispenvdef{#2}{#3}% } - -% @lisp: indented, narrowed, typewriter font; @example: same as @lisp. +% +% @lisp: indented, narrowed, typewriter font; +% @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % -\maketwodispenvs {lisp}{example}{% +\maketwodispenvdef{lisp}{example}{% \nonfillstart \tt\setupmarkupstyle{example}% \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. - \gobble % eat return + \gobble % eat return } % @display/@smalldisplay: same as @lisp except keep current font. % -\makedispenv {display}{% +\makedispenvdef{display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % -\makedispenv{format}{% +\makedispenvdef{format}{% \let\nonarrowing = t% \nonfillstart \gobble @@ -6167,7 +6580,7 @@ end \envdef\flushright{% \let\nonarrowing = t% \nonfillstart - \advance\leftskip by 0pt plus 1fill + \advance\leftskip by 0pt plus 1fill\relax \gobble } \let\Eflushright = \afterenvbreak @@ -6202,43 +6615,28 @@ end % we're doing normal filling. So, when using \aboveenvbreak and % \afterenvbreak, temporarily make \parskip 0. % +\makedispenvdef{quotation}{\quotationstart} +% \def\quotationstart{% - {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip - \parindent=0pt - % - % @cartouche defines \nonarrowing to inhibit narrowing at next level down. + \indentedblockstart % same as \indentedblock, but increase right margin too. \ifx\nonarrowing\relax - \advance\leftskip by \lispnarrowing \advance\rightskip by \lispnarrowing - \exdentamount = \lispnarrowing - \else - \let\nonarrowing = \relax \fi \parsearg\quotationlabel } -\envdef\quotation{% - \setnormaldispenv - \quotationstart -} - -\envdef\smallquotation{% - \setsmalldispenv - \quotationstart -} -\let\Esmallquotation = \Equotation - % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par - \ifx\quotationauthor\undefined\else + \ifx\quotationauthor\thisisundefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } +\def\Esmallquotation{\Equotation} % If we're given an argument, typeset it in bold with a colon after. \def\quotationlabel#1{% @@ -6248,6 +6646,32 @@ end \fi } +% @indentedblock is like @quotation, but indents only on the left and +% has no optional argument. +% +\makedispenvdef{indentedblock}{\indentedblockstart} +% +\def\indentedblockstart{% + {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip + \parindent=0pt + % + % @cartouche defines \nonarrowing to inhibit narrowing at next level down. + \ifx\nonarrowing\relax + \advance\leftskip by \lispnarrowing + \exdentamount = \lispnarrowing + \else + \let\nonarrowing = \relax + \fi +} + +% Keep a nonzero parskip for the environment, since we're doing normal filling. +% +\def\Eindentedblock{% + \par + {\parskip=0pt \afterenvbreak}% +} +\def\Esmallindentedblock{\Eindentedblock} + % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any as delimiter, @@ -6295,21 +6719,28 @@ end % Setup for the @verbatim environment % -% Real tab expansion +% Real tab expansion. \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount % -\def\starttabbox{\setbox0=\hbox\bgroup} +% We typeset each line of the verbatim in an \hbox, so we can handle +% tabs. The \global is in case the verbatim line starts with an accent, +% or some other command that starts with a begin-group. Otherwise, the +% entire \verbbox would disappear at the corresponding end-group, before +% it is typeset. Meanwhile, we can't have nested verbatim commands +% (can we?), so the \global won't be overwriting itself. +\newbox\verbbox +\def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup - \dimen0=\wd0 % the width so far, or since the previous tab - \divide\dimen0 by\tabw - \multiply\dimen0 by\tabw % compute previous multiple of \tabw - \advance\dimen0 by\tabw % advance to next multiple of \tabw - \wd0=\dimen0 \box0 \starttabbox + \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab + \divide\dimen\verbbox by\tabw + \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw + \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw + \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox }% } \endgroup @@ -6318,15 +6749,16 @@ end \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart - % Easiest (and conventionally used) font for verbatim - \tt - \def\par{\leavevmode\egroup\box0\endgraf}% + \tt % easiest (and conventionally used) font for verbatim + % The \leavevmode here is for blank lines. Otherwise, we would + % never \starttabox and the \egroup would end verbatim mode. + \def\par{\leavevmode\egroup\box\verbbox\endgraf}% \tabexpand \setupmarkupstyle{verbatim}% % Respect line breaks, % print special symbols as themselves, and - % make each space count - % must do in this order: + % make each space count. + % Must do in this order: \obeylines \uncatcodespecials \sepspaces \everypar{\starttabbox}% } @@ -6383,6 +6815,7 @@ end \makevalueexpandable \setupverbatim \indexnofonts % Allow `@@' and other weird things in file names. + \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% \input #1 \afterenvbreak }% @@ -6432,7 +6865,7 @@ end % commands also insert a nobreak penalty, and we don't want to allow % a break between a section heading and a defun. % - % As a minor refinement, we avoid "club" headers by signalling + % As a further refinement, we avoid "club" headers by signalling % with penalty of 10003 after the very first @deffn in the % sequence (see above), and penalty of 10002 after any following % @def command. @@ -6469,7 +6902,7 @@ end #1#2 \endheader % common ending: \interlinepenalty = 10000 - \advance\rightskip by 0pt plus 1fil + \advance\rightskip by 0pt plus 1fil\relax \endgraf \nobreak\vskip -\parskip \penalty\defunpenalty % signal to \startdefun and \dodefunx @@ -6499,13 +6932,36 @@ end \def\domakedefun#1#2#3{% \envdef#1{% \startdefun + \doingtypefnfalse % distinguish typed functions from all else \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } -%%% Untyped functions: +\newif\ifdoingtypefn % doing typed function? +\newif\ifrettypeownline % typeset return type on its own line? + +% @deftypefnnewline on|off says whether the return type of typed functions +% are printed on their own line. This affects @deftypefn, @deftypefun, +% @deftypeop, and @deftypemethod. +% +\parseargdef\deftypefnnewline{% + \def\temp{#1}% + \ifx\temp\onword + \expandafter\let\csname SETtxideftypefnnl\endcsname + = \empty + \else\ifx\temp\offword + \expandafter\let\csname SETtxideftypefnnl\endcsname + = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @txideftypefnnl value `\temp', + must be on|off}% + \fi\fi +} + +% Untyped functions: % @deffn category name args \makedefun{deffn}{\deffngeneral{}} @@ -6524,7 +6980,7 @@ end \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% } -%%% Typed functions: +% Typed functions: % @deftypefn category type name args \makedefun{deftypefn}{\deftypefngeneral{}} @@ -6539,10 +6995,11 @@ end % \def\deftypefngeneral#1#2 #3 #4 #5\endheader{% \dosubind{fn}{\code{#4}}{#1}% + \doingtypefntrue \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } -%%% Typed variables: +% Typed variables: % @deftypevr category type var args \makedefun{deftypevr}{\deftypecvgeneral{}} @@ -6560,7 +7017,7 @@ end \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } -%%% Untyped variables: +% Untyped variables: % @defvr category var args \makedefun{defvr}#1 {\deftypevrheader{#1} {} } @@ -6571,7 +7028,8 @@ end % \defcvof {category of}class var args \def\defcvof#1#2 {\deftypecvof{#1}#2 {} } -%%% Type: +% Types: + % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% @@ -6599,25 +7057,49 @@ end % We are followed by (but not passed) the arguments, if any. % \def\defname#1#2#3{% + \par % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % - % How we'll format the type name. Putting it in brackets helps + % Determine if we are typesetting the return type of a typed function + % on a line by itself. + \rettypeownlinefalse + \ifdoingtypefn % doing a typed function specifically? + % then check user option for putting return type on its own line: + \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else + \rettypeownlinetrue + \fi + \fi + % + % How we'll format the category name. Putting it in brackets helps % distinguish it from the body text that may end up on the next line % just below it. \def\temp{#1}% \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} % - % Figure out line sizes for the paragraph shape. + % Figure out line sizes for the paragraph shape. We'll always have at + % least two. + \tempnum = 2 + % % The first line needs space for \box0; but if \rightskip is nonzero, % we need only space for the part of \box0 which exceeds it: \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip + % + % If doing a return type on its own line, we'll have another line. + \ifrettypeownline + \advance\tempnum by 1 + \def\maybeshapeline{0in \hsize}% + \else + \def\maybeshapeline{}% + \fi + % % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent - % (plain.tex says that \dimen1 should be used only as global.) - \parshape 2 0in \dimen0 \defargsindent \dimen2 % - % Put the type name to the right margin. + % The final paragraph shape: + \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 + % + % Put the category name at the right margin. \noindent \hbox to 0pt{% \hfil\box0 \kern-\hsize @@ -6639,8 +7121,16 @@ end % . this still does not fix the ?` and !` ligatures, but so far no % one has made identifiers using them :). \df \tt - \def\temp{#2}% return value type - \ifx\temp\empty\else \tclose{\temp} \fi + \def\temp{#2}% text of the return type + \ifx\temp\empty\else + \tclose{\temp}% typeset the return type + \ifrettypeownline + % put return type on its own line; prohibit line break following: + \hfil\vadjust{\nobreak}\break + \else + \space % type on same line, so just followed by a space + \fi + \fi % no return type #3% output function name }% {\rm\enskip}% hskip 0.5 em of \tenrm @@ -6660,7 +7150,10 @@ end \df \sl \hyphenchar\font=0 % % On the other hand, if an argument has two dashes (for instance), we - % want a way to get ttsl. Let's try @var for that. + % want a way to get ttsl. We used to recommend @var for that, so + % leave the code in, but it's strange for @var to lead to typewriter. + % Nowadays we recommend @code, since the difference between a ttsl hyphen + % and a tt hyphen is pretty tiny. @code also disables ?` !`. \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% #1% \sl\hyphenchar\font=45 @@ -6758,7 +7251,7 @@ end % To do this right we need a feature of e-TeX, \scantokens, % which we arrange to emulate with a temporary file in ordinary TeX. -\ifx\eTeXversion\undefined +\ifx\eTeXversion\thisisundefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% @@ -6769,25 +7262,30 @@ end } \fi -\def\scanmacro#1{% - \begingroup - \newlinechar`\^^M - \let\xeatspaces\eatspaces - % Undo catcode changes of \startcontents and \doprintindex - % When called from @insertcopying or (short)caption, we need active - % backslash to get it printed correctly. Previously, we had - % \catcode`\\=\other instead. We'll see whether a problem appears - % with macro expansion. --kasal, 19aug04 - \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ - % ... and \example - \spaceisspace - % - % Append \endinput to make sure that TeX does not see the ending newline. - % I've verified that it is necessary both for e-TeX and for ordinary TeX - % --kasal, 29nov03 - \scantokens{#1\endinput}% - \endgroup -} +\def\scanmacro#1{\begingroup + \newlinechar`\^^M + \let\xeatspaces\eatspaces + % + % Undo catcode changes of \startcontents and \doprintindex + % When called from @insertcopying or (short)caption, we need active + % backslash to get it printed correctly. Previously, we had + % \catcode`\\=\other instead. We'll see whether a problem appears + % with macro expansion. --kasal, 19aug04 + \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ + % + % ... and for \example: + \spaceisspace + % + % The \empty here causes a following catcode 5 newline to be eaten as + % part of reading whitespace after a control sequence. It does not + % eat a catcode 13 newline. There's no good way to handle the two + % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX + % would then have different behavior). See the Macro Details node in + % the manual for the workaround we recommend for macros and + % line-oriented commands. + % + \scantokens{#1\empty}% +\endgroup} \def\scanexp#1{% \edef\temp{\noexpand\scanmacro{#1}}% @@ -6815,7 +7313,7 @@ end % This does \let #1 = #2, with \csnames; that is, % \let \csname#1\endcsname = \csname#2\endcsname % (except of course we have to play expansion games). -% +% \def\cslet#1#2{% \expandafter\let \csname#1\expandafter\endcsname @@ -6841,17 +7339,18 @@ end % Macro bodies are absorbed as an argument in a context where % all characters are catcode 10, 11 or 12, except \ which is active -% (as in normal texinfo). It is necessary to change the definition of \. - +% (as in normal texinfo). It is necessary to change the definition of \ +% to recognize macro arguments; this is the job of \mbodybackslash. +% % Non-ASCII encodings make 8-bit characters active, so un-activate % them to avoid their expansion. Must do this non-globally, to % confine the change to the current group. - +% % It's necessary to have hard CRs when the macro is executed. This is -% done by making ^^M (\endlinechar) catcode 12 when reading the macro +% done by making ^^M (\endlinechar) catcode 12 when reading the macro % body, and then making it the \newlinechar in \scanmacro. - -\def\scanctxt{% +% +\def\scanctxt{% used as subroutine \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other @@ -6864,13 +7363,13 @@ end \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi } -\def\scanargctxt{% +\def\scanargctxt{% used for copying and captions, not macros. \scanctxt \catcode`\\=\other \catcode`\^^M=\other } -\def\macrobodyctxt{% +\def\macrobodyctxt{% used for @macro definitions \scanctxt \catcode`\{=\other \catcode`\}=\other @@ -6878,32 +7377,56 @@ end \usembodybackslash } -\def\macroargctxt{% +\def\macroargctxt{% used when scanning invocations \scanctxt - \catcode`\\=\other + \catcode`\\=0 } +% why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes" +% for the single characters \ { }. Thus, we end up with the "commands" +% that would be written @\ @{ @} in a Texinfo document. +% +% We already have @{ and @}. For @\, we define it here, and only for +% this purpose, to produce a typewriter backslash (so, the @\ that we +% define for @math can't be used with @macro calls): +% +\def\\{\normalbackslash}% +% +% We would like to do this for \, too, since that is what makeinfo does. +% But it is not possible, because Texinfo already has a command @, for a +% cedilla accent. Documents must use @comma{} instead. +% +% \anythingelse will almost certainly be an error of some kind. + % \mbodybackslash is the definition of \ in @macro bodies. % It maps \foo\ => \csname macarg.foo\endcsname => #N % where N is the macro parameter number. % We define \csname macarg.\endcsname to be \realbackslash, so % \\ in macro replacement text gets you a backslash. - +% {\catcode`@=0 @catcode`@\=@active @gdef@usembodybackslash{@let\=@mbodybackslash} @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} } \expandafter\def\csname macarg.\endcsname{\realbackslash} +\def\margbackslash#1{\char`\#1 } + \def\macro{\recursivefalse\parsearg\macroxxx} \def\rmacro{\recursivetrue\parsearg\macroxxx} \def\macroxxx#1{% - \getargs{#1}% now \macname is the macname and \argl the arglist + \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty % no arguments - \paramno=0% + \paramno=0\relax \else \expandafter\parsemargdef \argl;% + \if\paramno>256\relax + \ifx\eTeXversion\thisisundefined + \errhelp = \EMsimple + \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} + \fi + \fi \fi \if1\csname ismacro.\the\macname\endcsname \message{Warning: redefining \the\macname}% @@ -6950,46 +7473,269 @@ end % an opening brace, and that opening brace is not consumed. \def\getargs#1{\getargsxxx#1{}} \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} -\def\getmacname #1 #2\relax{\macname={#1}} +\def\getmacname#1 #2\relax{\macname={#1}} \def\getmacargs#1{\def\argl{#1}} +% For macro processing make @ a letter so that we can make Texinfo private macro names. +\edef\texiatcatcode{\the\catcode`\@} +\catcode `@=11\relax + % Parse the optional {params} list. Set up \paramno and \paramlist -% so \defmacro knows what to do. Define \macarg.blah for each blah -% in the params list, to be ##N where N is the position in that list. +% so \defmacro knows what to do. Define \macarg.BLAH for each BLAH +% in the params list to some hook where the argument si to be expanded. If +% there are less than 10 arguments that hook is to be replaced by ##N where N +% is the position in that list, that is to say the macro arguments are to be +% defined `a la TeX in the macro body. +% % That gets used by \mbodybackslash (above). - +% % We need to get `macro parameter char #' into several definitions. -% The technique used is stolen from LaTeX: let \hash be something +% The technique used is stolen from LaTeX: let \hash be something % unexpandable, insert that wherever you need a #, and then redefine % it to # just before using the token list produced. % % The same technique is used to protect \eatspaces till just before % the macro is used. - -\def\parsemargdef#1;{\paramno=0\def\paramlist{}% - \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} +% +% If there are 10 or more arguments, a different technique is used, where the +% hook remains in the body, and when macro is to be expanded the body is +% processed again to replace the arguments. +% +% In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the +% argument N value and then \edef the body (nothing else will expand because of +% the catcode regime underwhich the body was input). +% +% If you compile with TeX (not eTeX), and you have macros with 10 or more +% arguments, you need that no macro has more than 256 arguments, otherwise an +% error is produced. +\def\parsemargdef#1;{% + \paramno=0\def\paramlist{}% + \let\hash\relax + \let\xeatspaces\relax + \parsemargdefxxx#1,;,% + % In case that there are 10 or more arguments we parse again the arguments + % list to set new definitions for the \macarg.BLAH macros corresponding to + % each BLAH argument. It was anyhow needed to parse already once this list + % in order to count the arguments, and as macros with at most 9 arguments + % are by far more frequent than macro with 10 or more arguments, defining + % twice the \macarg.BLAH macros does not cost too much processing power. + \ifnum\paramno<10\relax\else + \paramno0\relax + \parsemmanyargdef@@#1,;,% 10 or more arguments + \fi +} \def\parsemargdefxxx#1,{% \if#1;\let\next=\relax \else \let\next=\parsemargdefxxx - \advance\paramno by 1% + \advance\paramno by 1 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\xeatspaces{\hash\the\paramno}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} +\def\parsemmanyargdef@@#1,{% + \if#1;\let\next=\relax + \else + \let\next=\parsemmanyargdef@@ + \edef\tempb{\eatspaces{#1}}% + \expandafter\def\expandafter\tempa + \expandafter{\csname macarg.\tempb\endcsname}% + % Note that we need some extra \noexpand\noexpand, this is because we + % don't want \the to be expanded in the \parsermacbody as it uses an + % \xdef . + \expandafter\edef\tempa + {\noexpand\noexpand\noexpand\the\toks\the\paramno}% + \advance\paramno by 1\relax + \fi\next} + % These two commands read recursive and nonrecursive macro bodies. % (They're different since rec and nonrec macros end differently.) +% +\catcode `\@\texiatcatcode \long\def\parsemacbody#1@end macro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \long\def\parsermacbody#1@end rmacro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% +\catcode `\@=11\relax + +\let\endargs@\relax +\let\nil@\relax +\def\nilm@{\nil@}% +\long\def\nillm@{\nil@}% + +% This macro is expanded during the Texinfo macro expansion, not during its +% definition. It gets all the arguments values and assigns them to macros +% macarg.ARGNAME +% +% #1 is the macro name +% #2 is the list of argument names +% #3 is the list of argument values +\def\getargvals@#1#2#3{% + \def\macargdeflist@{}% + \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. + \def\paramlist{#2,\nil@}% + \def\macroname{#1}% + \begingroup + \macroargctxt + \def\argvaluelist{#3,\nil@}% + \def\@tempa{#3}% + \ifx\@tempa\empty + \setemptyargvalues@ + \else + \getargvals@@ + \fi +} + +% +\def\getargvals@@{% + \ifx\paramlist\nilm@ + % Some sanity check needed here that \argvaluelist is also empty. + \ifx\argvaluelist\nillm@ + \else + \errhelp = \EMsimple + \errmessage{Too many arguments in macro `\macroname'!}% + \fi + \let\next\macargexpandinbody@ + \else + \ifx\argvaluelist\nillm@ + % No more arguments values passed to macro. Set remaining named-arg + % macros to empty. + \let\next\setemptyargvalues@ + \else + % pop current arg name into \@tempb + \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% + \expandafter\@tempa\expandafter{\paramlist}% + % pop current argument value into \@tempc + \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% + \expandafter\@tempa\expandafter{\argvaluelist}% + % Here \@tempb is the current arg name and \@tempc is the current arg value. + % First place the new argument macro definition into \@tempd + \expandafter\macname\expandafter{\@tempc}% + \expandafter\let\csname macarg.\@tempb\endcsname\relax + \expandafter\def\expandafter\@tempe\expandafter{% + \csname macarg.\@tempb\endcsname}% + \edef\@tempd{\long\def\@tempe{\the\macname}}% + \push@\@tempd\macargdeflist@ + \let\next\getargvals@@ + \fi + \fi + \next +} + +\def\push@#1#2{% + \expandafter\expandafter\expandafter\def + \expandafter\expandafter\expandafter#2% + \expandafter\expandafter\expandafter{% + \expandafter#1#2}% +} + +% Replace arguments by their values in the macro body, and place the result +% in macro \@tempa +\def\macvalstoargs@{% + % To do this we use the property that token registers that are \the'ed + % within an \edef expand only once. So we are going to place all argument + % values into respective token registers. + % + % First we save the token context, and initialize argument numbering. + \begingroup + \paramno0\relax + % Then, for each argument number #N, we place the corresponding argument + % value into a new token list register \toks#N + \expandafter\putargsintokens@\saveparamlist@,;,% + % Then, we expand the body so that argument are replaced by their + % values. The trick for values not to be expanded themselves is that they + % are within tokens and that tokens expand only once in an \edef . + \edef\@tempc{\csname mac.\macroname .body\endcsname}% + % Now we restore the token stack pointer to free the token list registers + % which we have used, but we make sure that expanded body is saved after + % group. + \expandafter + \endgroup + \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% + } + +\def\macargexpandinbody@{% + %% Define the named-macro outside of this group and then close this group. + \expandafter + \endgroup + \macargdeflist@ + % First the replace in body the macro arguments by their values, the result + % is in \@tempa . + \macvalstoargs@ + % Then we point at the \norecurse or \gobble (for recursive) macro value + % with \@tempb . + \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname + % Depending on whether it is recursive or not, we need some tailing + % \egroup . + \ifx\@tempb\gobble + \let\@tempc\relax + \else + \let\@tempc\egroup + \fi + % And now we do the real job: + \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% + \@tempd +} -% This defines the macro itself. There are six cases: recursive and -% nonrecursive macros of zero, one, and many arguments. +\def\putargsintokens@#1,{% + \if#1;\let\next\relax + \else + \let\next\putargsintokens@ + % First we allocate the new token list register, and give it a temporary + % alias \@tempb . + \toksdef\@tempb\the\paramno + % Then we place the argument value into that token list register. + \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname + \expandafter\@tempb\expandafter{\@tempa}% + \advance\paramno by 1\relax + \fi + \next +} + +% Save the token stack pointer into macro #1 +\def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}} +% Restore the token stack pointer from number in macro #1 +\def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax} +% newtoks that can be used non \outer . +\def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi} + +% Tailing missing arguments are set to empty +\def\setemptyargvalues@{% + \ifx\paramlist\nilm@ + \let\next\macargexpandinbody@ + \else + \expandafter\setemptyargvaluesparser@\paramlist\endargs@ + \let\next\setemptyargvalues@ + \fi + \next +} + +\def\setemptyargvaluesparser@#1,#2\endargs@{% + \expandafter\def\expandafter\@tempa\expandafter{% + \expandafter\def\csname macarg.#1\endcsname{}}% + \push@\@tempa\macargdeflist@ + \def\paramlist{#2}% +} + +% #1 is the element target macro +% #2 is the list macro +% #3,#4\endargs@ is the list value +\def\pop@#1#2#3,#4\endargs@{% + \def#1{#3}% + \def#2{#4}% +} +\long\def\longpop@#1#2#3,#4\endargs@{% + \long\def#1{#3}% + \long\def#2{#4}% +} + +% This defines a Texinfo @macro. There are eight cases: recursive and +% nonrecursive macros of zero, one, up to nine, and many arguments. % Much magic with \expandafter here. % \xdef is used so that macro definitions will survive the file % they're defined in; @include reads the file inside a group. +% \def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars \ifrecursive @@ -7004,17 +7750,25 @@ end \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup\noexpand\scanmacro{\temp}}% - \else % many - \expandafter\xdef\csname\the\macname\endcsname{% - \bgroup\noexpand\macroargctxt - \noexpand\csname\the\macname xx\endcsname}% - \expandafter\xdef\csname\the\macname xx\endcsname##1{% - \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% - \expandafter\expandafter - \expandafter\xdef - \expandafter\expandafter - \csname\the\macname xxx\endcsname - \paramlist{\egroup\noexpand\scanmacro{\temp}}% + \else + \ifnum\paramno<10\relax % at most 9 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{\egroup\noexpand\scanmacro{\temp}}% + \else % 10 or more + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\getargvals@{\the\macname}{\argl}% + }% + \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp + \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble + \fi \fi \else \ifcase\paramno @@ -7031,29 +7785,40 @@ end \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% - \else % many - \expandafter\xdef\csname\the\macname\endcsname{% - \bgroup\noexpand\macroargctxt - \expandafter\noexpand\csname\the\macname xx\endcsname}% - \expandafter\xdef\csname\the\macname xx\endcsname##1{% - \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% - \expandafter\expandafter - \expandafter\xdef - \expandafter\expandafter - \csname\the\macname xxx\endcsname - \paramlist{% - \egroup - \noexpand\norecurse{\the\macname}% - \noexpand\scanmacro{\temp}\egroup}% + \else % at most 9 + \ifnum\paramno<10\relax + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \expandafter\noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \else % 10 or more: + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\getargvals@{\the\macname}{\argl}% + }% + \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp + \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse + \fi \fi \fi} +\catcode `\@\texiatcatcode\relax + \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} % \braceorline decides whether the next nonwhitespace character is a % {. If so it reads up to the closing }, if not, it reads the whole % line. Whatever was read is then fed to the next control sequence -% as an argument (by \parsebrace or \parsearg) +% as an argument (by \parsebrace or \parsearg). +% \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup\else @@ -7063,7 +7828,8 @@ end % @alias. % We need some trickery to remove the optional spaces around the equal -% sign. Just make them active and then expand them all to nothing. +% sign. Make them active and then expand them all to nothing. +% \def\alias{\parseargusing\obeyspaces\aliasxxx} \def\aliasxxx #1{\aliasyyy#1\relax} \def\aliasyyy #1=#2\relax{% @@ -7084,7 +7850,8 @@ end % @inforef is relatively simple. \def\inforef #1{\inforefzzz #1,,,,**} -\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, +\def\inforefzzz #1,#2,#3,#4**{% + \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} % @node's only job in TeX is to define \lastnode, which is used in @@ -7145,11 +7912,32 @@ end \toks0 = \expandafter{\lastsection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. - \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout + \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout }% \fi } +% @xrefautosectiontitle on|off says whether @section(ing) names are used +% automatically in xrefs, if the third arg is not explicitly specified. +% This was provided as a "secret" @set xref-automatic-section-title +% variable, now it's official. +% +\parseargdef\xrefautomaticsectiontitle{% + \def\temp{#1}% + \ifx\temp\onword + \expandafter\let\csname SETxref-automatic-section-title\endcsname + = \empty + \else\ifx\temp\offword + \expandafter\let\csname SETxref-automatic-section-title\endcsname + = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', + must be on|off}% + \fi\fi +} + +% % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is % the node name, #2 the name of the Info cross-reference, #3 the printed % node name, #4 the name of the Info file, #5 the name of the printed @@ -7158,26 +7946,41 @@ end \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} \def\ref#1{\xrefX[#1,,,,,,,]} +% +\newbox\toprefbox +\newbox\printedrefnamebox +\newbox\infofilenamebox +\newbox\printedmanualbox +% \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces - \def\printedmanual{\ignorespaces #5}% + % + % Get args without leading/trailing spaces. \def\printedrefname{\ignorespaces #3}% - \setbox1=\hbox{\printedmanual\unskip}% - \setbox0=\hbox{\printedrefname\unskip}% - \ifdim \wd0 = 0pt + \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% + % + \def\infofilename{\ignorespaces #4}% + \setbox\infofilenamebox = \hbox{\infofilename\unskip}% + % + \def\printedmanual{\ignorespaces #5}% + \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% + % + % If the printed reference name (arg #3) was not explicitly given in + % the @xref, figure out what we want to use. + \ifdim \wd\printedrefnamebox = 0pt % No printed node name was explicitly given. - \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax - % Use the node name inside the square brackets. + \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax + % Not auto section-title: use node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else - % Use the actual chapter/section title appear inside - % the square brackets. Use the real section title if we have it. - \ifdim \wd1 > 0pt - % It is in another manual, so we don't have it. + % Auto section-title: use chapter/section title inside + % the square brackets if we have it. + \ifdim \wd\printedmanualbox > 0pt + % It is in another manual, so we don't have it; use node name. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs - % We know the real title if we have the xref values. + % We (should) know the real title if we have the xref values. \def\printedrefname{\refx{#1-title}{}}% \else % Otherwise just copy the Info node name. @@ -7191,13 +7994,20 @@ end \ifpdf {\indexnofonts \turnoffactive + \makevalueexpandable % This expands tokens, so do it after making catcode changes, so _ - % etc. don't get their TeX definitions. + % etc. don't get their TeX definitions. This ignores all spaces in + % #4, including (wrongly) those in the middle of the filename. \getfilename{#4}% % - % See comments at \activebackslashdouble. - {\activebackslashdouble \xdef\pdfxrefdest{#1}% - \backslashparens\pdfxrefdest}% + % This (wrongly) does not take account of leading or trailing + % spaces in #1, which should be ignored. + \edef\pdfxrefdest{#1}% + \ifx\pdfxrefdest\empty + \def\pdfxrefdest{Top}% no empty targets + \else + \txiescapepdf\pdfxrefdest % escape PDF special chars + \fi % \leavevmode \startlink attr{/Border [0 0 0]}% @@ -7224,29 +8034,42 @@ end \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". - \ifdim\wd0 = 0pt + \ifdim\wd\printedrefnamebox = 0pt \refx{#1-snt}{}% \else \printedrefname \fi % - % if the user also gave the printed manual name (fifth arg), append + % If the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". - \ifdim \wd1 > 0pt + \ifdim \wd\printedmanualbox > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. + % + % If we use \unhbox to print the node names, TeX does not insert + % empty discretionaries after hyphens, which means that it will not + % find a line break at a hyphen in a node names. Since some manuals + % are best written with fairly long node names, containing hyphens, + % this is a loss. Therefore, we give the text of the node name + % again, so it is as if TeX is seeing it for the first time. + % + \ifdim \wd\printedmanualbox > 0pt + % Cross-manual reference with a printed manual name. + % + \crossmanualxref{\cite{\printedmanual\unskip}}% + % + \else\ifdim \wd\infofilenamebox > 0pt + % Cross-manual reference with only an info filename (arg 4), no + % printed manual name (arg 5). This is essentially the same as + % the case above; we output the filename, since we have nothing else. + % + \crossmanualxref{\code{\infofilename\unskip}}% % - % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not - % insert empty discretionaries after hyphens, which means that it will - % not find a line break at a hyphen in a node names. Since some manuals - % are best written with fairly long node names, containing hyphens, this - % is a loss. Therefore, we give the text of the node name again, so it - % is as if TeX is seeing it for the first time. - \ifdim \wd1 > 0pt - \putwordSection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}% \else + % Reference within this manual. + % % _ (for example) has to be the character _ for the purposes of the % control sequence corresponding to the node, but it has to expand % into the usual \leavevmode...\vrule stuff for purposes of @@ -7258,7 +8081,7 @@ end \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi }% - % output the `[mynode]' via a macro so it can be overridden. + % output the `[mynode]' via the macro below so it can be overridden. \xrefprintnodename\printedrefname % % But we always want a comma and a space: @@ -7266,11 +8089,37 @@ end % % output the `page 3'. \turnoffactive \putwordpage\tie\refx{#1-pg}{}% - \fi + \fi\fi \fi \endlink \endgroup} +% Output a cross-manual xref to #1. Used just above (twice). +% +% Only include the text "Section ``foo'' in" if the foo is neither +% missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply +% "see The Foo Manual", the idea being to refer to the whole manual. +% +% But, this being TeX, we can't easily compare our node name against the +% string "Top" while ignoring the possible spaces before and after in +% the input. By adding the arbitrary 7sp below, we make it much less +% likely that a real node name would have the same width as "Top" (e.g., +% in a monospaced font). Hopefully it will never happen in practice. +% +% For the same basic reason, we retypeset the "Top" at every +% reference, since the current font is indeterminate. +% +\def\crossmanualxref#1{% + \setbox\toprefbox = \hbox{Top\kern7sp}% + \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% + \ifdim \wd2 > 7sp % nonempty? + \ifdim \wd2 = \wd\toprefbox \else % same as Top? + \putwordSection{} ``\printedrefname'' \putwordin{}\space + \fi + \fi + #1% +} + % This macro is called from \xrefX for the `[nodename]' part of xref % output. It's a separate macro only so it can be changed more easily, % since square brackets don't work well in some documents. Particularly @@ -7321,7 +8170,8 @@ end \angleleft un\-de\-fined\angleright \iflinks \ifhavexrefs - \message{\linenumber Undefined cross reference `#1'.}% + {\toks0 = {#1}% avoid expansion of possibly-complex value + \message{\linenumber Undefined cross reference `\the\toks0'.}}% \else \ifwarnedxrefs\else \global\warnedxrefstrue @@ -7485,7 +8335,7 @@ end % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } -% @footnotestyle is meaningful for info output only. +% @footnotestyle is meaningful for Info output only. \let\footnotestyle=\comment {\catcode `\@=11 @@ -7548,6 +8398,8 @@ end % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut + % + % Invoke rest of plain TeX footnote routine. \futurelet\next\fo@t } }%end \catcode `\@=11 @@ -7635,7 +8487,7 @@ end it from ftp://tug.org/tex/epsf.tex.} % \def\image#1{% - \ifx\epsfbox\undefined + \ifx\epsfbox\thisisundefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% @@ -7651,7 +8503,7 @@ end % #2 is (optional) width, #3 is (optional) height. % #4 is (ignored optional) html alt text. % #5 is (ignored optional) extension. -% #6 is just the usual extra ignored arg for parsing this stuff. +% #6 is just the usual extra ignored arg for parsing stuff. \newif\ifimagevmode \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example @@ -7659,6 +8511,13 @@ end % If the image is by itself, center it. \ifvmode \imagevmodetrue + \else \ifx\centersub\centerV + % for @center @image, we need a vbox so we can have our vertical space + \imagevmodetrue + \vbox\bgroup % vbox has better behavior than vtop herev + \fi\fi + % + \ifimagevmode \nobreak\medskip % Usually we'll have text after the image which will insert % \parskip glue, so insert it here too to equalize the space @@ -7668,9 +8527,13 @@ end \fi % % Leave vertical mode so that indentation from an enclosing - % environment such as @quotation is respected. On the other hand, if - % it's at the top level, we don't want the normal paragraph indentation. - \noindent + % environment such as @quotation is respected. + % However, if we're at the top level, we don't want the + % normal paragraph indentation. + % On the other hand, if we are in the case of @center @image, we don't + % want to start a paragraph, which will create a hsize-width box and + % eradicate the centering. + \ifx\centersub\centerV\else \noindent \fi % % Output the image. \ifpdf @@ -7682,7 +8545,10 @@ end \epsfbox{#1.eps}% \fi % - \ifimagevmode \medskip \fi % space after the standalone image + \ifimagevmode + \medskip % space after a standalone image + \fi + \ifx\centersub\centerV \egroup \fi \endgroup} @@ -7975,21 +8841,22 @@ end \closein 1 \endgroup % end raw TeX \endgroup} -} % % If they passed de_DE, and txi-de_DE.tex doesn't exist, % try txi-de.tex. -% -\def\documentlanguagetrywithoutunderscore#1_#2\finish{% +% +\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else + \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 } +}% end of special _ catcode % \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? Putting it in the current @@ -7998,16 +8865,16 @@ directory should work if nowhere else does.} % This macro is called from txi-??.tex files; the first argument is the % \language name to set (without the "\lang@" prefix), the second and % third args are \{left,right}hyphenmin. -% +% % The language names to pass are determined when the format is built. % See the etex.log file created at that time, e.g., % /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. -% +% % With TeX Live 2008, etex now includes hyphenation patterns for all % available languages. This means we can support hyphenation in % Texinfo, at least to some extent. (This still doesn't solve the % accented characters problem.) -% +% \catcode`@=11 \def\txisetlanguage#1#2#3{% % do not set the language if the name is undefined in the current TeX. @@ -8062,7 +8929,7 @@ directory should work if nowhere else does.} \setnonasciicharscatcode\active \lattwochardefs % - \else \ifx \declaredencoding \latone + \else \ifx \declaredencoding \latone \setnonasciicharscatcode\active \latonechardefs % @@ -8074,7 +8941,7 @@ directory should work if nowhere else does.} \setnonasciicharscatcode\active \utfeightchardefs % - \else + \else \message{Unknown document encoding #1, ignoring.}% % \fi % utfeight @@ -8086,7 +8953,7 @@ directory should work if nowhere else does.} % A message to be logged when using a character that isn't available % the default font encoding (OT1). -% +% \def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. @@ -8099,21 +8966,21 @@ directory should work if nowhere else does.} % % Latin1 (ISO-8859-1) character definitions. \def\latonechardefs{% - \gdef^^a0{~} + \gdef^^a0{\tie} \gdef^^a1{\exclamdown} - \gdef^^a2{\missingcharmsg{CENT SIGN}} + \gdef^^a2{\missingcharmsg{CENT SIGN}} \gdef^^a3{{\pounds}} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\missingcharmsg{YEN SIGN}} - \gdef^^a6{\missingcharmsg{BROKEN BAR}} + \gdef^^a6{\missingcharmsg{BROKEN BAR}} \gdef^^a7{\S} - \gdef^^a8{\"{}} - \gdef^^a9{\copyright} + \gdef^^a8{\"{}} + \gdef^^a9{\copyright} \gdef^^aa{\ordf} \gdef^^ab{\guillemetleft} \gdef^^ac{$\lnot$} - \gdef^^ad{\-} - \gdef^^ae{\registeredsymbol} + \gdef^^ad{\-} + \gdef^^ae{\registeredsymbol} \gdef^^af{\={}} % \gdef^^b0{\textdegree} @@ -8129,7 +8996,7 @@ directory should work if nowhere else does.} \gdef^^b9{$^1$} \gdef^^ba{\ordm} % - \gdef^^bb{\guilletright} + \gdef^^bb{\guillemetright} \gdef^^bc{$1\over4$} \gdef^^bd{$1\over2$} \gdef^^be{$3\over4$} @@ -8140,7 +9007,7 @@ directory should work if nowhere else does.} \gdef^^c2{\^A} \gdef^^c3{\~A} \gdef^^c4{\"A} - \gdef^^c5{\ringaccent A} + \gdef^^c5{\ringaccent A} \gdef^^c6{\AE} \gdef^^c7{\cedilla C} \gdef^^c8{\`E} @@ -8152,7 +9019,7 @@ directory should work if nowhere else does.} \gdef^^ce{\^I} \gdef^^cf{\"I} % - \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER ETH}} + \gdef^^d0{\DH} \gdef^^d1{\~N} \gdef^^d2{\`O} \gdef^^d3{\'O} @@ -8166,7 +9033,7 @@ directory should work if nowhere else does.} \gdef^^db{\^U} \gdef^^dc{\"U} \gdef^^dd{\'Y} - \gdef^^de{\missingcharmsg{LATIN CAPITAL LETTER THORN}} + \gdef^^de{\TH} \gdef^^df{\ss} % \gdef^^e0{\`a} @@ -8186,7 +9053,7 @@ directory should work if nowhere else does.} \gdef^^ee{\^{\dotless i}} \gdef^^ef{\"{\dotless i}} % - \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER ETH}} + \gdef^^f0{\dh} \gdef^^f1{\~n} \gdef^^f2{\`o} \gdef^^f3{\'o} @@ -8200,7 +9067,7 @@ directory should work if nowhere else does.} \gdef^^fb{\^u} \gdef^^fc{\"u} \gdef^^fd{\'y} - \gdef^^fe{\missingcharmsg{LATIN SMALL LETTER THORN}} + \gdef^^fe{\th} \gdef^^ff{\"y} } @@ -8221,7 +9088,7 @@ directory should work if nowhere else does.} % Latin2 (ISO-8859-2) character definitions. \def\lattwochardefs{% - \gdef^^a0{~} + \gdef^^a0{\tie} \gdef^^a1{\ogonek{A}} \gdef^^a2{\u{}} \gdef^^a3{\L} @@ -8272,7 +9139,7 @@ directory should work if nowhere else does.} \gdef^^ce{\^I} \gdef^^cf{\v D} % - \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER D WITH STROKE}} + \gdef^^d0{\DH} \gdef^^d1{\'N} \gdef^^d2{\v N} \gdef^^d3{\'O} @@ -8281,7 +9148,7 @@ directory should work if nowhere else does.} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\v R} - \gdef^^d9{\ringaccent U} + \gdef^^d9{\ringaccent U} \gdef^^da{\'U} \gdef^^db{\H U} \gdef^^dc{\"U} @@ -8302,11 +9169,11 @@ directory should work if nowhere else does.} \gdef^^ea{\ogonek{e}} \gdef^^eb{\"e} \gdef^^ec{\v e} - \gdef^^ed{\'\i} - \gdef^^ee{\^\i} + \gdef^^ed{\'{\dotless{i}}} + \gdef^^ee{\^{\dotless{i}}} \gdef^^ef{\v d} % - \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER D WITH STROKE}} + \gdef^^f0{\dh} \gdef^^f1{\'n} \gdef^^f2{\v n} \gdef^^f3{\'o} @@ -8325,11 +9192,11 @@ directory should work if nowhere else does.} } % UTF-8 character definitions. -% +% % This code to support UTF-8 is based on LaTeX's utf8.def, with some % changes for Texinfo conventions. It is included here under the GPL by % permission from Frank Mittelbach and the LaTeX team. -% +% \newcount\countUTFx \newcount\countUTFy \newcount\countUTFz @@ -8394,7 +9261,7 @@ directory should work if nowhere else does.} \gdef\DeclareUnicodeCharacter#1#2{% \countUTFz = "#1\relax - \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% + %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% \begingroup \parseXMLCharref \def\UTFviiiTwoOctets##1##2{% @@ -8479,6 +9346,7 @@ directory should work if nowhere else does.} \DeclareUnicodeCharacter{00CE}{\^I} \DeclareUnicodeCharacter{00CF}{\"I} + \DeclareUnicodeCharacter{00D0}{\DH} \DeclareUnicodeCharacter{00D1}{\~N} \DeclareUnicodeCharacter{00D2}{\`O} \DeclareUnicodeCharacter{00D3}{\'O} @@ -8491,6 +9359,7 @@ directory should work if nowhere else does.} \DeclareUnicodeCharacter{00DB}{\^U} \DeclareUnicodeCharacter{00DC}{\"U} \DeclareUnicodeCharacter{00DD}{\'Y} + \DeclareUnicodeCharacter{00DE}{\TH} \DeclareUnicodeCharacter{00DF}{\ss} \DeclareUnicodeCharacter{00E0}{\`a} @@ -8510,6 +9379,7 @@ directory should work if nowhere else does.} \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} + \DeclareUnicodeCharacter{00F0}{\dh} \DeclareUnicodeCharacter{00F1}{\~n} \DeclareUnicodeCharacter{00F2}{\`o} \DeclareUnicodeCharacter{00F3}{\'o} @@ -8522,6 +9392,7 @@ directory should work if nowhere else does.} \DeclareUnicodeCharacter{00FB}{\^u} \DeclareUnicodeCharacter{00FC}{\"u} \DeclareUnicodeCharacter{00FD}{\'y} + \DeclareUnicodeCharacter{00FE}{\th} \DeclareUnicodeCharacter{00FF}{\"y} \DeclareUnicodeCharacter{0100}{\=A} @@ -8858,8 +9729,8 @@ directory should work if nowhere else does.} % Prevent underfull vbox error messages. \vbadness = 10000 -% Don't be so finicky about underfull hboxes, either. -\hbadness = 2000 +% Don't be very finicky about underfull hboxes, either. +\hbadness = 6666 % Following George Bush, get rid of widows and orphans. \widowpenalty=10000 @@ -9066,28 +9937,21 @@ directory should work if nowhere else does.} \message{and turning on texinfo input format.} +\def^^L{\par} % remove \outer, so ^L can appear in an @comment + % DEL is a comment character, in case @c does not suffice. \catcode`\^^? = 14 % Define macros to output various characters with catcode for normal text. -\catcode`\"=\other -\catcode`\~=\other -\catcode`\^=\other -\catcode`\_=\other -\catcode`\|=\other -\catcode`\<=\other -\catcode`\>=\other -\catcode`\+=\other -\catcode`\$=\other -\def\normaldoublequote{"} -\def\normaltilde{~} -\def\normalcaret{^} -\def\normalunderscore{_} -\def\normalverticalbar{|} -\def\normalless{<} -\def\normalgreater{>} -\def\normalplus{+} -\def\normaldollar{$}%$ font-lock fix +\catcode`\"=\other \def\normaldoublequote{"} +\catcode`\$=\other \def\normaldollar{$}%$ font-lock fix +\catcode`\+=\other \def\normalplus{+} +\catcode`\<=\other \def\normalless{<} +\catcode`\>=\other \def\normalgreater{>} +\catcode`\^=\other \def\normalcaret{^} +\catcode`\_=\other \def\normalunderscore{_} +\catcode`\|=\other \def\normalverticalbar{|} +\catcode`\~=\other \def\normaltilde{~} % This macro is used to make a character print one way in \tt % (where it can probably be output as-is), and another way in other fonts, @@ -9114,11 +9978,9 @@ directory should work if nowhere else does.} \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote -\catcode`\~=\active -\def~{{\tt\char126}} +\catcode`\~=\active \def\activetilde{{\tt\char126}} \let~ = \activetilde \chardef\hat=`\^ -\catcode`\^=\active -\def^{{\tt \hat}} +\catcode`\^=\active \def\activehat{{\tt \hat}} \let^ = \activehat \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} @@ -9128,16 +9990,26 @@ directory should work if nowhere else does.} \catcode`\|=\active \def|{{\tt\char124}} + \chardef \less=`\< -\catcode`\<=\active -\def<{{\tt \less}} +\catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless \chardef \gtr=`\> -\catcode`\>=\active -\def>{{\tt \gtr}} -\catcode`\+=\active -\def+{{\tt \char 43}} -\catcode`\$=\active -\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix +\catcode`\>=\active \def\activegtr{{\tt \gtr}}\let> = \activegtr +\catcode`\+=\active \def+{{\tt \char 43}} +\catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix + +% used for headline/footline in the output routine, in case the page +% breaks in the middle of an @tex block. +\def\texinfochars{% + \let< = \activeless + \let> = \activegtr + \let~ = \activetilde + \let^ = \activehat + \markupsetuplqdefault \markupsetuprqdefault + \let\b = \strong + \let\i = \smartitalic + % in principle, all other definitions in \tex have to be undone too. +} % If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. @@ -9165,34 +10037,48 @@ directory should work if nowhere else does.} % In texinfo, backslash is an active character; it prints the backslash % in fixed width font. -\catcode`\\=\active -@def@normalbackslash{{@tt@backslashcurfont}} +\catcode`\\=\active % @ for escape char from now on. + +% The story here is that in math mode, the \char of \backslashcurfont +% ends up printing the roman \ from the math symbol font (because \char +% in math mode uses the \mathcode, and plain.tex sets +% \mathcode`\\="026E). It seems better for @backslashchar{} to always +% print a typewriter backslash, hence we use an explicit \mathchar, +% which is the decimal equivalent of "715c (class 7, e.g., use \fam; +% ignored family value; char position "5C). We can't use " for the +% usual hex value because it has already been made active. +@def@normalbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} +@let@backslashchar = @normalbackslash % @backslashchar{} is for user documents. + % On startup, @fixbackslash assigns: % @let \ = @normalbackslash - % \rawbackslash defines an active \ to do \backslashcurfont. % \otherbackslash defines an active \ to be a literal `\' character with -% catcode other. +% catcode other. We switch back and forth between these. @gdef@rawbackslash{@let\=@backslashcurfont} @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of -% the literal character `\'. -% -@def@normalturnoffactive{% - @let\=@normalbackslash - @let"=@normaldoublequote - @let~=@normaltilde - @let^=@normalcaret - @let_=@normalunderscore - @let|=@normalverticalbar - @let<=@normalless - @let>=@normalgreater - @let+=@normalplus - @let$=@normaldollar %$ font-lock fix - @markupsetuplqdefault - @markupsetuprqdefault - @unsepspaces +% the literal character `\'. Also revert - to its normal character, in +% case the active - from code has slipped in. +% +{@catcode`- = @active + @gdef@normalturnoffactive{% + @let-=@normaldash + @let"=@normaldoublequote + @let$=@normaldollar %$ font-lock fix + @let+=@normalplus + @let<=@normalless + @let>=@normalgreater + @let\=@normalbackslash + @let^=@normalcaret + @let_=@normalunderscore + @let|=@normalverticalbar + @let~=@normaltilde + @markupsetuplqdefault + @markupsetuprqdefault + @unsepspaces + } } % Make _ and + \other characters, temporarily. @@ -9221,10 +10107,19 @@ directory should work if nowhere else does.} % Say @foo, not \foo, in error messages. @escapechar = `@@ +% These (along with & and #) are made active for url-breaking, so need +% active definitions as the normal characters. +@def@normaldot{.} +@def@normalquest{?} +@def@normalslash{/} + % These look ok in all fonts, so just make them not special. -@catcode`@& = @other -@catcode`@# = @other -@catcode`@% = @other +% @hashchar{} gets its own user-level command, because of #line. +@catcode`@& = @other @def@normalamp{&} +@catcode`@# = @other @def@normalhash{#} +@catcode`@% = @other @def@normalpercent{%} + +@let @hashchar = @normalhash @c Finally, make ` and ' active, so that txicodequoteundirected and @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we @@ -9234,7 +10129,7 @@ directory should work if nowhere else does.} @catcode`@`=@active @markupsetuplqdefault @markupsetuprqdefault - + @c Local variables: @c eval: (add-hook 'write-file-hooks 'time-stamp) @c page-delimiter: "^\\\\message" diff --git a/doc/texinfo.tex.20090118 b/doc/texinfo.tex.20090118 new file mode 100644 index 000000000..03c29989c --- /dev/null +++ b/doc/texinfo.tex.20090118 @@ -0,0 +1,9250 @@ +% texinfo.tex -- TeX macros to handle Texinfo files. +% +% Load plain if necessary, i.e., if running under initex. +\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi +% +\def\texinfoversion{2009-01-18.17} +% +% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, +% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +% 2007, 2008, 2009 Free Software Foundation, Inc. +% +% This texinfo.tex file is free software: you can redistribute it and/or +% modify it under the terms of the GNU General Public License as +% published by the Free Software Foundation, either version 3 of the +% License, or (at your option) any later version. +% +% This texinfo.tex file is distributed in the hope that it will be +% useful, but WITHOUT ANY WARRANTY; without even the implied warranty +% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +% General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see . +% +% As a special exception, when this file is read by TeX when processing +% a Texinfo source document, you may use the result without +% restriction. (This has been our intent since Texinfo was invented.) +% +% Please try the latest version of texinfo.tex before submitting bug +% reports; you can get the latest version from: +% http://www.gnu.org/software/texinfo/ (the Texinfo home page), or +% ftp://tug.org/tex/texinfo.tex +% (and all CTAN mirrors, see http://www.ctan.org). +% The texinfo.tex in any given distribution could well be out +% of date, so if that's what you're using, please check. +% +% Send bug reports to bug-texinfo@gnu.org. Please include including a +% complete document in each bug report with which we can reproduce the +% problem. Patches are, of course, greatly appreciated. +% +% To process a Texinfo manual with TeX, it's most reliable to use the +% texi2dvi shell script that comes with the distribution. For a simple +% manual foo.texi, however, you can get away with this: +% tex foo.texi +% texindex foo.?? +% tex foo.texi +% tex foo.texi +% dvips foo.dvi -o # or whatever; this makes foo.ps. +% The extra TeX runs get the cross-reference information correct. +% Sometimes one run after texindex suffices, and sometimes you need more +% than two; texi2dvi does it as many times as necessary. +% +% It is possible to adapt texinfo.tex for other languages, to some +% extent. You can get the existing language-specific files from the +% full Texinfo distribution. +% +% The GNU Texinfo home page is http://www.gnu.org/software/texinfo. + + +\message{Loading texinfo [version \texinfoversion]:} + +% If in a .fmt file, print the version number +% and turn on active characters that we couldn't do earlier because +% they might have appeared in the input file name. +\everyjob{\message{[Texinfo version \texinfoversion]}% + \catcode`+=\active \catcode`\_=\active} + + +\chardef\other=12 + +% We never want plain's \outer definition of \+ in Texinfo. +% For @tex, we can use \tabalign. +\let\+ = \relax + +% Save some plain tex macros whose names we will redefine. +\let\ptexb=\b +\let\ptexbullet=\bullet +\let\ptexc=\c +\let\ptexcomma=\, +\let\ptexdot=\. +\let\ptexdots=\dots +\let\ptexend=\end +\let\ptexequiv=\equiv +\let\ptexexclam=\! +\let\ptexfootnote=\footnote +\let\ptexgtr=> +\let\ptexhat=^ +\let\ptexi=\i +\let\ptexindent=\indent +\let\ptexinsert=\insert +\let\ptexlbrace=\{ +\let\ptexless=< +\let\ptexnewwrite\newwrite +\let\ptexnoindent=\noindent +\let\ptexplus=+ +\let\ptexrbrace=\} +\let\ptexslash=\/ +\let\ptexstar=\* +\let\ptext=\t +\let\ptextop=\top +{\catcode`\'=\active +\global\let\ptexquoteright'}% Math-mode def from plain.tex. +\let\ptexraggedright=\raggedright + +% If this character appears in an error message or help string, it +% starts a new line in the output. +\newlinechar = `^^J + +% Use TeX 3.0's \inputlineno to get the line number, for better error +% messages, but if we're using an old version of TeX, don't do anything. +% +\ifx\inputlineno\thisisundefined + \let\linenumber = \empty % Pre-3.0. +\else + \def\linenumber{l.\the\inputlineno:\space} +\fi + +% Set up fixed words for English if not already set. +\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi +\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi +\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi +\ifx\putwordin\undefined \gdef\putwordin{in}\fi +\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi +\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi +\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi +\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi +\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi +\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi +\ifx\putwordof\undefined \gdef\putwordof{of}\fi +\ifx\putwordon\undefined \gdef\putwordon{on}\fi +\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi +\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi +\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi +\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi +\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi +\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi +\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi +% +\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi +\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi +\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi +\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi +\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi +\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi +\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi +\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi +\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi +\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi +\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi +\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi +% +\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi +\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi +\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi +\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi +\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi + +% Since the category of space is not known, we have to be careful. +\chardef\spacecat = 10 +\def\spaceisspace{\catcode`\ =\spacecat} + +% sometimes characters are active, so we need control sequences. +\chardef\colonChar = `\: +\chardef\commaChar = `\, +\chardef\dashChar = `\- +\chardef\dotChar = `\. +\chardef\exclamChar= `\! +\chardef\lquoteChar= `\` +\chardef\questChar = `\? +\chardef\rquoteChar= `\' +\chardef\semiChar = `\; +\chardef\underChar = `\_ + +% Ignore a token. +% +\def\gobble#1{} + +% The following is used inside several \edef's. +\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} + +% Hyphenation fixes. +\hyphenation{ + Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script + ap-pen-dix bit-map bit-maps + data-base data-bases eshell fall-ing half-way long-est man-u-script + man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm + par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces + spell-ing spell-ings + stand-alone strong-est time-stamp time-stamps which-ever white-space + wide-spread wrap-around +} + +% Margin to add to right of even pages, to left of odd pages. +\newdimen\bindingoffset +\newdimen\normaloffset +\newdimen\pagewidth \newdimen\pageheight + +% For a final copy, take out the rectangles +% that mark overfull boxes (in case you have decided +% that the text looks ok even though it passes the margin). +% +\def\finalout{\overfullrule=0pt} + +% @| inserts a changebar to the left of the current line. It should +% surround any changed text. This approach does *not* work if the +% change spans more than two lines of output. To handle that, we would +% have adopt a much more difficult approach (putting marks into the main +% vertical list for the beginning and end of each change). +% +\def\|{% + % \vadjust can only be used in horizontal mode. + \leavevmode + % + % Append this vertical mode material after the current line in the output. + \vadjust{% + % We want to insert a rule with the height and depth of the current + % leading; that is exactly what \strutbox is supposed to record. + \vskip-\baselineskip + % + % \vadjust-items are inserted at the left edge of the type. So + % the \llap here moves out into the left-hand margin. + \llap{% + % + % For a thicker or thinner bar, change the `1pt'. + \vrule height\baselineskip width1pt + % + % This is the space between the bar and the text. + \hskip 12pt + }% + }% +} + +% Sometimes it is convenient to have everything in the transcript file +% and nothing on the terminal. We don't just call \tracingall here, +% since that produces some useless output on the terminal. We also make +% some effort to order the tracing commands to reduce output in the log +% file; cf. trace.sty in LaTeX. +% +\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% +\def\loggingall{% + \tracingstats2 + \tracingpages1 + \tracinglostchars2 % 2 gives us more in etex + \tracingparagraphs1 + \tracingoutput1 + \tracingmacros2 + \tracingrestores1 + \showboxbreadth\maxdimen \showboxdepth\maxdimen + \ifx\eTeXversion\undefined\else % etex gives us more logging + \tracingscantokens1 + \tracingifs1 + \tracinggroups1 + \tracingnesting2 + \tracingassigns1 + \fi + \tracingcommands3 % 3 gives us more in etex + \errorcontextlines16 +}% + +% add check for \lastpenalty to plain's definitions. If the last thing +% we did was a \nobreak, we don't want to insert more space. +% +\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount + \removelastskip\penalty-50\smallskip\fi\fi} +\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount + \removelastskip\penalty-100\medskip\fi\fi} +\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount + \removelastskip\penalty-200\bigskip\fi\fi} + +% For @cropmarks command. +% Do @cropmarks to get crop marks. +% +\newif\ifcropmarks +\let\cropmarks = \cropmarkstrue +% +% Dimensions to add cropmarks at corners. +% Added by P. A. MacKay, 12 Nov. 1986 +% +\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines +\newdimen\cornerlong \cornerlong=1pc +\newdimen\cornerthick \cornerthick=.3pt +\newdimen\topandbottommargin \topandbottommargin=.75in + +% Output a mark which sets \thischapter, \thissection and \thiscolor. +% We dump everything together because we only have one kind of mark. +% This works because we only use \botmark / \topmark, not \firstmark. +% +% A mark contains a subexpression of the \ifcase ... \fi construct. +% \get*marks macros below extract the needed part using \ifcase. +% +% Another complication is to let the user choose whether \thischapter +% (\thissection) refers to the chapter (section) in effect at the top +% of a page, or that at the bottom of a page. The solution is +% described on page 260 of The TeXbook. It involves outputting two +% marks for the sectioning macros, one before the section break, and +% one after. I won't pretend I can describe this better than DEK... +\def\domark{% + \toks0=\expandafter{\lastchapterdefs}% + \toks2=\expandafter{\lastsectiondefs}% + \toks4=\expandafter{\prevchapterdefs}% + \toks6=\expandafter{\prevsectiondefs}% + \toks8=\expandafter{\lastcolordefs}% + \mark{% + \the\toks0 \the\toks2 + \noexpand\or \the\toks4 \the\toks6 + \noexpand\else \the\toks8 + }% +} +% \topmark doesn't work for the very first chapter (after the title +% page or the contents), so we use \firstmark there -- this gets us +% the mark with the chapter defs, unless the user sneaks in, e.g., +% @setcolor (or @url, or @link, etc.) between @contents and the very +% first @chapter. +\def\gettopheadingmarks{% + \ifcase0\topmark\fi + \ifx\thischapter\empty \ifcase0\firstmark\fi \fi +} +\def\getbottomheadingmarks{\ifcase1\botmark\fi} +\def\getcolormarks{\ifcase2\topmark\fi} + +% Avoid "undefined control sequence" errors. +\def\lastchapterdefs{} +\def\lastsectiondefs{} +\def\prevchapterdefs{} +\def\prevsectiondefs{} +\def\lastcolordefs{} + +% Main output routine. +\chardef\PAGE = 255 +\output = {\onepageout{\pagecontents\PAGE}} + +\newbox\headlinebox +\newbox\footlinebox + +% \onepageout takes a vbox as an argument. Note that \pagecontents +% does insertions, but you have to call it yourself. +\def\onepageout#1{% + \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi + % + \ifodd\pageno \advance\hoffset by \bindingoffset + \else \advance\hoffset by -\bindingoffset\fi + % + % Do this outside of the \shipout so @code etc. will be expanded in + % the headline as they should be, not taken literally (outputting ''code). + \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi + \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% + \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi + \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% + % + {% + % Have to do this stuff outside the \shipout because we want it to + % take effect in \write's, yet the group defined by the \vbox ends + % before the \shipout runs. + % + \indexdummies % don't expand commands in the output. + \normalturnoffactive % \ in index entries must not stay \, e.g., if + % the page break happens to be in the middle of an example. + % We don't want .vr (or whatever) entries like this: + % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} + % "\acronym" won't work when it's read back in; + % it needs to be + % {\code {{\tt \backslashcurfont }acronym} + \shipout\vbox{% + % Do this early so pdf references go to the beginning of the page. + \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi + % + \ifcropmarks \vbox to \outervsize\bgroup + \hsize = \outerhsize + \vskip-\topandbottommargin + \vtop to0pt{% + \line{\ewtop\hfil\ewtop}% + \nointerlineskip + \line{% + \vbox{\moveleft\cornerthick\nstop}% + \hfill + \vbox{\moveright\cornerthick\nstop}% + }% + \vss}% + \vskip\topandbottommargin + \line\bgroup + \hfil % center the page within the outer (page) hsize. + \ifodd\pageno\hskip\bindingoffset\fi + \vbox\bgroup + \fi + % + \unvbox\headlinebox + \pagebody{#1}% + \ifdim\ht\footlinebox > 0pt + % Only leave this space if the footline is nonempty. + % (We lessened \vsize for it in \oddfootingyyy.) + % The \baselineskip=24pt in plain's \makefootline has no effect. + \vskip 24pt + \unvbox\footlinebox + \fi + % + \ifcropmarks + \egroup % end of \vbox\bgroup + \hfil\egroup % end of (centering) \line\bgroup + \vskip\topandbottommargin plus1fill minus1fill + \boxmaxdepth = \cornerthick + \vbox to0pt{\vss + \line{% + \vbox{\moveleft\cornerthick\nsbot}% + \hfill + \vbox{\moveright\cornerthick\nsbot}% + }% + \nointerlineskip + \line{\ewbot\hfil\ewbot}% + }% + \egroup % \vbox from first cropmarks clause + \fi + }% end of \shipout\vbox + }% end of group with \indexdummies + \advancepageno + \ifnum\outputpenalty>-20000 \else\dosupereject\fi +} + +\newinsert\margin \dimen\margin=\maxdimen + +\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} +{\catcode`\@ =11 +\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi +% marginal hacks, juha@viisa.uucp (Juha Takala) +\ifvoid\margin\else % marginal info is present + \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi +\dimen@=\dp#1\relax \unvbox#1\relax +\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi +\ifr@ggedbottom \kern-\dimen@ \vfil \fi} +} + +% Here are the rules for the cropmarks. Note that they are +% offset so that the space between them is truly \outerhsize or \outervsize +% (P. A. MacKay, 12 November, 1986) +% +\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} +\def\nstop{\vbox + {\hrule height\cornerthick depth\cornerlong width\cornerthick}} +\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} +\def\nsbot{\vbox + {\hrule height\cornerlong depth\cornerthick width\cornerthick}} + +% Parse an argument, then pass it to #1. The argument is the rest of +% the input line (except we remove a trailing comment). #1 should be a +% macro which expects an ordinary undelimited TeX argument. +% +\def\parsearg{\parseargusing{}} +\def\parseargusing#1#2{% + \def\argtorun{#2}% + \begingroup + \obeylines + \spaceisspace + #1% + \parseargline\empty% Insert the \empty token, see \finishparsearg below. +} + +{\obeylines % + \gdef\parseargline#1^^M{% + \endgroup % End of the group started in \parsearg. + \argremovecomment #1\comment\ArgTerm% + }% +} + +% First remove any @comment, then any @c comment. +\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} +\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} + +% Each occurrence of `\^^M' or `\^^M' is replaced by a single space. +% +% \argremovec might leave us with trailing space, e.g., +% @end itemize @c foo +% This space token undergoes the same procedure and is eventually removed +% by \finishparsearg. +% +\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} +\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} +\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% + \def\temp{#3}% + \ifx\temp\empty + % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: + \let\temp\finishparsearg + \else + \let\temp\argcheckspaces + \fi + % Put the space token in: + \temp#1 #3\ArgTerm +} + +% If a _delimited_ argument is enclosed in braces, they get stripped; so +% to get _exactly_ the rest of the line, we had to prevent such situation. +% We prepended an \empty token at the very beginning and we expand it now, +% just before passing the control to \argtorun. +% (Similarly, we have to think about #3 of \argcheckspacesY above: it is +% either the null string, or it ends with \^^M---thus there is no danger +% that a pair of braces would be stripped. +% +% But first, we have to remove the trailing space token. +% +\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} + +% \parseargdef\foo{...} +% is roughly equivalent to +% \def\foo{\parsearg\Xfoo} +% \def\Xfoo#1{...} +% +% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my +% favourite TeX trick. --kasal, 16nov03 + +\def\parseargdef#1{% + \expandafter \doparseargdef \csname\string#1\endcsname #1% +} +\def\doparseargdef#1#2{% + \def#2{\parsearg#1}% + \def#1##1% +} + +% Several utility definitions with active space: +{ + \obeyspaces + \gdef\obeyedspace{ } + + % Make each space character in the input produce a normal interword + % space in the output. Don't allow a line break at this space, as this + % is used only in environments like @example, where each line of input + % should produce a line of output anyway. + % + \gdef\sepspaces{\obeyspaces\let =\tie} + + % If an index command is used in an @example environment, any spaces + % therein should become regular spaces in the raw index file, not the + % expansion of \tie (\leavevmode \penalty \@M \ ). + \gdef\unsepspaces{\let =\space} +} + + +\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} + +% Define the framework for environments in texinfo.tex. It's used like this: +% +% \envdef\foo{...} +% \def\Efoo{...} +% +% It's the responsibility of \envdef to insert \begingroup before the +% actual body; @end closes the group after calling \Efoo. \envdef also +% defines \thisenv, so the current environment is known; @end checks +% whether the environment name matches. The \checkenv macro can also be +% used to check whether the current environment is the one expected. +% +% Non-false conditionals (@iftex, @ifset) don't fit into this, so they +% are not treated as environments; they don't open a group. (The +% implementation of @end takes care not to call \endgroup in this +% special case.) + + +% At run-time, environments start with this: +\def\startenvironment#1{\begingroup\def\thisenv{#1}} +% initialize +\let\thisenv\empty + +% ... but they get defined via ``\envdef\foo{...}'': +\long\def\envdef#1#2{\def#1{\startenvironment#1#2}} +\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} + +% Check whether we're in the right environment: +\def\checkenv#1{% + \def\temp{#1}% + \ifx\thisenv\temp + \else + \badenverr + \fi +} + +% Environment mismatch, #1 expected: +\def\badenverr{% + \errhelp = \EMsimple + \errmessage{This command can appear only \inenvironment\temp, + not \inenvironment\thisenv}% +} +\def\inenvironment#1{% + \ifx#1\empty + out of any environment% + \else + in environment \expandafter\string#1% + \fi +} + +% @end foo executes the definition of \Efoo. +% But first, it executes a specialized version of \checkenv +% +\parseargdef\end{% + \if 1\csname iscond.#1\endcsname + \else + % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03 + \expandafter\checkenv\csname#1\endcsname + \csname E#1\endcsname + \endgroup + \fi +} + +\newhelp\EMsimple{Press RETURN to continue.} + + +%% Simple single-character @ commands + +% @@ prints an @ +% Kludge this until the fonts are right (grr). +\def\@{{\tt\char64}} + +% This is turned off because it was never documented +% and you can use @w{...} around a quote to suppress ligatures. +%% Define @` and @' to be the same as ` and ' +%% but suppressing ligatures. +%\def\`{{`}} +%\def\'{{'}} + +% Used to generate quoted braces. +\def\mylbrace {{\tt\char123}} +\def\myrbrace {{\tt\char125}} +\let\{=\mylbrace +\let\}=\myrbrace +\begingroup + % Definitions to produce \{ and \} commands for indices, + % and @{ and @} for the aux/toc files. + \catcode`\{ = \other \catcode`\} = \other + \catcode`\[ = 1 \catcode`\] = 2 + \catcode`\! = 0 \catcode`\\ = \other + !gdef!lbracecmd[\{]% + !gdef!rbracecmd[\}]% + !gdef!lbraceatcmd[@{]% + !gdef!rbraceatcmd[@}]% +!endgroup + +% @comma{} to avoid , parsing problems. +\let\comma = , + +% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent +% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. +\let\, = \c +\let\dotaccent = \. +\def\ringaccent#1{{\accent23 #1}} +\let\tieaccent = \t +\let\ubaraccent = \b +\let\udotaccent = \d + +% Other special characters: @questiondown @exclamdown @ordf @ordm +% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. +\def\questiondown{?`} +\def\exclamdown{!`} +\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} +\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} + +% Dotless i and dotless j, used for accents. +\def\imacro{i} +\def\jmacro{j} +\def\dotless#1{% + \def\temp{#1}% + \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi + \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi + \else \errmessage{@dotless can be used only with i or j}% + \fi\fi +} + +% The \TeX{} logo, as in plain, but resetting the spacing so that a +% period following counts as ending a sentence. (Idea found in latex.) +% +\edef\TeX{\TeX \spacefactor=1000 } + +% @LaTeX{} logo. Not quite the same results as the definition in +% latex.ltx, since we use a different font for the raised A; it's most +% convenient for us to use an explicitly smaller font, rather than using +% the \scriptstyle font (since we don't reset \scriptstyle and +% \scriptscriptstyle). +% +\def\LaTeX{% + L\kern-.36em + {\setbox0=\hbox{T}% + \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}% + \kern-.15em + \TeX +} + +% Be sure we're in horizontal mode when doing a tie, since we make space +% equivalent to this in @example-like environments. Otherwise, a space +% at the beginning of a line will start with \penalty -- and +% since \penalty is valid in vertical mode, we'd end up putting the +% penalty on the vertical list instead of in the new paragraph. +{\catcode`@ = 11 + % Avoid using \@M directly, because that causes trouble + % if the definition is written into an index file. + \global\let\tiepenalty = \@M + \gdef\tie{\leavevmode\penalty\tiepenalty\ } +} + +% @: forces normal size whitespace following. +\def\:{\spacefactor=1000 } + +% @* forces a line break. +\def\*{\hfil\break\hbox{}\ignorespaces} + +% @/ allows a line break. +\let\/=\allowbreak + +% @. is an end-of-sentence period. +\def\.{.\spacefactor=\endofsentencespacefactor\space} + +% @! is an end-of-sentence bang. +\def\!{!\spacefactor=\endofsentencespacefactor\space} + +% @? is an end-of-sentence query. +\def\?{?\spacefactor=\endofsentencespacefactor\space} + +% @frenchspacing on|off says whether to put extra space after punctuation. +% +\def\onword{on} +\def\offword{off} +% +\parseargdef\frenchspacing{% + \def\temp{#1}% + \ifx\temp\onword \plainfrenchspacing + \else\ifx\temp\offword \plainnonfrenchspacing + \else + \errhelp = \EMsimple + \errmessage{Unknown @frenchspacing option `\temp', must be on/off}% + \fi\fi +} + +% @w prevents a word break. Without the \leavevmode, @w at the +% beginning of a paragraph, when TeX is still in vertical mode, would +% produce a whole line of output instead of starting the paragraph. +\def\w#1{\leavevmode\hbox{#1}} + +% @group ... @end group forces ... to be all on one page, by enclosing +% it in a TeX vbox. We use \vtop instead of \vbox to construct the box +% to keep its height that of a normal line. According to the rules for +% \topskip (p.114 of the TeXbook), the glue inserted is +% max (\topskip - \ht (first item), 0). If that height is large, +% therefore, no glue is inserted, and the space between the headline and +% the text is small, which looks bad. +% +% Another complication is that the group might be very large. This can +% cause the glue on the previous page to be unduly stretched, because it +% does not have much material. In this case, it's better to add an +% explicit \vfill so that the extra space is at the bottom. The +% threshold for doing this is if the group is more than \vfilllimit +% percent of a page (\vfilllimit can be changed inside of @tex). +% +\newbox\groupbox +\def\vfilllimit{0.7} +% +\envdef\group{% + \ifnum\catcode`\^^M=\active \else + \errhelp = \groupinvalidhelp + \errmessage{@group invalid in context where filling is enabled}% + \fi + \startsavinginserts + % + \setbox\groupbox = \vtop\bgroup + % Do @comment since we are called inside an environment such as + % @example, where each end-of-line in the input causes an + % end-of-line in the output. We don't want the end-of-line after + % the `@group' to put extra space in the output. Since @group + % should appear on a line by itself (according to the Texinfo + % manual), we don't worry about eating any user text. + \comment +} +% +% The \vtop produces a box with normal height and large depth; thus, TeX puts +% \baselineskip glue before it, and (when the next line of text is done) +% \lineskip glue after it. Thus, space below is not quite equal to space +% above. But it's pretty close. +\def\Egroup{% + % To get correct interline space between the last line of the group + % and the first line afterwards, we have to propagate \prevdepth. + \endgraf % Not \par, as it may have been set to \lisppar. + \global\dimen1 = \prevdepth + \egroup % End the \vtop. + % \dimen0 is the vertical size of the group's box. + \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox + % \dimen2 is how much space is left on the page (more or less). + \dimen2 = \pageheight \advance\dimen2 by -\pagetotal + % if the group doesn't fit on the current page, and it's a big big + % group, force a page break. + \ifdim \dimen0 > \dimen2 + \ifdim \pagetotal < \vfilllimit\pageheight + \page + \fi + \fi + \box\groupbox + \prevdepth = \dimen1 + \checkinserts +} +% +% TeX puts in an \escapechar (i.e., `@') at the beginning of the help +% message, so this ends up printing `@group can only ...'. +% +\newhelp\groupinvalidhelp{% +group can only be used in environments such as @example,^^J% +where each line of input produces a line of output.} + +% @need space-in-mils +% forces a page break if there is not space-in-mils remaining. + +\newdimen\mil \mil=0.001in + +% Old definition--didn't work. +%\parseargdef\need{\par % +%% This method tries to make TeX break the page naturally +%% if the depth of the box does not fit. +%{\baselineskip=0pt% +%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak +%\prevdepth=-1000pt +%}} + +\parseargdef\need{% + % Ensure vertical mode, so we don't make a big box in the middle of a + % paragraph. + \par + % + % If the @need value is less than one line space, it's useless. + \dimen0 = #1\mil + \dimen2 = \ht\strutbox + \advance\dimen2 by \dp\strutbox + \ifdim\dimen0 > \dimen2 + % + % Do a \strut just to make the height of this box be normal, so the + % normal leading is inserted relative to the preceding line. + % And a page break here is fine. + \vtop to #1\mil{\strut\vfil}% + % + % TeX does not even consider page breaks if a penalty added to the + % main vertical list is 10000 or more. But in order to see if the + % empty box we just added fits on the page, we must make it consider + % page breaks. On the other hand, we don't want to actually break the + % page after the empty box. So we use a penalty of 9999. + % + % There is an extremely small chance that TeX will actually break the + % page at this \penalty, if there are no other feasible breakpoints in + % sight. (If the user is using lots of big @group commands, which + % almost-but-not-quite fill up a page, TeX will have a hard time doing + % good page breaking, for example.) However, I could not construct an + % example where a page broke at this \penalty; if it happens in a real + % document, then we can reconsider our strategy. + \penalty9999 + % + % Back up by the size of the box, whether we did a page break or not. + \kern -#1\mil + % + % Do not allow a page break right after this kern. + \nobreak + \fi +} + +% @br forces paragraph break (and is undocumented). + +\let\br = \par + +% @page forces the start of a new page. +% +\def\page{\par\vfill\supereject} + +% @exdent text.... +% outputs text on separate line in roman font, starting at standard page margin + +% This records the amount of indent in the innermost environment. +% That's how much \exdent should take out. +\newskip\exdentamount + +% This defn is used inside fill environments such as @defun. +\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} + +% This defn is used inside nofill environments such as @example. +\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount + \leftline{\hskip\leftskip{\rm#1}}}} + +% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current +% paragraph. For more general purposes, use the \margin insertion +% class. WHICH is `l' or `r'. +% +\newskip\inmarginspacing \inmarginspacing=1cm +\def\strutdepth{\dp\strutbox} +% +\def\doinmargin#1#2{\strut\vadjust{% + \nobreak + \kern-\strutdepth + \vtop to \strutdepth{% + \baselineskip=\strutdepth + \vss + % if you have multiple lines of stuff to put here, you'll need to + % make the vbox yourself of the appropriate size. + \ifx#1l% + \llap{\ignorespaces #2\hskip\inmarginspacing}% + \else + \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% + \fi + \null + }% +}} +\def\inleftmargin{\doinmargin l} +\def\inrightmargin{\doinmargin r} +% +% @inmargin{TEXT [, RIGHT-TEXT]} +% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; +% else use TEXT for both). +% +\def\inmargin#1{\parseinmargin #1,,\finish} +\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \def\lefttext{#1}% have both texts + \def\righttext{#2}% + \else + \def\lefttext{#1}% have only one text + \def\righttext{#1}% + \fi + % + \ifodd\pageno + \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin + \else + \def\temp{\inleftmargin\lefttext}% + \fi + \temp +} + +% @include FILE -- \input text of FILE. +% +\def\include{\parseargusing\filenamecatcodes\includezzz} +\def\includezzz#1{% + \pushthisfilestack + \def\thisfile{#1}% + {% + \makevalueexpandable % we want to expand any @value in FILE. + \turnoffactive % and allow special characters in the expansion + \indexnofonts % Allow `@@' and other weird things in file names. + \edef\temp{\noexpand\input #1 }% + % + % This trickery is to read FILE outside of a group, in case it makes + % definitions, etc. + \expandafter + }\temp + \popthisfilestack +} +\def\filenamecatcodes{% + \catcode`\\=\other + \catcode`~=\other + \catcode`^=\other + \catcode`_=\other + \catcode`|=\other + \catcode`<=\other + \catcode`>=\other + \catcode`+=\other + \catcode`-=\other + \catcode`\`=\other + \catcode`\'=\other +} + +\def\pushthisfilestack{% + \expandafter\pushthisfilestackX\popthisfilestack\StackTerm +} +\def\pushthisfilestackX{% + \expandafter\pushthisfilestackY\thisfile\StackTerm +} +\def\pushthisfilestackY #1\StackTerm #2\StackTerm {% + \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% +} + +\def\popthisfilestack{\errthisfilestackempty} +\def\errthisfilestackempty{\errmessage{Internal error: + the stack of filenames is empty.}} + +\def\thisfile{} + +% @center line +% outputs that line, centered. +% +\parseargdef\center{% + \ifhmode + \let\next\centerH + \else + \let\next\centerV + \fi + \next{\hfil \ignorespaces#1\unskip \hfil}% +} +\def\centerH#1{% + {% + \hfil\break + \advance\hsize by -\leftskip + \advance\hsize by -\rightskip + \line{#1}% + \break + }% +} +\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}} + +% @sp n outputs n lines of vertical space + +\parseargdef\sp{\vskip #1\baselineskip} + +% @comment ...line which is ignored... +% @c is the same as @comment +% @ignore ... @end ignore is another way to write a comment + +\def\comment{\begingroup \catcode`\^^M=\other% +\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% +\commentxxx} +{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} + +\let\c=\comment + +% @paragraphindent NCHARS +% We'll use ems for NCHARS, close enough. +% NCHARS can also be the word `asis' or `none'. +% We cannot feasibly implement @paragraphindent asis, though. +% +\def\asisword{asis} % no translation, these are keywords +\def\noneword{none} +% +\parseargdef\paragraphindent{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \defaultparindent = 0pt + \else + \defaultparindent = #1em + \fi + \fi + \parindent = \defaultparindent +} + +% @exampleindent NCHARS +% We'll use ems for NCHARS like @paragraphindent. +% It seems @exampleindent asis isn't necessary, but +% I preserve it to make it similar to @paragraphindent. +\parseargdef\exampleindent{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \lispnarrowing = 0pt + \else + \lispnarrowing = #1em + \fi + \fi +} + +% @firstparagraphindent WORD +% If WORD is `none', then suppress indentation of the first paragraph +% after a section heading. If WORD is `insert', then do indent at such +% paragraphs. +% +% The paragraph indentation is suppressed or not by calling +% \suppressfirstparagraphindent, which the sectioning commands do. +% We switch the definition of this back and forth according to WORD. +% By default, we suppress indentation. +% +\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} +\def\insertword{insert} +% +\parseargdef\firstparagraphindent{% + \def\temp{#1}% + \ifx\temp\noneword + \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent + \else\ifx\temp\insertword + \let\suppressfirstparagraphindent = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @firstparagraphindent option `\temp'}% + \fi\fi +} + +% Here is how we actually suppress indentation. Redefine \everypar to +% \kern backwards by \parindent, and then reset itself to empty. +% +% We also make \indent itself not actually do anything until the next +% paragraph. +% +\gdef\dosuppressfirstparagraphindent{% + \gdef\indent{% + \restorefirstparagraphindent + \indent + }% + \gdef\noindent{% + \restorefirstparagraphindent + \noindent + }% + \global\everypar = {% + \kern -\parindent + \restorefirstparagraphindent + }% +} + +\gdef\restorefirstparagraphindent{% + \global \let \indent = \ptexindent + \global \let \noindent = \ptexnoindent + \global \everypar = {}% +} + + +% @asis just yields its argument. Used with @table, for example. +% +\def\asis#1{#1} + +% @math outputs its argument in math mode. +% +% One complication: _ usually means subscripts, but it could also mean +% an actual _ character, as in @math{@var{some_variable} + 1}. So make +% _ active, and distinguish by seeing if the current family is \slfam, +% which is what @var uses. +{ + \catcode`\_ = \active + \gdef\mathunderscore{% + \catcode`\_=\active + \def_{\ifnum\fam=\slfam \_\else\sb\fi}% + } +} +% Another complication: we want \\ (and @\) to output a \ character. +% FYI, plain.tex uses \\ as a temporary control sequence (why?), but +% this is not advertised and we don't care. Texinfo does not +% otherwise define @\. +% +% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. +\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} +% +\def\math{% + \tex + \mathunderscore + \let\\ = \mathbackslash + \mathactive + % make the texinfo accent commands work in math mode + \let\"=\ddot + \let\'=\acute + \let\==\bar + \let\^=\hat + \let\`=\grave + \let\u=\breve + \let\v=\check + \let\~=\tilde + \let\dotaccent=\dot + $\finishmath +} +\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. + +% Some active characters (such as <) are spaced differently in math. +% We have to reset their definitions in case the @math was an argument +% to a command which sets the catcodes (such as @item or @section). +% +{ + \catcode`^ = \active + \catcode`< = \active + \catcode`> = \active + \catcode`+ = \active + \catcode`' = \active + \gdef\mathactive{% + \let^ = \ptexhat + \let< = \ptexless + \let> = \ptexgtr + \let+ = \ptexplus + \let' = \ptexquoteright + } +} + +% Some math mode symbols. +\def\bullet{$\ptexbullet$} +\def\geq{\ifmmode \ge\else $\ge$\fi} +\def\leq{\ifmmode \le\else $\le$\fi} +\def\minus{\ifmmode -\else $-$\fi} + +% @dots{} outputs an ellipsis using the current font. +% We do .5em per period so that it has the same spacing in the cm +% typewriter fonts as three actual period characters; on the other hand, +% in other typewriter fonts three periods are wider than 1.5em. So do +% whichever is larger. +% +\def\dots{% + \leavevmode + \setbox0=\hbox{...}% get width of three periods + \ifdim\wd0 > 1.5em + \dimen0 = \wd0 + \else + \dimen0 = 1.5em + \fi + \hbox to \dimen0{% + \hskip 0pt plus.25fil + .\hskip 0pt plus1fil + .\hskip 0pt plus1fil + .\hskip 0pt plus.5fil + }% +} + +% @enddots{} is an end-of-sentence ellipsis. +% +\def\enddots{% + \dots + \spacefactor=\endofsentencespacefactor +} + +% @comma{} is so commas can be inserted into text without messing up +% Texinfo's parsing. +% +\let\comma = , + +% @refill is a no-op. +\let\refill=\relax + +% If working on a large document in chapters, it is convenient to +% be able to disable indexing, cross-referencing, and contents, for test runs. +% This is done with @novalidate (before @setfilename). +% +\newif\iflinks \linkstrue % by default we want the aux files. +\let\novalidate = \linksfalse + +% @setfilename is done at the beginning of every texinfo file. +% So open here the files we need to have open while reading the input. +% This makes it possible to make a .fmt file for texinfo. +\def\setfilename{% + \fixbackslash % Turn off hack to swallow `\input texinfo'. + \iflinks + \tryauxfile + % Open the new aux file. TeX will close it automatically at exit. + \immediate\openout\auxfile=\jobname.aux + \fi % \openindices needs to do some work in any case. + \openindices + \let\setfilename=\comment % Ignore extra @setfilename cmds. + % + % If texinfo.cnf is present on the system, read it. + % Useful for site-wide @afourpaper, etc. + \openin 1 texinfo.cnf + \ifeof 1 \else \input texinfo.cnf \fi + \closein 1 + % + \comment % Ignore the actual filename. +} + +% Called from \setfilename. +% +\def\openindices{% + \newindex{cp}% + \newcodeindex{fn}% + \newcodeindex{vr}% + \newcodeindex{tp}% + \newcodeindex{ky}% + \newcodeindex{pg}% +} + +% @bye. +\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} + + +\message{pdf,} +% adobe `portable' document format +\newcount\tempnum +\newcount\lnkcount +\newtoks\filename +\newcount\filenamelength +\newcount\pgn +\newtoks\toksA +\newtoks\toksB +\newtoks\toksC +\newtoks\toksD +\newbox\boxA +\newcount\countA +\newif\ifpdf +\newif\ifpdfmakepagedest + +% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 +% can be set). So we test for \relax and 0 as well as \undefined, +% borrowed from ifpdf.sty. +\ifx\pdfoutput\undefined +\else + \ifx\pdfoutput\relax + \else + \ifcase\pdfoutput + \else + \pdftrue + \fi + \fi +\fi + +% PDF uses PostScript string constants for the names of xref targets, +% for display in the outlines, and in other places. Thus, we have to +% double any backslashes. Otherwise, a name like "\node" will be +% interpreted as a newline (\n), followed by o, d, e. Not good. +% http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html +% (and related messages, the final outcome is that it is up to the TeX +% user to double the backslashes and otherwise make the string valid, so +% that's what we do). + +% double active backslashes. +% +{\catcode`\@=0 \catcode`\\=\active + @gdef@activebackslashdouble{% + @catcode`@\=@active + @let\=@doublebackslash} +} + +% To handle parens, we must adopt a different approach, since parens are +% not active characters. hyperref.dtx (which has the same problem as +% us) handles it with this amazing macro to replace tokens, with minor +% changes for Texinfo. It is included here under the GPL by permission +% from the author, Heiko Oberdiek. +% +% #1 is the tokens to replace. +% #2 is the replacement. +% #3 is the control sequence with the string. +% +\def\HyPsdSubst#1#2#3{% + \def\HyPsdReplace##1#1##2\END{% + ##1% + \ifx\\##2\\% + \else + #2% + \HyReturnAfterFi{% + \HyPsdReplace##2\END + }% + \fi + }% + \xdef#3{\expandafter\HyPsdReplace#3#1\END}% +} +\long\def\HyReturnAfterFi#1\fi{\fi#1} + +% #1 is a control sequence in which to do the replacements. +\def\backslashparens#1{% + \xdef#1{#1}% redefine it as its expansion; the definition is simply + % \lastnode when called from \setref -> \pdfmkdest. + \HyPsdSubst{(}{\realbackslash(}{#1}% + \HyPsdSubst{)}{\realbackslash)}{#1}% +} + +\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images +with PDF output, and none of those formats could be found. (.eps cannot +be supported due to the design of the PDF format; use regular TeX (DVI +output) for that.)} + +\ifpdf + % + % Color manipulation macros based on pdfcolor.tex. + \def\cmykDarkRed{0.28 1 1 0.35} + \def\cmykBlack{0 0 0 1} + % + % k sets the color for filling (usual text, etc.); + % K sets the color for stroking (thin rules, e.g., normal _'s). + \def\pdfsetcolor#1{\pdfliteral{#1 k #1 K}} + % + % Set color, and create a mark which defines \thiscolor accordingly, + % so that \makeheadline knows which color to restore. + \def\setcolor#1{% + \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% + \domark + \pdfsetcolor{#1}% + } + % + \def\maincolor{\cmykBlack} + \pdfsetcolor{\maincolor} + \edef\thiscolor{\maincolor} + \def\lastcolordefs{} + % + \def\makefootline{% + \baselineskip24pt + \line{\pdfsetcolor{\maincolor}\the\footline}% + } + % + \def\makeheadline{% + \vbox to 0pt{% + \vskip-22.5pt + \line{% + \vbox to8.5pt{}% + % Extract \thiscolor definition from the marks. + \getcolormarks + % Typeset the headline with \maincolor, then restore the color. + \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% + }% + \vss + }% + \nointerlineskip + } + % + % + \pdfcatalog{/PageMode /UseOutlines} + % + % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). + \def\dopdfimage#1#2#3{% + \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% + \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% + % + % pdftex (and the PDF format) support .png, .jpg, .pdf (among + % others). Let's try in that order. + \let\pdfimgext=\empty + \begingroup + \openin 1 #1.png \ifeof 1 + \openin 1 #1.jpg \ifeof 1 + \openin 1 #1.jpeg \ifeof 1 + \openin 1 #1.JPG \ifeof 1 + \openin 1 #1.pdf \ifeof 1 + \openin 1 #1.PDF \ifeof 1 + \errhelp = \nopdfimagehelp + \errmessage{Could not find image file #1 for pdf}% + \else \gdef\pdfimgext{PDF}% + \fi + \else \gdef\pdfimgext{pdf}% + \fi + \else \gdef\pdfimgext{JPG}% + \fi + \else \gdef\pdfimgext{jpeg}% + \fi + \else \gdef\pdfimgext{jpg}% + \fi + \else \gdef\pdfimgext{png}% + \fi + \closein 1 + \endgroup + % + % without \immediate, ancient pdftex seg faults when the same image is + % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) + \ifnum\pdftexversion < 14 + \immediate\pdfimage + \else + \immediate\pdfximage + \fi + \ifdim \wd0 >0pt width \imagewidth \fi + \ifdim \wd2 >0pt height \imageheight \fi + \ifnum\pdftexversion<13 + #1.\pdfimgext + \else + {#1.\pdfimgext}% + \fi + \ifnum\pdftexversion < 14 \else + \pdfrefximage \pdflastximage + \fi} + % + \def\pdfmkdest#1{{% + % We have to set dummies so commands such as @code, and characters + % such as \, aren't expanded when present in a section title. + \indexnofonts + \turnoffactive + \activebackslashdouble + \makevalueexpandable + \def\pdfdestname{#1}% + \backslashparens\pdfdestname + \safewhatsit{\pdfdest name{\pdfdestname} xyz}% + }} + % + % used to mark target names; must be expandable. + \def\pdfmkpgn#1{#1} + % + % by default, use a color that is dark enough to print on paper as + % nearly black, but still distinguishable for online viewing. + \def\urlcolor{\cmykDarkRed} + \def\linkcolor{\cmykDarkRed} + \def\endlink{\setcolor{\maincolor}\pdfendlink} + % + % Adding outlines to PDF; macros for calculating structure of outlines + % come from Petr Olsak + \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% + \else \csname#1\endcsname \fi} + \def\advancenumber#1{\tempnum=\expnumber{#1}\relax + \advance\tempnum by 1 + \expandafter\xdef\csname#1\endcsname{\the\tempnum}} + % + % #1 is the section text, which is what will be displayed in the + % outline by the pdf viewer. #2 is the pdf expression for the number + % of subentries (or empty, for subsubsections). #3 is the node text, + % which might be empty if this toc entry had no corresponding node. + % #4 is the page number + % + \def\dopdfoutline#1#2#3#4{% + % Generate a link to the node text if that exists; else, use the + % page number. We could generate a destination for the section + % text in the case where a section has no node, but it doesn't + % seem worth the trouble, since most documents are normally structured. + \def\pdfoutlinedest{#3}% + \ifx\pdfoutlinedest\empty + \def\pdfoutlinedest{#4}% + \else + % Doubled backslashes in the name. + {\activebackslashdouble \xdef\pdfoutlinedest{#3}% + \backslashparens\pdfoutlinedest}% + \fi + % + % Also double the backslashes in the display string. + {\activebackslashdouble \xdef\pdfoutlinetext{#1}% + \backslashparens\pdfoutlinetext}% + % + \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% + } + % + \def\pdfmakeoutlines{% + \begingroup + % Thanh's hack / proper braces in bookmarks + \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace + \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace + % + % Read toc silently, to get counts of subentries for \pdfoutline. + \def\numchapentry##1##2##3##4{% + \def\thischapnum{##2}% + \def\thissecnum{0}% + \def\thissubsecnum{0}% + }% + \def\numsecentry##1##2##3##4{% + \advancenumber{chap\thischapnum}% + \def\thissecnum{##2}% + \def\thissubsecnum{0}% + }% + \def\numsubsecentry##1##2##3##4{% + \advancenumber{sec\thissecnum}% + \def\thissubsecnum{##2}% + }% + \def\numsubsubsecentry##1##2##3##4{% + \advancenumber{subsec\thissubsecnum}% + }% + \def\thischapnum{0}% + \def\thissecnum{0}% + \def\thissubsecnum{0}% + % + % use \def rather than \let here because we redefine \chapentry et + % al. a second time, below. + \def\appentry{\numchapentry}% + \def\appsecentry{\numsecentry}% + \def\appsubsecentry{\numsubsecentry}% + \def\appsubsubsecentry{\numsubsubsecentry}% + \def\unnchapentry{\numchapentry}% + \def\unnsecentry{\numsecentry}% + \def\unnsubsecentry{\numsubsecentry}% + \def\unnsubsubsecentry{\numsubsubsecentry}% + \readdatafile{toc}% + % + % Read toc second time, this time actually producing the outlines. + % The `-' means take the \expnumber as the absolute number of + % subentries, which we calculated on our first read of the .toc above. + % + % We use the node names as the destinations. + \def\numchapentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% + \def\numsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% + \def\numsubsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% + \def\numsubsubsecentry##1##2##3##4{% count is always zero + \dopdfoutline{##1}{}{##3}{##4}}% + % + % PDF outlines are displayed using system fonts, instead of + % document fonts. Therefore we cannot use special characters, + % since the encoding is unknown. For example, the eogonek from + % Latin 2 (0xea) gets translated to a | character. Info from + % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. + % + % xx to do this right, we have to translate 8-bit characters to + % their "best" equivalent, based on the @documentencoding. Right + % now, I guess we'll just let the pdf reader have its way. + \indexnofonts + \setupdatafile + \catcode`\\=\active \otherbackslash + \input \tocreadfilename + \endgroup + } + % + \def\skipspaces#1{\def\PP{#1}\def\D{|}% + \ifx\PP\D\let\nextsp\relax + \else\let\nextsp\skipspaces + \ifx\p\space\else\addtokens{\filename}{\PP}% + \advance\filenamelength by 1 + \fi + \fi + \nextsp} + \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} + \ifnum\pdftexversion < 14 + \let \startlink \pdfannotlink + \else + \let \startlink \pdfstartlink + \fi + % make a live url in pdf output. + \def\pdfurl#1{% + \begingroup + % it seems we really need yet another set of dummies; have not + % tried to figure out what each command should do in the context + % of @url. for now, just make @/ a no-op, that's the only one + % people have actually reported a problem with. + % + \normalturnoffactive + \def\@{@}% + \let\/=\empty + \makevalueexpandable + % do we want to go so far as to use \indexnofonts instead of just + % special-casing \var here? + \def\var##1{##1}% + % + \leavevmode\setcolor{\urlcolor}% + \startlink attr{/Border [0 0 0]}% + user{/Subtype /Link /A << /S /URI /URI (#1) >>}% + \endgroup} + \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} + \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} + \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} + \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} + \def\maketoks{% + \expandafter\poptoks\the\toksA|ENDTOKS|\relax + \ifx\first0\adn0 + \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 + \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 + \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 + \else + \ifnum0=\countA\else\makelink\fi + \ifx\first.\let\next=\done\else + \let\next=\maketoks + \addtokens{\toksB}{\the\toksD} + \ifx\first,\addtokens{\toksB}{\space}\fi + \fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \next} + \def\makelink{\addtokens{\toksB}% + {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} + \def\pdflink#1{% + \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} + \setcolor{\linkcolor}#1\endlink} + \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} +\else + % non-pdf mode + \let\pdfmkdest = \gobble + \let\pdfurl = \gobble + \let\endlink = \relax + \let\setcolor = \gobble + \let\pdfsetcolor = \gobble + \let\pdfmakeoutlines = \relax +\fi % \ifx\pdfoutput + + +\message{fonts,} + +% Change the current font style to #1, remembering it in \curfontstyle. +% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in +% italics, not bold italics. +% +\def\setfontstyle#1{% + \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. + \csname ten#1\endcsname % change the current font +} + +% Select #1 fonts with the current style. +% +\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} + +\def\rm{\fam=0 \setfontstyle{rm}} +\def\it{\fam=\itfam \setfontstyle{it}} +\def\sl{\fam=\slfam \setfontstyle{sl}} +\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} +\def\tt{\fam=\ttfam \setfontstyle{tt}} + +% Unfortunately, we have to override this for titles and the like, since +% in those cases "rm" is bold. Sigh. +\def\rmisbold{\rm\def\curfontstyle{bf}} + +% Texinfo sort of supports the sans serif font style, which plain TeX does not. +% So we set up a \sf. +\newfam\sffam +\def\sf{\fam=\sffam \setfontstyle{sf}} +\let\li = \sf % Sometimes we call it \li, not \sf. + +% We don't need math for this font style. +\def\ttsl{\setfontstyle{ttsl}} + + +% Default leading. +\newdimen\textleading \textleading = 13.2pt + +% Set the baselineskip to #1, and the lineskip and strut size +% correspondingly. There is no deep meaning behind these magic numbers +% used as factors; they just match (closely enough) what Knuth defined. +% +\def\lineskipfactor{.08333} +\def\strutheightpercent{.70833} +\def\strutdepthpercent {.29167} +% +% can get a sort of poor man's double spacing by redefining this. +\def\baselinefactor{1} +% +\def\setleading#1{% + \dimen0 = #1\relax + \normalbaselineskip = \baselinefactor\dimen0 + \normallineskip = \lineskipfactor\normalbaselineskip + \normalbaselines + \setbox\strutbox =\hbox{% + \vrule width0pt height\strutheightpercent\baselineskip + depth \strutdepthpercent \baselineskip + }% +} + +% PDF CMaps. See also LaTeX's t1.cmap. +% +% do nothing with this by default. +\expandafter\let\csname cmapOT1\endcsname\gobble +\expandafter\let\csname cmapOT1IT\endcsname\gobble +\expandafter\let\csname cmapOT1TT\endcsname\gobble + +% if we are producing pdf, and we have \pdffontattr, then define cmaps. +% (\pdffontattr was introduced many years ago, but people still run +% older pdftex's; it's easy to conditionalize, so we do.) +\ifpdf \ifx\pdffontattr\undefined \else + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1-0) +%%Title: (TeX-OT1-0 TeX OT1 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1) +/Supplement 0 +>> def +/CMapName /TeX-OT1-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +8 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<23> <26> <0023> +<28> <3B> <0028> +<3F> <5B> <003F> +<5D> <5E> <005D> +<61> <7A> <0061> +<7B> <7C> <2013> +endbfrange +40 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <00660066> +<0C> <00660069> +<0D> <0066006C> +<0E> <006600660069> +<0F> <00660066006C> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<21> <0021> +<22> <201D> +<27> <2019> +<3C> <00A1> +<3D> <003D> +<3E> <00BF> +<5C> <201C> +<5F> <02D9> +<60> <2018> +<7D> <02DD> +<7E> <007E> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +% +% \cmapOT1IT + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1IT-0) +%%Title: (TeX-OT1IT-0 TeX OT1IT 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1IT) +/Supplement 0 +>> def +/CMapName /TeX-OT1IT-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +8 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<25> <26> <0025> +<28> <3B> <0028> +<3F> <5B> <003F> +<5D> <5E> <005D> +<61> <7A> <0061> +<7B> <7C> <2013> +endbfrange +42 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <00660066> +<0C> <00660069> +<0D> <0066006C> +<0E> <006600660069> +<0F> <00660066006C> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<21> <0021> +<22> <201D> +<23> <0023> +<24> <00A3> +<27> <2019> +<3C> <00A1> +<3D> <003D> +<3E> <00BF> +<5C> <201C> +<5F> <02D9> +<60> <2018> +<7D> <02DD> +<7E> <007E> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1IT\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +% +% \cmapOT1TT + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1TT-0) +%%Title: (TeX-OT1TT-0 TeX OT1TT 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1TT) +/Supplement 0 +>> def +/CMapName /TeX-OT1TT-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +5 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<21> <26> <0021> +<28> <5F> <0028> +<61> <7E> <0061> +endbfrange +32 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <2191> +<0C> <2193> +<0D> <0027> +<0E> <00A1> +<0F> <00BF> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<20> <2423> +<27> <2019> +<60> <2018> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1TT\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +\fi\fi + + +% Set the font macro #1 to the font named #2, adding on the +% specified font prefix (normally `cm'). +% #3 is the font's design size, #4 is a scale factor, #5 is the CMap +% encoding (currently only OT1, OT1IT and OT1TT are allowed, pass +% empty to omit). +\def\setfont#1#2#3#4#5{% + \font#1=\fontprefix#2#3 scaled #4 + \csname cmap#5\endcsname#1% +} +% This is what gets called when #5 of \setfont is empty. +\let\cmap\gobble +% emacs-page end of cmaps + +% Use cm as the default font prefix. +% To specify the font prefix, you must define \fontprefix +% before you read in texinfo.tex. +\ifx\fontprefix\undefined +\def\fontprefix{cm} +\fi +% Support font families that don't use the same naming scheme as CM. +\def\rmshape{r} +\def\rmbshape{bx} %where the normal face is bold +\def\bfshape{b} +\def\bxshape{bx} +\def\ttshape{tt} +\def\ttbshape{tt} +\def\ttslshape{sltt} +\def\itshape{ti} +\def\itbshape{bxti} +\def\slshape{sl} +\def\slbshape{bxsl} +\def\sfshape{ss} +\def\sfbshape{ss} +\def\scshape{csc} +\def\scbshape{csc} + +% Definitions for a main text size of 11pt. This is the default in +% Texinfo. +% +\def\definetextfontsizexi{% +% Text fonts (11.2pt, magstep1). +\def\textnominalsize{11pt} +\edef\mainmagstep{\magstephalf} +\setfont\textrm\rmshape{10}{\mainmagstep}{OT1} +\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} +\setfont\textbf\bfshape{10}{\mainmagstep}{OT1} +\setfont\textit\itshape{10}{\mainmagstep}{OT1IT} +\setfont\textsl\slshape{10}{\mainmagstep}{OT1} +\setfont\textsf\sfshape{10}{\mainmagstep}{OT1} +\setfont\textsc\scshape{10}{\mainmagstep}{OT1} +\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep +\def\textecsize{1095} + +% A few fonts for @defun names and args. +\setfont\defbf\bfshape{10}{\magstep1}{OT1} +\setfont\deftt\ttshape{10}{\magstep1}{OT1TT} +\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} + +% Fonts for indices, footnotes, small examples (9pt). +\def\smallnominalsize{9pt} +\setfont\smallrm\rmshape{9}{1000}{OT1} +\setfont\smalltt\ttshape{9}{1000}{OT1TT} +\setfont\smallbf\bfshape{10}{900}{OT1} +\setfont\smallit\itshape{9}{1000}{OT1IT} +\setfont\smallsl\slshape{9}{1000}{OT1} +\setfont\smallsf\sfshape{9}{1000}{OT1} +\setfont\smallsc\scshape{10}{900}{OT1} +\setfont\smallttsl\ttslshape{10}{900}{OT1TT} +\font\smalli=cmmi9 +\font\smallsy=cmsy9 +\def\smallecsize{0900} + +% Fonts for small examples (8pt). +\def\smallernominalsize{8pt} +\setfont\smallerrm\rmshape{8}{1000}{OT1} +\setfont\smallertt\ttshape{8}{1000}{OT1TT} +\setfont\smallerbf\bfshape{10}{800}{OT1} +\setfont\smallerit\itshape{8}{1000}{OT1IT} +\setfont\smallersl\slshape{8}{1000}{OT1} +\setfont\smallersf\sfshape{8}{1000}{OT1} +\setfont\smallersc\scshape{10}{800}{OT1} +\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} +\font\smalleri=cmmi8 +\font\smallersy=cmsy8 +\def\smallerecsize{0800} + +% Fonts for title page (20.4pt): +\def\titlenominalsize{20pt} +\setfont\titlerm\rmbshape{12}{\magstep3}{OT1} +\setfont\titleit\itbshape{10}{\magstep4}{OT1IT} +\setfont\titlesl\slbshape{10}{\magstep4}{OT1} +\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} +\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} +\setfont\titlesf\sfbshape{17}{\magstep1}{OT1} +\let\titlebf=\titlerm +\setfont\titlesc\scbshape{10}{\magstep4}{OT1} +\font\titlei=cmmi12 scaled \magstep3 +\font\titlesy=cmsy10 scaled \magstep4 +\def\titleecsize{2074} + +% Chapter (and unnumbered) fonts (17.28pt). +\def\chapnominalsize{17pt} +\setfont\chaprm\rmbshape{12}{\magstep2}{OT1} +\setfont\chapit\itbshape{10}{\magstep3}{OT1IT} +\setfont\chapsl\slbshape{10}{\magstep3}{OT1} +\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} +\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} +\setfont\chapsf\sfbshape{17}{1000}{OT1} +\let\chapbf=\chaprm +\setfont\chapsc\scbshape{10}{\magstep3}{OT1} +\font\chapi=cmmi12 scaled \magstep2 +\font\chapsy=cmsy10 scaled \magstep3 +\def\chapecsize{1728} + +% Section fonts (14.4pt). +\def\secnominalsize{14pt} +\setfont\secrm\rmbshape{12}{\magstep1}{OT1} +\setfont\secit\itbshape{10}{\magstep2}{OT1IT} +\setfont\secsl\slbshape{10}{\magstep2}{OT1} +\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} +\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} +\setfont\secsf\sfbshape{12}{\magstep1}{OT1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep2}{OT1} +\font\seci=cmmi12 scaled \magstep1 +\font\secsy=cmsy10 scaled \magstep2 +\def\sececsize{1440} + +% Subsection fonts (13.15pt). +\def\ssecnominalsize{13pt} +\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} +\setfont\ssecit\itbshape{10}{1315}{OT1IT} +\setfont\ssecsl\slbshape{10}{1315}{OT1} +\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} +\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} +\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{1315}{OT1} +\font\sseci=cmmi12 scaled \magstephalf +\font\ssecsy=cmsy10 scaled 1315 +\def\ssececsize{1200} + +% Reduced fonts for @acro in text (10pt). +\def\reducednominalsize{10pt} +\setfont\reducedrm\rmshape{10}{1000}{OT1} +\setfont\reducedtt\ttshape{10}{1000}{OT1TT} +\setfont\reducedbf\bfshape{10}{1000}{OT1} +\setfont\reducedit\itshape{10}{1000}{OT1IT} +\setfont\reducedsl\slshape{10}{1000}{OT1} +\setfont\reducedsf\sfshape{10}{1000}{OT1} +\setfont\reducedsc\scshape{10}{1000}{OT1} +\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} +\font\reducedi=cmmi10 +\font\reducedsy=cmsy10 +\def\reducedecsize{1000} + +% reset the current fonts +\textfonts +\rm +} % end of 11pt text font size definitions + + +% Definitions to make the main text be 10pt Computer Modern, with +% section, chapter, etc., sizes following suit. This is for the GNU +% Press printing of the Emacs 22 manual. Maybe other manuals in the +% future. Used with @smallbook, which sets the leading to 12pt. +% +\def\definetextfontsizex{% +% Text fonts (10pt). +\def\textnominalsize{10pt} +\edef\mainmagstep{1000} +\setfont\textrm\rmshape{10}{\mainmagstep}{OT1} +\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} +\setfont\textbf\bfshape{10}{\mainmagstep}{OT1} +\setfont\textit\itshape{10}{\mainmagstep}{OT1IT} +\setfont\textsl\slshape{10}{\mainmagstep}{OT1} +\setfont\textsf\sfshape{10}{\mainmagstep}{OT1} +\setfont\textsc\scshape{10}{\mainmagstep}{OT1} +\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep +\def\textecsize{1000} + +% A few fonts for @defun names and args. +\setfont\defbf\bfshape{10}{\magstephalf}{OT1} +\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} +\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} + +% Fonts for indices, footnotes, small examples (9pt). +\def\smallnominalsize{9pt} +\setfont\smallrm\rmshape{9}{1000}{OT1} +\setfont\smalltt\ttshape{9}{1000}{OT1TT} +\setfont\smallbf\bfshape{10}{900}{OT1} +\setfont\smallit\itshape{9}{1000}{OT1IT} +\setfont\smallsl\slshape{9}{1000}{OT1} +\setfont\smallsf\sfshape{9}{1000}{OT1} +\setfont\smallsc\scshape{10}{900}{OT1} +\setfont\smallttsl\ttslshape{10}{900}{OT1TT} +\font\smalli=cmmi9 +\font\smallsy=cmsy9 +\def\smallecsize{0900} + +% Fonts for small examples (8pt). +\def\smallernominalsize{8pt} +\setfont\smallerrm\rmshape{8}{1000}{OT1} +\setfont\smallertt\ttshape{8}{1000}{OT1TT} +\setfont\smallerbf\bfshape{10}{800}{OT1} +\setfont\smallerit\itshape{8}{1000}{OT1IT} +\setfont\smallersl\slshape{8}{1000}{OT1} +\setfont\smallersf\sfshape{8}{1000}{OT1} +\setfont\smallersc\scshape{10}{800}{OT1} +\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} +\font\smalleri=cmmi8 +\font\smallersy=cmsy8 +\def\smallerecsize{0800} + +% Fonts for title page (20.4pt): +\def\titlenominalsize{20pt} +\setfont\titlerm\rmbshape{12}{\magstep3}{OT1} +\setfont\titleit\itbshape{10}{\magstep4}{OT1IT} +\setfont\titlesl\slbshape{10}{\magstep4}{OT1} +\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} +\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} +\setfont\titlesf\sfbshape{17}{\magstep1}{OT1} +\let\titlebf=\titlerm +\setfont\titlesc\scbshape{10}{\magstep4}{OT1} +\font\titlei=cmmi12 scaled \magstep3 +\font\titlesy=cmsy10 scaled \magstep4 +\def\titleecsize{2074} + +% Chapter fonts (14.4pt). +\def\chapnominalsize{14pt} +\setfont\chaprm\rmbshape{12}{\magstep1}{OT1} +\setfont\chapit\itbshape{10}{\magstep2}{OT1IT} +\setfont\chapsl\slbshape{10}{\magstep2}{OT1} +\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} +\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} +\setfont\chapsf\sfbshape{12}{\magstep1}{OT1} +\let\chapbf\chaprm +\setfont\chapsc\scbshape{10}{\magstep2}{OT1} +\font\chapi=cmmi12 scaled \magstep1 +\font\chapsy=cmsy10 scaled \magstep2 +\def\chapecsize{1440} + +% Section fonts (12pt). +\def\secnominalsize{12pt} +\setfont\secrm\rmbshape{12}{1000}{OT1} +\setfont\secit\itbshape{10}{\magstep1}{OT1IT} +\setfont\secsl\slbshape{10}{\magstep1}{OT1} +\setfont\sectt\ttbshape{12}{1000}{OT1TT} +\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} +\setfont\secsf\sfbshape{12}{1000}{OT1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep1}{OT1} +\font\seci=cmmi12 +\font\secsy=cmsy10 scaled \magstep1 +\def\sececsize{1200} + +% Subsection fonts (10pt). +\def\ssecnominalsize{10pt} +\setfont\ssecrm\rmbshape{10}{1000}{OT1} +\setfont\ssecit\itbshape{10}{1000}{OT1IT} +\setfont\ssecsl\slbshape{10}{1000}{OT1} +\setfont\ssectt\ttbshape{10}{1000}{OT1TT} +\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} +\setfont\ssecsf\sfbshape{10}{1000}{OT1} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{1000}{OT1} +\font\sseci=cmmi10 +\font\ssecsy=cmsy10 +\def\ssececsize{1000} + +% Reduced fonts for @acro in text (9pt). +\def\reducednominalsize{9pt} +\setfont\reducedrm\rmshape{9}{1000}{OT1} +\setfont\reducedtt\ttshape{9}{1000}{OT1TT} +\setfont\reducedbf\bfshape{10}{900}{OT1} +\setfont\reducedit\itshape{9}{1000}{OT1IT} +\setfont\reducedsl\slshape{9}{1000}{OT1} +\setfont\reducedsf\sfshape{9}{1000}{OT1} +\setfont\reducedsc\scshape{10}{900}{OT1} +\setfont\reducedttsl\ttslshape{10}{900}{OT1TT} +\font\reducedi=cmmi9 +\font\reducedsy=cmsy9 +\def\reducedecsize{0900} + +% reduce space between paragraphs +\divide\parskip by 2 + +% reset the current fonts +\textfonts +\rm +} % end of 10pt text font size definitions + + +% We provide the user-level command +% @fonttextsize 10 +% (or 11) to redefine the text font size. pt is assumed. +% +\def\xword{10} +\def\xiword{11} +% +\parseargdef\fonttextsize{% + \def\textsizearg{#1}% + \wlog{doing @fonttextsize \textsizearg}% + % + % Set \globaldefs so that documents can use this inside @tex, since + % makeinfo 4.8 does not support it, but we need it nonetheless. + % + \begingroup \globaldefs=1 + \ifx\textsizearg\xword \definetextfontsizex + \else \ifx\textsizearg\xiword \definetextfontsizexi + \else + \errhelp=\EMsimple + \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} + \fi\fi + \endgroup +} + + +% In order for the font changes to affect most math symbols and letters, +% we have to define the \textfont of the standard families. Since +% texinfo doesn't allow for producing subscripts and superscripts except +% in the main text, we don't bother to reset \scriptfont and +% \scriptscriptfont (which would also require loading a lot more fonts). +% +\def\resetmathfonts{% + \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy + \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf + \textfont\ttfam=\tentt \textfont\sffam=\tensf +} + +% The font-changing commands redefine the meanings of \tenSTYLE, instead +% of just \STYLE. We do this because \STYLE needs to also set the +% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire +% \tenSTYLE to set the current font. +% +% Each font-changing command also sets the names \lsize (one size lower) +% and \lllsize (three sizes lower). These relative commands are used in +% the LaTeX logo and acronyms. +% +% This all needs generalizing, badly. +% +\def\textfonts{% + \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl + \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc + \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy + \let\tenttsl=\textttsl + \def\curfontsize{text}% + \def\lsize{reduced}\def\lllsize{smaller}% + \resetmathfonts \setleading{\textleading}} +\def\titlefonts{% + \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl + \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc + \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy + \let\tenttsl=\titlettsl + \def\curfontsize{title}% + \def\lsize{chap}\def\lllsize{subsec}% + \resetmathfonts \setleading{25pt}} +\def\titlefont#1{{\titlefonts\rmisbold #1}} +\def\chapfonts{% + \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl + \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc + \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy + \let\tenttsl=\chapttsl + \def\curfontsize{chap}% + \def\lsize{sec}\def\lllsize{text}% + \resetmathfonts \setleading{19pt}} +\def\secfonts{% + \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl + \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc + \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy + \let\tenttsl=\secttsl + \def\curfontsize{sec}% + \def\lsize{subsec}\def\lllsize{reduced}% + \resetmathfonts \setleading{16pt}} +\def\subsecfonts{% + \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl + \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc + \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy + \let\tenttsl=\ssecttsl + \def\curfontsize{ssec}% + \def\lsize{text}\def\lllsize{small}% + \resetmathfonts \setleading{15pt}} +\let\subsubsecfonts = \subsecfonts +\def\reducedfonts{% + \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl + \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc + \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy + \let\tenttsl=\reducedttsl + \def\curfontsize{reduced}% + \def\lsize{small}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallfonts{% + \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl + \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc + \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy + \let\tenttsl=\smallttsl + \def\curfontsize{small}% + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallerfonts{% + \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl + \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc + \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy + \let\tenttsl=\smallerttsl + \def\curfontsize{smaller}% + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{9.5pt}} + +% Fonts for short table of contents. +\setfont\shortcontrm\rmshape{12}{1000}{OT1} +\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 +\setfont\shortcontsl\slshape{12}{1000}{OT1} +\setfont\shortconttt\ttshape{12}{1000}{OT1TT} + +% Define these just so they can be easily changed for other fonts. +\def\angleleft{$\langle$} +\def\angleright{$\rangle$} + +% Set the fonts to use with the @small... environments. +\let\smallexamplefonts = \smallfonts + +% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample +% can fit this many characters: +% 8.5x11=86 smallbook=72 a4=90 a5=69 +% If we use \scriptfonts (8pt), then we can fit this many characters: +% 8.5x11=90+ smallbook=80 a4=90+ a5=77 +% For me, subjectively, the few extra characters that fit aren't worth +% the additional smallness of 8pt. So I'm making the default 9pt. +% +% By the way, for comparison, here's what fits with @example (10pt): +% 8.5x11=71 smallbook=60 a4=75 a5=58 +% --karl, 24jan03. + +% Set up the default fonts, so we can use them for creating boxes. +% +\definetextfontsizexi + + +\message{markup,} + +% Check if we are currently using a typewriter font. Since all the +% Computer Modern typewriter fonts have zero interword stretch (and +% shrink), and it is reasonable to expect all typewriter fonts to have +% this property, we can check that font parameter. +% +\def\ifmonospace{\ifdim\fontdimen3\font=0pt } + +% Markup style infrastructure. \defmarkupstylesetup\INITMACRO will +% define and register \INITMACRO to be called on markup style changes. +% \INITMACRO can check \currentmarkupstyle for the innermost +% style and the set of \ifmarkupSTYLE switches for all styles +% currently in effect. +\newif\ifmarkupvar +\newif\ifmarkupsamp +\newif\ifmarkupkey +%\newif\ifmarkupfile % @file == @samp. +%\newif\ifmarkupoption % @option == @samp. +\newif\ifmarkupcode +\newif\ifmarkupkbd +%\newif\ifmarkupenv % @env == @code. +%\newif\ifmarkupcommand % @command == @code. +\newif\ifmarkuptex % @tex (and part of @math, for now). +\newif\ifmarkupexample +\newif\ifmarkupverb +\newif\ifmarkupverbatim + +\let\currentmarkupstyle\empty + +\def\setupmarkupstyle#1{% + \csname markup#1true\endcsname + \def\currentmarkupstyle{#1}% + \markupstylesetup +} + +\let\markupstylesetup\empty + +\def\defmarkupstylesetup#1{% + \expandafter\def\expandafter\markupstylesetup + \expandafter{\markupstylesetup #1}% + \def#1% +} + +% Markup style setup for left and right quotes. +\defmarkupstylesetup\markupsetuplq{% + \expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname + \ifx\temp\relax \markupsetuplqdefault \else \temp \fi +} + +\defmarkupstylesetup\markupsetuprq{% + \expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname + \ifx\temp\relax \markupsetuprqdefault \else \temp \fi +} + +{ +\catcode`\'=\active +\catcode`\`=\active + +\gdef\markupsetuplqdefault{\let`\lq} +\gdef\markupsetuprqdefault{\let'\rq} + +\gdef\markupsetcodequoteleft{\let`\codequoteleft} +\gdef\markupsetcodequoteright{\let'\codequoteright} + +\gdef\markupsetnoligaturesquoteleft{\let`\noligaturesquoteleft} +} + +\let\markupsetuplqcode \markupsetcodequoteleft +\let\markupsetuprqcode \markupsetcodequoteright +\let\markupsetuplqexample \markupsetcodequoteleft +\let\markupsetuprqexample \markupsetcodequoteright +\let\markupsetuplqverb \markupsetcodequoteleft +\let\markupsetuprqverb \markupsetcodequoteright +\let\markupsetuplqverbatim \markupsetcodequoteleft +\let\markupsetuprqverbatim \markupsetcodequoteright + +\let\markupsetuplqsamp \markupsetnoligaturesquoteleft +\let\markupsetuplqkbd \markupsetnoligaturesquoteleft + +% Allow an option to not replace quotes with a regular directed right +% quote/apostrophe (char 0x27), but instead use the undirected quote +% from cmtt (char 0x0d). The undirected quote is ugly, so don't make it +% the default, but it works for pasting with more pdf viewers (at least +% evince), the lilypond developers report. xpdf does work with the +% regular 0x27. +% +\def\codequoteright{% + \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax + \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax + '% + \else \char'15 \fi + \else \char'15 \fi +} +% +% and a similar option for the left quote char vs. a grave accent. +% Modern fonts display ASCII 0x60 as a grave accent, so some people like +% the code environments to do likewise. +% +\def\codequoteleft{% + \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax + \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax + % [Knuth] pp. 380,381,391 + % \relax disables Spanish ligatures ?` and !` of \tt font. + \relax`% + \else \char'22 \fi + \else \char'22 \fi +} + +% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. +\def\noligaturesquoteleft{\relax\lq} + +% Count depth in font-changes, for error checks +\newcount\fontdepth \fontdepth=0 + +%% Add scribe-like font environments, plus @l for inline lisp (usually sans +%% serif) and @ii for TeX italic + +% \smartitalic{ARG} outputs arg in italics, followed by an italic correction +% unless the following character is such as not to need one. +\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else + \ptexslash\fi\fi\fi} +\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx} +\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx} + +% like \smartslanted except unconditionally uses \ttsl. +% @var is set to this for defun arguments. +\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx} + +% @cite is like \smartslanted except unconditionally use \sl. We never want +% ttsl for book titles, do we? +\def\cite#1{{\sl #1}\futurelet\next\smartitalicx} + +\let\i=\smartitalic +\let\slanted=\smartslanted +\def\var#1{{\setupmarkupstyle{var}\smartslanted{#1}}} +\let\dfn=\smartslanted +\let\emph=\smartitalic + +% Explicit font changes: @r, @sc, undocumented @ii. +\def\r#1{{\rm #1}} % roman font +\def\sc#1{{\smallcaps#1}} % smallcaps font +\def\ii#1{{\it #1}} % italic font + +% @b, explicit bold. Also @strong. +\def\b#1{{\bf #1}} +\let\strong=\b + +% @sansserif, explicit sans. +\def\sansserif#1{{\sf #1}} + +% We can't just use \exhyphenpenalty, because that only has effect at +% the end of a paragraph. Restore normal hyphenation at the end of the +% group within which \nohyphenation is presumably called. +% +\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} +\def\restorehyphenation{\hyphenchar\font = `- } + +% Set sfcode to normal for the chars that usually have another value. +% Can't use plain's \frenchspacing because it uses the `\x notation, and +% sometimes \x has an active definition that messes things up. +% +\catcode`@=11 + \def\plainfrenchspacing{% + \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m + \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m + \def\endofsentencespacefactor{1000}% for @. and friends + } + \def\plainnonfrenchspacing{% + \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 + \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 + \def\endofsentencespacefactor{3000}% for @. and friends + } +\catcode`@=\other +\def\endofsentencespacefactor{3000}% default + +% @t, explicit typewriter. +\def\t#1{% + {\tt \rawbackslash \plainfrenchspacing #1}% + \null +} + +% @samp. +\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} + +% definition of @key that produces a lozenge. Doesn't adjust to text size. +%\setfont\keyrm\rmshape{8}{1000}{OT1} +%\font\keysy=cmsy9 +%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% +% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% +% \vbox{\hrule\kern-0.4pt +% \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% +% \kern-0.4pt\hrule}% +% \kern-.06em\raise0.4pt\hbox{\angleright}}}} + +% definition of @key with no lozenge. If the current font is already +% monospace, don't change it; that way, we respect @kbdinputstyle. But +% if it isn't monospace, then use \tt. +% +\def\key#1{{\setupmarkupstyle{key}% + \nohyphenation + \ifmonospace\else\tt\fi + #1}\null} + +% ctrl is no longer a Texinfo command. +\def\ctrl #1{{\tt \rawbackslash \hat}#1} + +% @file, @option are the same as @samp. +\let\file=\samp +\let\option=\samp + +% @code is a modification of @t, +% which makes spaces the same size as normal in the surrounding text. +\def\tclose#1{% + {% + % Change normal interword space to be same as for the current font. + \spaceskip = \fontdimen2\font + % + % Switch to typewriter. + \tt + % + % But `\ ' produces the large typewriter interword space. + \def\ {{\spaceskip = 0pt{} }}% + % + % Turn off hyphenation. + \nohyphenation + % + \rawbackslash + \plainfrenchspacing + #1% + }% + \null +} + +% We *must* turn on hyphenation at `-' and `_' in @code. +% Otherwise, it is too hard to avoid overfull hboxes +% in the Emacs manual, the Library manual, etc. + +% Unfortunately, TeX uses one parameter (\hyphenchar) to control +% both hyphenation at - and hyphenation within words. +% We must therefore turn them both off (\tclose does that) +% and arrange explicitly to hyphenate at a dash. +% -- rms. +{ + \catcode`\-=\active \catcode`\_=\active + \catcode`\'=\active \catcode`\`=\active + \global\let'=\rq \global\let`=\lq % default definitions + % + \global\def\code{\begingroup + \setupmarkupstyle{code}% + % The following should really be moved into \setupmarkupstyle handlers. + \catcode\dashChar=\active \catcode\underChar=\active + \ifallowcodebreaks + \let-\codedash + \let_\codeunder + \else + \let-\realdash + \let_\realunder + \fi + \codex + } +} + +\def\realdash{-} +\def\codedash{-\discretionary{}{}{}} +\def\codeunder{% + % this is all so @math{@code{var_name}+1} can work. In math mode, _ + % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) + % will therefore expand the active definition of _, which is us + % (inside @code that is), therefore an endless loop. + \ifusingtt{\ifmmode + \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. + \else\normalunderscore \fi + \discretionary{}{}{}}% + {\_}% +} +\def\codex #1{\tclose{#1}\endgroup} + +% An additional complication: the above will allow breaks after, e.g., +% each of the four underscores in __typeof__. This is undesirable in +% some manuals, especially if they don't have long identifiers in +% general. @allowcodebreaks provides a way to control this. +% +\newif\ifallowcodebreaks \allowcodebreakstrue + +\def\keywordtrue{true} +\def\keywordfalse{false} + +\parseargdef\allowcodebreaks{% + \def\txiarg{#1}% + \ifx\txiarg\keywordtrue + \allowcodebreakstrue + \else\ifx\txiarg\keywordfalse + \allowcodebreaksfalse + \else + \errhelp = \EMsimple + \errmessage{Unknown @allowcodebreaks option `\txiarg'}% + \fi\fi +} + +% @kbd is like @code, except that if the argument is just one @key command, +% then @kbd has no effect. +\def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}} + +% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), +% `example' (@kbd uses ttsl only inside of @example and friends), +% or `code' (@kbd uses normal tty font always). +\parseargdef\kbdinputstyle{% + \def\txiarg{#1}% + \ifx\txiarg\worddistinct + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% + \else\ifx\txiarg\wordexample + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% + \else\ifx\txiarg\wordcode + \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% + \else + \errhelp = \EMsimple + \errmessage{Unknown @kbdinputstyle option `\txiarg'}% + \fi\fi\fi +} +\def\worddistinct{distinct} +\def\wordexample{example} +\def\wordcode{code} + +% Default is `distinct'. +\kbdinputstyle distinct + +\def\xkey{\key} +\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% +\ifx\one\xkey\ifx\threex\three \key{#2}% +\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi +\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi} + +% For @indicateurl, @env, @command quotes seem unnecessary, so use \code. +\let\indicateurl=\code +\let\env=\code +\let\command=\code + +% @clicksequence{File @click{} Open ...} +\def\clicksequence#1{\begingroup #1\endgroup} + +% @clickstyle @arrow (by default) +\parseargdef\clickstyle{\def\click{#1}} +\def\click{\arrow} + +% @uref (abbreviation for `urlref') takes an optional (comma-separated) +% second argument specifying the text to display and an optional third +% arg as text to display instead of (rather than in addition to) the url +% itself. First (mandatory) arg is the url. Perhaps eventually put in +% a hypertex \special here. +% +\def\uref#1{\douref #1,,,\finish} +\def\douref#1,#2,#3,#4\finish{\begingroup + \unsepspaces + \pdfurl{#1}% + \setbox0 = \hbox{\ignorespaces #3}% + \ifdim\wd0 > 0pt + \unhbox0 % third arg given, show only that + \else + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \ifpdf + \unhbox0 % PDF: 2nd arg given, show only it + \else + \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url + \fi + \else + \code{#1}% only url given, so show it + \fi + \fi + \endlink +\endgroup} + +% @url synonym for @uref, since that's how everyone uses it. +% +\let\url=\uref + +% rms does not like angle brackets --karl, 17may97. +% So now @email is just like @uref, unless we are pdf. +% +%\def\email#1{\angleleft{\tt #1}\angleright} +\ifpdf + \def\email#1{\doemail#1,,\finish} + \def\doemail#1,#2,#3\finish{\begingroup + \unsepspaces + \pdfurl{mailto:#1}% + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi + \endlink + \endgroup} +\else + \let\email=\uref +\fi + +% Typeset a dimension, e.g., `in' or `pt'. The only reason for the +% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. +% +\def\dmn#1{\thinspace #1} + +% @l was never documented to mean ``switch to the Lisp font'', +% and it is not used as such in any manual I can find. We need it for +% Polish suppressed-l. --karl, 22sep96. +%\def\l#1{{\li #1}\null} + +% @acronym for "FBI", "NATO", and the like. +% We print this one point size smaller, since it's intended for +% all-uppercase. +% +\def\acronym#1{\doacronym #1,,\finish} +\def\doacronym#1,#2,#3\finish{% + {\selectfonts\lsize #1}% + \def\temp{#2}% + \ifx\temp\empty \else + \space ({\unsepspaces \ignorespaces \temp \unskip})% + \fi +} + +% @abbr for "Comput. J." and the like. +% No font change, but don't do end-of-sentence spacing. +% +\def\abbr#1{\doabbr #1,,\finish} +\def\doabbr#1,#2,#3\finish{% + {\plainfrenchspacing #1}% + \def\temp{#2}% + \ifx\temp\empty \else + \space ({\unsepspaces \ignorespaces \temp \unskip})% + \fi +} + + +\message{glyphs,} + +% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. +% +% Since these characters are used in examples, they should be an even number of +% \tt widths. Each \tt character is 1en, so two makes it 1em. +% +\def\point{$\star$} +\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} +\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} +\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} +\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} +\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} + +% The @error{} command. +% Adapted from the TeXbook's \boxit. +% +\newbox\errorbox +% +{\tentt \global\dimen0 = 3em}% Width of the box. +\dimen2 = .55pt % Thickness of rules +% The text. (`r' is open on the right, `e' somewhat less so on the left.) +\setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt} +% +\setbox\errorbox=\hbox to \dimen0{\hfil + \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. + \advance\hsize by -2\dimen2 % Rules. + \vbox{% + \hrule height\dimen2 + \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. + \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. + \kern3pt\vrule width\dimen2}% Space to right. + \hrule height\dimen2} + \hfil} +% +\def\error{\leavevmode\lower.7ex\copy\errorbox} + +% @pounds{} is a sterling sign, which Knuth put in the CM italic font. +% +\def\pounds{{\it\$}} + +% @euro{} comes from a separate font, depending on the current style. +% We use the free feym* fonts from the eurosym package by Henrik +% Theiling, which support regular, slanted, bold and bold slanted (and +% "outlined" (blackboard board, sort of) versions, which we don't need). +% It is available from http://www.ctan.org/tex-archive/fonts/eurosym. +% +% Although only regular is the truly official Euro symbol, we ignore +% that. The Euro is designed to be slightly taller than the regular +% font height. +% +% feymr - regular +% feymo - slanted +% feybr - bold +% feybo - bold slanted +% +% There is no good (free) typewriter version, to my knowledge. +% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. +% Hmm. +% +% Also doesn't work in math. Do we need to do math with euro symbols? +% Hope not. +% +% +\def\euro{{\eurofont e}} +\def\eurofont{% + % We set the font at each command, rather than predefining it in + % \textfonts and the other font-switching commands, so that + % installations which never need the symbol don't have to have the + % font installed. + % + % There is only one designed size (nominal 10pt), so we always scale + % that to the current nominal size. + % + % By the way, simply using "at 1em" works for cmr10 and the like, but + % does not work for cmbx10 and other extended/shrunken fonts. + % + \def\eurosize{\csname\curfontsize nominalsize\endcsname}% + % + \ifx\curfontstyle\bfstylename + % bold: + \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize + \else + % regular: + \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize + \fi + \thiseurofont +} + +% Hacks for glyphs from the EC fonts similar to \euro. We don't +% use \let for the aliases, because sometimes we redefine the original +% macro, and the alias should reflect the redefinition. +\def\guillemetleft{{\ecfont \char"13}} +\def\guillemotleft{\guillemetleft} +\def\guillemetright{{\ecfont \char"14}} +\def\guillemotright{\guillemetright} +\def\guilsinglleft{{\ecfont \char"0E}} +\def\guilsinglright{{\ecfont \char"0F}} +\def\quotedblbase{{\ecfont \char"12}} +\def\quotesinglbase{{\ecfont \char"0D}} +% +% This positioning is not perfect (see the ogonek LaTeX package), but +% we have the precomposed glyphs for the most common cases. We put the +% tests to use those glyphs in the single \ogonek macro so we have fewer +% dummy definitions to worry about for index entries, etc. +% +% ogonek is also used with other letters in Lithuanian (IOU), but using +% the precomposed glyphs for those is not so easy since they aren't in +% the same EC font. +\def\ogonek#1{{% + \def\temp{#1}% + \ifx\temp\macrocharA\Aogonek + \else\ifx\temp\macrochara\aogonek + \else\ifx\temp\macrocharE\Eogonek + \else\ifx\temp\macrochare\eogonek + \else + \ecfont \setbox0=\hbox{#1}% + \ifdim\ht0=1ex\accent"0C #1% + \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% + \fi + \fi\fi\fi\fi + }% +} +\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} +\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} +\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} +\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} +% +\def\ecfont{% + % We can't distinguish serif/sans and italic/slanted, but this + % is used for crude hacks anyway (like adding French and German + % quotes to documents typeset with CM, where we lose kerning), so + % hopefully nobody will notice/care. + \edef\ecsize{\csname\curfontsize ecsize\endcsname}% + \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% + \ifx\curfontstyle\bfstylename + % bold: + \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize + \else + % regular: + \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize + \fi + \thisecfont +} + +% @registeredsymbol - R in a circle. The font for the R should really +% be smaller yet, but lllsize is the best we can do for now. +% Adapted from the plain.tex definition of \copyright. +% +\def\registeredsymbol{% + $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% + \hfil\crcr\Orb}}% + }$% +} + +% @textdegree - the normal degrees sign. +% +\def\textdegree{$^\circ$} + +% Laurent Siebenmann reports \Orb undefined with: +% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 +% so we'll define it if necessary. +% +\ifx\Orb\undefined +\def\Orb{\mathhexbox20D} +\fi + +% Quotes. +\chardef\quotedblleft="5C +\chardef\quotedblright=`\" +\chardef\quoteleft=`\` +\chardef\quoteright=`\' + + +\message{page headings,} + +\newskip\titlepagetopglue \titlepagetopglue = 1.5in +\newskip\titlepagebottomglue \titlepagebottomglue = 2pc + +% First the title page. Must do @settitle before @titlepage. +\newif\ifseenauthor +\newif\iffinishedtitlepage + +% Do an implicit @contents or @shortcontents after @end titlepage if the +% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. +% +\newif\ifsetcontentsaftertitlepage + \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue +\newif\ifsetshortcontentsaftertitlepage + \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue + +\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% + \endgroup\page\hbox{}\page} + +\envdef\titlepage{% + % Open one extra group, as we want to close it in the middle of \Etitlepage. + \begingroup + \parindent=0pt \textfonts + % Leave some space at the very top of the page. + \vglue\titlepagetopglue + % No rule at page bottom unless we print one at the top with @title. + \finishedtitlepagetrue + % + % Most title ``pages'' are actually two pages long, with space + % at the top of the second. We don't want the ragged left on the second. + \let\oldpage = \page + \def\page{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + \let\page = \oldpage + \page + \null + }% +} + +\def\Etitlepage{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + % It is important to do the page break before ending the group, + % because the headline and footline are only empty inside the group. + % If we use the new definition of \page, we always get a blank page + % after the title page, which we certainly don't want. + \oldpage + \endgroup + % + % Need this before the \...aftertitlepage checks so that if they are + % in effect the toc pages will come out with page numbers. + \HEADINGSon + % + % If they want short, they certainly want long too. + \ifsetshortcontentsaftertitlepage + \shortcontents + \contents + \global\let\shortcontents = \relax + \global\let\contents = \relax + \fi + % + \ifsetcontentsaftertitlepage + \contents + \global\let\contents = \relax + \global\let\shortcontents = \relax + \fi +} + +\def\finishtitlepage{% + \vskip4pt \hrule height 2pt width \hsize + \vskip\titlepagebottomglue + \finishedtitlepagetrue +} + +%%% Macros to be used within @titlepage: + +\let\subtitlerm=\tenrm +\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} + +\parseargdef\title{% + \checkenv\titlepage + \leftline{\titlefonts\rmisbold #1} + % print a rule at the page bottom also. + \finishedtitlepagefalse + \vskip4pt \hrule height 4pt width \hsize \vskip4pt +} + +\parseargdef\subtitle{% + \checkenv\titlepage + {\subtitlefont \rightline{#1}}% +} + +% @author should come last, but may come many times. +% It can also be used inside @quotation. +% +\parseargdef\author{% + \def\temp{\quotation}% + \ifx\thisenv\temp + \def\quotationauthor{#1}% printed in \Equotation. + \else + \checkenv\titlepage + \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi + {\secfonts\rmisbold \leftline{#1}}% + \fi +} + + +%%% Set up page headings and footings. + +\let\thispage=\folio + +\newtoks\evenheadline % headline on even pages +\newtoks\oddheadline % headline on odd pages +\newtoks\evenfootline % footline on even pages +\newtoks\oddfootline % footline on odd pages + +% Now make TeX use those variables +\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline + \else \the\evenheadline \fi}} +\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline + \else \the\evenfootline \fi}\HEADINGShook} +\let\HEADINGShook=\relax + +% Commands to set those variables. +% For example, this is what @headings on does +% @evenheading @thistitle|@thispage|@thischapter +% @oddheading @thischapter|@thispage|@thistitle +% @evenfooting @thisfile|| +% @oddfooting ||@thisfile + + +\def\evenheading{\parsearg\evenheadingxxx} +\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} +\def\evenheadingyyy #1\|#2\|#3\|#4\finish{% +\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\def\oddheading{\parsearg\oddheadingxxx} +\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} +\def\oddheadingyyy #1\|#2\|#3\|#4\finish{% +\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% + +\def\evenfooting{\parsearg\evenfootingxxx} +\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} +\def\evenfootingyyy #1\|#2\|#3\|#4\finish{% +\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\def\oddfooting{\parsearg\oddfootingxxx} +\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} +\def\oddfootingyyy #1\|#2\|#3\|#4\finish{% + \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% + % + % Leave some space for the footline. Hopefully ok to assume + % @evenfooting will not be used by itself. + \global\advance\pageheight by -12pt + \global\advance\vsize by -12pt +} + +\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} + +% @evenheadingmarks top \thischapter <- chapter at the top of a page +% @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page +% +% The same set of arguments for: +% +% @oddheadingmarks +% @evenfootingmarks +% @oddfootingmarks +% @everyheadingmarks +% @everyfootingmarks + +\def\evenheadingmarks{\headingmarks{even}{heading}} +\def\oddheadingmarks{\headingmarks{odd}{heading}} +\def\evenfootingmarks{\headingmarks{even}{footing}} +\def\oddfootingmarks{\headingmarks{odd}{footing}} +\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} + \headingmarks{odd}{heading}{#1} } +\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} + \headingmarks{odd}{footing}{#1} } +% #1 = even/odd, #2 = heading/footing, #3 = top/bottom. +\def\headingmarks#1#2#3 {% + \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname + \global\expandafter\let\csname get#1#2marks\endcsname \temp +} + +\everyheadingmarks bottom +\everyfootingmarks bottom + +% @headings double turns headings on for double-sided printing. +% @headings single turns headings on for single-sided printing. +% @headings off turns them off. +% @headings on same as @headings double, retained for compatibility. +% @headings after turns on double-sided headings after this page. +% @headings doubleafter turns on double-sided headings after this page. +% @headings singleafter turns on single-sided headings after this page. +% By default, they are off at the start of a document, +% and turned `on' after @end titlepage. + +\def\headings #1 {\csname HEADINGS#1\endcsname} + +\def\HEADINGSoff{% +\global\evenheadline={\hfil} \global\evenfootline={\hfil} +\global\oddheadline={\hfil} \global\oddfootline={\hfil}} +\HEADINGSoff +% When we turn headings on, set the page number to 1. +% For double-sided printing, put current file name in lower left corner, +% chapter name on inside top of right hand pages, document +% title on inside top of left hand pages, and page numbers on outside top +% edge of all pages. +\def\HEADINGSdouble{% +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} +\let\contentsalignmacro = \chappager + +% For single-sided printing, chapter title goes across top left of page, +% page number on top right. +\def\HEADINGSsingle{% +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} +\def\HEADINGSon{\HEADINGSdouble} + +\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} +\let\HEADINGSdoubleafter=\HEADINGSafter +\def\HEADINGSdoublex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} + +\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} +\def\HEADINGSsinglex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} + +% Subroutines used in generating headings +% This produces Day Month Year style of output. +% Only define if not already defined, in case a txi-??.tex file has set +% up a different format (e.g., txi-cs.tex does this). +\ifx\today\undefined +\def\today{% + \number\day\space + \ifcase\month + \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr + \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug + \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec + \fi + \space\number\year} +\fi + +% @settitle line... specifies the title of the document, for headings. +% It generates no output of its own. +\def\thistitle{\putwordNoTitle} +\def\settitle{\parsearg{\gdef\thistitle}} + + +\message{tables,} +% Tables -- @table, @ftable, @vtable, @item(x). + +% default indentation of table text +\newdimen\tableindent \tableindent=.8in +% default indentation of @itemize and @enumerate text +\newdimen\itemindent \itemindent=.3in +% margin between end of table item and start of table text. +\newdimen\itemmargin \itemmargin=.1in + +% used internally for \itemindent minus \itemmargin +\newdimen\itemmax + +% Note @table, @ftable, and @vtable define @item, @itemx, etc., with +% these defs. +% They also define \itemindex +% to index the item name in whatever manner is desired (perhaps none). + +\newif\ifitemxneedsnegativevskip + +\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} + +\def\internalBitem{\smallbreak \parsearg\itemzzz} +\def\internalBitemx{\itemxpar \parsearg\itemzzz} + +\def\itemzzz #1{\begingroup % + \advance\hsize by -\rightskip + \advance\hsize by -\tableindent + \setbox0=\hbox{\itemindicate{#1}}% + \itemindex{#1}% + \nobreak % This prevents a break before @itemx. + % + % If the item text does not fit in the space we have, put it on a line + % by itself, and do not allow a page break either before or after that + % line. We do not start a paragraph here because then if the next + % command is, e.g., @kindex, the whatsit would get put into the + % horizontal list on a line by itself, resulting in extra blank space. + \ifdim \wd0>\itemmax + % + % Make this a paragraph so we get the \parskip glue and wrapping, + % but leave it ragged-right. + \begingroup + \advance\leftskip by-\tableindent + \advance\hsize by\tableindent + \advance\rightskip by0pt plus1fil + \leavevmode\unhbox0\par + \endgroup + % + % We're going to be starting a paragraph, but we don't want the + % \parskip glue -- logically it's part of the @item we just started. + \nobreak \vskip-\parskip + % + % Stop a page break at the \parskip glue coming up. However, if + % what follows is an environment such as @example, there will be no + % \parskip glue; then the negative vskip we just inserted would + % cause the example and the item to crash together. So we use this + % bizarre value of 10001 as a signal to \aboveenvbreak to insert + % \parskip glue after all. Section titles are handled this way also. + % + \penalty 10001 + \endgroup + \itemxneedsnegativevskipfalse + \else + % The item text fits into the space. Start a paragraph, so that the + % following text (if any) will end up on the same line. + \noindent + % Do this with kerns and \unhbox so that if there is a footnote in + % the item text, it can migrate to the main vertical list and + % eventually be printed. + \nobreak\kern-\tableindent + \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 + \unhbox0 + \nobreak\kern\dimen0 + \endgroup + \itemxneedsnegativevskiptrue + \fi +} + +\def\item{\errmessage{@item while not in a list environment}} +\def\itemx{\errmessage{@itemx while not in a list environment}} + +% @table, @ftable, @vtable. +\envdef\table{% + \let\itemindex\gobble + \tablecheck{table}% +} +\envdef\ftable{% + \def\itemindex ##1{\doind {fn}{\code{##1}}}% + \tablecheck{ftable}% +} +\envdef\vtable{% + \def\itemindex ##1{\doind {vr}{\code{##1}}}% + \tablecheck{vtable}% +} +\def\tablecheck#1{% + \ifnum \the\catcode`\^^M=\active + \endgroup + \errmessage{This command won't work in this context; perhaps the problem is + that we are \inenvironment\thisenv}% + \def\next{\doignore{#1}}% + \else + \let\next\tablex + \fi + \next +} +\def\tablex#1{% + \def\itemindicate{#1}% + \parsearg\tabley +} +\def\tabley#1{% + {% + \makevalueexpandable + \edef\temp{\noexpand\tablez #1\space\space\space}% + \expandafter + }\temp \endtablez +} +\def\tablez #1 #2 #3 #4\endtablez{% + \aboveenvbreak + \ifnum 0#1>0 \advance \leftskip by #1\mil \fi + \ifnum 0#2>0 \tableindent=#2\mil \fi + \ifnum 0#3>0 \advance \rightskip by #3\mil \fi + \itemmax=\tableindent + \advance \itemmax by -\itemmargin + \advance \leftskip by \tableindent + \exdentamount=\tableindent + \parindent = 0pt + \parskip = \smallskipamount + \ifdim \parskip=0pt \parskip=2pt \fi + \let\item = \internalBitem + \let\itemx = \internalBitemx +} +\def\Etable{\endgraf\afterenvbreak} +\let\Eftable\Etable +\let\Evtable\Etable +\let\Eitemize\Etable +\let\Eenumerate\Etable + +% This is the counter used by @enumerate, which is really @itemize + +\newcount \itemno + +\envdef\itemize{\parsearg\doitemize} + +\def\doitemize#1{% + \aboveenvbreak + \itemmax=\itemindent + \advance\itemmax by -\itemmargin + \advance\leftskip by \itemindent + \exdentamount=\itemindent + \parindent=0pt + \parskip=\smallskipamount + \ifdim\parskip=0pt \parskip=2pt \fi + % + % Try typesetting the item mark that if the document erroneously says + % something like @itemize @samp (intending @table), there's an error + % right away at the @itemize. It's not the best error message in the + % world, but it's better than leaving it to the @item. This means if + % the user wants an empty mark, they have to say @w{} not just @w. + \def\itemcontents{#1}% + \setbox0 = \hbox{\itemcontents}% + % + % @itemize with no arg is equivalent to @itemize @bullet. + \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi + % + \let\item=\itemizeitem +} + +% Definition of @item while inside @itemize and @enumerate. +% +\def\itemizeitem{% + \advance\itemno by 1 % for enumerations + {\let\par=\endgraf \smallbreak}% reasonable place to break + {% + % If the document has an @itemize directly after a section title, a + % \nobreak will be last on the list, and \sectionheading will have + % done a \vskip-\parskip. In that case, we don't want to zero + % parskip, or the item text will crash with the heading. On the + % other hand, when there is normal text preceding the item (as there + % usually is), we do want to zero parskip, or there would be too much + % space. In that case, we won't have a \nobreak before. At least + % that's the theory. + \ifnum\lastpenalty<10000 \parskip=0in \fi + \noindent + \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% + % + \vadjust{\penalty 1200}}% not good to break after first line of item. + \flushcr +} + +% \splitoff TOKENS\endmark defines \first to be the first token in +% TOKENS, and \rest to be the remainder. +% +\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% + +% Allow an optional argument of an uppercase letter, lowercase letter, +% or number, to specify the first label in the enumerated list. No +% argument is the same as `1'. +% +\envparseargdef\enumerate{\enumeratey #1 \endenumeratey} +\def\enumeratey #1 #2\endenumeratey{% + % If we were given no argument, pretend we were given `1'. + \def\thearg{#1}% + \ifx\thearg\empty \def\thearg{1}\fi + % + % Detect if the argument is a single token. If so, it might be a + % letter. Otherwise, the only valid thing it can be is a number. + % (We will always have one token, because of the test we just made. + % This is a good thing, since \splitoff doesn't work given nothing at + % all -- the first parameter is undelimited.) + \expandafter\splitoff\thearg\endmark + \ifx\rest\empty + % Only one token in the argument. It could still be anything. + % A ``lowercase letter'' is one whose \lccode is nonzero. + % An ``uppercase letter'' is one whose \lccode is both nonzero, and + % not equal to itself. + % Otherwise, we assume it's a number. + % + % We need the \relax at the end of the \ifnum lines to stop TeX from + % continuing to look for a . + % + \ifnum\lccode\expandafter`\thearg=0\relax + \numericenumerate % a number (we hope) + \else + % It's a letter. + \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax + \lowercaseenumerate % lowercase letter + \else + \uppercaseenumerate % uppercase letter + \fi + \fi + \else + % Multiple tokens in the argument. We hope it's a number. + \numericenumerate + \fi +} + +% An @enumerate whose labels are integers. The starting integer is +% given in \thearg. +% +\def\numericenumerate{% + \itemno = \thearg + \startenumeration{\the\itemno}% +} + +% The starting (lowercase) letter is in \thearg. +\def\lowercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more lowercase letters in @enumerate; get a bigger + alphabet}% + \fi + \char\lccode\itemno + }% +} + +% The starting (uppercase) letter is in \thearg. +\def\uppercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more uppercase letters in @enumerate; get a bigger + alphabet} + \fi + \char\uccode\itemno + }% +} + +% Call \doitemize, adding a period to the first argument and supplying the +% common last two arguments. Also subtract one from the initial value in +% \itemno, since @item increments \itemno. +% +\def\startenumeration#1{% + \advance\itemno by -1 + \doitemize{#1.}\flushcr +} + +% @alphaenumerate and @capsenumerate are abbreviations for giving an arg +% to @enumerate. +% +\def\alphaenumerate{\enumerate{a}} +\def\capsenumerate{\enumerate{A}} +\def\Ealphaenumerate{\Eenumerate} +\def\Ecapsenumerate{\Eenumerate} + + +% @multitable macros +% Amy Hendrickson, 8/18/94, 3/6/96 +% +% @multitable ... @end multitable will make as many columns as desired. +% Contents of each column will wrap at width given in preamble. Width +% can be specified either with sample text given in a template line, +% or in percent of \hsize, the current width of text on page. + +% Table can continue over pages but will only break between lines. + +% To make preamble: +% +% Either define widths of columns in terms of percent of \hsize: +% @multitable @columnfractions .25 .3 .45 +% @item ... +% +% Numbers following @columnfractions are the percent of the total +% current hsize to be used for each column. You may use as many +% columns as desired. + + +% Or use a template: +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item ... +% using the widest term desired in each column. + +% Each new table line starts with @item, each subsequent new column +% starts with @tab. Empty columns may be produced by supplying @tab's +% with nothing between them for as many times as empty columns are needed, +% ie, @tab@tab@tab will produce two empty columns. + +% @item, @tab do not need to be on their own lines, but it will not hurt +% if they are. + +% Sample multitable: + +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item first col stuff @tab second col stuff @tab third col +% @item +% first col stuff +% @tab +% second col stuff +% @tab +% third col +% @item first col stuff @tab second col stuff +% @tab Many paragraphs of text may be used in any column. +% +% They will wrap at the width determined by the template. +% @item@tab@tab This will be in third column. +% @end multitable + +% Default dimensions may be reset by user. +% @multitableparskip is vertical space between paragraphs in table. +% @multitableparindent is paragraph indent in table. +% @multitablecolmargin is horizontal space to be left between columns. +% @multitablelinespace is space to leave between table items, baseline +% to baseline. +% 0pt means it depends on current normal line spacing. +% +\newskip\multitableparskip +\newskip\multitableparindent +\newdimen\multitablecolspace +\newskip\multitablelinespace +\multitableparskip=0pt +\multitableparindent=6pt +\multitablecolspace=12pt +\multitablelinespace=0pt + +% Macros used to set up halign preamble: +% +\let\endsetuptable\relax +\def\xendsetuptable{\endsetuptable} +\let\columnfractions\relax +\def\xcolumnfractions{\columnfractions} +\newif\ifsetpercent + +% #1 is the @columnfraction, usually a decimal number like .5, but might +% be just 1. We just use it, whatever it is. +% +\def\pickupwholefraction#1 {% + \global\advance\colcount by 1 + \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% + \setuptable +} + +\newcount\colcount +\def\setuptable#1{% + \def\firstarg{#1}% + \ifx\firstarg\xendsetuptable + \let\go = \relax + \else + \ifx\firstarg\xcolumnfractions + \global\setpercenttrue + \else + \ifsetpercent + \let\go\pickupwholefraction + \else + \global\advance\colcount by 1 + \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a + % separator; typically that is always in the input, anyway. + \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% + \fi + \fi + \ifx\go\pickupwholefraction + % Put the argument back for the \pickupwholefraction call, so + % we'll always have a period there to be parsed. + \def\go{\pickupwholefraction#1}% + \else + \let\go = \setuptable + \fi% + \fi + \go +} + +% multitable-only commands. +% +% @headitem starts a heading row, which we typeset in bold. +% Assignments have to be global since we are inside the implicit group +% of an alignment entry. \everycr resets \everytab so we don't have to +% undo it ourselves. +\def\headitemfont{\b}% for people to use in the template row; not changeable +\def\headitem{% + \checkenv\multitable + \crcr + \global\everytab={\bf}% can't use \headitemfont since the parsing differs + \the\everytab % for the first item +}% +% +% A \tab used to include \hskip1sp. But then the space in a template +% line is not enough. That is bad. So let's go back to just `&' until +% we again encounter the problem the 1sp was intended to solve. +% --karl, nathan@acm.org, 20apr99. +\def\tab{\checkenv\multitable &\the\everytab}% + +% @multitable ... @end multitable definitions: +% +\newtoks\everytab % insert after every tab. +% +\envdef\multitable{% + \vskip\parskip + \startsavinginserts + % + % @item within a multitable starts a normal row. + % We use \def instead of \let so that if one of the multitable entries + % contains an @itemize, we don't choke on the \item (seen as \crcr aka + % \endtemplate) expanding \doitemize. + \def\item{\crcr}% + % + \tolerance=9500 + \hbadness=9500 + \setmultitablespacing + \parskip=\multitableparskip + \parindent=\multitableparindent + \overfullrule=0pt + \global\colcount=0 + % + \everycr = {% + \noalign{% + \global\everytab={}% + \global\colcount=0 % Reset the column counter. + % Check for saved footnotes, etc. + \checkinserts + % Keeps underfull box messages off when table breaks over pages. + %\filbreak + % Maybe so, but it also creates really weird page breaks when the + % table breaks over pages. Wouldn't \vfil be better? Wait until the + % problem manifests itself, so it can be fixed for real --karl. + }% + }% + % + \parsearg\domultitable +} +\def\domultitable#1{% + % To parse everything between @multitable and @item: + \setuptable#1 \endsetuptable + % + % This preamble sets up a generic column definition, which will + % be used as many times as user calls for columns. + % \vtop will set a single line and will also let text wrap and + % continue for many paragraphs if desired. + \halign\bgroup &% + \global\advance\colcount by 1 + \multistrut + \vtop{% + % Use the current \colcount to find the correct column width: + \hsize=\expandafter\csname col\the\colcount\endcsname + % + % In order to keep entries from bumping into each other + % we will add a \leftskip of \multitablecolspace to all columns after + % the first one. + % + % If a template has been used, we will add \multitablecolspace + % to the width of each template entry. + % + % If the user has set preamble in terms of percent of \hsize we will + % use that dimension as the width of the column, and the \leftskip + % will keep entries from bumping into each other. Table will start at + % left margin and final column will justify at right margin. + % + % Make sure we don't inherit \rightskip from the outer environment. + \rightskip=0pt + \ifnum\colcount=1 + % The first column will be indented with the surrounding text. + \advance\hsize by\leftskip + \else + \ifsetpercent \else + % If user has not set preamble in terms of percent of \hsize + % we will advance \hsize by \multitablecolspace. + \advance\hsize by \multitablecolspace + \fi + % In either case we will make \leftskip=\multitablecolspace: + \leftskip=\multitablecolspace + \fi + % Ignoring space at the beginning and end avoids an occasional spurious + % blank line, when TeX decides to break the line at the space before the + % box from the multistrut, so the strut ends up on a line by itself. + % For example: + % @multitable @columnfractions .11 .89 + % @item @code{#} + % @tab Legal holiday which is valid in major parts of the whole country. + % Is automatically provided with highlighting sequences respectively + % marking characters. + \noindent\ignorespaces##\unskip\multistrut + }\cr +} +\def\Emultitable{% + \crcr + \egroup % end the \halign + \global\setpercentfalse +} + +\def\setmultitablespacing{% + \def\multistrut{\strut}% just use the standard line spacing + % + % Compute \multitablelinespace (if not defined by user) for use in + % \multitableparskip calculation. We used define \multistrut based on + % this, but (ironically) that caused the spacing to be off. + % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. +\ifdim\multitablelinespace=0pt +\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip +\global\advance\multitablelinespace by-\ht0 +\fi +%% Test to see if parskip is larger than space between lines of +%% table. If not, do nothing. +%% If so, set to same dimension as multitablelinespace. +\ifdim\multitableparskip>\multitablelinespace +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller + %% than skip between lines in the table. +\fi% +\ifdim\multitableparskip=0pt +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller + %% than skip between lines in the table. +\fi} + + +\message{conditionals,} + +% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, +% @ifnotxml always succeed. They currently do nothing; we don't +% attempt to check whether the conditionals are properly nested. But we +% have to remember that they are conditionals, so that @end doesn't +% attempt to close an environment group. +% +\def\makecond#1{% + \expandafter\let\csname #1\endcsname = \relax + \expandafter\let\csname iscond.#1\endcsname = 1 +} +\makecond{iftex} +\makecond{ifnotdocbook} +\makecond{ifnothtml} +\makecond{ifnotinfo} +\makecond{ifnotplaintext} +\makecond{ifnotxml} + +% Ignore @ignore, @ifhtml, @ifinfo, and the like. +% +\def\direntry{\doignore{direntry}} +\def\documentdescription{\doignore{documentdescription}} +\def\docbook{\doignore{docbook}} +\def\html{\doignore{html}} +\def\ifdocbook{\doignore{ifdocbook}} +\def\ifhtml{\doignore{ifhtml}} +\def\ifinfo{\doignore{ifinfo}} +\def\ifnottex{\doignore{ifnottex}} +\def\ifplaintext{\doignore{ifplaintext}} +\def\ifxml{\doignore{ifxml}} +\def\ignore{\doignore{ignore}} +\def\menu{\doignore{menu}} +\def\xml{\doignore{xml}} + +% Ignore text until a line `@end #1', keeping track of nested conditionals. +% +% A count to remember the depth of nesting. +\newcount\doignorecount + +\def\doignore#1{\begingroup + % Scan in ``verbatim'' mode: + \obeylines + \catcode`\@ = \other + \catcode`\{ = \other + \catcode`\} = \other + % + % Make sure that spaces turn into tokens that match what \doignoretext wants. + \spaceisspace + % + % Count number of #1's that we've seen. + \doignorecount = 0 + % + % Swallow text until we reach the matching `@end #1'. + \dodoignore{#1}% +} + +{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. + \obeylines % + % + \gdef\dodoignore#1{% + % #1 contains the command name as a string, e.g., `ifinfo'. + % + % Define a command to find the next `@end #1'. + \long\def\doignoretext##1^^M@end #1{% + \doignoretextyyy##1^^M@#1\_STOP_}% + % + % And this command to find another #1 command, at the beginning of a + % line. (Otherwise, we would consider a line `@c @ifset', for + % example, to count as an @ifset for nesting.) + \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% + % + % And now expand that command. + \doignoretext ^^M% + }% +} + +\def\doignoreyyy#1{% + \def\temp{#1}% + \ifx\temp\empty % Nothing found. + \let\next\doignoretextzzz + \else % Found a nested condition, ... + \advance\doignorecount by 1 + \let\next\doignoretextyyy % ..., look for another. + % If we're here, #1 ends with ^^M\ifinfo (for example). + \fi + \next #1% the token \_STOP_ is present just after this macro. +} + +% We have to swallow the remaining "\_STOP_". +% +\def\doignoretextzzz#1{% + \ifnum\doignorecount = 0 % We have just found the outermost @end. + \let\next\enddoignore + \else % Still inside a nested condition. + \advance\doignorecount by -1 + \let\next\doignoretext % Look for the next @end. + \fi + \next +} + +% Finish off ignored text. +{ \obeylines% + % Ignore anything after the last `@end #1'; this matters in verbatim + % environments, where otherwise the newline after an ignored conditional + % would result in a blank line in the output. + \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% +} + + +% @set VAR sets the variable VAR to an empty value. +% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. +% +% Since we want to separate VAR from REST-OF-LINE (which might be +% empty), we can't just use \parsearg; we have to insert a space of our +% own to delimit the rest of the line, and then take it out again if we +% didn't need it. +% We rely on the fact that \parsearg sets \catcode`\ =10. +% +\parseargdef\set{\setyyy#1 \endsetyyy} +\def\setyyy#1 #2\endsetyyy{% + {% + \makevalueexpandable + \def\temp{#2}% + \edef\next{\gdef\makecsname{SET#1}}% + \ifx\temp\empty + \next{}% + \else + \setzzz#2\endsetzzz + \fi + }% +} +% Remove the trailing space \setxxx inserted. +\def\setzzz#1 \endsetzzz{\next{#1}} + +% @clear VAR clears (i.e., unsets) the variable VAR. +% +\parseargdef\clear{% + {% + \makevalueexpandable + \global\expandafter\let\csname SET#1\endcsname=\relax + }% +} + +% @value{foo} gets the text saved in variable foo. +\def\value{\begingroup\makevalueexpandable\valuexxx} +\def\valuexxx#1{\expandablevalue{#1}\endgroup} +{ + \catcode`\- = \active \catcode`\_ = \active + % + \gdef\makevalueexpandable{% + \let\value = \expandablevalue + % We don't want these characters active, ... + \catcode`\-=\other \catcode`\_=\other + % ..., but we might end up with active ones in the argument if + % we're called from @code, as @code{@value{foo-bar_}}, though. + % So \let them to their normal equivalents. + \let-\realdash \let_\normalunderscore + } +} + +% We have this subroutine so that we can handle at least some @value's +% properly in indexes (we call \makevalueexpandable in \indexdummies). +% The command has to be fully expandable (if the variable is set), since +% the result winds up in the index file. This means that if the +% variable's value contains other Texinfo commands, it's almost certain +% it will fail (although perhaps we could fix that with sufficient work +% to do a one-level expansion on the result, instead of complete). +% +\def\expandablevalue#1{% + \expandafter\ifx\csname SET#1\endcsname\relax + {[No value for ``#1'']}% + \message{Variable `#1', used in @value, is not set.}% + \else + \csname SET#1\endcsname + \fi +} + +% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined +% with @set. +% +% To get special treatment of `@end ifset,' call \makeond and the redefine. +% +\makecond{ifset} +\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} +\def\doifset#1#2{% + {% + \makevalueexpandable + \let\next=\empty + \expandafter\ifx\csname SET#2\endcsname\relax + #1% If not set, redefine \next. + \fi + \expandafter + }\next +} +\def\ifsetfail{\doignore{ifset}} + +% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been +% defined with @set, or has been undefined with @clear. +% +% The `\else' inside the `\doifset' parameter is a trick to reuse the +% above code: if the variable is not set, do nothing, if it is set, +% then redefine \next to \ifclearfail. +% +\makecond{ifclear} +\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} +\def\ifclearfail{\doignore{ifclear}} + +% @dircategory CATEGORY -- specify a category of the dir file +% which this file should belong to. Ignore this in TeX. +\let\dircategory=\comment + +% @defininfoenclose. +\let\definfoenclose=\comment + + +\message{indexing,} +% Index generation facilities + +% Define \newwrite to be identical to plain tex's \newwrite +% except not \outer, so it can be used within macros and \if's. +\edef\newwrite{\makecsname{ptexnewwrite}} + +% \newindex {foo} defines an index named foo. +% It automatically defines \fooindex such that +% \fooindex ...rest of line... puts an entry in the index foo. +% It also defines \fooindfile to be the number of the output channel for +% the file that accumulates this index. The file's extension is foo. +% The name of an index should be no more than 2 characters long +% for the sake of vms. +% +\def\newindex#1{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 % Open the file + \fi + \expandafter\xdef\csname#1index\endcsname{% % Define @#1index + \noexpand\doindex{#1}} +} + +% @defindex foo == \newindex{foo} +% +\def\defindex{\parsearg\newindex} + +% Define @defcodeindex, like @defindex except put all entries in @code. +% +\def\defcodeindex{\parsearg\newcodeindex} +% +\def\newcodeindex#1{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 + \fi + \expandafter\xdef\csname#1index\endcsname{% + \noexpand\docodeindex{#1}}% +} + + +% @synindex foo bar makes index foo feed into index bar. +% Do this instead of @defindex foo if you don't want it as a separate index. +% +% @syncodeindex foo bar similar, but put all entries made for index foo +% inside @code. +% +\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} +\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} + +% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), +% #3 the target index (bar). +\def\dosynindex#1#2#3{% + % Only do \closeout if we haven't already done it, else we'll end up + % closing the target index. + \expandafter \ifx\csname donesynindex#2\endcsname \relax + % The \closeout helps reduce unnecessary open files; the limit on the + % Acorn RISC OS is a mere 16 files. + \expandafter\closeout\csname#2indfile\endcsname + \expandafter\let\csname donesynindex#2\endcsname = 1 + \fi + % redefine \fooindfile: + \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname + \expandafter\let\csname#2indfile\endcsname=\temp + % redefine \fooindex: + \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% +} + +% Define \doindex, the driver for all \fooindex macros. +% Argument #1 is generated by the calling \fooindex macro, +% and it is "foo", the name of the index. + +% \doindex just uses \parsearg; it calls \doind for the actual work. +% This is because \doind is more useful to call from other macros. + +% There is also \dosubind {index}{topic}{subtopic} +% which makes an entry in a two-level index such as the operation index. + +\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} +\def\singleindexer #1{\doind{\indexname}{#1}} + +% like the previous two, but they put @code around the argument. +\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} +\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} + +% Take care of Texinfo commands that can appear in an index entry. +% Since there are some commands we want to expand, and others we don't, +% we have to laboriously prevent expansion for those that we don't. +% +\def\indexdummies{% + \escapechar = `\\ % use backslash in output files. + \def\@{@}% change to @@ when we switch to @ as escape char in index files. + \def\ {\realbackslash\space }% + % + % Need these in case \tex is in effect and \{ is a \delimiter again. + % But can't use \lbracecmd and \rbracecmd because texindex assumes + % braces and backslashes are used only as delimiters. + \let\{ = \mylbrace + \let\} = \myrbrace + % + % I don't entirely understand this, but when an index entry is + % generated from a macro call, the \endinput which \scanmacro inserts + % causes processing to be prematurely terminated. This is, + % apparently, because \indexsorttmp is fully expanded, and \endinput + % is an expandable command. The redefinition below makes \endinput + % disappear altogether for that purpose -- although logging shows that + % processing continues to some further point. On the other hand, it + % seems \endinput does not hurt in the printed index arg, since that + % is still getting written without apparent harm. + % + % Sample source (mac-idx3.tex, reported by Graham Percival to + % help-texinfo, 22may06): + % @macro funindex {WORD} + % @findex xyz + % @end macro + % ... + % @funindex commtest + % + % The above is not enough to reproduce the bug, but it gives the flavor. + % + % Sample whatsit resulting: + % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} + % + % So: + \let\endinput = \empty + % + % Do the redefinitions. + \commondummies +} + +% For the aux and toc files, @ is the escape character. So we want to +% redefine everything using @ as the escape character (instead of +% \realbackslash, still used for index files). When everything uses @, +% this will be simpler. +% +\def\atdummies{% + \def\@{@@}% + \def\ {@ }% + \let\{ = \lbraceatcmd + \let\} = \rbraceatcmd + % + % Do the redefinitions. + \commondummies + \otherbackslash +} + +% Called from \indexdummies and \atdummies. +% +\def\commondummies{% + % + % \definedummyword defines \#1 as \string\#1\space, thus effectively + % preventing its expansion. This is used only for control% words, + % not control letters, because the \space would be incorrect for + % control characters, but is needed to separate the control word + % from whatever follows. + % + % For control letters, we have \definedummyletter, which omits the + % space. + % + % These can be used both for control words that take an argument and + % those that do not. If it is followed by {arg} in the input, then + % that will dutifully get written to the index (or wherever). + % + \def\definedummyword ##1{\def##1{\string##1\space}}% + \def\definedummyletter##1{\def##1{\string##1}}% + \let\definedummyaccent\definedummyletter + % + \commondummiesnofonts + % + \definedummyletter\_% + % + % Non-English letters. + \definedummyword\AA + \definedummyword\AE + \definedummyword\L + \definedummyword\OE + \definedummyword\O + \definedummyword\aa + \definedummyword\ae + \definedummyword\l + \definedummyword\oe + \definedummyword\o + \definedummyword\ss + \definedummyword\exclamdown + \definedummyword\questiondown + \definedummyword\ordf + \definedummyword\ordm + % + % Although these internal commands shouldn't show up, sometimes they do. + \definedummyword\bf + \definedummyword\gtr + \definedummyword\hat + \definedummyword\less + \definedummyword\sf + \definedummyword\sl + \definedummyword\tclose + \definedummyword\tt + % + \definedummyword\LaTeX + \definedummyword\TeX + % + % Assorted special characters. + \definedummyword\bullet + \definedummyword\comma + \definedummyword\copyright + \definedummyword\registeredsymbol + \definedummyword\dots + \definedummyword\enddots + \definedummyword\equiv + \definedummyword\error + \definedummyword\euro + \definedummyword\guillemetleft + \definedummyword\guillemetright + \definedummyword\guilsinglleft + \definedummyword\guilsinglright + \definedummyword\expansion + \definedummyword\minus + \definedummyword\ogonek + \definedummyword\pounds + \definedummyword\point + \definedummyword\print + \definedummyword\quotedblbase + \definedummyword\quotedblleft + \definedummyword\quotedblright + \definedummyword\quoteleft + \definedummyword\quoteright + \definedummyword\quotesinglbase + \definedummyword\result + \definedummyword\textdegree + % + % We want to disable all macros so that they are not expanded by \write. + \macrolist + % + \normalturnoffactive + % + % Handle some cases of @value -- where it does not contain any + % (non-fully-expandable) commands. + \makevalueexpandable +} + +% \commondummiesnofonts: common to \commondummies and \indexnofonts. +% +\def\commondummiesnofonts{% + % Control letters and accents. + \definedummyletter\!% + \definedummyaccent\"% + \definedummyaccent\'% + \definedummyletter\*% + \definedummyaccent\,% + \definedummyletter\.% + \definedummyletter\/% + \definedummyletter\:% + \definedummyaccent\=% + \definedummyletter\?% + \definedummyaccent\^% + \definedummyaccent\`% + \definedummyaccent\~% + \definedummyword\u + \definedummyword\v + \definedummyword\H + \definedummyword\dotaccent + \definedummyword\ogonek + \definedummyword\ringaccent + \definedummyword\tieaccent + \definedummyword\ubaraccent + \definedummyword\udotaccent + \definedummyword\dotless + % + % Texinfo font commands. + \definedummyword\b + \definedummyword\i + \definedummyword\r + \definedummyword\sc + \definedummyword\t + % + % Commands that take arguments. + \definedummyword\acronym + \definedummyword\cite + \definedummyword\code + \definedummyword\command + \definedummyword\dfn + \definedummyword\emph + \definedummyword\env + \definedummyword\file + \definedummyword\kbd + \definedummyword\key + \definedummyword\math + \definedummyword\option + \definedummyword\pxref + \definedummyword\ref + \definedummyword\samp + \definedummyword\strong + \definedummyword\tie + \definedummyword\uref + \definedummyword\url + \definedummyword\var + \definedummyword\verb + \definedummyword\w + \definedummyword\xref +} + +% \indexnofonts is used when outputting the strings to sort the index +% by, and when constructing control sequence names. It eliminates all +% control sequences and just writes whatever the best ASCII sort string +% would be for a given command (usually its argument). +% +\def\indexnofonts{% + % Accent commands should become @asis. + \def\definedummyaccent##1{\let##1\asis}% + % We can just ignore other control letters. + \def\definedummyletter##1{\let##1\empty}% + % Hopefully, all control words can become @asis. + \let\definedummyword\definedummyaccent + % + \commondummiesnofonts + % + % Don't no-op \tt, since it isn't a user-level command + % and is used in the definitions of the active chars like <, >, |, etc. + % Likewise with the other plain tex font commands. + %\let\tt=\asis + % + \def\ { }% + \def\@{@}% + % how to handle braces? + \def\_{\normalunderscore}% + % + % Non-English letters. + \def\AA{AA}% + \def\AE{AE}% + \def\L{L}% + \def\OE{OE}% + \def\O{O}% + \def\aa{aa}% + \def\ae{ae}% + \def\l{l}% + \def\oe{oe}% + \def\o{o}% + \def\ss{ss}% + \def\exclamdown{!}% + \def\questiondown{?}% + \def\ordf{a}% + \def\ordm{o}% + % + \def\LaTeX{LaTeX}% + \def\TeX{TeX}% + % + % Assorted special characters. + % (The following {} will end up in the sort string, but that's ok.) + \def\bullet{bullet}% + \def\comma{,}% + \def\copyright{copyright}% + \def\registeredsymbol{R}% + \def\dots{...}% + \def\enddots{...}% + \def\equiv{==}% + \def\error{error}% + \def\euro{euro}% + \def\guillemetleft{<<}% + \def\guillemetright{>>}% + \def\guilsinglleft{<}% + \def\guilsinglright{>}% + \def\expansion{==>}% + \def\minus{-}% + \def\pounds{pounds}% + \def\point{.}% + \def\print{-|}% + \def\quotedblbase{"}% + \def\quotedblleft{"}% + \def\quotedblright{"}% + \def\quoteleft{`}% + \def\quoteright{'}% + \def\quotesinglbase{,}% + \def\result{=>}% + \def\textdegree{degrees}% + % + % We need to get rid of all macros, leaving only the arguments (if present). + % Of course this is not nearly correct, but it is the best we can do for now. + % makeinfo does not expand macros in the argument to @deffn, which ends up + % writing an index entry, and texindex isn't prepared for an index sort entry + % that starts with \. + % + % Since macro invocations are followed by braces, we can just redefine them + % to take a single TeX argument. The case of a macro invocation that + % goes to end-of-line is not handled. + % + \macrolist +} + +\let\indexbackslash=0 %overridden during \printindex. +\let\SETmarginindex=\relax % put index entries in margin (undocumented)? + +% Most index entries go through here, but \dosubind is the general case. +% #1 is the index name, #2 is the entry text. +\def\doind#1#2{\dosubind{#1}{#2}{}} + +% Workhorse for all \fooindexes. +% #1 is name of index, #2 is stuff to put there, #3 is subentry -- +% empty if called from \doind, as we usually are (the main exception +% is with most defuns, which call us directly). +% +\def\dosubind#1#2#3{% + \iflinks + {% + % Store the main index entry text (including the third arg). + \toks0 = {#2}% + % If third arg is present, precede it with a space. + \def\thirdarg{#3}% + \ifx\thirdarg\empty \else + \toks0 = \expandafter{\the\toks0 \space #3}% + \fi + % + \edef\writeto{\csname#1indfile\endcsname}% + % + \safewhatsit\dosubindwrite + }% + \fi +} + +% Write the entry in \toks0 to the index file: +% +\def\dosubindwrite{% + % Put the index entry in the margin if desired. + \ifx\SETmarginindex\relax\else + \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% + \fi + % + % Remember, we are within a group. + \indexdummies % Must do this here, since \bf, etc expand at this stage + \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now + % so it will be output as is; and it will print as backslash. + % + % Process the index entry with all font commands turned off, to + % get the string to sort by. + {\indexnofonts + \edef\temp{\the\toks0}% need full expansion + \xdef\indexsorttmp{\temp}% + }% + % + % Set up the complete index entry, with both the sort key and + % the original text, including any font commands. We write + % three arguments to \entry to the .?? file (four in the + % subentry case), texindex reduces to two when writing the .??s + % sorted result. + \edef\temp{% + \write\writeto{% + \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% + }% + \temp +} + +% Take care of unwanted page breaks/skips around a whatsit: +% +% If a skip is the last thing on the list now, preserve it +% by backing up by \lastskip, doing the \write, then inserting +% the skip again. Otherwise, the whatsit generated by the +% \write or \pdfdest will make \lastskip zero. The result is that +% sequences like this: +% @end defun +% @tindex whatever +% @defun ... +% will have extra space inserted, because the \medbreak in the +% start of the @defun won't see the skip inserted by the @end of +% the previous defun. +% +% But don't do any of this if we're not in vertical mode. We +% don't want to do a \vskip and prematurely end a paragraph. +% +% Avoid page breaks due to these extra skips, too. +% +% But wait, there is a catch there: +% We'll have to check whether \lastskip is zero skip. \ifdim is not +% sufficient for this purpose, as it ignores stretch and shrink parts +% of the skip. The only way seems to be to check the textual +% representation of the skip. +% +% The following is almost like \def\zeroskipmacro{0.0pt} except that +% the ``p'' and ``t'' characters have catcode \other, not 11 (letter). +% +\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} +% +\newskip\whatsitskip +\newcount\whatsitpenalty +% +% ..., ready, GO: +% +\def\safewhatsit#1{% +\ifhmode + #1% +\else + % \lastskip and \lastpenalty cannot both be nonzero simultaneously. + \whatsitskip = \lastskip + \edef\lastskipmacro{\the\lastskip}% + \whatsitpenalty = \lastpenalty + % + % If \lastskip is nonzero, that means the last item was a + % skip. And since a skip is discardable, that means this + % -\whatsitskip glue we're inserting is preceded by a + % non-discardable item, therefore it is not a potential + % breakpoint, therefore no \nobreak needed. + \ifx\lastskipmacro\zeroskipmacro + \else + \vskip-\whatsitskip + \fi + % + #1% + % + \ifx\lastskipmacro\zeroskipmacro + % If \lastskip was zero, perhaps the last item was a penalty, and + % perhaps it was >=10000, e.g., a \nobreak. In that case, we want + % to re-insert the same penalty (values >10000 are used for various + % signals); since we just inserted a non-discardable item, any + % following glue (such as a \parskip) would be a breakpoint. For example: + % + % @deffn deffn-whatever + % @vindex index-whatever + % Description. + % would allow a break between the index-whatever whatsit + % and the "Description." paragraph. + \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi + \else + % On the other hand, if we had a nonzero \lastskip, + % this make-up glue would be preceded by a non-discardable item + % (the whatsit from the \write), so we must insert a \nobreak. + \nobreak\vskip\whatsitskip + \fi +\fi +} + +% The index entry written in the file actually looks like +% \entry {sortstring}{page}{topic} +% or +% \entry {sortstring}{page}{topic}{subtopic} +% The texindex program reads in these files and writes files +% containing these kinds of lines: +% \initial {c} +% before the first topic whose initial is c +% \entry {topic}{pagelist} +% for a topic that is used without subtopics +% \primary {topic} +% for the beginning of a topic that is used with subtopics +% \secondary {subtopic}{pagelist} +% for each subtopic. + +% Define the user-accessible indexing commands +% @findex, @vindex, @kindex, @cindex. + +\def\findex {\fnindex} +\def\kindex {\kyindex} +\def\cindex {\cpindex} +\def\vindex {\vrindex} +\def\tindex {\tpindex} +\def\pindex {\pgindex} + +\def\cindexsub {\begingroup\obeylines\cindexsub} +{\obeylines % +\gdef\cindexsub "#1" #2^^M{\endgroup % +\dosubind{cp}{#2}{#1}}} + +% Define the macros used in formatting output of the sorted index material. + +% @printindex causes a particular index (the ??s file) to get printed. +% It does not print any chapter heading (usually an @unnumbered). +% +\parseargdef\printindex{\begingroup + \dobreak \chapheadingskip{10000}% + % + \smallfonts \rm + \tolerance = 9500 + \plainfrenchspacing + \everypar = {}% don't want the \kern\-parindent from indentation suppression. + % + % See if the index file exists and is nonempty. + % Change catcode of @ here so that if the index file contains + % \initial {@} + % as its first line, TeX doesn't complain about mismatched braces + % (because it thinks @} is a control sequence). + \catcode`\@ = 11 + \openin 1 \jobname.#1s + \ifeof 1 + % \enddoublecolumns gets confused if there is no text in the index, + % and it loses the chapter title and the aux file entries for the + % index. The easiest way to prevent this problem is to make sure + % there is some text. + \putwordIndexNonexistent + \else + % + % If the index file exists but is empty, then \openin leaves \ifeof + % false. We have to make TeX try to read something from the file, so + % it can discover if there is anything in it. + \read 1 to \temp + \ifeof 1 + \putwordIndexIsEmpty + \else + % Index files are almost Texinfo source, but we use \ as the escape + % character. It would be better to use @, but that's too big a change + % to make right now. + \def\indexbackslash{\backslashcurfont}% + \catcode`\\ = 0 + \escapechar = `\\ + \begindoublecolumns + \input \jobname.#1s + \enddoublecolumns + \fi + \fi + \closein 1 +\endgroup} + +% These macros are used by the sorted index file itself. +% Change them to control the appearance of the index. + +\def\initial#1{{% + % Some minor font changes for the special characters. + \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt + % + % Remove any glue we may have, we'll be inserting our own. + \removelastskip + % + % We like breaks before the index initials, so insert a bonus. + \nobreak + \vskip 0pt plus 3\baselineskip + \penalty 0 + \vskip 0pt plus -3\baselineskip + % + % Typeset the initial. Making this add up to a whole number of + % baselineskips increases the chance of the dots lining up from column + % to column. It still won't often be perfect, because of the stretch + % we need before each entry, but it's better. + % + % No shrink because it confuses \balancecolumns. + \vskip 1.67\baselineskip plus .5\baselineskip + \leftline{\secbf #1}% + % Do our best not to break after the initial. + \nobreak + \vskip .33\baselineskip plus .1\baselineskip +}} + +% \entry typesets a paragraph consisting of the text (#1), dot leaders, and +% then page number (#2) flushed to the right margin. It is used for index +% and table of contents entries. The paragraph is indented by \leftskip. +% +% A straightforward implementation would start like this: +% \def\entry#1#2{... +% But this freezes the catcodes in the argument, and can cause problems to +% @code, which sets - active. This problem was fixed by a kludge--- +% ``-'' was active throughout whole index, but this isn't really right. +% +% The right solution is to prevent \entry from swallowing the whole text. +% --kasal, 21nov03 +\def\entry{% + \begingroup + % + % Start a new paragraph if necessary, so our assignments below can't + % affect previous text. + \par + % + % Do not fill out the last line with white space. + \parfillskip = 0in + % + % No extra space above this paragraph. + \parskip = 0in + % + % Do not prefer a separate line ending with a hyphen to fewer lines. + \finalhyphendemerits = 0 + % + % \hangindent is only relevant when the entry text and page number + % don't both fit on one line. In that case, bob suggests starting the + % dots pretty far over on the line. Unfortunately, a large + % indentation looks wrong when the entry text itself is broken across + % lines. So we use a small indentation and put up with long leaders. + % + % \hangafter is reset to 1 (which is the value we want) at the start + % of each paragraph, so we need not do anything with that. + \hangindent = 2em + % + % When the entry text needs to be broken, just fill out the first line + % with blank space. + \rightskip = 0pt plus1fil + % + % A bit of stretch before each entry for the benefit of balancing + % columns. + \vskip 0pt plus1pt + % + % Swallow the left brace of the text (first parameter): + \afterassignment\doentry + \let\temp = +} +\def\doentry{% + \bgroup % Instead of the swallowed brace. + \noindent + \aftergroup\finishentry + % And now comes the text of the entry. +} +\def\finishentry#1{% + % #1 is the page number. + % + % The following is kludged to not output a line of dots in the index if + % there are no page numbers. The next person who breaks this will be + % cursed by a Unix daemon. + \setbox\boxA = \hbox{#1}% + \ifdim\wd\boxA = 0pt + \ % + \else + % + % If we must, put the page number on a line of its own, and fill out + % this line with blank space. (The \hfil is overwhelmed with the + % fill leaders glue in \indexdotfill if the page number does fit.) + \hfil\penalty50 + \null\nobreak\indexdotfill % Have leaders before the page number. + % + % The `\ ' here is removed by the implicit \unskip that TeX does as + % part of (the primitive) \par. Without it, a spurious underfull + % \hbox ensues. + \ifpdf + \pdfgettoks#1.% + \ \the\toksA + \else + \ #1% + \fi + \fi + \par + \endgroup +} + +% Like plain.tex's \dotfill, except uses up at least 1 em. +\def\indexdotfill{\cleaders + \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} + +\def\primary #1{\line{#1\hfil}} + +\newskip\secondaryindent \secondaryindent=0.5cm +\def\secondary#1#2{{% + \parfillskip=0in + \parskip=0in + \hangindent=1in + \hangafter=1 + \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill + \ifpdf + \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. + \else + #2 + \fi + \par +}} + +% Define two-column mode, which we use to typeset indexes. +% Adapted from the TeXbook, page 416, which is to say, +% the manmac.tex format used to print the TeXbook itself. +\catcode`\@=11 + +\newbox\partialpage +\newdimen\doublecolumnhsize + +\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns + % Grab any single-column material above us. + \output = {% + % + % Here is a possibility not foreseen in manmac: if we accumulate a + % whole lot of material, we might end up calling this \output + % routine twice in a row (see the doublecol-lose test, which is + % essentially a couple of indexes with @setchapternewpage off). In + % that case we just ship out what is in \partialpage with the normal + % output routine. Generally, \partialpage will be empty when this + % runs and this will be a no-op. See the indexspread.tex test case. + \ifvoid\partialpage \else + \onepageout{\pagecontents\partialpage}% + \fi + % + \global\setbox\partialpage = \vbox{% + % Unvbox the main output page. + \unvbox\PAGE + \kern-\topskip \kern\baselineskip + }% + }% + \eject % run that output routine to set \partialpage + % + % Use the double-column output routine for subsequent pages. + \output = {\doublecolumnout}% + % + % Change the page size parameters. We could do this once outside this + % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 + % format, but then we repeat the same computation. Repeating a couple + % of assignments once per index is clearly meaningless for the + % execution time, so we may as well do it in one place. + % + % First we halve the line length, less a little for the gutter between + % the columns. We compute the gutter based on the line length, so it + % changes automatically with the paper format. The magic constant + % below is chosen so that the gutter has the same value (well, +-<1pt) + % as it did when we hard-coded it. + % + % We put the result in a separate register, \doublecolumhsize, so we + % can restore it in \pagesofar, after \hsize itself has (potentially) + % been clobbered. + % + \doublecolumnhsize = \hsize + \advance\doublecolumnhsize by -.04154\hsize + \divide\doublecolumnhsize by 2 + \hsize = \doublecolumnhsize + % + % Double the \vsize as well. (We don't need a separate register here, + % since nobody clobbers \vsize.) + \vsize = 2\vsize +} + +% The double-column output routine for all double-column pages except +% the last. +% +\def\doublecolumnout{% + \splittopskip=\topskip \splitmaxdepth=\maxdepth + % Get the available space for the double columns -- the normal + % (undoubled) page height minus any material left over from the + % previous page. + \dimen@ = \vsize + \divide\dimen@ by 2 + \advance\dimen@ by -\ht\partialpage + % + % box0 will be the left-hand column, box2 the right. + \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ + \onepageout\pagesofar + \unvbox255 + \penalty\outputpenalty +} +% +% Re-output the contents of the output page -- any previous material, +% followed by the two boxes we just split, in box0 and box2. +\def\pagesofar{% + \unvbox\partialpage + % + \hsize = \doublecolumnhsize + \wd0=\hsize \wd2=\hsize + \hbox to\pagewidth{\box0\hfil\box2}% +} +% +% All done with double columns. +\def\enddoublecolumns{% + % The following penalty ensures that the page builder is exercised + % _before_ we change the output routine. This is necessary in the + % following situation: + % + % The last section of the index consists only of a single entry. + % Before this section, \pagetotal is less than \pagegoal, so no + % break occurs before the last section starts. However, the last + % section, consisting of \initial and the single \entry, does not + % fit on the page and has to be broken off. Without the following + % penalty the page builder will not be exercised until \eject + % below, and by that time we'll already have changed the output + % routine to the \balancecolumns version, so the next-to-last + % double-column page will be processed with \balancecolumns, which + % is wrong: The two columns will go to the main vertical list, with + % the broken-off section in the recent contributions. As soon as + % the output routine finishes, TeX starts reconsidering the page + % break. The two columns and the broken-off section both fit on the + % page, because the two columns now take up only half of the page + % goal. When TeX sees \eject from below which follows the final + % section, it invokes the new output routine that we've set after + % \balancecolumns below; \onepageout will try to fit the two columns + % and the final section into the vbox of \pageheight (see + % \pagebody), causing an overfull box. + % + % Note that glue won't work here, because glue does not exercise the + % page builder, unlike penalties (see The TeXbook, pp. 280-281). + \penalty0 + % + \output = {% + % Split the last of the double-column material. Leave it on the + % current page, no automatic page break. + \balancecolumns + % + % If we end up splitting too much material for the current page, + % though, there will be another page break right after this \output + % invocation ends. Having called \balancecolumns once, we do not + % want to call it again. Therefore, reset \output to its normal + % definition right away. (We hope \balancecolumns will never be + % called on to balance too much material, but if it is, this makes + % the output somewhat more palatable.) + \global\output = {\onepageout{\pagecontents\PAGE}}% + }% + \eject + \endgroup % started in \begindoublecolumns + % + % \pagegoal was set to the doubled \vsize above, since we restarted + % the current page. We're now back to normal single-column + % typesetting, so reset \pagegoal to the normal \vsize (after the + % \endgroup where \vsize got restored). + \pagegoal = \vsize +} +% +% Called at the end of the double column material. +\def\balancecolumns{% + \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. + \dimen@ = \ht0 + \advance\dimen@ by \topskip + \advance\dimen@ by-\baselineskip + \divide\dimen@ by 2 % target to split to + %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% + \splittopskip = \topskip + % Loop until we get a decent breakpoint. + {% + \vbadness = 10000 + \loop + \global\setbox3 = \copy0 + \global\setbox1 = \vsplit3 to \dimen@ + \ifdim\ht3>\dimen@ + \global\advance\dimen@ by 1pt + \repeat + }% + %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% + \setbox0=\vbox to\dimen@{\unvbox1}% + \setbox2=\vbox to\dimen@{\unvbox3}% + % + \pagesofar +} +\catcode`\@ = \other + + +\message{sectioning,} +% Chapters, sections, etc. + +% \unnumberedno is an oxymoron, of course. But we count the unnumbered +% sections so that we can refer to them unambiguously in the pdf +% outlines by their "section number". We avoid collisions with chapter +% numbers by starting them at 10000. (If a document ever has 10000 +% chapters, we're in trouble anyway, I'm sure.) +\newcount\unnumberedno \unnumberedno = 10000 +\newcount\chapno +\newcount\secno \secno=0 +\newcount\subsecno \subsecno=0 +\newcount\subsubsecno \subsubsecno=0 + +% This counter is funny since it counts through charcodes of letters A, B, ... +\newcount\appendixno \appendixno = `\@ +% +% \def\appendixletter{\char\the\appendixno} +% We do the following ugly conditional instead of the above simple +% construct for the sake of pdftex, which needs the actual +% letter in the expansion, not just typeset. +% +\def\appendixletter{% + \ifnum\appendixno=`A A% + \else\ifnum\appendixno=`B B% + \else\ifnum\appendixno=`C C% + \else\ifnum\appendixno=`D D% + \else\ifnum\appendixno=`E E% + \else\ifnum\appendixno=`F F% + \else\ifnum\appendixno=`G G% + \else\ifnum\appendixno=`H H% + \else\ifnum\appendixno=`I I% + \else\ifnum\appendixno=`J J% + \else\ifnum\appendixno=`K K% + \else\ifnum\appendixno=`L L% + \else\ifnum\appendixno=`M M% + \else\ifnum\appendixno=`N N% + \else\ifnum\appendixno=`O O% + \else\ifnum\appendixno=`P P% + \else\ifnum\appendixno=`Q Q% + \else\ifnum\appendixno=`R R% + \else\ifnum\appendixno=`S S% + \else\ifnum\appendixno=`T T% + \else\ifnum\appendixno=`U U% + \else\ifnum\appendixno=`V V% + \else\ifnum\appendixno=`W W% + \else\ifnum\appendixno=`X X% + \else\ifnum\appendixno=`Y Y% + \else\ifnum\appendixno=`Z Z% + % The \the is necessary, despite appearances, because \appendixletter is + % expanded while writing the .toc file. \char\appendixno is not + % expandable, thus it is written literally, thus all appendixes come out + % with the same letter (or @) in the toc without it. + \else\char\the\appendixno + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} + +% Each @chapter defines these (using marks) as the number+name, number +% and name of the chapter. Page headings and footings can use +% these. @section does likewise. +\def\thischapter{} +\def\thischapternum{} +\def\thischaptername{} +\def\thissection{} +\def\thissectionnum{} +\def\thissectionname{} + +\newcount\absseclevel % used to calculate proper heading level +\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count + +% @raisesections: treat @section as chapter, @subsection as section, etc. +\def\raisesections{\global\advance\secbase by -1} +\let\up=\raisesections % original BFox name + +% @lowersections: treat @chapter as section, @section as subsection, etc. +\def\lowersections{\global\advance\secbase by 1} +\let\down=\lowersections % original BFox name + +% we only have subsub. +\chardef\maxseclevel = 3 +% +% A numbered section within an unnumbered changes to unnumbered too. +% To achive this, remember the "biggest" unnum. sec. we are currently in: +\chardef\unmlevel = \maxseclevel +% +% Trace whether the current chapter is an appendix or not: +% \chapheadtype is "N" or "A", unnumbered chapters are ignored. +\def\chapheadtype{N} + +% Choose a heading macro +% #1 is heading type +% #2 is heading level +% #3 is text for heading +\def\genhead#1#2#3{% + % Compute the abs. sec. level: + \absseclevel=#2 + \advance\absseclevel by \secbase + % Make sure \absseclevel doesn't fall outside the range: + \ifnum \absseclevel < 0 + \absseclevel = 0 + \else + \ifnum \absseclevel > 3 + \absseclevel = 3 + \fi + \fi + % The heading type: + \def\headtype{#1}% + \if \headtype U% + \ifnum \absseclevel < \unmlevel + \chardef\unmlevel = \absseclevel + \fi + \else + % Check for appendix sections: + \ifnum \absseclevel = 0 + \edef\chapheadtype{\headtype}% + \else + \if \headtype A\if \chapheadtype N% + \errmessage{@appendix... within a non-appendix chapter}% + \fi\fi + \fi + % Check for numbered within unnumbered: + \ifnum \absseclevel > \unmlevel + \def\headtype{U}% + \else + \chardef\unmlevel = 3 + \fi + \fi + % Now print the heading: + \if \headtype U% + \ifcase\absseclevel + \unnumberedzzz{#3}% + \or \unnumberedseczzz{#3}% + \or \unnumberedsubseczzz{#3}% + \or \unnumberedsubsubseczzz{#3}% + \fi + \else + \if \headtype A% + \ifcase\absseclevel + \appendixzzz{#3}% + \or \appendixsectionzzz{#3}% + \or \appendixsubseczzz{#3}% + \or \appendixsubsubseczzz{#3}% + \fi + \else + \ifcase\absseclevel + \chapterzzz{#3}% + \or \seczzz{#3}% + \or \numberedsubseczzz{#3}% + \or \numberedsubsubseczzz{#3}% + \fi + \fi + \fi + \suppressfirstparagraphindent +} + +% an interface: +\def\numhead{\genhead N} +\def\apphead{\genhead A} +\def\unnmhead{\genhead U} + +% @chapter, @appendix, @unnumbered. Increment top-level counter, reset +% all lower-level sectioning counters to zero. +% +% Also set \chaplevelprefix, which we prepend to @float sequence numbers +% (e.g., figures), q.v. By default (before any chapter), that is empty. +\let\chaplevelprefix = \empty +% +\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz +\def\chapterzzz#1{% + % section resetting is \global in case the chapter is in a group, such + % as an @include file. + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\chapno by 1 + % + % Used for \float. + \gdef\chaplevelprefix{\the\chapno.}% + \resetallfloatnos + % + \message{\putwordChapter\space \the\chapno}% + % + % Write the actual heading. + \chapmacro{#1}{Ynumbered}{\the\chapno}% + % + % So @section and the like are numbered underneath this chapter. + \global\let\section = \numberedsec + \global\let\subsection = \numberedsubsec + \global\let\subsubsection = \numberedsubsubsec +} + +\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz +\def\appendixzzz#1{% + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\appendixno by 1 + \gdef\chaplevelprefix{\appendixletter.}% + \resetallfloatnos + % + \def\appendixnum{\putwordAppendix\space \appendixletter}% + \message{\appendixnum}% + % + \chapmacro{#1}{Yappendix}{\appendixletter}% + % + \global\let\section = \appendixsec + \global\let\subsection = \appendixsubsec + \global\let\subsubsection = \appendixsubsubsec +} + +\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz +\def\unnumberedzzz#1{% + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\unnumberedno by 1 + % + % Since an unnumbered has no number, no prefix for figures. + \global\let\chaplevelprefix = \empty + \resetallfloatnos + % + % This used to be simply \message{#1}, but TeX fully expands the + % argument to \message. Therefore, if #1 contained @-commands, TeX + % expanded them. For example, in `@unnumbered The @cite{Book}', TeX + % expanded @cite (which turns out to cause errors because \cite is meant + % to be executed, not expanded). + % + % Anyway, we don't want the fully-expanded definition of @cite to appear + % as a result of the \message, we just want `@cite' itself. We use + % \the to achieve this: TeX expands \the only once, + % simply yielding the contents of . (We also do this for + % the toc entries.) + \toks0 = {#1}% + \message{(\the\toks0)}% + % + \chapmacro{#1}{Ynothing}{\the\unnumberedno}% + % + \global\let\section = \unnumberedsec + \global\let\subsection = \unnumberedsubsec + \global\let\subsubsection = \unnumberedsubsubsec +} + +% @centerchap is like @unnumbered, but the heading is centered. +\outer\parseargdef\centerchap{% + % Well, we could do the following in a group, but that would break + % an assumption that \chapmacro is called at the outermost level. + % Thus we are safer this way: --kasal, 24feb04 + \let\centerparametersmaybe = \centerparameters + \unnmhead0{#1}% + \let\centerparametersmaybe = \relax +} + +% @top is like @unnumbered. +\let\top\unnumbered + +% Sections. +\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz +\def\seczzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% +} + +\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz +\def\appendixsectionzzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% +} +\let\appendixsec\appendixsection + +\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz +\def\unnumberedseczzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% +} + +% Subsections. +\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz +\def\numberedsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% +} + +\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz +\def\appendixsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Yappendix}% + {\appendixletter.\the\secno.\the\subsecno}% +} + +\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz +\def\unnumberedsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno}% +} + +% Subsubsections. +\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz +\def\numberedsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Ynumbered}% + {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz +\def\appendixsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Yappendix}% + {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz +\def\unnumberedsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +% These macros control what the section commands do, according +% to what kind of chapter we are in (ordinary, appendix, or unnumbered). +% Define them by default for a numbered chapter. +\let\section = \numberedsec +\let\subsection = \numberedsubsec +\let\subsubsection = \numberedsubsubsec + +% Define @majorheading, @heading and @subheading + +% NOTE on use of \vbox for chapter headings, section headings, and such: +% 1) We use \vbox rather than the earlier \line to permit +% overlong headings to fold. +% 2) \hyphenpenalty is set to 10000 because hyphenation in a +% heading is obnoxious; this forbids it. +% 3) Likewise, headings look best if no \parindent is used, and +% if justification is not attempted. Hence \raggedright. + +\def\majorheading{% + {\advance\chapheadingskip by 10pt \chapbreak }% + \parsearg\chapheadingzzz +} + +\def\chapheading{\chapbreak \parsearg\chapheadingzzz} +\def\chapheadingzzz#1{% + {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\ptexraggedright + \rmisbold #1\hfill}}% + \bigskip \par\penalty 200\relax + \suppressfirstparagraphindent +} + +% @heading, @subheading, @subsubheading. +\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} +\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} +\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} + +% These macros generate a chapter, section, etc. heading only +% (including whitespace, linebreaking, etc. around it), +% given all the information in convenient, parsed form. + +%%% Args are the skip and penalty (usually negative) +\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} + +%%% Define plain chapter starts, and page on/off switching for it +% Parameter controlling skip before chapter headings (if needed) + +\newskip\chapheadingskip + +\def\chapbreak{\dobreak \chapheadingskip {-4000}} +\def\chappager{\par\vfill\supereject} +% Because \domark is called before \chapoddpage, the filler page will +% get the headings for the next chapter, which is wrong. But we don't +% care -- we just disable all headings on the filler page. +\def\chapoddpage{% + \chappager + \ifodd\pageno \else + \begingroup + \evenheadline={\hfil}\evenfootline={\hfil}% + \oddheadline={\hfil}\oddfootline={\hfil}% + \hbox to 0pt{}% + \chappager + \endgroup + \fi +} + +\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} + +\def\CHAPPAGoff{% +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chapbreak +\global\let\pagealignmacro=\chappager} + +\def\CHAPPAGon{% +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chappager +\global\let\pagealignmacro=\chappager +\global\def\HEADINGSon{\HEADINGSsingle}} + +\def\CHAPPAGodd{% +\global\let\contentsalignmacro = \chapoddpage +\global\let\pchapsepmacro=\chapoddpage +\global\let\pagealignmacro=\chapoddpage +\global\def\HEADINGSon{\HEADINGSdouble}} + +\CHAPPAGon + +% Chapter opening. +% +% #1 is the text, #2 is the section type (Ynumbered, Ynothing, +% Yappendix, Yomitfromtoc), #3 the chapter number. +% +% To test against our argument. +\def\Ynothingkeyword{Ynothing} +\def\Yomitfromtockeyword{Yomitfromtoc} +\def\Yappendixkeyword{Yappendix} +% +\def\chapmacro#1#2#3{% + % Insert the first mark before the heading break (see notes for \domark). + \let\prevchapterdefs=\lastchapterdefs + \let\prevsectiondefs=\lastsectiondefs + \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% + \gdef\thissection{}}% + % + \def\temptype{#2}% + \ifx\temptype\Ynothingkeyword + \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% + \gdef\thischapter{\thischaptername}}% + \else\ifx\temptype\Yomitfromtockeyword + \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% + \gdef\thischapter{}}% + \else\ifx\temptype\Yappendixkeyword + \toks0={#1}% + \xdef\lastchapterdefs{% + \gdef\noexpand\thischaptername{\the\toks0}% + \gdef\noexpand\thischapternum{\appendixletter}% + \gdef\noexpand\thischapter{\putwordAppendix{} \noexpand\thischapternum: + \noexpand\thischaptername}% + }% + \else + \toks0={#1}% + \xdef\lastchapterdefs{% + \gdef\noexpand\thischaptername{\the\toks0}% + \gdef\noexpand\thischapternum{\the\chapno}% + \gdef\noexpand\thischapter{\putwordChapter{} \noexpand\thischapternum: + \noexpand\thischaptername}% + }% + \fi\fi\fi + % + % Output the mark. Pass it through \safewhatsit, to take care of + % the preceding space. + \safewhatsit\domark + % + % Insert the chapter heading break. + \pchapsepmacro + % + % Now the second mark, after the heading break. No break points + % between here and the heading. + \let\prevchapterdefs=\lastchapterdefs + \let\prevsectiondefs=\lastsectiondefs + \domark + % + {% + \chapfonts \rmisbold + % + % Have to define \lastsection before calling \donoderef, because the + % xref code eventually uses it. On the other hand, it has to be called + % after \pchapsepmacro, or the headline will change too soon. + \gdef\lastsection{#1}% + % + % Only insert the separating space if we have a chapter/appendix + % number, and don't print the unnumbered ``number''. + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unnchap}% + \else\ifx\temptype\Yomitfromtockeyword + \setbox0 = \hbox{}% contents like unnumbered, but no toc entry + \def\toctype{omit}% + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% + \def\toctype{app}% + \else + \setbox0 = \hbox{#3\enspace}% + \def\toctype{numchap}% + \fi\fi\fi + % + % Write the toc entry for this chapter. Must come before the + % \donoderef, because we include the current node name in the toc + % entry, and \donoderef resets it to empty. + \writetocentry{\toctype}{#1}{#3}% + % + % For pdftex, we have to write out the node definition (aka, make + % the pdfdest) after any page break, but before the actual text has + % been typeset. If the destination for the pdf outline is after the + % text, then jumping from the outline may wind up with the text not + % being visible, for instance under high magnification. + \donoderef{#2}% + % + % Typeset the actual heading. + \nobreak % Avoid page breaks at the interline glue. + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright + \hangindent=\wd0 \centerparametersmaybe + \unhbox0 #1\par}% + }% + \nobreak\bigskip % no page break after a chapter title + \nobreak +} + +% @centerchap -- centered and unnumbered. +\let\centerparametersmaybe = \relax +\def\centerparameters{% + \advance\rightskip by 3\rightskip + \leftskip = \rightskip + \parfillskip = 0pt +} + + +% I don't think this chapter style is supported any more, so I'm not +% updating it with the new noderef stuff. We'll see. --karl, 11aug03. +% +\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} +% +\def\unnchfopen #1{% +\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\ptexraggedright + \rmisbold #1\hfill}}\bigskip \par\nobreak +} +\def\chfopen #1#2{\chapoddpage {\chapfonts +\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% +\par\penalty 5000 % +} +\def\centerchfopen #1{% +\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt + \hfill {\rmisbold #1}\hfill}}\bigskip \par\nobreak +} +\def\CHAPFopen{% + \global\let\chapmacro=\chfopen + \global\let\centerchapmacro=\centerchfopen} + + +% Section titles. These macros combine the section number parts and +% call the generic \sectionheading to do the printing. +% +\newskip\secheadingskip +\def\secheadingbreak{\dobreak \secheadingskip{-1000}} + +% Subsection titles. +\newskip\subsecheadingskip +\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} + +% Subsubsection titles. +\def\subsubsecheadingskip{\subsecheadingskip} +\def\subsubsecheadingbreak{\subsecheadingbreak} + + +% Print any size, any type, section title. +% +% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is +% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the +% section number. +% +\def\seckeyword{sec} +% +\def\sectionheading#1#2#3#4{% + {% + % Switch to the right set of fonts. + \csname #2fonts\endcsname \rmisbold + % + \def\sectionlevel{#2}% + \def\temptype{#3}% + % + % Insert first mark before the heading break (see notes for \domark). + \let\prevsectiondefs=\lastsectiondefs + \ifx\temptype\Ynothingkeyword + \ifx\sectionlevel\seckeyword + \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% + \gdef\thissection{\thissectionname}}% + \fi + \else\ifx\temptype\Yomitfromtockeyword + % Don't redefine \thissection. + \else\ifx\temptype\Yappendixkeyword + \ifx\sectionlevel\seckeyword + \toks0={#1}% + \xdef\lastsectiondefs{% + \gdef\noexpand\thissectionname{\the\toks0}% + \gdef\noexpand\thissectionnum{#4}% + \gdef\noexpand\thissection{\putwordSection{} \noexpand\thissectionnum: + \noexpand\thissectionname}% + }% + \fi + \else + \ifx\sectionlevel\seckeyword + \toks0={#1}% + \xdef\lastsectiondefs{% + \gdef\noexpand\thissectionname{\the\toks0}% + \gdef\noexpand\thissectionnum{#4}% + \gdef\noexpand\thissection{\putwordSection{} \noexpand\thissectionnum: + \noexpand\thissectionname}% + }% + \fi + \fi\fi\fi + % + % Go into vertical mode. Usually we'll already be there, but we + % don't want the following whatsit to end up in a preceding paragraph + % if the document didn't happen to have a blank line. + \par + % + % Output the mark. Pass it through \safewhatsit, to take care of + % the preceding space. + \safewhatsit\domark + % + % Insert space above the heading. + \csname #2headingbreak\endcsname + % + % Now the second mark, after the heading break. No break points + % between here and the heading. + \let\prevsectiondefs=\lastsectiondefs + \domark + % + % Only insert the space after the number if we have a section number. + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unn}% + \gdef\lastsection{#1}% + \else\ifx\temptype\Yomitfromtockeyword + % for @headings -- no section number, don't include in toc, + % and don't redefine \lastsection. + \setbox0 = \hbox{}% + \def\toctype{omit}% + \let\sectionlevel=\empty + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{#4\enspace}% + \def\toctype{app}% + \gdef\lastsection{#1}% + \else + \setbox0 = \hbox{#4\enspace}% + \def\toctype{num}% + \gdef\lastsection{#1}% + \fi\fi\fi + % + % Write the toc entry (before \donoderef). See comments in \chapmacro. + \writetocentry{\toctype\sectionlevel}{#1}{#4}% + % + % Write the node reference (= pdf destination for pdftex). + % Again, see comments in \chapmacro. + \donoderef{#3}% + % + % Interline glue will be inserted when the vbox is completed. + % That glue will be a valid breakpoint for the page, since it'll be + % preceded by a whatsit (usually from the \donoderef, or from the + % \writetocentry if there was no node). We don't want to allow that + % break, since then the whatsits could end up on page n while the + % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. + \nobreak + % + % Output the actual section heading. + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright + \hangindent=\wd0 % zero if no section number + \unhbox0 #1}% + }% + % Add extra space after the heading -- half of whatever came above it. + % Don't allow stretch, though. + \kern .5 \csname #2headingskip\endcsname + % + % Do not let the kern be a potential breakpoint, as it would be if it + % was followed by glue. + \nobreak + % + % We'll almost certainly start a paragraph next, so don't let that + % glue accumulate. (Not a breakpoint because it's preceded by a + % discardable item.) + \vskip-\parskip + % + % This is purely so the last item on the list is a known \penalty > + % 10000. This is so \startdefun can avoid allowing breakpoints after + % section headings. Otherwise, it would insert a valid breakpoint between: + % + % @section sec-whatever + % @deffn def-whatever + \penalty 10001 +} + + +\message{toc,} +% Table of contents. +\newwrite\tocfile + +% Write an entry to the toc file, opening it if necessary. +% Called from @chapter, etc. +% +% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} +% We append the current node name (if any) and page number as additional +% arguments for the \{chap,sec,...}entry macros which will eventually +% read this. The node name is used in the pdf outlines as the +% destination to jump to. +% +% We open the .toc file for writing here instead of at @setfilename (or +% any other fixed time) so that @contents can be anywhere in the document. +% But if #1 is `omit', then we don't do anything. This is used for the +% table of contents chapter openings themselves. +% +\newif\iftocfileopened +\def\omitkeyword{omit}% +% +\def\writetocentry#1#2#3{% + \edef\writetoctype{#1}% + \ifx\writetoctype\omitkeyword \else + \iftocfileopened\else + \immediate\openout\tocfile = \jobname.toc + \global\tocfileopenedtrue + \fi + % + \iflinks + {\atdummies + \edef\temp{% + \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% + \temp + }% + \fi + \fi + % + % Tell \shipout to create a pdf destination on each page, if we're + % writing pdf. These are used in the table of contents. We can't + % just write one on every page because the title pages are numbered + % 1 and 2 (the page numbers aren't printed), and so are the first + % two pages of the document. Thus, we'd have two destinations named + % `1', and two named `2'. + \ifpdf \global\pdfmakepagedesttrue \fi +} + + +% These characters do not print properly in the Computer Modern roman +% fonts, so we must take special care. This is more or less redundant +% with the Texinfo input format setup at the end of this file. +% +\def\activecatcodes{% + \catcode`\"=\active + \catcode`\$=\active + \catcode`\<=\active + \catcode`\>=\active + \catcode`\\=\active + \catcode`\^=\active + \catcode`\_=\active + \catcode`\|=\active + \catcode`\~=\active +} + + +% Read the toc file, which is essentially Texinfo input. +\def\readtocfile{% + \setupdatafile + \activecatcodes + \input \tocreadfilename +} + +\newskip\contentsrightmargin \contentsrightmargin=1in +\newcount\savepageno +\newcount\lastnegativepageno \lastnegativepageno = -1 + +% Prepare to read what we've written to \tocfile. +% +\def\startcontents#1{% + % If @setchapternewpage on, and @headings double, the contents should + % start on an odd page, unlike chapters. Thus, we maintain + % \contentsalignmacro in parallel with \pagealignmacro. + % From: Torbjorn Granlund + \contentsalignmacro + \immediate\closeout\tocfile + % + % Don't need to put `Contents' or `Short Contents' in the headline. + % It is abundantly clear what they are. + \chapmacro{#1}{Yomitfromtoc}{}% + % + \savepageno = \pageno + \begingroup % Set up to handle contents files properly. + \raggedbottom % Worry more about breakpoints than the bottom. + \advance\hsize by -\contentsrightmargin % Don't use the full line length. + % + % Roman numerals for page numbers. + \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi +} + +% redefined for the two-volume lispref. We always output on +% \jobname.toc even if this is redefined. +% +\def\tocreadfilename{\jobname.toc} + +% Normal (long) toc. +% +\def\contents{% + \startcontents{\putwordTOC}% + \openin 1 \tocreadfilename\space + \ifeof 1 \else + \readtocfile + \fi + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \ifeof 1 \else + \pdfmakeoutlines + \fi + \closein 1 + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} + +% And just the chapters. +\def\summarycontents{% + \startcontents{\putwordShortTOC}% + % + \let\numchapentry = \shortchapentry + \let\appentry = \shortchapentry + \let\unnchapentry = \shortunnchapentry + % We want a true roman here for the page numbers. + \secfonts + \let\rm=\shortcontrm \let\bf=\shortcontbf + \let\sl=\shortcontsl \let\tt=\shortconttt + \rm + \hyphenpenalty = 10000 + \advance\baselineskip by 1pt % Open it up a little. + \def\numsecentry##1##2##3##4{} + \let\appsecentry = \numsecentry + \let\unnsecentry = \numsecentry + \let\numsubsecentry = \numsecentry + \let\appsubsecentry = \numsecentry + \let\unnsubsecentry = \numsecentry + \let\numsubsubsecentry = \numsecentry + \let\appsubsubsecentry = \numsecentry + \let\unnsubsubsecentry = \numsecentry + \openin 1 \tocreadfilename\space + \ifeof 1 \else + \readtocfile + \fi + \closein 1 + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} +\let\shortcontents = \summarycontents + +% Typeset the label for a chapter or appendix for the short contents. +% The arg is, e.g., `A' for an appendix, or `3' for a chapter. +% +\def\shortchaplabel#1{% + % This space should be enough, since a single number is .5em, and the + % widest letter (M) is 1em, at least in the Computer Modern fonts. + % But use \hss just in case. + % (This space doesn't include the extra space that gets added after + % the label; that gets put in by \shortchapentry above.) + % + % We'd like to right-justify chapter numbers, but that looks strange + % with appendix letters. And right-justifying numbers and + % left-justifying letters looks strange when there is less than 10 + % chapters. Have to read the whole toc once to know how many chapters + % there are before deciding ... + \hbox to 1em{#1\hss}% +} + +% These macros generate individual entries in the table of contents. +% The first argument is the chapter or section name. +% The last argument is the page number. +% The arguments in between are the chapter number, section number, ... + +% Chapters, in the main contents. +\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} +% +% Chapters, in the short toc. +% See comments in \dochapentry re vbox and related settings. +\def\shortchapentry#1#2#3#4{% + \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% +} + +% Appendices, in the main contents. +% Need the word Appendix, and a fixed-size box. +% +\def\appendixbox#1{% + % We use M since it's probably the widest letter. + \setbox0 = \hbox{\putwordAppendix{} M}% + \hbox to \wd0{\putwordAppendix{} #1\hss}} +% +\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} + +% Unnumbered chapters. +\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} +\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} + +% Sections. +\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} +\let\appsecentry=\numsecentry +\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} + +% Subsections. +\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} +\let\appsubsecentry=\numsubsecentry +\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} + +% And subsubsections. +\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} +\let\appsubsubsecentry=\numsubsubsecentry +\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} + +% This parameter controls the indentation of the various levels. +% Same as \defaultparindent. +\newdimen\tocindent \tocindent = 15pt + +% Now for the actual typesetting. In all these, #1 is the text and #2 is the +% page number. +% +% If the toc has to be broken over pages, we want it to be at chapters +% if at all possible; hence the \penalty. +\def\dochapentry#1#2{% + \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip + \begingroup + \chapentryfonts + \tocentry{#1}{\dopageno\bgroup#2\egroup}% + \endgroup + \nobreak\vskip .25\baselineskip plus.1\baselineskip +} + +\def\dosecentry#1#2{\begingroup + \secentryfonts \leftskip=\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +\def\dosubsecentry#1#2{\begingroup + \subsecentryfonts \leftskip=2\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +\def\dosubsubsecentry#1#2{\begingroup + \subsubsecentryfonts \leftskip=3\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +% We use the same \entry macro as for the index entries. +\let\tocentry = \entry + +% Space between chapter (or whatever) number and the title. +\def\labelspace{\hskip1em \relax} + +\def\dopageno#1{{\rm #1}} +\def\doshortpageno#1{{\rm #1}} + +\def\chapentryfonts{\secfonts \rm} +\def\secentryfonts{\textfonts} +\def\subsecentryfonts{\textfonts} +\def\subsubsecentryfonts{\textfonts} + + +\message{environments,} +% @foo ... @end foo. + +% @tex ... @end tex escapes into raw Tex temporarily. +% One exception: @ is still an escape character, so that @end tex works. +% But \@ or @@ will get a plain tex @ character. + +\envdef\tex{% + \setupmarkupstyle{tex}% + \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 + \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 + \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie + \catcode `\%=14 + \catcode `\+=\other + \catcode `\"=\other + \catcode `\|=\other + \catcode `\<=\other + \catcode `\>=\other + \catcode`\`=\other + \catcode`\'=\other + \escapechar=`\\ + % + \let\b=\ptexb + \let\bullet=\ptexbullet + \let\c=\ptexc + \let\,=\ptexcomma + \let\.=\ptexdot + \let\dots=\ptexdots + \let\equiv=\ptexequiv + \let\!=\ptexexclam + \let\i=\ptexi + \let\indent=\ptexindent + \let\noindent=\ptexnoindent + \let\{=\ptexlbrace + \let\+=\tabalign + \let\}=\ptexrbrace + \let\/=\ptexslash + \let\*=\ptexstar + \let\t=\ptext + \expandafter \let\csname top\endcsname=\ptextop % outer + \let\frenchspacing=\plainfrenchspacing + % + \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% + \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% + \def\@{@}% +} +% There is no need to define \Etex. + +% Define @lisp ... @end lisp. +% @lisp environment forms a group so it can rebind things, +% including the definition of @end lisp (which normally is erroneous). + +% Amount to narrow the margins by for @lisp. +\newskip\lispnarrowing \lispnarrowing=0.4in + +% This is the definition that ^^M gets inside @lisp, @example, and other +% such environments. \null is better than a space, since it doesn't +% have any width. +\def\lisppar{\null\endgraf} + +% This space is always present above and below environments. +\newskip\envskipamount \envskipamount = 0pt + +% Make spacing and below environment symmetrical. We use \parskip here +% to help in doing that, since in @example-like environments \parskip +% is reset to zero; thus the \afterenvbreak inserts no space -- but the +% start of the next paragraph will insert \parskip. +% +\def\aboveenvbreak{{% + % =10000 instead of <10000 because of a special case in \itemzzz and + % \sectionheading, q.v. + \ifnum \lastpenalty=10000 \else + \advance\envskipamount by \parskip + \endgraf + \ifdim\lastskip<\envskipamount + \removelastskip + % it's not a good place to break if the last penalty was \nobreak + % or better ... + \ifnum\lastpenalty<10000 \penalty-50 \fi + \vskip\envskipamount + \fi + \fi +}} + +\let\afterenvbreak = \aboveenvbreak + +% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will +% also clear it, so that its embedded environments do the narrowing again. +\let\nonarrowing=\relax + +% @cartouche ... @end cartouche: draw rectangle w/rounded corners around +% environment contents. +\font\circle=lcircle10 +\newdimen\circthick +\newdimen\cartouter\newdimen\cartinner +\newskip\normbskip\newskip\normpskip\newskip\normlskip +\circthick=\fontdimen8\circle +% +\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth +\def\ctr{{\hskip 6pt\circle\char'010}} +\def\cbl{{\circle\char'012\hskip -6pt}} +\def\cbr{{\hskip 6pt\circle\char'011}} +\def\carttop{\hbox to \cartouter{\hskip\lskip + \ctl\leaders\hrule height\circthick\hfil\ctr + \hskip\rskip}} +\def\cartbot{\hbox to \cartouter{\hskip\lskip + \cbl\leaders\hrule height\circthick\hfil\cbr + \hskip\rskip}} +% +\newskip\lskip\newskip\rskip + +\envdef\cartouche{% + \ifhmode\par\fi % can't be in the midst of a paragraph. + \startsavinginserts + \lskip=\leftskip \rskip=\rightskip + \leftskip=0pt\rightskip=0pt % we want these *outside*. + \cartinner=\hsize \advance\cartinner by-\lskip + \advance\cartinner by-\rskip + \cartouter=\hsize + \advance\cartouter by 18.4pt % allow for 3pt kerns on either + % side, and for 6pt waste from + % each corner char, and rule thickness + \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip + % Flag to tell @lisp, etc., not to narrow margin. + \let\nonarrowing = t% + \vbox\bgroup + \baselineskip=0pt\parskip=0pt\lineskip=0pt + \carttop + \hbox\bgroup + \hskip\lskip + \vrule\kern3pt + \vbox\bgroup + \kern3pt + \hsize=\cartinner + \baselineskip=\normbskip + \lineskip=\normlskip + \parskip=\normpskip + \vskip -\parskip + \comment % For explanation, see the end of \def\group. +} +\def\Ecartouche{% + \ifhmode\par\fi + \kern3pt + \egroup + \kern3pt\vrule + \hskip\rskip + \egroup + \cartbot + \egroup + \checkinserts +} + + +% This macro is called at the beginning of all the @example variants, +% inside a group. +\newdimen\nonfillparindent +\def\nonfillstart{% + \aboveenvbreak + \hfuzz = 12pt % Don't be fussy + \sepspaces % Make spaces be word-separators rather than space tokens. + \let\par = \lisppar % don't ignore blank lines + \obeylines % each line of input is a line of output + \parskip = 0pt + % Turn off paragraph indentation but redefine \indent to emulate + % the normal \indent. + \nonfillparindent=\parindent + \parindent = 0pt + \let\indent\nonfillindent + % + \emergencystretch = 0pt % don't try to avoid overfull boxes + \ifx\nonarrowing\relax + \advance \leftskip by \lispnarrowing + \exdentamount=\lispnarrowing + \else + \let\nonarrowing = \relax + \fi + \let\exdent=\nofillexdent +} + +\begingroup +\obeyspaces +% We want to swallow spaces (but not other tokens) after the fake +% @indent in our nonfill-environments, where spaces are normally +% active and set to @tie, resulting in them not being ignored after +% @indent. +\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% +\gdef\nonfillindentcheck{% +\ifx\temp % +\expandafter\nonfillindentgobble% +\else% +\leavevmode\nonfillindentbox% +\fi% +}% +\endgroup +\def\nonfillindentgobble#1{\nonfillindent} +\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} + +% If you want all examples etc. small: @set dispenvsize small. +% If you want even small examples the full size: @set dispenvsize nosmall. +% This affects the following displayed environments: +% @example, @display, @format, @lisp +% +\def\smallword{small} +\def\nosmallword{nosmall} +\let\SETdispenvsize\relax +\def\setnormaldispenv{% + \ifx\SETdispenvsize\smallword + % end paragraph for sake of leading, in case document has no blank + % line. This is redundant with what happens in \aboveenvbreak, but + % we need to do it before changing the fonts, and it's inconvenient + % to change the fonts afterward. + \ifnum \lastpenalty=10000 \else \endgraf \fi + \smallexamplefonts \rm + \fi +} +\def\setsmalldispenv{% + \ifx\SETdispenvsize\nosmallword + \else + \ifnum \lastpenalty=10000 \else \endgraf \fi + \smallexamplefonts \rm + \fi +} + +% We often define two environments, @foo and @smallfoo. +% Let's do it by one command: +\def\makedispenv #1#2{ + \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2} + \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2} + \expandafter\let\csname E#1\endcsname \afterenvbreak + \expandafter\let\csname Esmall#1\endcsname \afterenvbreak +} + +% Define two synonyms: +\def\maketwodispenvs #1#2#3{ + \makedispenv{#1}{#3} + \makedispenv{#2}{#3} +} + +% @lisp: indented, narrowed, typewriter font; @example: same as @lisp. +% +% @smallexample and @smalllisp: use smaller fonts. +% Originally contributed by Pavel@xerox. +% +\maketwodispenvs {lisp}{example}{% + \nonfillstart + \tt\setupmarkupstyle{example}% + \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. + \gobble % eat return +} +% @display/@smalldisplay: same as @lisp except keep current font. +% +\makedispenv {display}{% + \nonfillstart + \gobble +} + +% @format/@smallformat: same as @display except don't narrow margins. +% +\makedispenv{format}{% + \let\nonarrowing = t% + \nonfillstart + \gobble +} + +% @flushleft: same as @format, but doesn't obey \SETdispenvsize. +\envdef\flushleft{% + \let\nonarrowing = t% + \nonfillstart + \gobble +} +\let\Eflushleft = \afterenvbreak + +% @flushright. +% +\envdef\flushright{% + \let\nonarrowing = t% + \nonfillstart + \advance\leftskip by 0pt plus 1fill + \gobble +} +\let\Eflushright = \afterenvbreak + + +% @raggedright does more-or-less normal line breaking but no right +% justification. From plain.tex. +\envdef\raggedright{% + \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax +} +\let\Eraggedright\par + +\envdef\raggedleft{% + \parindent=0pt \leftskip0pt plus2em + \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt + \hbadness=10000 % Last line will usually be underfull, so turn off + % badness reporting. +} +\let\Eraggedleft\par + +\envdef\raggedcenter{% + \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em + \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt + \hbadness=10000 % Last line will usually be underfull, so turn off + % badness reporting. +} +\let\Eraggedcenter\par + + +% @quotation does normal linebreaking (hence we can't use \nonfillstart) +% and narrows the margins. We keep \parskip nonzero in general, since +% we're doing normal filling. So, when using \aboveenvbreak and +% \afterenvbreak, temporarily make \parskip 0. +% +\def\quotationstart{% + {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip + \parindent=0pt + % + % @cartouche defines \nonarrowing to inhibit narrowing at next level down. + \ifx\nonarrowing\relax + \advance\leftskip by \lispnarrowing + \advance\rightskip by \lispnarrowing + \exdentamount = \lispnarrowing + \else + \let\nonarrowing = \relax + \fi + \parsearg\quotationlabel +} + +\envdef\quotation{% + \setnormaldispenv + \quotationstart +} + +\envdef\smallquotation{% + \setsmalldispenv + \quotationstart +} +\let\Esmallquotation = \Equotation + +% We have retained a nonzero parskip for the environment, since we're +% doing normal filling. +% +\def\Equotation{% + \par + \ifx\quotationauthor\undefined\else + % indent a bit. + \leftline{\kern 2\leftskip \sl ---\quotationauthor}% + \fi + {\parskip=0pt \afterenvbreak}% +} + +% If we're given an argument, typeset it in bold with a colon after. +\def\quotationlabel#1{% + \def\temp{#1}% + \ifx\temp\empty \else + {\bf #1: }% + \fi +} + + +% LaTeX-like @verbatim...@end verbatim and @verb{...} +% If we want to allow any as delimiter, +% we need the curly braces so that makeinfo sees the @verb command, eg: +% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org +% +% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. +% +% [Knuth] p.344; only we need to do the other characters Texinfo sets +% active too. Otherwise, they get lost as the first character on a +% verbatim line. +\def\dospecials{% + \do\ \do\\\do\{\do\}\do\$\do\&% + \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% + \do\<\do\>\do\|\do\@\do+\do\"% + % Don't do the quotes -- if we do, @set txicodequoteundirected and + % @set txicodequotebacktick will not have effect on @verb and + % @verbatim, and ?` and !` ligatures won't get disabled. + %\do\`\do\'% +} +% +% [Knuth] p. 380 +\def\uncatcodespecials{% + \def\do##1{\catcode`##1=\other}\dospecials} +% +% Setup for the @verb command. +% +% Eight spaces for a tab +\begingroup + \catcode`\^^I=\active + \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} +\endgroup +% +\def\setupverb{% + \tt % easiest (and conventionally used) font for verbatim + \def\par{\leavevmode\endgraf}% + \setupmarkupstyle{verb}% + \tabeightspaces + % Respect line breaks, + % print special symbols as themselves, and + % make each space count + % must do in this order: + \obeylines \uncatcodespecials \sepspaces +} + +% Setup for the @verbatim environment +% +% Real tab expansion +\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount +% +\def\starttabbox{\setbox0=\hbox\bgroup} +% +\begingroup + \catcode`\^^I=\active + \gdef\tabexpand{% + \catcode`\^^I=\active + \def^^I{\leavevmode\egroup + \dimen0=\wd0 % the width so far, or since the previous tab + \divide\dimen0 by\tabw + \multiply\dimen0 by\tabw % compute previous multiple of \tabw + \advance\dimen0 by\tabw % advance to next multiple of \tabw + \wd0=\dimen0 \box0 \starttabbox + }% + } +\endgroup + +% start the verbatim environment. +\def\setupverbatim{% + \let\nonarrowing = t% + \nonfillstart + % Easiest (and conventionally used) font for verbatim + \tt + \def\par{\leavevmode\egroup\box0\endgraf}% + \tabexpand + \setupmarkupstyle{verbatim}% + % Respect line breaks, + % print special symbols as themselves, and + % make each space count + % must do in this order: + \obeylines \uncatcodespecials \sepspaces + \everypar{\starttabbox}% +} + +% Do the @verb magic: verbatim text is quoted by unique +% delimiter characters. Before first delimiter expect a +% right brace, after last delimiter expect closing brace: +% +% \def\doverb'{'#1'}'{#1} +% +% [Knuth] p. 382; only eat outer {} +\begingroup + \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other + \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] +\endgroup +% +\def\verb{\begingroup\setupverb\doverb} +% +% +% Do the @verbatim magic: define the macro \doverbatim so that +% the (first) argument ends when '@end verbatim' is reached, ie: +% +% \def\doverbatim#1@end verbatim{#1} +% +% For Texinfo it's a lot easier than for LaTeX, +% because texinfo's \verbatim doesn't stop at '\end{verbatim}': +% we need not redefine '\', '{' and '}'. +% +% Inspired by LaTeX's verbatim command set [latex.ltx] +% +\begingroup + \catcode`\ =\active + \obeylines % + % ignore everything up to the first ^^M, that's the newline at the end + % of the @verbatim input line itself. Otherwise we get an extra blank + % line in the output. + \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% + % We really want {...\end verbatim} in the body of the macro, but + % without the active space; thus we have to use \xdef and \gobble. +\endgroup +% +\envdef\verbatim{% + \setupverbatim\doverbatim +} +\let\Everbatim = \afterenvbreak + + +% @verbatiminclude FILE - insert text of file in verbatim environment. +% +\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} +% +\def\doverbatiminclude#1{% + {% + \makevalueexpandable + \setupverbatim + \indexnofonts % Allow `@@' and other weird things in file names. + \input #1 + \afterenvbreak + }% +} + +% @copying ... @end copying. +% Save the text away for @insertcopying later. +% +% We save the uninterpreted tokens, rather than creating a box. +% Saving the text in a box would be much easier, but then all the +% typesetting commands (@smallbook, font changes, etc.) have to be done +% beforehand -- and a) we want @copying to be done first in the source +% file; b) letting users define the frontmatter in as flexible order as +% possible is very desirable. +% +\def\copying{\checkenv{}\begingroup\scanargctxt\docopying} +\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} +% +\def\insertcopying{% + \begingroup + \parindent = 0pt % paragraph indentation looks wrong on title page + \scanexp\copyingtext + \endgroup +} + + +\message{defuns,} +% @defun etc. + +\newskip\defbodyindent \defbodyindent=.4in +\newskip\defargsindent \defargsindent=50pt +\newskip\deflastargmargin \deflastargmargin=18pt +\newcount\defunpenalty + +% Start the processing of @deffn: +\def\startdefun{% + \ifnum\lastpenalty<10000 + \medbreak + \defunpenalty=10003 % Will keep this @deffn together with the + % following @def command, see below. + \else + % If there are two @def commands in a row, we'll have a \nobreak, + % which is there to keep the function description together with its + % header. But if there's nothing but headers, we need to allow a + % break somewhere. Check specifically for penalty 10002, inserted + % by \printdefunline, instead of 10000, since the sectioning + % commands also insert a nobreak penalty, and we don't want to allow + % a break between a section heading and a defun. + % + % As a minor refinement, we avoid "club" headers by signalling + % with penalty of 10003 after the very first @deffn in the + % sequence (see above), and penalty of 10002 after any following + % @def command. + \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi + % + % Similarly, after a section heading, do not allow a break. + % But do insert the glue. + \medskip % preceded by discardable penalty, so not a breakpoint + \fi + % + \parindent=0in + \advance\leftskip by \defbodyindent + \exdentamount=\defbodyindent +} + +\def\dodefunx#1{% + % First, check whether we are in the right environment: + \checkenv#1% + % + % As above, allow line break if we have multiple x headers in a row. + % It's not a great place, though. + \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi + % + % And now, it's time to reuse the body of the original defun: + \expandafter\gobbledefun#1% +} +\def\gobbledefun#1\startdefun{} + +% \printdefunline \deffnheader{text} +% +\def\printdefunline#1#2{% + \begingroup + % call \deffnheader: + #1#2 \endheader + % common ending: + \interlinepenalty = 10000 + \advance\rightskip by 0pt plus 1fil + \endgraf + \nobreak\vskip -\parskip + \penalty\defunpenalty % signal to \startdefun and \dodefunx + % Some of the @defun-type tags do not enable magic parentheses, + % rendering the following check redundant. But we don't optimize. + \checkparencounts + \endgroup +} + +\def\Edefun{\endgraf\medbreak} + +% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; +% the only thing remaining is to define \deffnheader. +% +\def\makedefun#1{% + \expandafter\let\csname E#1\endcsname = \Edefun + \edef\temp{\noexpand\domakedefun + \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% + \temp +} + +% \domakedefun \deffn \deffnx \deffnheader +% +% Define \deffn and \deffnx, without parameters. +% \deffnheader has to be defined explicitly. +% +\def\domakedefun#1#2#3{% + \envdef#1{% + \startdefun + \parseargusing\activeparens{\printdefunline#3}% + }% + \def#2{\dodefunx#1}% + \def#3% +} + +%%% Untyped functions: + +% @deffn category name args +\makedefun{deffn}{\deffngeneral{}} + +% @deffn category class name args +\makedefun{defop}#1 {\defopon{#1\ \putwordon}} + +% \defopon {category on}class name args +\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } + +% \deffngeneral {subind}category name args +% +\def\deffngeneral#1#2 #3 #4\endheader{% + % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. + \dosubind{fn}{\code{#3}}{#1}% + \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% +} + +%%% Typed functions: + +% @deftypefn category type name args +\makedefun{deftypefn}{\deftypefngeneral{}} + +% @deftypeop category class type name args +\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} + +% \deftypeopon {category on}class type name args +\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } + +% \deftypefngeneral {subind}category type name args +% +\def\deftypefngeneral#1#2 #3 #4 #5\endheader{% + \dosubind{fn}{\code{#4}}{#1}% + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% +} + +%%% Typed variables: + +% @deftypevr category type var args +\makedefun{deftypevr}{\deftypecvgeneral{}} + +% @deftypecv category class type var args +\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} + +% \deftypecvof {category of}class type var args +\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } + +% \deftypecvgeneral {subind}category type var args +% +\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% + \dosubind{vr}{\code{#4}}{#1}% + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% +} + +%%% Untyped variables: + +% @defvr category var args +\makedefun{defvr}#1 {\deftypevrheader{#1} {} } + +% @defcv category class var args +\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} + +% \defcvof {category of}class var args +\def\defcvof#1#2 {\deftypecvof{#1}#2 {} } + +%%% Type: +% @deftp category name args +\makedefun{deftp}#1 #2 #3\endheader{% + \doind{tp}{\code{#2}}% + \defname{#1}{}{#2}\defunargs{#3\unskip}% +} + +% Remaining @defun-like shortcuts: +\makedefun{defun}{\deffnheader{\putwordDeffunc} } +\makedefun{defmac}{\deffnheader{\putwordDefmac} } +\makedefun{defspec}{\deffnheader{\putwordDefspec} } +\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } +\makedefun{defvar}{\defvrheader{\putwordDefvar} } +\makedefun{defopt}{\defvrheader{\putwordDefopt} } +\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } +\makedefun{defmethod}{\defopon\putwordMethodon} +\makedefun{deftypemethod}{\deftypeopon\putwordMethodon} +\makedefun{defivar}{\defcvof\putwordInstanceVariableof} +\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} + +% \defname, which formats the name of the @def (not the args). +% #1 is the category, such as "Function". +% #2 is the return type, if any. +% #3 is the function name. +% +% We are followed by (but not passed) the arguments, if any. +% +\def\defname#1#2#3{% + % Get the values of \leftskip and \rightskip as they were outside the @def... + \advance\leftskip by -\defbodyindent + % + % How we'll format the type name. Putting it in brackets helps + % distinguish it from the body text that may end up on the next line + % just below it. + \def\temp{#1}% + \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} + % + % Figure out line sizes for the paragraph shape. + % The first line needs space for \box0; but if \rightskip is nonzero, + % we need only space for the part of \box0 which exceeds it: + \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip + % The continuations: + \dimen2=\hsize \advance\dimen2 by -\defargsindent + % (plain.tex says that \dimen1 should be used only as global.) + \parshape 2 0in \dimen0 \defargsindent \dimen2 + % + % Put the type name to the right margin. + \noindent + \hbox to 0pt{% + \hfil\box0 \kern-\hsize + % \hsize has to be shortened this way: + \kern\leftskip + % Intentionally do not respect \rightskip, since we need the space. + }% + % + % Allow all lines to be underfull without complaint: + \tolerance=10000 \hbadness=10000 + \exdentamount=\defbodyindent + {% + % defun fonts. We use typewriter by default (used to be bold) because: + % . we're printing identifiers, they should be in tt in principle. + % . in languages with many accents, such as Czech or French, it's + % common to leave accents off identifiers. The result looks ok in + % tt, but exceedingly strange in rm. + % . we don't want -- and --- to be treated as ligatures. + % . this still does not fix the ?` and !` ligatures, but so far no + % one has made identifiers using them :). + \df \tt + \def\temp{#2}% return value type + \ifx\temp\empty\else \tclose{\temp} \fi + #3% output function name + }% + {\rm\enskip}% hskip 0.5 em of \tenrm + % + \boldbrax + % arguments will be output next, if any. +} + +% Print arguments in slanted roman (not ttsl), inconsistently with using +% tt for the name. This is because literal text is sometimes needed in +% the argument list (groff manual), and ttsl and tt are not very +% distinguishable. Prevent hyphenation at `-' chars. +% +\def\defunargs#1{% + % use sl by default (not ttsl), + % tt for the names. + \df \sl \hyphenchar\font=0 + % + % On the other hand, if an argument has two dashes (for instance), we + % want a way to get ttsl. Let's try @var for that. + \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% + #1% + \sl\hyphenchar\font=45 +} + +% We want ()&[] to print specially on the defun line. +% +\def\activeparens{% + \catcode`\(=\active \catcode`\)=\active + \catcode`\[=\active \catcode`\]=\active + \catcode`\&=\active +} + +% Make control sequences which act like normal parenthesis chars. +\let\lparen = ( \let\rparen = ) + +% Be sure that we always have a definition for `(', etc. For example, +% if the fn name has parens in it, \boldbrax will not be in effect yet, +% so TeX would otherwise complain about undefined control sequence. +{ + \activeparens + \global\let(=\lparen \global\let)=\rparen + \global\let[=\lbrack \global\let]=\rbrack + \global\let& = \& + + \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} + \gdef\magicamp{\let&=\amprm} +} + +\newcount\parencount + +% If we encounter &foo, then turn on ()-hacking afterwards +\newif\ifampseen +\def\amprm#1 {\ampseentrue{\bf\ }} + +\def\parenfont{% + \ifampseen + % At the first level, print parens in roman, + % otherwise use the default font. + \ifnum \parencount=1 \rm \fi + \else + % The \sf parens (in \boldbrax) actually are a little bolder than + % the contained text. This is especially needed for [ and ] . + \sf + \fi +} +\def\infirstlevel#1{% + \ifampseen + \ifnum\parencount=1 + #1% + \fi + \fi +} +\def\bfafterword#1 {#1 \bf} + +\def\opnr{% + \global\advance\parencount by 1 + {\parenfont(}% + \infirstlevel \bfafterword +} +\def\clnr{% + {\parenfont)}% + \infirstlevel \sl + \global\advance\parencount by -1 +} + +\newcount\brackcount +\def\lbrb{% + \global\advance\brackcount by 1 + {\bf[}% +} +\def\rbrb{% + {\bf]}% + \global\advance\brackcount by -1 +} + +\def\checkparencounts{% + \ifnum\parencount=0 \else \badparencount \fi + \ifnum\brackcount=0 \else \badbrackcount \fi +} +% these should not use \errmessage; the glibc manual, at least, actually +% has such constructs (when documenting function pointers). +\def\badparencount{% + \message{Warning: unbalanced parentheses in @def...}% + \global\parencount=0 +} +\def\badbrackcount{% + \message{Warning: unbalanced square brackets in @def...}% + \global\brackcount=0 +} + + +\message{macros,} +% @macro. + +% To do this right we need a feature of e-TeX, \scantokens, +% which we arrange to emulate with a temporary file in ordinary TeX. +\ifx\eTeXversion\undefined + \newwrite\macscribble + \def\scantokens#1{% + \toks0={#1}% + \immediate\openout\macscribble=\jobname.tmp + \immediate\write\macscribble{\the\toks0}% + \immediate\closeout\macscribble + \input \jobname.tmp + } +\fi + +\def\scanmacro#1{% + \begingroup + \newlinechar`\^^M + \let\xeatspaces\eatspaces + % Undo catcode changes of \startcontents and \doprintindex + % When called from @insertcopying or (short)caption, we need active + % backslash to get it printed correctly. Previously, we had + % \catcode`\\=\other instead. We'll see whether a problem appears + % with macro expansion. --kasal, 19aug04 + \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ + % ... and \example + \spaceisspace + % + % Append \endinput to make sure that TeX does not see the ending newline. + % I've verified that it is necessary both for e-TeX and for ordinary TeX + % --kasal, 29nov03 + \scantokens{#1\endinput}% + \endgroup +} + +\def\scanexp#1{% + \edef\temp{\noexpand\scanmacro{#1}}% + \temp +} + +\newcount\paramno % Count of parameters +\newtoks\macname % Macro name +\newif\ifrecursive % Is it recursive? + +% List of all defined macros in the form +% \definedummyword\macro1\definedummyword\macro2... +% Currently is also contains all @aliases; the list can be split +% if there is a need. +\def\macrolist{} + +% Add the macro to \macrolist +\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} +\def\addtomacrolistxxx#1{% + \toks0 = \expandafter{\macrolist\definedummyword#1}% + \xdef\macrolist{\the\toks0}% +} + +% Utility routines. +% This does \let #1 = #2, with \csnames; that is, +% \let \csname#1\endcsname = \csname#2\endcsname +% (except of course we have to play expansion games). +% +\def\cslet#1#2{% + \expandafter\let + \csname#1\expandafter\endcsname + \csname#2\endcsname +} + +% Trim leading and trailing spaces off a string. +% Concepts from aro-bend problem 15 (see CTAN). +{\catcode`\@=11 +\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} +\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} +\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} +\def\unbrace#1{#1} +\unbrace{\gdef\trim@@@ #1 } #2@{#1} +} + +% Trim a single trailing ^^M off a string. +{\catcode`\^^M=\other \catcode`\Q=3% +\gdef\eatcr #1{\eatcra #1Q^^MQ}% +\gdef\eatcra#1^^MQ{\eatcrb#1Q}% +\gdef\eatcrb#1Q#2Q{#1}% +} + +% Macro bodies are absorbed as an argument in a context where +% all characters are catcode 10, 11 or 12, except \ which is active +% (as in normal texinfo). It is necessary to change the definition of \. + +% Non-ASCII encodings make 8-bit characters active, so un-activate +% them to avoid their expansion. Must do this non-globally, to +% confine the change to the current group. + +% It's necessary to have hard CRs when the macro is executed. This is +% done by making ^^M (\endlinechar) catcode 12 when reading the macro +% body, and then making it the \newlinechar in \scanmacro. + +\def\scanctxt{% + \catcode`\"=\other + \catcode`\+=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\@=\other + \catcode`\^=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\~=\other + \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi +} + +\def\scanargctxt{% + \scanctxt + \catcode`\\=\other + \catcode`\^^M=\other +} + +\def\macrobodyctxt{% + \scanctxt + \catcode`\{=\other + \catcode`\}=\other + \catcode`\^^M=\other + \usembodybackslash +} + +\def\macroargctxt{% + \scanctxt + \catcode`\\=\other +} + +% \mbodybackslash is the definition of \ in @macro bodies. +% It maps \foo\ => \csname macarg.foo\endcsname => #N +% where N is the macro parameter number. +% We define \csname macarg.\endcsname to be \realbackslash, so +% \\ in macro replacement text gets you a backslash. + +{\catcode`@=0 @catcode`@\=@active + @gdef@usembodybackslash{@let\=@mbodybackslash} + @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} +} +\expandafter\def\csname macarg.\endcsname{\realbackslash} + +\def\macro{\recursivefalse\parsearg\macroxxx} +\def\rmacro{\recursivetrue\parsearg\macroxxx} + +\def\macroxxx#1{% + \getargs{#1}% now \macname is the macname and \argl the arglist + \ifx\argl\empty % no arguments + \paramno=0% + \else + \expandafter\parsemargdef \argl;% + \fi + \if1\csname ismacro.\the\macname\endcsname + \message{Warning: redefining \the\macname}% + \else + \expandafter\ifx\csname \the\macname\endcsname \relax + \else \errmessage{Macro name \the\macname\space already defined}\fi + \global\cslet{macsave.\the\macname}{\the\macname}% + \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% + \addtomacrolist{\the\macname}% + \fi + \begingroup \macrobodyctxt + \ifrecursive \expandafter\parsermacbody + \else \expandafter\parsemacbody + \fi} + +\parseargdef\unmacro{% + \if1\csname ismacro.#1\endcsname + \global\cslet{#1}{macsave.#1}% + \global\expandafter\let \csname ismacro.#1\endcsname=0% + % Remove the macro name from \macrolist: + \begingroup + \expandafter\let\csname#1\endcsname \relax + \let\definedummyword\unmacrodo + \xdef\macrolist{\macrolist}% + \endgroup + \else + \errmessage{Macro #1 not defined}% + \fi +} + +% Called by \do from \dounmacro on each macro. The idea is to omit any +% macro definitions that have been changed to \relax. +% +\def\unmacrodo#1{% + \ifx #1\relax + % remove this + \else + \noexpand\definedummyword \noexpand#1% + \fi +} + +% This makes use of the obscure feature that if the last token of a +% is #, then the preceding argument is delimited by +% an opening brace, and that opening brace is not consumed. +\def\getargs#1{\getargsxxx#1{}} +\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} +\def\getmacname #1 #2\relax{\macname={#1}} +\def\getmacargs#1{\def\argl{#1}} + +% Parse the optional {params} list. Set up \paramno and \paramlist +% so \defmacro knows what to do. Define \macarg.blah for each blah +% in the params list, to be ##N where N is the position in that list. +% That gets used by \mbodybackslash (above). + +% We need to get `macro parameter char #' into several definitions. +% The technique used is stolen from LaTeX: let \hash be something +% unexpandable, insert that wherever you need a #, and then redefine +% it to # just before using the token list produced. +% +% The same technique is used to protect \eatspaces till just before +% the macro is used. + +\def\parsemargdef#1;{\paramno=0\def\paramlist{}% + \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} +\def\parsemargdefxxx#1,{% + \if#1;\let\next=\relax + \else \let\next=\parsemargdefxxx + \advance\paramno by 1% + \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname + {\xeatspaces{\hash\the\paramno}}% + \edef\paramlist{\paramlist\hash\the\paramno,}% + \fi\next} + +% These two commands read recursive and nonrecursive macro bodies. +% (They're different since rec and nonrec macros end differently.) + +\long\def\parsemacbody#1@end macro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% +\long\def\parsermacbody#1@end rmacro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% + +% This defines the macro itself. There are six cases: recursive and +% nonrecursive macros of zero, one, and many arguments. +% Much magic with \expandafter here. +% \xdef is used so that macro definitions will survive the file +% they're defined in; @include reads the file inside a group. +\def\defmacro{% + \let\hash=##% convert placeholders to macro parameter chars + \ifrecursive + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\scanmacro{\temp}}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup\noexpand\scanmacro{\temp}}% + \else % many + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{\egroup\noexpand\scanmacro{\temp}}% + \fi + \else + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \else % many + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \expandafter\noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \fi + \fi} + +\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} + +% \braceorline decides whether the next nonwhitespace character is a +% {. If so it reads up to the closing }, if not, it reads the whole +% line. Whatever was read is then fed to the next control sequence +% as an argument (by \parsebrace or \parsearg) +\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} +\def\braceorlinexxx{% + \ifx\nchar\bgroup\else + \expandafter\parsearg + \fi \macnamexxx} + + +% @alias. +% We need some trickery to remove the optional spaces around the equal +% sign. Just make them active and then expand them all to nothing. +\def\alias{\parseargusing\obeyspaces\aliasxxx} +\def\aliasxxx #1{\aliasyyy#1\relax} +\def\aliasyyy #1=#2\relax{% + {% + \expandafter\let\obeyedspace=\empty + \addtomacrolist{#1}% + \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% + }% + \next +} + + +\message{cross references,} + +\newwrite\auxfile +\newif\ifhavexrefs % True if xref values are known. +\newif\ifwarnedxrefs % True if we warned once that they aren't known. + +% @inforef is relatively simple. +\def\inforef #1{\inforefzzz #1,,,,**} +\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, + node \samp{\ignorespaces#1{}}} + +% @node's only job in TeX is to define \lastnode, which is used in +% cross-references. The @node line might or might not have commas, and +% might or might not have spaces before the first comma, like: +% @node foo , bar , ... +% We don't want such trailing spaces in the node name. +% +\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} +% +% also remove a trailing comma, in case of something like this: +% @node Help-Cross, , , Cross-refs +\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} +\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} + +\let\nwnode=\node +\let\lastnode=\empty + +% Write a cross-reference definition for the current node. #1 is the +% type (Ynumbered, Yappendix, Ynothing). +% +\def\donoderef#1{% + \ifx\lastnode\empty\else + \setref{\lastnode}{#1}% + \global\let\lastnode=\empty + \fi +} + +% @anchor{NAME} -- define xref target at arbitrary point. +% +\newcount\savesfregister +% +\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} +\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} +\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} + +% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an +% anchor), which consists of three parts: +% 1) NAME-title - the current sectioning name taken from \lastsection, +% or the anchor name. +% 2) NAME-snt - section number and type, passed as the SNT arg, or +% empty for anchors. +% 3) NAME-pg - the page number. +% +% This is called from \donoderef, \anchor, and \dofloat. In the case of +% floats, there is an additional part, which is not written here: +% 4) NAME-lof - the text as it should appear in a @listoffloats. +% +\def\setref#1#2{% + \pdfmkdest{#1}% + \iflinks + {% + \atdummies % preserve commands, but don't expand them + \edef\writexrdef##1##2{% + \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef + ##1}{##2}}% these are parameters of \writexrdef + }% + \toks0 = \expandafter{\lastsection}% + \immediate \writexrdef{title}{\the\toks0 }% + \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. + \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout + }% + \fi +} + +% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is +% the node name, #2 the name of the Info cross-reference, #3 the printed +% node name, #4 the name of the Info file, #5 the name of the printed +% manual. All but the node name can be omitted. +% +\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} +\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} +\def\ref#1{\xrefX[#1,,,,,,,]} +\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup + \unsepspaces + \def\printedmanual{\ignorespaces #5}% + \def\printedrefname{\ignorespaces #3}% + \setbox1=\hbox{\printedmanual\unskip}% + \setbox0=\hbox{\printedrefname\unskip}% + \ifdim \wd0 = 0pt + % No printed node name was explicitly given. + \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax + % Use the node name inside the square brackets. + \def\printedrefname{\ignorespaces #1}% + \else + % Use the actual chapter/section title appear inside + % the square brackets. Use the real section title if we have it. + \ifdim \wd1 > 0pt + % It is in another manual, so we don't have it. + \def\printedrefname{\ignorespaces #1}% + \else + \ifhavexrefs + % We know the real title if we have the xref values. + \def\printedrefname{\refx{#1-title}{}}% + \else + % Otherwise just copy the Info node name. + \def\printedrefname{\ignorespaces #1}% + \fi% + \fi + \fi + \fi + % + % Make link in pdf output. + \ifpdf + {\indexnofonts + \turnoffactive + % This expands tokens, so do it after making catcode changes, so _ + % etc. don't get their TeX definitions. + \getfilename{#4}% + % + % See comments at \activebackslashdouble. + {\activebackslashdouble \xdef\pdfxrefdest{#1}% + \backslashparens\pdfxrefdest}% + % + \leavevmode + \startlink attr{/Border [0 0 0]}% + \ifnum\filenamelength>0 + goto file{\the\filename.pdf} name{\pdfxrefdest}% + \else + goto name{\pdfmkpgn{\pdfxrefdest}}% + \fi + }% + \setcolor{\linkcolor}% + \fi + % + % Float references are printed completely differently: "Figure 1.2" + % instead of "[somenode], p.3". We distinguish them by the + % LABEL-title being set to a magic string. + {% + % Have to otherify everything special to allow the \csname to + % include an _ in the xref name, etc. + \indexnofonts + \turnoffactive + \expandafter\global\expandafter\let\expandafter\Xthisreftitle + \csname XR#1-title\endcsname + }% + \iffloat\Xthisreftitle + % If the user specified the print name (third arg) to the ref, + % print it instead of our usual "Figure 1.2". + \ifdim\wd0 = 0pt + \refx{#1-snt}{}% + \else + \printedrefname + \fi + % + % if the user also gave the printed manual name (fifth arg), append + % "in MANUALNAME". + \ifdim \wd1 > 0pt + \space \putwordin{} \cite{\printedmanual}% + \fi + \else + % node/anchor (non-float) references. + % + % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not + % insert empty discretionaries after hyphens, which means that it will + % not find a line break at a hyphen in a node names. Since some manuals + % are best written with fairly long node names, containing hyphens, this + % is a loss. Therefore, we give the text of the node name again, so it + % is as if TeX is seeing it for the first time. + \ifdim \wd1 > 0pt + \putwordSection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}% + \else + % _ (for example) has to be the character _ for the purposes of the + % control sequence corresponding to the node, but it has to expand + % into the usual \leavevmode...\vrule stuff for purposes of + % printing. So we \turnoffactive for the \refx-snt, back on for the + % printing, back off for the \refx-pg. + {\turnoffactive + % Only output a following space if the -snt ref is nonempty; for + % @unnumbered and @anchor, it won't be. + \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% + \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi + }% + % output the `[mynode]' via a macro so it can be overridden. + \xrefprintnodename\printedrefname + % + % But we always want a comma and a space: + ,\space + % + % output the `page 3'. + \turnoffactive \putwordpage\tie\refx{#1-pg}{}% + \fi + \fi + \endlink +\endgroup} + +% This macro is called from \xrefX for the `[nodename]' part of xref +% output. It's a separate macro only so it can be changed more easily, +% since square brackets don't work well in some documents. Particularly +% one that Bob is working on :). +% +\def\xrefprintnodename#1{[#1]} + +% Things referred to by \setref. +% +\def\Ynothing{} +\def\Yomitfromtoc{} +\def\Ynumbered{% + \ifnum\secno=0 + \putwordChapter@tie \the\chapno + \else \ifnum\subsecno=0 + \putwordSection@tie \the\chapno.\the\secno + \else \ifnum\subsubsecno=0 + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno + \else + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno + \fi\fi\fi +} +\def\Yappendix{% + \ifnum\secno=0 + \putwordAppendix@tie @char\the\appendixno{}% + \else \ifnum\subsecno=0 + \putwordSection@tie @char\the\appendixno.\the\secno + \else \ifnum\subsubsecno=0 + \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno + \else + \putwordSection@tie + @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno + \fi\fi\fi +} + +% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. +% If its value is nonempty, SUFFIX is output afterward. +% +\def\refx#1#2{% + {% + \indexnofonts + \otherbackslash + \expandafter\global\expandafter\let\expandafter\thisrefX + \csname XR#1\endcsname + }% + \ifx\thisrefX\relax + % If not defined, say something at least. + \angleleft un\-de\-fined\angleright + \iflinks + \ifhavexrefs + \message{\linenumber Undefined cross reference `#1'.}% + \else + \ifwarnedxrefs\else + \global\warnedxrefstrue + \message{Cross reference values unknown; you must run TeX again.}% + \fi + \fi + \fi + \else + % It's defined, so just use it. + \thisrefX + \fi + #2% Output the suffix in any case. +} + +% This is the macro invoked by entries in the aux file. Usually it's +% just a \def (we prepend XR to the control sequence name to avoid +% collisions). But if this is a float type, we have more work to do. +% +\def\xrdef#1#2{% + {% The node name might contain 8-bit characters, which in our current + % implementation are changed to commands like @'e. Don't let these + % mess up the control sequence name. + \indexnofonts + \turnoffactive + \xdef\safexrefname{#1}% + }% + % + \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref + % + % Was that xref control sequence that we just defined for a float? + \expandafter\iffloat\csname XR\safexrefname\endcsname + % it was a float, and we have the (safe) float type in \iffloattype. + \expandafter\let\expandafter\floatlist + \csname floatlist\iffloattype\endcsname + % + % Is this the first time we've seen this float type? + \expandafter\ifx\floatlist\relax + \toks0 = {\do}% yes, so just \do + \else + % had it before, so preserve previous elements in list. + \toks0 = \expandafter{\floatlist\do}% + \fi + % + % Remember this xref in the control sequence \floatlistFLOATTYPE, + % for later use in \listoffloats. + \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 + {\safexrefname}}% + \fi +} + +% Read the last existing aux file, if any. No error if none exists. +% +\def\tryauxfile{% + \openin 1 \jobname.aux + \ifeof 1 \else + \readdatafile{aux}% + \global\havexrefstrue + \fi + \closein 1 +} + +\def\setupdatafile{% + \catcode`\^^@=\other + \catcode`\^^A=\other + \catcode`\^^B=\other + \catcode`\^^C=\other + \catcode`\^^D=\other + \catcode`\^^E=\other + \catcode`\^^F=\other + \catcode`\^^G=\other + \catcode`\^^H=\other + \catcode`\^^K=\other + \catcode`\^^L=\other + \catcode`\^^N=\other + \catcode`\^^P=\other + \catcode`\^^Q=\other + \catcode`\^^R=\other + \catcode`\^^S=\other + \catcode`\^^T=\other + \catcode`\^^U=\other + \catcode`\^^V=\other + \catcode`\^^W=\other + \catcode`\^^X=\other + \catcode`\^^Z=\other + \catcode`\^^[=\other + \catcode`\^^\=\other + \catcode`\^^]=\other + \catcode`\^^^=\other + \catcode`\^^_=\other + % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. + % in xref tags, i.e., node names. But since ^^e4 notation isn't + % supported in the main text, it doesn't seem desirable. Furthermore, + % that is not enough: for node names that actually contain a ^ + % character, we would end up writing a line like this: 'xrdef {'hat + % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first + % argument, and \hat is not an expandable control sequence. It could + % all be worked out, but why? Either we support ^^ or we don't. + % + % The other change necessary for this was to define \auxhat: + % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter + % and then to call \auxhat in \setq. + % + \catcode`\^=\other + % + % Special characters. Should be turned off anyway, but... + \catcode`\~=\other + \catcode`\[=\other + \catcode`\]=\other + \catcode`\"=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\$=\other + \catcode`\#=\other + \catcode`\&=\other + \catcode`\%=\other + \catcode`+=\other % avoid \+ for paranoia even though we've turned it off + % + % This is to support \ in node names and titles, since the \ + % characters end up in a \csname. It's easier than + % leaving it active and making its active definition an actual \ + % character. What I don't understand is why it works in the *value* + % of the xrdef. Seems like it should be a catcode12 \, and that + % should not typeset properly. But it works, so I'm moving on for + % now. --karl, 15jan04. + \catcode`\\=\other + % + % Make the characters 128-255 be printing characters. + {% + \count1=128 + \def\loop{% + \catcode\count1=\other + \advance\count1 by 1 + \ifnum \count1<256 \loop \fi + }% + }% + % + % @ is our escape character in .aux files, and we need braces. + \catcode`\{=1 + \catcode`\}=2 + \catcode`\@=0 +} + +\def\readdatafile#1{% +\begingroup + \setupdatafile + \input\jobname.#1 +\endgroup} + + +\message{insertions,} +% including footnotes. + +\newcount \footnoteno + +% The trailing space in the following definition for supereject is +% vital for proper filling; pages come out unaligned when you do a +% pagealignmacro call if that space before the closing brace is +% removed. (Generally, numeric constants should always be followed by a +% space to prevent strange expansion errors.) +\def\supereject{\par\penalty -20000\footnoteno =0 } + +% @footnotestyle is meaningful for info output only. +\let\footnotestyle=\comment + +{\catcode `\@=11 +% +% Auto-number footnotes. Otherwise like plain. +\gdef\footnote{% + \let\indent=\ptexindent + \let\noindent=\ptexnoindent + \global\advance\footnoteno by \@ne + \edef\thisfootno{$^{\the\footnoteno}$}% + % + % In case the footnote comes at the end of a sentence, preserve the + % extra spacing after we do the footnote number. + \let\@sf\empty + \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi + % + % Remove inadvertent blank space before typesetting the footnote number. + \unskip + \thisfootno\@sf + \dofootnote +}% + +% Don't bother with the trickery in plain.tex to not require the +% footnote text as a parameter. Our footnotes don't need to be so general. +% +% Oh yes, they do; otherwise, @ifset (and anything else that uses +% \parseargline) fails inside footnotes because the tokens are fixed when +% the footnote is read. --karl, 16nov96. +% +\gdef\dofootnote{% + \insert\footins\bgroup + % We want to typeset this text as a normal paragraph, even if the + % footnote reference occurs in (for example) a display environment. + % So reset some parameters. + \hsize=\pagewidth + \interlinepenalty\interfootnotelinepenalty + \splittopskip\ht\strutbox % top baseline for broken footnotes + \splitmaxdepth\dp\strutbox + \floatingpenalty\@MM + \leftskip\z@skip + \rightskip\z@skip + \spaceskip\z@skip + \xspaceskip\z@skip + \parindent\defaultparindent + % + \smallfonts \rm + % + % Because we use hanging indentation in footnotes, a @noindent appears + % to exdent this text, so make it be a no-op. makeinfo does not use + % hanging indentation so @noindent can still be needed within footnote + % text after an @example or the like (not that this is good style). + \let\noindent = \relax + % + % Hang the footnote text off the number. Use \everypar in case the + % footnote extends for more than one paragraph. + \everypar = {\hang}% + \textindent{\thisfootno}% + % + % Don't crash into the line above the footnote text. Since this + % expands into a box, it must come within the paragraph, lest it + % provide a place where TeX can split the footnote. + \footstrut + \futurelet\next\fo@t +} +}%end \catcode `\@=11 + +% In case a @footnote appears in a vbox, save the footnote text and create +% the real \insert just after the vbox finished. Otherwise, the insertion +% would be lost. +% Similarly, if a @footnote appears inside an alignment, save the footnote +% text to a box and make the \insert when a row of the table is finished. +% And the same can be done for other insert classes. --kasal, 16nov03. + +% Replace the \insert primitive by a cheating macro. +% Deeper inside, just make sure that the saved insertions are not spilled +% out prematurely. +% +\def\startsavinginserts{% + \ifx \insert\ptexinsert + \let\insert\saveinsert + \else + \let\checkinserts\relax + \fi +} + +% This \insert replacement works for both \insert\footins{foo} and +% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. +% +\def\saveinsert#1{% + \edef\next{\noexpand\savetobox \makeSAVEname#1}% + \afterassignment\next + % swallow the left brace + \let\temp = +} +\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} +\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} + +\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} + +\def\placesaveins#1{% + \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname + {\box#1}% +} + +% eat @SAVE -- beware, all of them have catcode \other: +{ + \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) + \gdef\gobblesave @SAVE{} +} + +% initialization: +\def\newsaveins #1{% + \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% + \next +} +\def\newsaveinsX #1{% + \csname newbox\endcsname #1% + \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts + \checksaveins #1}% +} + +% initialize: +\let\checkinserts\empty +\newsaveins\footins +\newsaveins\margin + + +% @image. We use the macros from epsf.tex to support this. +% If epsf.tex is not installed and @image is used, we complain. +% +% Check for and read epsf.tex up front. If we read it only at @image +% time, we might be inside a group, and then its definitions would get +% undone and the next image would fail. +\openin 1 = epsf.tex +\ifeof 1 \else + % Do not bother showing banner with epsf.tex v2.7k (available in + % doc/epsf.tex and on ctan). + \def\epsfannounce{\toks0 = }% + \input epsf.tex +\fi +\closein 1 +% +% We will only complain once about lack of epsf.tex. +\newif\ifwarnednoepsf +\newhelp\noepsfhelp{epsf.tex must be installed for images to + work. It is also included in the Texinfo distribution, or you can get + it from ftp://tug.org/tex/epsf.tex.} +% +\def\image#1{% + \ifx\epsfbox\undefined + \ifwarnednoepsf \else + \errhelp = \noepsfhelp + \errmessage{epsf.tex not found, images will be ignored}% + \global\warnednoepsftrue + \fi + \else + \imagexxx #1,,,,,\finish + \fi +} +% +% Arguments to @image: +% #1 is (mandatory) image filename; we tack on .eps extension. +% #2 is (optional) width, #3 is (optional) height. +% #4 is (ignored optional) html alt text. +% #5 is (ignored optional) extension. +% #6 is just the usual extra ignored arg for parsing this stuff. +\newif\ifimagevmode +\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup + \catcode`\^^M = 5 % in case we're inside an example + \normalturnoffactive % allow _ et al. in names + % If the image is by itself, center it. + \ifvmode + \imagevmodetrue + \nobreak\medskip + % Usually we'll have text after the image which will insert + % \parskip glue, so insert it here too to equalize the space + % above and below. + \nobreak\vskip\parskip + \nobreak + \fi + % + % Leave vertical mode so that indentation from an enclosing + % environment such as @quotation is respected. On the other hand, if + % it's at the top level, we don't want the normal paragraph indentation. + \noindent + % + % Output the image. + \ifpdf + \dopdfimage{#1}{#2}{#3}% + \else + % \epsfbox itself resets \epsf?size at each figure. + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi + \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi + \epsfbox{#1.eps}% + \fi + % + \ifimagevmode \medskip \fi % space after the standalone image +\endgroup} + + +% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, +% etc. We don't actually implement floating yet, we always include the +% float "here". But it seemed the best name for the future. +% +\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} + +% There may be a space before second and/or third parameter; delete it. +\def\eatcommaspace#1, {#1,} + +% #1 is the optional FLOATTYPE, the text label for this float, typically +% "Figure", "Table", "Example", etc. Can't contain commas. If omitted, +% this float will not be numbered and cannot be referred to. +% +% #2 is the optional xref label. Also must be present for the float to +% be referable. +% +% #3 is the optional positioning argument; for now, it is ignored. It +% will somehow specify the positions allowed to float to (here, top, bottom). +% +% We keep a separate counter for each FLOATTYPE, which we reset at each +% chapter-level command. +\let\resetallfloatnos=\empty +% +\def\dofloat#1,#2,#3,#4\finish{% + \let\thiscaption=\empty + \let\thisshortcaption=\empty + % + % don't lose footnotes inside @float. + % + % BEWARE: when the floats start float, we have to issue warning whenever an + % insert appears inside a float which could possibly float. --kasal, 26may04 + % + \startsavinginserts + % + % We can't be used inside a paragraph. + \par + % + \vtop\bgroup + \def\floattype{#1}% + \def\floatlabel{#2}% + \def\floatloc{#3}% we do nothing with this yet. + % + \ifx\floattype\empty + \let\safefloattype=\empty + \else + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + \fi + % + % If label is given but no type, we handle that as the empty type. + \ifx\floatlabel\empty \else + % We want each FLOATTYPE to be numbered separately (Figure 1, + % Table 1, Figure 2, ...). (And if no label, no number.) + % + \expandafter\getfloatno\csname\safefloattype floatno\endcsname + \global\advance\floatno by 1 + % + {% + % This magic value for \lastsection is output by \setref as the + % XREFLABEL-title value. \xrefX uses it to distinguish float + % labels (which have a completely different output format) from + % node and anchor labels. And \xrdef uses it to construct the + % lists of floats. + % + \edef\lastsection{\floatmagic=\safefloattype}% + \setref{\floatlabel}{Yfloat}% + }% + \fi + % + % start with \parskip glue, I guess. + \vskip\parskip + % + % Don't suppress indentation if a float happens to start a section. + \restorefirstparagraphindent +} + +% we have these possibilities: +% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap +% @float Foo,lbl & no caption: Foo 1.1 +% @float Foo & @caption{Cap}: Foo: Cap +% @float Foo & no caption: Foo +% @float ,lbl & Caption{Cap}: 1.1: Cap +% @float ,lbl & no caption: 1.1 +% @float & @caption{Cap}: Cap +% @float & no caption: +% +\def\Efloat{% + \let\floatident = \empty + % + % In all cases, if we have a float type, it comes first. + \ifx\floattype\empty \else \def\floatident{\floattype}\fi + % + % If we have an xref label, the number comes next. + \ifx\floatlabel\empty \else + \ifx\floattype\empty \else % if also had float type, need tie first. + \appendtomacro\floatident{\tie}% + \fi + % the number. + \appendtomacro\floatident{\chaplevelprefix\the\floatno}% + \fi + % + % Start the printed caption with what we've constructed in + % \floatident, but keep it separate; we need \floatident again. + \let\captionline = \floatident + % + \ifx\thiscaption\empty \else + \ifx\floatident\empty \else + \appendtomacro\captionline{: }% had ident, so need a colon between + \fi + % + % caption text. + \appendtomacro\captionline{\scanexp\thiscaption}% + \fi + % + % If we have anything to print, print it, with space before. + % Eventually this needs to become an \insert. + \ifx\captionline\empty \else + \vskip.5\parskip + \captionline + % + % Space below caption. + \vskip\parskip + \fi + % + % If have an xref label, write the list of floats info. Do this + % after the caption, to avoid chance of it being a breakpoint. + \ifx\floatlabel\empty \else + % Write the text that goes in the lof to the aux file as + % \floatlabel-lof. Besides \floatident, we include the short + % caption if specified, else the full caption if specified, else nothing. + {% + \atdummies + % + % since we read the caption text in the macro world, where ^^M + % is turned into a normal character, we have to scan it back, so + % we don't write the literal three characters "^^M" into the aux file. + \scanexp{% + \xdef\noexpand\gtemp{% + \ifx\thisshortcaption\empty + \thiscaption + \else + \thisshortcaption + \fi + }% + }% + \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident + \ifx\gtemp\empty \else : \gtemp \fi}}% + }% + \fi + \egroup % end of \vtop + % + % place the captured inserts + % + % BEWARE: when the floats start floating, we have to issue warning + % whenever an insert appears inside a float which could possibly + % float. --kasal, 26may04 + % + \checkinserts +} + +% Append the tokens #2 to the definition of macro #1, not expanding either. +% +\def\appendtomacro#1#2{% + \expandafter\def\expandafter#1\expandafter{#1#2}% +} + +% @caption, @shortcaption +% +\def\caption{\docaption\thiscaption} +\def\shortcaption{\docaption\thisshortcaption} +\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} +\def\defcaption#1#2{\egroup \def#1{#2}} + +% The parameter is the control sequence identifying the counter we are +% going to use. Create it if it doesn't exist and assign it to \floatno. +\def\getfloatno#1{% + \ifx#1\relax + % Haven't seen this figure type before. + \csname newcount\endcsname #1% + % + % Remember to reset this floatno at the next chap. + \expandafter\gdef\expandafter\resetallfloatnos + \expandafter{\resetallfloatnos #1=0 }% + \fi + \let\floatno#1% +} + +% \setref calls this to get the XREFLABEL-snt value. We want an @xref +% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we +% first read the @float command. +% +\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% + +% Magic string used for the XREFLABEL-title value, so \xrefX can +% distinguish floats from other xref types. +\def\floatmagic{!!float!!} + +% #1 is the control sequence we are passed; we expand into a conditional +% which is true if #1 represents a float ref. That is, the magic +% \lastsection value which we \setref above. +% +\def\iffloat#1{\expandafter\doiffloat#1==\finish} +% +% #1 is (maybe) the \floatmagic string. If so, #2 will be the +% (safe) float type for this float. We set \iffloattype to #2. +% +\def\doiffloat#1=#2=#3\finish{% + \def\temp{#1}% + \def\iffloattype{#2}% + \ifx\temp\floatmagic +} + +% @listoffloats FLOATTYPE - print a list of floats like a table of contents. +% +\parseargdef\listoffloats{% + \def\floattype{#1}% floattype + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + % + % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. + \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax + \ifhavexrefs + % if the user said @listoffloats foo but never @float foo. + \message{\linenumber No `\safefloattype' floats to list.}% + \fi + \else + \begingroup + \leftskip=\tocindent % indent these entries like a toc + \let\do=\listoffloatsdo + \csname floatlist\safefloattype\endcsname + \endgroup + \fi +} + +% This is called on each entry in a list of floats. We're passed the +% xref label, in the form LABEL-title, which is how we save it in the +% aux file. We strip off the -title and look up \XRLABEL-lof, which +% has the text we're supposed to typeset here. +% +% Figures without xref labels will not be included in the list (since +% they won't appear in the aux file). +% +\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} +\def\listoffloatsdoentry#1-title\finish{{% + % Can't fully expand XR#1-lof because it can contain anything. Just + % pass the control sequence. On the other hand, XR#1-pg is just the + % page number, and we want to fully expand that so we can get a link + % in pdf output. + \toksA = \expandafter{\csname XR#1-lof\endcsname}% + % + % use the same \entry macro we use to generate the TOC and index. + \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% + \writeentry +}} + + +\message{localization,} + +% For single-language documents, @documentlanguage is usually given very +% early, just after @documentencoding. Single argument is the language +% (de) or locale (de_DE) abbreviation. +% +{ + \catcode`\_ = \active + \globaldefs=1 +\parseargdef\documentlanguage{\begingroup + \let_=\normalunderscore % normal _ character for filenames + \tex % read txi-??.tex file in plain TeX. + % Read the file by the name they passed if it exists. + \openin 1 txi-#1.tex + \ifeof 1 + \documentlanguagetrywithoutunderscore{#1_\finish}% + \else + \globaldefs = 1 % everything in the txi-LL files needs to persist + \input txi-#1.tex + \fi + \closein 1 + \endgroup % end raw TeX +\endgroup} +} +% +% If they passed de_DE, and txi-de_DE.tex doesn't exist, +% try txi-de.tex. +% +\def\documentlanguagetrywithoutunderscore#1_#2\finish{% + \openin 1 txi-#1.tex + \ifeof 1 + \errhelp = \nolanghelp + \errmessage{Cannot read language file txi-#1.tex}% + \else + \input txi-#1.tex + \fi + \closein 1 +} +% +\newhelp\nolanghelp{The given language definition file cannot be found or +is empty. Maybe you need to install it? Putting it in the current +directory should work if nowhere else does.} + +% This macro is called from txi-??.tex files; the first argument is the +% \language name to set (without the "\lang@" prefix), the second and +% third args are \{left,right}hyphenmin. +% +% The language names to pass are determined when the format is built. +% See the etex.log file created at that time, e.g., +% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. +% +% With TeX Live 2008, etex now includes hyphenation patterns for all +% available languages. This means we can support hyphenation in +% Texinfo, at least to some extent. (This still doesn't solve the +% accented characters problem.) +% +\catcode`@=11 +\def\txisetlanguage#1#2#3{% + % do not set the language if the name is undefined in the current TeX. + \expandafter\ifx\csname lang@#1\endcsname \relax + \message{no patterns for #1}% + \else + \global\language = \csname lang@#1\endcsname + \fi + % but there is no harm in adjusting the hyphenmin values regardless. + \global\lefthyphenmin = #2\relax + \global\righthyphenmin = #3\relax +} + +% Helpers for encodings. +% Set the catcode of characters 128 through 255 to the specified number. +% +\def\setnonasciicharscatcode#1{% + \count255=128 + \loop\ifnum\count255<256 + \global\catcode\count255=#1\relax + \advance\count255 by 1 + \repeat +} + +\def\setnonasciicharscatcodenonglobal#1{% + \count255=128 + \loop\ifnum\count255<256 + \catcode\count255=#1\relax + \advance\count255 by 1 + \repeat +} + +% @documentencoding sets the definition of non-ASCII characters +% according to the specified encoding. +% +\parseargdef\documentencoding{% + % Encoding being declared for the document. + \def\declaredencoding{\csname #1.enc\endcsname}% + % + % Supported encodings: names converted to tokens in order to be able + % to compare them with \ifx. + \def\ascii{\csname US-ASCII.enc\endcsname}% + \def\latnine{\csname ISO-8859-15.enc\endcsname}% + \def\latone{\csname ISO-8859-1.enc\endcsname}% + \def\lattwo{\csname ISO-8859-2.enc\endcsname}% + \def\utfeight{\csname UTF-8.enc\endcsname}% + % + \ifx \declaredencoding \ascii + \asciichardefs + % + \else \ifx \declaredencoding \lattwo + \setnonasciicharscatcode\active + \lattwochardefs + % + \else \ifx \declaredencoding \latone + \setnonasciicharscatcode\active + \latonechardefs + % + \else \ifx \declaredencoding \latnine + \setnonasciicharscatcode\active + \latninechardefs + % + \else \ifx \declaredencoding \utfeight + \setnonasciicharscatcode\active + \utfeightchardefs + % + \else + \message{Unknown document encoding #1, ignoring.}% + % + \fi % utfeight + \fi % latnine + \fi % latone + \fi % lattwo + \fi % ascii +} + +% A message to be logged when using a character that isn't available +% the default font encoding (OT1). +% +\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} + +% Take account of \c (plain) vs. \, (Texinfo) difference. +\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} + +% First, make active non-ASCII characters in order for them to be +% correctly categorized when TeX reads the replacement text of +% macros containing the character definitions. +\setnonasciicharscatcode\active +% +% Latin1 (ISO-8859-1) character definitions. +\def\latonechardefs{% + \gdef^^a0{~} + \gdef^^a1{\exclamdown} + \gdef^^a2{\missingcharmsg{CENT SIGN}} + \gdef^^a3{{\pounds}} + \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} + \gdef^^a5{\missingcharmsg{YEN SIGN}} + \gdef^^a6{\missingcharmsg{BROKEN BAR}} + \gdef^^a7{\S} + \gdef^^a8{\"{}} + \gdef^^a9{\copyright} + \gdef^^aa{\ordf} + \gdef^^ab{\guillemetleft} + \gdef^^ac{$\lnot$} + \gdef^^ad{\-} + \gdef^^ae{\registeredsymbol} + \gdef^^af{\={}} + % + \gdef^^b0{\textdegree} + \gdef^^b1{$\pm$} + \gdef^^b2{$^2$} + \gdef^^b3{$^3$} + \gdef^^b4{\'{}} + \gdef^^b5{$\mu$} + \gdef^^b6{\P} + % + \gdef^^b7{$^.$} + \gdef^^b8{\cedilla\ } + \gdef^^b9{$^1$} + \gdef^^ba{\ordm} + % + \gdef^^bb{\guilletright} + \gdef^^bc{$1\over4$} + \gdef^^bd{$1\over2$} + \gdef^^be{$3\over4$} + \gdef^^bf{\questiondown} + % + \gdef^^c0{\`A} + \gdef^^c1{\'A} + \gdef^^c2{\^A} + \gdef^^c3{\~A} + \gdef^^c4{\"A} + \gdef^^c5{\ringaccent A} + \gdef^^c6{\AE} + \gdef^^c7{\cedilla C} + \gdef^^c8{\`E} + \gdef^^c9{\'E} + \gdef^^ca{\^E} + \gdef^^cb{\"E} + \gdef^^cc{\`I} + \gdef^^cd{\'I} + \gdef^^ce{\^I} + \gdef^^cf{\"I} + % + \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER ETH}} + \gdef^^d1{\~N} + \gdef^^d2{\`O} + \gdef^^d3{\'O} + \gdef^^d4{\^O} + \gdef^^d5{\~O} + \gdef^^d6{\"O} + \gdef^^d7{$\times$} + \gdef^^d8{\O} + \gdef^^d9{\`U} + \gdef^^da{\'U} + \gdef^^db{\^U} + \gdef^^dc{\"U} + \gdef^^dd{\'Y} + \gdef^^de{\missingcharmsg{LATIN CAPITAL LETTER THORN}} + \gdef^^df{\ss} + % + \gdef^^e0{\`a} + \gdef^^e1{\'a} + \gdef^^e2{\^a} + \gdef^^e3{\~a} + \gdef^^e4{\"a} + \gdef^^e5{\ringaccent a} + \gdef^^e6{\ae} + \gdef^^e7{\cedilla c} + \gdef^^e8{\`e} + \gdef^^e9{\'e} + \gdef^^ea{\^e} + \gdef^^eb{\"e} + \gdef^^ec{\`{\dotless i}} + \gdef^^ed{\'{\dotless i}} + \gdef^^ee{\^{\dotless i}} + \gdef^^ef{\"{\dotless i}} + % + \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER ETH}} + \gdef^^f1{\~n} + \gdef^^f2{\`o} + \gdef^^f3{\'o} + \gdef^^f4{\^o} + \gdef^^f5{\~o} + \gdef^^f6{\"o} + \gdef^^f7{$\div$} + \gdef^^f8{\o} + \gdef^^f9{\`u} + \gdef^^fa{\'u} + \gdef^^fb{\^u} + \gdef^^fc{\"u} + \gdef^^fd{\'y} + \gdef^^fe{\missingcharmsg{LATIN SMALL LETTER THORN}} + \gdef^^ff{\"y} +} + +% Latin9 (ISO-8859-15) encoding character definitions. +\def\latninechardefs{% + % Encoding is almost identical to Latin1. + \latonechardefs + % + \gdef^^a4{\euro} + \gdef^^a6{\v S} + \gdef^^a8{\v s} + \gdef^^b4{\v Z} + \gdef^^b8{\v z} + \gdef^^bc{\OE} + \gdef^^bd{\oe} + \gdef^^be{\"Y} +} + +% Latin2 (ISO-8859-2) character definitions. +\def\lattwochardefs{% + \gdef^^a0{~} + \gdef^^a1{\ogonek{A}} + \gdef^^a2{\u{}} + \gdef^^a3{\L} + \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} + \gdef^^a5{\v L} + \gdef^^a6{\'S} + \gdef^^a7{\S} + \gdef^^a8{\"{}} + \gdef^^a9{\v S} + \gdef^^aa{\cedilla S} + \gdef^^ab{\v T} + \gdef^^ac{\'Z} + \gdef^^ad{\-} + \gdef^^ae{\v Z} + \gdef^^af{\dotaccent Z} + % + \gdef^^b0{\textdegree} + \gdef^^b1{\ogonek{a}} + \gdef^^b2{\ogonek{ }} + \gdef^^b3{\l} + \gdef^^b4{\'{}} + \gdef^^b5{\v l} + \gdef^^b6{\'s} + \gdef^^b7{\v{}} + \gdef^^b8{\cedilla\ } + \gdef^^b9{\v s} + \gdef^^ba{\cedilla s} + \gdef^^bb{\v t} + \gdef^^bc{\'z} + \gdef^^bd{\H{}} + \gdef^^be{\v z} + \gdef^^bf{\dotaccent z} + % + \gdef^^c0{\'R} + \gdef^^c1{\'A} + \gdef^^c2{\^A} + \gdef^^c3{\u A} + \gdef^^c4{\"A} + \gdef^^c5{\'L} + \gdef^^c6{\'C} + \gdef^^c7{\cedilla C} + \gdef^^c8{\v C} + \gdef^^c9{\'E} + \gdef^^ca{\ogonek{E}} + \gdef^^cb{\"E} + \gdef^^cc{\v E} + \gdef^^cd{\'I} + \gdef^^ce{\^I} + \gdef^^cf{\v D} + % + \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER D WITH STROKE}} + \gdef^^d1{\'N} + \gdef^^d2{\v N} + \gdef^^d3{\'O} + \gdef^^d4{\^O} + \gdef^^d5{\H O} + \gdef^^d6{\"O} + \gdef^^d7{$\times$} + \gdef^^d8{\v R} + \gdef^^d9{\ringaccent U} + \gdef^^da{\'U} + \gdef^^db{\H U} + \gdef^^dc{\"U} + \gdef^^dd{\'Y} + \gdef^^de{\cedilla T} + \gdef^^df{\ss} + % + \gdef^^e0{\'r} + \gdef^^e1{\'a} + \gdef^^e2{\^a} + \gdef^^e3{\u a} + \gdef^^e4{\"a} + \gdef^^e5{\'l} + \gdef^^e6{\'c} + \gdef^^e7{\cedilla c} + \gdef^^e8{\v c} + \gdef^^e9{\'e} + \gdef^^ea{\ogonek{e}} + \gdef^^eb{\"e} + \gdef^^ec{\v e} + \gdef^^ed{\'\i} + \gdef^^ee{\^\i} + \gdef^^ef{\v d} + % + \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER D WITH STROKE}} + \gdef^^f1{\'n} + \gdef^^f2{\v n} + \gdef^^f3{\'o} + \gdef^^f4{\^o} + \gdef^^f5{\H o} + \gdef^^f6{\"o} + \gdef^^f7{$\div$} + \gdef^^f8{\v r} + \gdef^^f9{\ringaccent u} + \gdef^^fa{\'u} + \gdef^^fb{\H u} + \gdef^^fc{\"u} + \gdef^^fd{\'y} + \gdef^^fe{\cedilla t} + \gdef^^ff{\dotaccent{}} +} + +% UTF-8 character definitions. +% +% This code to support UTF-8 is based on LaTeX's utf8.def, with some +% changes for Texinfo conventions. It is included here under the GPL by +% permission from Frank Mittelbach and the LaTeX team. +% +\newcount\countUTFx +\newcount\countUTFy +\newcount\countUTFz + +\gdef\UTFviiiTwoOctets#1#2{\expandafter + \UTFviiiDefined\csname u8:#1\string #2\endcsname} +% +\gdef\UTFviiiThreeOctets#1#2#3{\expandafter + \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} +% +\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter + \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} + +\gdef\UTFviiiDefined#1{% + \ifx #1\relax + \message{\linenumber Unicode char \string #1 not defined for Texinfo}% + \else + \expandafter #1% + \fi +} + +\begingroup + \catcode`\~13 + \catcode`\"12 + + \def\UTFviiiLoop{% + \global\catcode\countUTFx\active + \uccode`\~\countUTFx + \uppercase\expandafter{\UTFviiiTmp}% + \advance\countUTFx by 1 + \ifnum\countUTFx < \countUTFy + \expandafter\UTFviiiLoop + \fi} + + \countUTFx = "C2 + \countUTFy = "E0 + \def\UTFviiiTmp{% + \xdef~{\noexpand\UTFviiiTwoOctets\string~}} + \UTFviiiLoop + + \countUTFx = "E0 + \countUTFy = "F0 + \def\UTFviiiTmp{% + \xdef~{\noexpand\UTFviiiThreeOctets\string~}} + \UTFviiiLoop + + \countUTFx = "F0 + \countUTFy = "F4 + \def\UTFviiiTmp{% + \xdef~{\noexpand\UTFviiiFourOctets\string~}} + \UTFviiiLoop +\endgroup + +\begingroup + \catcode`\"=12 + \catcode`\<=12 + \catcode`\.=12 + \catcode`\,=12 + \catcode`\;=12 + \catcode`\!=12 + \catcode`\~=13 + + \gdef\DeclareUnicodeCharacter#1#2{% + \countUTFz = "#1\relax + \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% + \begingroup + \parseXMLCharref + \def\UTFviiiTwoOctets##1##2{% + \csname u8:##1\string ##2\endcsname}% + \def\UTFviiiThreeOctets##1##2##3{% + \csname u8:##1\string ##2\string ##3\endcsname}% + \def\UTFviiiFourOctets##1##2##3##4{% + \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter + \gdef\UTFviiiTmp{#2}% + \endgroup} + + \gdef\parseXMLCharref{% + \ifnum\countUTFz < "A0\relax + \errhelp = \EMsimple + \errmessage{Cannot define Unicode char value < 00A0}% + \else\ifnum\countUTFz < "800\relax + \parseUTFviiiA,% + \parseUTFviiiB C\UTFviiiTwoOctets.,% + \else\ifnum\countUTFz < "10000\relax + \parseUTFviiiA;% + \parseUTFviiiA,% + \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% + \else + \parseUTFviiiA;% + \parseUTFviiiA,% + \parseUTFviiiA!% + \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% + \fi\fi\fi + } + + \gdef\parseUTFviiiA#1{% + \countUTFx = \countUTFz + \divide\countUTFz by 64 + \countUTFy = \countUTFz + \multiply\countUTFz by 64 + \advance\countUTFx by -\countUTFz + \advance\countUTFx by 128 + \uccode `#1\countUTFx + \countUTFz = \countUTFy} + + \gdef\parseUTFviiiB#1#2#3#4{% + \advance\countUTFz by "#10\relax + \uccode `#3\countUTFz + \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} +\endgroup + +\def\utfeightchardefs{% + \DeclareUnicodeCharacter{00A0}{\tie} + \DeclareUnicodeCharacter{00A1}{\exclamdown} + \DeclareUnicodeCharacter{00A3}{\pounds} + \DeclareUnicodeCharacter{00A8}{\"{ }} + \DeclareUnicodeCharacter{00A9}{\copyright} + \DeclareUnicodeCharacter{00AA}{\ordf} + \DeclareUnicodeCharacter{00AB}{\guillemetleft} + \DeclareUnicodeCharacter{00AD}{\-} + \DeclareUnicodeCharacter{00AE}{\registeredsymbol} + \DeclareUnicodeCharacter{00AF}{\={ }} + + \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} + \DeclareUnicodeCharacter{00B4}{\'{ }} + \DeclareUnicodeCharacter{00B8}{\cedilla{ }} + \DeclareUnicodeCharacter{00BA}{\ordm} + \DeclareUnicodeCharacter{00BB}{\guillemetright} + \DeclareUnicodeCharacter{00BF}{\questiondown} + + \DeclareUnicodeCharacter{00C0}{\`A} + \DeclareUnicodeCharacter{00C1}{\'A} + \DeclareUnicodeCharacter{00C2}{\^A} + \DeclareUnicodeCharacter{00C3}{\~A} + \DeclareUnicodeCharacter{00C4}{\"A} + \DeclareUnicodeCharacter{00C5}{\AA} + \DeclareUnicodeCharacter{00C6}{\AE} + \DeclareUnicodeCharacter{00C7}{\cedilla{C}} + \DeclareUnicodeCharacter{00C8}{\`E} + \DeclareUnicodeCharacter{00C9}{\'E} + \DeclareUnicodeCharacter{00CA}{\^E} + \DeclareUnicodeCharacter{00CB}{\"E} + \DeclareUnicodeCharacter{00CC}{\`I} + \DeclareUnicodeCharacter{00CD}{\'I} + \DeclareUnicodeCharacter{00CE}{\^I} + \DeclareUnicodeCharacter{00CF}{\"I} + + \DeclareUnicodeCharacter{00D1}{\~N} + \DeclareUnicodeCharacter{00D2}{\`O} + \DeclareUnicodeCharacter{00D3}{\'O} + \DeclareUnicodeCharacter{00D4}{\^O} + \DeclareUnicodeCharacter{00D5}{\~O} + \DeclareUnicodeCharacter{00D6}{\"O} + \DeclareUnicodeCharacter{00D8}{\O} + \DeclareUnicodeCharacter{00D9}{\`U} + \DeclareUnicodeCharacter{00DA}{\'U} + \DeclareUnicodeCharacter{00DB}{\^U} + \DeclareUnicodeCharacter{00DC}{\"U} + \DeclareUnicodeCharacter{00DD}{\'Y} + \DeclareUnicodeCharacter{00DF}{\ss} + + \DeclareUnicodeCharacter{00E0}{\`a} + \DeclareUnicodeCharacter{00E1}{\'a} + \DeclareUnicodeCharacter{00E2}{\^a} + \DeclareUnicodeCharacter{00E3}{\~a} + \DeclareUnicodeCharacter{00E4}{\"a} + \DeclareUnicodeCharacter{00E5}{\aa} + \DeclareUnicodeCharacter{00E6}{\ae} + \DeclareUnicodeCharacter{00E7}{\cedilla{c}} + \DeclareUnicodeCharacter{00E8}{\`e} + \DeclareUnicodeCharacter{00E9}{\'e} + \DeclareUnicodeCharacter{00EA}{\^e} + \DeclareUnicodeCharacter{00EB}{\"e} + \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} + \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} + \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} + \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} + + \DeclareUnicodeCharacter{00F1}{\~n} + \DeclareUnicodeCharacter{00F2}{\`o} + \DeclareUnicodeCharacter{00F3}{\'o} + \DeclareUnicodeCharacter{00F4}{\^o} + \DeclareUnicodeCharacter{00F5}{\~o} + \DeclareUnicodeCharacter{00F6}{\"o} + \DeclareUnicodeCharacter{00F8}{\o} + \DeclareUnicodeCharacter{00F9}{\`u} + \DeclareUnicodeCharacter{00FA}{\'u} + \DeclareUnicodeCharacter{00FB}{\^u} + \DeclareUnicodeCharacter{00FC}{\"u} + \DeclareUnicodeCharacter{00FD}{\'y} + \DeclareUnicodeCharacter{00FF}{\"y} + + \DeclareUnicodeCharacter{0100}{\=A} + \DeclareUnicodeCharacter{0101}{\=a} + \DeclareUnicodeCharacter{0102}{\u{A}} + \DeclareUnicodeCharacter{0103}{\u{a}} + \DeclareUnicodeCharacter{0104}{\ogonek{A}} + \DeclareUnicodeCharacter{0105}{\ogonek{a}} + \DeclareUnicodeCharacter{0106}{\'C} + \DeclareUnicodeCharacter{0107}{\'c} + \DeclareUnicodeCharacter{0108}{\^C} + \DeclareUnicodeCharacter{0109}{\^c} + \DeclareUnicodeCharacter{0118}{\ogonek{E}} + \DeclareUnicodeCharacter{0119}{\ogonek{e}} + \DeclareUnicodeCharacter{010A}{\dotaccent{C}} + \DeclareUnicodeCharacter{010B}{\dotaccent{c}} + \DeclareUnicodeCharacter{010C}{\v{C}} + \DeclareUnicodeCharacter{010D}{\v{c}} + \DeclareUnicodeCharacter{010E}{\v{D}} + + \DeclareUnicodeCharacter{0112}{\=E} + \DeclareUnicodeCharacter{0113}{\=e} + \DeclareUnicodeCharacter{0114}{\u{E}} + \DeclareUnicodeCharacter{0115}{\u{e}} + \DeclareUnicodeCharacter{0116}{\dotaccent{E}} + \DeclareUnicodeCharacter{0117}{\dotaccent{e}} + \DeclareUnicodeCharacter{011A}{\v{E}} + \DeclareUnicodeCharacter{011B}{\v{e}} + \DeclareUnicodeCharacter{011C}{\^G} + \DeclareUnicodeCharacter{011D}{\^g} + \DeclareUnicodeCharacter{011E}{\u{G}} + \DeclareUnicodeCharacter{011F}{\u{g}} + + \DeclareUnicodeCharacter{0120}{\dotaccent{G}} + \DeclareUnicodeCharacter{0121}{\dotaccent{g}} + \DeclareUnicodeCharacter{0124}{\^H} + \DeclareUnicodeCharacter{0125}{\^h} + \DeclareUnicodeCharacter{0128}{\~I} + \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} + \DeclareUnicodeCharacter{012A}{\=I} + \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} + \DeclareUnicodeCharacter{012C}{\u{I}} + \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} + + \DeclareUnicodeCharacter{0130}{\dotaccent{I}} + \DeclareUnicodeCharacter{0131}{\dotless{i}} + \DeclareUnicodeCharacter{0132}{IJ} + \DeclareUnicodeCharacter{0133}{ij} + \DeclareUnicodeCharacter{0134}{\^J} + \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} + \DeclareUnicodeCharacter{0139}{\'L} + \DeclareUnicodeCharacter{013A}{\'l} + + \DeclareUnicodeCharacter{0141}{\L} + \DeclareUnicodeCharacter{0142}{\l} + \DeclareUnicodeCharacter{0143}{\'N} + \DeclareUnicodeCharacter{0144}{\'n} + \DeclareUnicodeCharacter{0147}{\v{N}} + \DeclareUnicodeCharacter{0148}{\v{n}} + \DeclareUnicodeCharacter{014C}{\=O} + \DeclareUnicodeCharacter{014D}{\=o} + \DeclareUnicodeCharacter{014E}{\u{O}} + \DeclareUnicodeCharacter{014F}{\u{o}} + + \DeclareUnicodeCharacter{0150}{\H{O}} + \DeclareUnicodeCharacter{0151}{\H{o}} + \DeclareUnicodeCharacter{0152}{\OE} + \DeclareUnicodeCharacter{0153}{\oe} + \DeclareUnicodeCharacter{0154}{\'R} + \DeclareUnicodeCharacter{0155}{\'r} + \DeclareUnicodeCharacter{0158}{\v{R}} + \DeclareUnicodeCharacter{0159}{\v{r}} + \DeclareUnicodeCharacter{015A}{\'S} + \DeclareUnicodeCharacter{015B}{\'s} + \DeclareUnicodeCharacter{015C}{\^S} + \DeclareUnicodeCharacter{015D}{\^s} + \DeclareUnicodeCharacter{015E}{\cedilla{S}} + \DeclareUnicodeCharacter{015F}{\cedilla{s}} + + \DeclareUnicodeCharacter{0160}{\v{S}} + \DeclareUnicodeCharacter{0161}{\v{s}} + \DeclareUnicodeCharacter{0162}{\cedilla{t}} + \DeclareUnicodeCharacter{0163}{\cedilla{T}} + \DeclareUnicodeCharacter{0164}{\v{T}} + + \DeclareUnicodeCharacter{0168}{\~U} + \DeclareUnicodeCharacter{0169}{\~u} + \DeclareUnicodeCharacter{016A}{\=U} + \DeclareUnicodeCharacter{016B}{\=u} + \DeclareUnicodeCharacter{016C}{\u{U}} + \DeclareUnicodeCharacter{016D}{\u{u}} + \DeclareUnicodeCharacter{016E}{\ringaccent{U}} + \DeclareUnicodeCharacter{016F}{\ringaccent{u}} + + \DeclareUnicodeCharacter{0170}{\H{U}} + \DeclareUnicodeCharacter{0171}{\H{u}} + \DeclareUnicodeCharacter{0174}{\^W} + \DeclareUnicodeCharacter{0175}{\^w} + \DeclareUnicodeCharacter{0176}{\^Y} + \DeclareUnicodeCharacter{0177}{\^y} + \DeclareUnicodeCharacter{0178}{\"Y} + \DeclareUnicodeCharacter{0179}{\'Z} + \DeclareUnicodeCharacter{017A}{\'z} + \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} + \DeclareUnicodeCharacter{017C}{\dotaccent{z}} + \DeclareUnicodeCharacter{017D}{\v{Z}} + \DeclareUnicodeCharacter{017E}{\v{z}} + + \DeclareUnicodeCharacter{01C4}{D\v{Z}} + \DeclareUnicodeCharacter{01C5}{D\v{z}} + \DeclareUnicodeCharacter{01C6}{d\v{z}} + \DeclareUnicodeCharacter{01C7}{LJ} + \DeclareUnicodeCharacter{01C8}{Lj} + \DeclareUnicodeCharacter{01C9}{lj} + \DeclareUnicodeCharacter{01CA}{NJ} + \DeclareUnicodeCharacter{01CB}{Nj} + \DeclareUnicodeCharacter{01CC}{nj} + \DeclareUnicodeCharacter{01CD}{\v{A}} + \DeclareUnicodeCharacter{01CE}{\v{a}} + \DeclareUnicodeCharacter{01CF}{\v{I}} + + \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} + \DeclareUnicodeCharacter{01D1}{\v{O}} + \DeclareUnicodeCharacter{01D2}{\v{o}} + \DeclareUnicodeCharacter{01D3}{\v{U}} + \DeclareUnicodeCharacter{01D4}{\v{u}} + + \DeclareUnicodeCharacter{01E2}{\={\AE}} + \DeclareUnicodeCharacter{01E3}{\={\ae}} + \DeclareUnicodeCharacter{01E6}{\v{G}} + \DeclareUnicodeCharacter{01E7}{\v{g}} + \DeclareUnicodeCharacter{01E8}{\v{K}} + \DeclareUnicodeCharacter{01E9}{\v{k}} + + \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} + \DeclareUnicodeCharacter{01F1}{DZ} + \DeclareUnicodeCharacter{01F2}{Dz} + \DeclareUnicodeCharacter{01F3}{dz} + \DeclareUnicodeCharacter{01F4}{\'G} + \DeclareUnicodeCharacter{01F5}{\'g} + \DeclareUnicodeCharacter{01F8}{\`N} + \DeclareUnicodeCharacter{01F9}{\`n} + \DeclareUnicodeCharacter{01FC}{\'{\AE}} + \DeclareUnicodeCharacter{01FD}{\'{\ae}} + \DeclareUnicodeCharacter{01FE}{\'{\O}} + \DeclareUnicodeCharacter{01FF}{\'{\o}} + + \DeclareUnicodeCharacter{021E}{\v{H}} + \DeclareUnicodeCharacter{021F}{\v{h}} + + \DeclareUnicodeCharacter{0226}{\dotaccent{A}} + \DeclareUnicodeCharacter{0227}{\dotaccent{a}} + \DeclareUnicodeCharacter{0228}{\cedilla{E}} + \DeclareUnicodeCharacter{0229}{\cedilla{e}} + \DeclareUnicodeCharacter{022E}{\dotaccent{O}} + \DeclareUnicodeCharacter{022F}{\dotaccent{o}} + + \DeclareUnicodeCharacter{0232}{\=Y} + \DeclareUnicodeCharacter{0233}{\=y} + \DeclareUnicodeCharacter{0237}{\dotless{j}} + + \DeclareUnicodeCharacter{02DB}{\ogonek{ }} + + \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} + \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} + \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} + \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} + \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} + \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} + \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} + \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} + \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} + \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} + \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} + \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} + + \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} + \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} + + \DeclareUnicodeCharacter{1E20}{\=G} + \DeclareUnicodeCharacter{1E21}{\=g} + \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} + \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} + \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} + \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} + \DeclareUnicodeCharacter{1E26}{\"H} + \DeclareUnicodeCharacter{1E27}{\"h} + + \DeclareUnicodeCharacter{1E30}{\'K} + \DeclareUnicodeCharacter{1E31}{\'k} + \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} + \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} + \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} + \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} + \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} + \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} + \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} + \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} + \DeclareUnicodeCharacter{1E3E}{\'M} + \DeclareUnicodeCharacter{1E3F}{\'m} + + \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} + \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} + \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} + \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} + \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} + \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} + \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} + \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} + \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} + \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} + + \DeclareUnicodeCharacter{1E54}{\'P} + \DeclareUnicodeCharacter{1E55}{\'p} + \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} + \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} + \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} + \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} + \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} + \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} + \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} + \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} + + \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} + \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} + \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} + \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} + \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} + \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} + \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} + \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} + \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} + \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} + + \DeclareUnicodeCharacter{1E7C}{\~V} + \DeclareUnicodeCharacter{1E7D}{\~v} + \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} + \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} + + \DeclareUnicodeCharacter{1E80}{\`W} + \DeclareUnicodeCharacter{1E81}{\`w} + \DeclareUnicodeCharacter{1E82}{\'W} + \DeclareUnicodeCharacter{1E83}{\'w} + \DeclareUnicodeCharacter{1E84}{\"W} + \DeclareUnicodeCharacter{1E85}{\"w} + \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} + \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} + \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} + \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} + \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} + \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} + \DeclareUnicodeCharacter{1E8C}{\"X} + \DeclareUnicodeCharacter{1E8D}{\"x} + \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} + \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} + + \DeclareUnicodeCharacter{1E90}{\^Z} + \DeclareUnicodeCharacter{1E91}{\^z} + \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} + \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} + \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} + \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} + \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} + \DeclareUnicodeCharacter{1E97}{\"t} + \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} + \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} + + \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} + \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} + + \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} + \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} + \DeclareUnicodeCharacter{1EBC}{\~E} + \DeclareUnicodeCharacter{1EBD}{\~e} + + \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} + \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} + \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} + \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} + + \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} + \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} + + \DeclareUnicodeCharacter{1EF2}{\`Y} + \DeclareUnicodeCharacter{1EF3}{\`y} + \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} + + \DeclareUnicodeCharacter{1EF8}{\~Y} + \DeclareUnicodeCharacter{1EF9}{\~y} + + \DeclareUnicodeCharacter{2013}{--} + \DeclareUnicodeCharacter{2014}{---} + \DeclareUnicodeCharacter{2018}{\quoteleft} + \DeclareUnicodeCharacter{2019}{\quoteright} + \DeclareUnicodeCharacter{201A}{\quotesinglbase} + \DeclareUnicodeCharacter{201C}{\quotedblleft} + \DeclareUnicodeCharacter{201D}{\quotedblright} + \DeclareUnicodeCharacter{201E}{\quotedblbase} + \DeclareUnicodeCharacter{2022}{\bullet} + \DeclareUnicodeCharacter{2026}{\dots} + \DeclareUnicodeCharacter{2039}{\guilsinglleft} + \DeclareUnicodeCharacter{203A}{\guilsinglright} + \DeclareUnicodeCharacter{20AC}{\euro} + + \DeclareUnicodeCharacter{2192}{\expansion} + \DeclareUnicodeCharacter{21D2}{\result} + + \DeclareUnicodeCharacter{2212}{\minus} + \DeclareUnicodeCharacter{2217}{\point} + \DeclareUnicodeCharacter{2261}{\equiv} +}% end of \utfeightchardefs + + +% US-ASCII character definitions. +\def\asciichardefs{% nothing need be done + \relax +} + +% Make non-ASCII characters printable again for compatibility with +% existing Texinfo documents that may use them, even without declaring a +% document encoding. +% +\setnonasciicharscatcode \other + + +\message{formatting,} + +\newdimen\defaultparindent \defaultparindent = 15pt + +\chapheadingskip = 15pt plus 4pt minus 2pt +\secheadingskip = 12pt plus 3pt minus 2pt +\subsecheadingskip = 9pt plus 2pt minus 2pt + +% Prevent underfull vbox error messages. +\vbadness = 10000 + +% Don't be so finicky about underfull hboxes, either. +\hbadness = 2000 + +% Following George Bush, get rid of widows and orphans. +\widowpenalty=10000 +\clubpenalty=10000 + +% Use TeX 3.0's \emergencystretch to help line breaking, but if we're +% using an old version of TeX, don't do anything. We want the amount of +% stretch added to depend on the line length, hence the dependence on +% \hsize. We call this whenever the paper size is set. +% +\def\setemergencystretch{% + \ifx\emergencystretch\thisisundefined + % Allow us to assign to \emergencystretch anyway. + \def\emergencystretch{\dimen0}% + \else + \emergencystretch = .15\hsize + \fi +} + +% Parameters in order: 1) textheight; 2) textwidth; +% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; +% 7) physical page height; 8) physical page width. +% +% We also call \setleading{\textleading}, so the caller should define +% \textleading. The caller should also set \parskip. +% +\def\internalpagesizes#1#2#3#4#5#6#7#8{% + \voffset = #3\relax + \topskip = #6\relax + \splittopskip = \topskip + % + \vsize = #1\relax + \advance\vsize by \topskip + \outervsize = \vsize + \advance\outervsize by 2\topandbottommargin + \pageheight = \vsize + % + \hsize = #2\relax + \outerhsize = \hsize + \advance\outerhsize by 0.5in + \pagewidth = \hsize + % + \normaloffset = #4\relax + \bindingoffset = #5\relax + % + \ifpdf + \pdfpageheight #7\relax + \pdfpagewidth #8\relax + % if we don't reset these, they will remain at "1 true in" of + % whatever layout pdftex was dumped with. + \pdfhorigin = 1 true in + \pdfvorigin = 1 true in + \fi + % + \setleading{\textleading} + % + \parindent = \defaultparindent + \setemergencystretch +} + +% @letterpaper (the default). +\def\letterpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % If page is nothing but text, make it come out even. + \internalpagesizes{607.2pt}{6in}% that's 46 lines + {\voffset}{.25in}% + {\bindingoffset}{36pt}% + {11in}{8.5in}% +}} + +% Use @smallbook to reset parameters for 7x9.25 trim size. +\def\smallbook{{\globaldefs = 1 + \parskip = 2pt plus 1pt + \textleading = 12pt + % + \internalpagesizes{7.5in}{5in}% + {-.2in}{0in}% + {\bindingoffset}{16pt}% + {9.25in}{7in}% + % + \lispnarrowing = 0.3in + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = .5cm +}} + +% Use @smallerbook to reset parameters for 6x9 trim size. +% (Just testing, parameters still in flux.) +\def\smallerbook{{\globaldefs = 1 + \parskip = 1.5pt plus 1pt + \textleading = 12pt + % + \internalpagesizes{7.4in}{4.8in}% + {-.2in}{-.4in}% + {0pt}{14pt}% + {9in}{6in}% + % + \lispnarrowing = 0.25in + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = .4cm +}} + +% Use @afourpaper to print on European A4 paper. +\def\afourpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % Double-side printing via postscript on Laserjet 4050 + % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. + % To change the settings for a different printer or situation, adjust + % \normaloffset until the front-side and back-side texts align. Then + % do the same for \bindingoffset. You can set these for testing in + % your texinfo source file like this: + % @tex + % \global\normaloffset = -6mm + % \global\bindingoffset = 10mm + % @end tex + \internalpagesizes{673.2pt}{160mm}% that's 51 lines + {\voffset}{\hoffset}% + {\bindingoffset}{44pt}% + {297mm}{210mm}% + % + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = 5mm +}} + +% Use @afivepaper to print on European A5 paper. +% From romildo@urano.iceb.ufop.br, 2 July 2000. +% He also recommends making @example and @lisp be small. +\def\afivepaper{{\globaldefs = 1 + \parskip = 2pt plus 1pt minus 0.1pt + \textleading = 12.5pt + % + \internalpagesizes{160mm}{120mm}% + {\voffset}{\hoffset}% + {\bindingoffset}{8pt}% + {210mm}{148mm}% + % + \lispnarrowing = 0.2in + \tolerance = 800 + \hfuzz = 1.2pt + \contentsrightmargin = 0pt + \defbodyindent = 2mm + \tableindent = 12mm +}} + +% A specific text layout, 24x15cm overall, intended for A4 paper. +\def\afourlatex{{\globaldefs = 1 + \afourpaper + \internalpagesizes{237mm}{150mm}% + {\voffset}{4.6mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + % + % Must explicitly reset to 0 because we call \afourpaper. + \globaldefs = 0 +}} + +% Use @afourwide to print on A4 paper in landscape format. +\def\afourwide{{\globaldefs = 1 + \afourpaper + \internalpagesizes{241mm}{165mm}% + {\voffset}{-2.95mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + \globaldefs = 0 +}} + +% @pagesizes TEXTHEIGHT[,TEXTWIDTH] +% Perhaps we should allow setting the margins, \topskip, \parskip, +% and/or leading, also. Or perhaps we should compute them somehow. +% +\parseargdef\pagesizes{\pagesizesyyy #1,,\finish} +\def\pagesizesyyy#1,#2,#3\finish{{% + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi + \globaldefs = 1 + % + \parskip = 3pt plus 2pt minus 1pt + \setleading{\textleading}% + % + \dimen0 = #1\relax + \advance\dimen0 by \voffset + % + \dimen2 = \hsize + \advance\dimen2 by \normaloffset + % + \internalpagesizes{#1}{\hsize}% + {\voffset}{\normaloffset}% + {\bindingoffset}{44pt}% + {\dimen0}{\dimen2}% +}} + +% Set default to letter. +% +\letterpaper + + +\message{and turning on texinfo input format.} + +% DEL is a comment character, in case @c does not suffice. +\catcode`\^^? = 14 + +% Define macros to output various characters with catcode for normal text. +\catcode`\"=\other +\catcode`\~=\other +\catcode`\^=\other +\catcode`\_=\other +\catcode`\|=\other +\catcode`\<=\other +\catcode`\>=\other +\catcode`\+=\other +\catcode`\$=\other +\def\normaldoublequote{"} +\def\normaltilde{~} +\def\normalcaret{^} +\def\normalunderscore{_} +\def\normalverticalbar{|} +\def\normalless{<} +\def\normalgreater{>} +\def\normalplus{+} +\def\normaldollar{$}%$ font-lock fix + +% This macro is used to make a character print one way in \tt +% (where it can probably be output as-is), and another way in other fonts, +% where something hairier probably needs to be done. +% +% #1 is what to print if we are indeed using \tt; #2 is what to print +% otherwise. Since all the Computer Modern typewriter fonts have zero +% interword stretch (and shrink), and it is reasonable to expect all +% typewriter fonts to have this, we can check that font parameter. +% +\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} + +% Same as above, but check for italic font. Actually this also catches +% non-italic slanted fonts since it is impossible to distinguish them from +% italic fonts. But since this is only used by $ and it uses \sl anyway +% this is not a problem. +\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} + +% Turn off all special characters except @ +% (and those which the user can use as if they were ordinary). +% Most of these we simply print from the \tt font, but for some, we can +% use math or other variants that look better in normal text. + +\catcode`\"=\active +\def\activedoublequote{{\tt\char34}} +\let"=\activedoublequote +\catcode`\~=\active +\def~{{\tt\char126}} +\chardef\hat=`\^ +\catcode`\^=\active +\def^{{\tt \hat}} + +\catcode`\_=\active +\def_{\ifusingtt\normalunderscore\_} +\let\realunder=_ +% Subroutine for the previous macro. +\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } + +\catcode`\|=\active +\def|{{\tt\char124}} +\chardef \less=`\< +\catcode`\<=\active +\def<{{\tt \less}} +\chardef \gtr=`\> +\catcode`\>=\active +\def>{{\tt \gtr}} +\catcode`\+=\active +\def+{{\tt \char 43}} +\catcode`\$=\active +\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix + +% If a .fmt file is being used, characters that might appear in a file +% name cannot be active until we have parsed the command line. +% So turn them off again, and have \everyjob (or @setfilename) turn them on. +% \otherifyactive is called near the end of this file. +\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} + +% Used sometimes to turn off (effectively) the active characters even after +% parsing them. +\def\turnoffactive{% + \normalturnoffactive + \otherbackslash +} + +\catcode`\@=0 + +% \backslashcurfont outputs one backslash character in current font, +% as in \char`\\. +\global\chardef\backslashcurfont=`\\ +\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work + +% \realbackslash is an actual character `\' with catcode other, and +% \doublebackslash is two of them (for the pdf outlines). +{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} + +% In texinfo, backslash is an active character; it prints the backslash +% in fixed width font. +\catcode`\\=\active +@def@normalbackslash{{@tt@backslashcurfont}} +% On startup, @fixbackslash assigns: +% @let \ = @normalbackslash + +% \rawbackslash defines an active \ to do \backslashcurfont. +% \otherbackslash defines an active \ to be a literal `\' character with +% catcode other. +@gdef@rawbackslash{@let\=@backslashcurfont} +@gdef@otherbackslash{@let\=@realbackslash} + +% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of +% the literal character `\'. +% +@def@normalturnoffactive{% + @let\=@normalbackslash + @let"=@normaldoublequote + @let~=@normaltilde + @let^=@normalcaret + @let_=@normalunderscore + @let|=@normalverticalbar + @let<=@normalless + @let>=@normalgreater + @let+=@normalplus + @let$=@normaldollar %$ font-lock fix + @markupsetuplqdefault + @markupsetuprqdefault + @unsepspaces +} + +% Make _ and + \other characters, temporarily. +% This is canceled by @fixbackslash. +@otherifyactive + +% If a .fmt file is being used, we don't want the `\input texinfo' to show up. +% That is what \eatinput is for; after that, the `\' should revert to printing +% a backslash. +% +@gdef@eatinput input texinfo{@fixbackslash} +@global@let\ = @eatinput + +% On the other hand, perhaps the file did not have a `\input texinfo'. Then +% the first `\' in the file would cause an error. This macro tries to fix +% that, assuming it is called before the first `\' could plausibly occur. +% Also turn back on active characters that might appear in the input +% file name, in case not using a pre-dumped format. +% +@gdef@fixbackslash{% + @ifx\@eatinput @let\ = @normalbackslash @fi + @catcode`+=@active + @catcode`@_=@active +} + +% Say @foo, not \foo, in error messages. +@escapechar = `@@ + +% These look ok in all fonts, so just make them not special. +@catcode`@& = @other +@catcode`@# = @other +@catcode`@% = @other + +@c Finally, make ` and ' active, so that txicodequoteundirected and +@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we +@c don't make ` and ' active, @code will not get them as active chars. +@c Do this last of all since we use ` in the previous @catcode assignments. +@catcode`@'=@active +@catcode`@`=@active +@markupsetuplqdefault +@markupsetuprqdefault + +@c Local variables: +@c eval: (add-hook 'write-file-hooks 'time-stamp) +@c page-delimiter: "^\\\\message" +@c time-stamp-start: "def\\\\texinfoversion{" +@c time-stamp-format: "%:y-%02m-%02d.%02H" +@c time-stamp-end: "}" +@c End: + +@c vim:sw=2: + +@ignore + arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 +@end ignore diff --git a/execute_cmd.c~ b/execute_cmd.c~ index 8d963519b..315d7b19c 100644 --- a/execute_cmd.c~ +++ b/execute_cmd.c~ @@ -2599,6 +2599,7 @@ execute_for_command (for_command) loop_level++; identifier = for_command->name->word; + line_number = for_command->line; /* for expansion error messages */ list = releaser = expand_words_no_vars (for_command->map_list); begin_unwind_frame ("for"); @@ -4967,6 +4968,8 @@ execute_disk_command (words, redirects, command_line, pipe_in, pipe_out, parent_return: QUIT; +itrace("async child pid = %d", pid); + /* Make sure that the pipes are closed in the parent. */ close_pipes (pipe_in, pipe_out); #if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD) diff --git a/jobs.c~ b/jobs.c~ new file mode 100644 index 000000000..6857d8216 --- /dev/null +++ b/jobs.c~ @@ -0,0 +1,4476 @@ +/* jobs.c - functions that make children, remember them, and handle their termination. */ + +/* This file works with both POSIX and BSD systems. It implements job + control. */ + +/* Copyright (C) 1989-2013 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. + + Bash is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Bash is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bash. If not, see . +*/ + +#include "config.h" + +#include "bashtypes.h" +#include "trap.h" +#include +#include +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif + +#include "posixtime.h" + +#if defined (HAVE_SYS_RESOURCE_H) && defined (HAVE_WAIT3) && !defined (_POSIX_VERSION) && !defined (RLIMTYPE) +# include +#endif /* !_POSIX_VERSION && HAVE_SYS_RESOURCE_H && HAVE_WAIT3 && !RLIMTYPE */ + +#if defined (HAVE_SYS_FILE_H) +# include +#endif + +#include "filecntl.h" +#include +#if defined (HAVE_SYS_PARAM_H) +#include +#endif + +#if defined (BUFFERED_INPUT) +# include "input.h" +#endif + +/* Need to include this up here for *_TTY_DRIVER definitions. */ +#include "shtty.h" + +/* Define this if your output is getting swallowed. It's a no-op on + machines with the termio or termios tty drivers. */ +/* #define DRAIN_OUTPUT */ + +/* For the TIOCGPGRP and TIOCSPGRP ioctl parameters on HP-UX */ +#if defined (hpux) && !defined (TERMIOS_TTY_DRIVER) +# include +#endif /* hpux && !TERMIOS_TTY_DRIVER */ + +#include "bashansi.h" +#include "bashintl.h" +#include "shell.h" +#include "jobs.h" +#include "execute_cmd.h" +#include "flags.h" + +#include "builtins/builtext.h" +#include "builtins/common.h" + +#if !defined (errno) +extern int errno; +#endif /* !errno */ + +#if !defined (HAVE_KILLPG) +extern int killpg __P((pid_t, int)); +#endif + +#if !DEFAULT_CHILD_MAX +# define DEFAULT_CHILD_MAX 32 +#endif + +#if !MAX_CHILD_MAX +# define MAX_CHILD_MAX 8192 +#endif + +#if !defined (DEBUG) +#define MAX_JOBS_IN_ARRAY 4096 /* production */ +#else +#define MAX_JOBS_IN_ARRAY 128 /* testing */ +#endif + +/* Flag values for second argument to delete_job */ +#define DEL_WARNSTOPPED 1 /* warn about deleting stopped jobs */ +#define DEL_NOBGPID 2 /* don't add pgrp leader to bgpids */ + +/* Take care of system dependencies that must be handled when waiting for + children. The arguments to the WAITPID macro match those to the Posix.1 + waitpid() function. */ + +#if defined (ultrix) && defined (mips) && defined (_POSIX_VERSION) +# define WAITPID(pid, statusp, options) \ + wait3 ((union wait *)statusp, options, (struct rusage *)0) +#else +# if defined (_POSIX_VERSION) || defined (HAVE_WAITPID) +# define WAITPID(pid, statusp, options) \ + waitpid ((pid_t)pid, statusp, options) +# else +# if defined (HAVE_WAIT3) +# define WAITPID(pid, statusp, options) \ + wait3 (statusp, options, (struct rusage *)0) +# else +# define WAITPID(pid, statusp, options) \ + wait3 (statusp, options, (int *)0) +# endif /* HAVE_WAIT3 */ +# endif /* !_POSIX_VERSION && !HAVE_WAITPID*/ +#endif /* !(Ultrix && mips && _POSIX_VERSION) */ + +/* getpgrp () varies between systems. Even systems that claim to be + Posix.1 compatible lie sometimes (Ultrix, SunOS4, apollo). */ +#if defined (GETPGRP_VOID) +# define getpgid(p) getpgrp () +#else +# define getpgid(p) getpgrp (p) +#endif /* !GETPGRP_VOID */ + +/* If the system needs it, REINSTALL_SIGCHLD_HANDLER will reinstall the + handler for SIGCHLD. */ +#if defined (MUST_REINSTALL_SIGHANDLERS) +# define REINSTALL_SIGCHLD_HANDLER signal (SIGCHLD, sigchld_handler) +#else +# define REINSTALL_SIGCHLD_HANDLER +#endif /* !MUST_REINSTALL_SIGHANDLERS */ + +/* Some systems let waitpid(2) tell callers about stopped children. */ +#if !defined (WCONTINUED) || defined (WCONTINUED_BROKEN) +# undef WCONTINUED +# define WCONTINUED 0 +#endif +#if !defined (WIFCONTINUED) +# define WIFCONTINUED(s) (0) +#endif + +/* The number of additional slots to allocate when we run out. */ +#define JOB_SLOTS 8 + +typedef int sh_job_map_func_t __P((JOB *, int, int, int)); + +/* Variables used here but defined in other files. */ +extern int subshell_environment, line_number; +extern int posixly_correct, shell_level; +extern int last_command_exit_value, last_command_exit_signal; +extern int loop_level, breaking; +extern int executing_list; +extern int sourcelevel; +extern int running_trap; +extern sh_builtin_func_t *this_shell_builtin; +extern char *shell_name, *this_command_name; +extern sigset_t top_level_mask; +extern procenv_t wait_intr_buf; +extern int wait_signal_received; +extern WORD_LIST *subst_assign_varlist; + +static struct jobstats zerojs = { -1L, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NO_JOB, NO_JOB, 0, 0 }; +struct jobstats js = { -1L, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NO_JOB, NO_JOB, 0, 0 }; + +struct bgpids bgpids = { 0, 0, 0 }; + +/* The array of known jobs. */ +JOB **jobs = (JOB **)NULL; + +#if 0 +/* The number of slots currently allocated to JOBS. */ +int job_slots = 0; +#endif + +/* The controlling tty for this shell. */ +int shell_tty = -1; + +/* The shell's process group. */ +pid_t shell_pgrp = NO_PID; + +/* The terminal's process group. */ +pid_t terminal_pgrp = NO_PID; + +/* The process group of the shell's parent. */ +pid_t original_pgrp = NO_PID; + +/* The process group of the pipeline currently being made. */ +pid_t pipeline_pgrp = (pid_t)0; + +#if defined (PGRP_PIPE) +/* Pipes which each shell uses to communicate with the process group leader + until all of the processes in a pipeline have been started. Then the + process leader is allowed to continue. */ +int pgrp_pipe[2] = { -1, -1 }; +#endif + +#if 0 +/* The job which is current; i.e. the one that `%+' stands for. */ +int current_job = NO_JOB; + +/* The previous job; i.e. the one that `%-' stands for. */ +int previous_job = NO_JOB; +#endif + +/* Last child made by the shell. */ +volatile pid_t last_made_pid = NO_PID; + +/* Pid of the last asynchronous child. */ +volatile pid_t last_asynchronous_pid = NO_PID; + +/* The pipeline currently being built. */ +PROCESS *the_pipeline = (PROCESS *)NULL; + +/* If this is non-zero, do job control. */ +int job_control = 1; + +/* Call this when you start making children. */ +int already_making_children = 0; + +/* If this is non-zero, $LINES and $COLUMNS are reset after every process + exits from get_tty_state(). */ +int check_window_size = CHECKWINSIZE_DEFAULT; + +/* Functions local to this file. */ + +static sighandler wait_sigint_handler __P((int)); +static sighandler sigchld_handler __P((int)); +static sighandler sigcont_sighandler __P((int)); +static sighandler sigstop_sighandler __P((int)); + +static int waitchld __P((pid_t, int)); + +static PROCESS *find_pipeline __P((pid_t, int, int *)); +static PROCESS *find_process __P((pid_t, int, int *)); + +static char *current_working_directory __P((void)); +static char *job_working_directory __P((void)); +static char *j_strsignal __P((int)); +static char *printable_job_status __P((int, PROCESS *, int)); + +static PROCESS *find_last_proc __P((int, int)); +static pid_t find_last_pid __P((int, int)); + +static int set_new_line_discipline __P((int)); +static int map_over_jobs __P((sh_job_map_func_t *, int, int)); +static int job_last_stopped __P((int)); +static int job_last_running __P((int)); +static int most_recent_job_in_state __P((int, JOB_STATE)); +static int find_job __P((pid_t, int, PROCESS **)); +static int print_job __P((JOB *, int, int, int)); +static int process_exit_status __P((WAIT)); +static int process_exit_signal __P((WAIT)); +static int set_job_status_and_cleanup __P((int)); + +static WAIT job_signal_status __P((int)); +static WAIT raw_job_exit_status __P((int)); + +static void notify_of_job_status __P((void)); +static void reset_job_indices __P((void)); +static void cleanup_dead_jobs __P((void)); +static int processes_in_job __P((int)); +static void realloc_jobs_list __P((void)); +static int compact_jobs_list __P((int)); +static int discard_pipeline __P((PROCESS *)); +static void add_process __P((char *, pid_t)); +static void print_pipeline __P((PROCESS *, int, int, FILE *)); +static void pretty_print_job __P((int, int, FILE *)); +static void set_current_job __P((int)); +static void reset_current __P((void)); +static void set_job_running __P((int)); +static void setjstatus __P((int)); +static int maybe_give_terminal_to __P((pid_t, pid_t, int)); +static void mark_all_jobs_as_dead __P((void)); +static void mark_dead_jobs_as_notified __P((int)); +static void restore_sigint_handler __P((void)); +#if defined (PGRP_PIPE) +static void pipe_read __P((int *)); +#endif + +static struct pidstat *bgp_alloc __P((pid_t, int)); +static struct pidstat *bgp_add __P((pid_t, int)); +static int bgp_delete __P((pid_t)); +static void bgp_clear __P((void)); +static int bgp_search __P((pid_t)); +static void bgp_prune __P((void)); + +#if defined (ARRAY_VARS) +static int *pstatuses; /* list of pipeline statuses */ +static int statsize; +#endif + +/* Used to synchronize between wait_for and other functions and the SIGCHLD + signal handler. */ +static int sigchld; +static int queue_sigchld; + +#define QUEUE_SIGCHLD(os) (os) = sigchld, queue_sigchld++ + +#define UNQUEUE_SIGCHLD(os) \ + do { \ + queue_sigchld--; \ + if (queue_sigchld == 0 && os != sigchld) \ + waitchld (-1, 0); \ + } while (0) + +static SigHandler *old_tstp, *old_ttou, *old_ttin; +static SigHandler *old_cont = (SigHandler *)SIG_DFL; + +/* A place to temporarily save the current pipeline. */ +static PROCESS *saved_pipeline; +static int saved_already_making_children; + +/* Set this to non-zero whenever you don't want the jobs list to change at + all: no jobs deleted and no status change notifications. This is used, + for example, when executing SIGCHLD traps, which may run arbitrary + commands. */ +static int jobs_list_frozen; + +static char retcode_name_buffer[64]; + +#if !defined (_POSIX_VERSION) + +/* These are definitions to map POSIX 1003.1 functions onto existing BSD + library functions and system calls. */ +#define setpgid(pid, pgrp) setpgrp (pid, pgrp) +#define tcsetpgrp(fd, pgrp) ioctl ((fd), TIOCSPGRP, &(pgrp)) + +pid_t +tcgetpgrp (fd) + int fd; +{ + pid_t pgrp; + + /* ioctl will handle setting errno correctly. */ + if (ioctl (fd, TIOCGPGRP, &pgrp) < 0) + return (-1); + return (pgrp); +} + +#endif /* !_POSIX_VERSION */ + +/* Initialize the global job stats structure and other bookkeeping variables */ +void +init_job_stats () +{ + js = zerojs; +} + +/* Return the working directory for the current process. Unlike + job_working_directory, this does not call malloc (), nor do any + of the functions it calls. This is so that it can safely be called + from a signal handler. */ +static char * +current_working_directory () +{ + char *dir; + static char d[PATH_MAX]; + + dir = get_string_value ("PWD"); + + if (dir == 0 && the_current_working_directory && no_symbolic_links) + dir = the_current_working_directory; + + if (dir == 0) + { + dir = getcwd (d, sizeof(d)); + if (dir) + dir = d; + } + + return (dir == 0) ? "" : dir; +} + +/* Return the working directory for the current process. */ +static char * +job_working_directory () +{ + char *dir; + + dir = get_string_value ("PWD"); + if (dir) + return (savestring (dir)); + + dir = get_working_directory ("job-working-directory"); + if (dir) + return (dir); + + return (savestring ("")); +} + +void +making_children () +{ + if (already_making_children) + return; + + already_making_children = 1; + start_pipeline (); +} + +void +stop_making_children () +{ + already_making_children = 0; +} + +void +cleanup_the_pipeline () +{ + PROCESS *disposer; + sigset_t set, oset; + + BLOCK_CHILD (set, oset); + disposer = the_pipeline; + the_pipeline = (PROCESS *)NULL; + UNBLOCK_CHILD (oset); + + if (disposer) + discard_pipeline (disposer); +} + +void +save_pipeline (clear) + int clear; +{ + saved_pipeline = the_pipeline; + if (clear) + the_pipeline = (PROCESS *)NULL; + saved_already_making_children = already_making_children; +} + +void +restore_pipeline (discard) + int discard; +{ + PROCESS *old_pipeline; + + old_pipeline = the_pipeline; + the_pipeline = saved_pipeline; + already_making_children = saved_already_making_children; + if (discard && old_pipeline) + discard_pipeline (old_pipeline); +} + +/* Start building a pipeline. */ +void +start_pipeline () +{ + if (the_pipeline) + { + cleanup_the_pipeline (); + pipeline_pgrp = 0; +#if defined (PGRP_PIPE) + sh_closepipe (pgrp_pipe); +#endif + } + +#if defined (PGRP_PIPE) + if (job_control) + { + if (pipe (pgrp_pipe) == -1) + sys_error (_("start_pipeline: pgrp pipe")); + } +#endif +} + +/* Stop building a pipeline. Install the process list in the job array. + This returns the index of the newly installed job. + DEFERRED is a command structure to be executed upon satisfactory + execution exit of this pipeline. */ +int +stop_pipeline (async, deferred) + int async; + COMMAND *deferred; +{ + register int i, j; + JOB *newjob; + sigset_t set, oset; + + BLOCK_CHILD (set, oset); + +#if defined (PGRP_PIPE) + /* The parent closes the process group synchronization pipe. */ + sh_closepipe (pgrp_pipe); +#endif + + cleanup_dead_jobs (); + + if (js.j_jobslots == 0) + { + js.j_jobslots = JOB_SLOTS; + jobs = (JOB **)xmalloc (js.j_jobslots * sizeof (JOB *)); + + /* Now blank out these new entries. */ + for (i = 0; i < js.j_jobslots; i++) + jobs[i] = (JOB *)NULL; + + js.j_firstj = js.j_lastj = js.j_njobs = 0; + } + + /* Scan from the last slot backward, looking for the next free one. */ + /* XXX - revisit this interactive assumption */ + /* XXX - this way for now */ + if (interactive) + { + for (i = js.j_jobslots; i; i--) + if (jobs[i - 1]) + break; + } + else + { +#if 0 + /* This wraps around, but makes it inconvenient to extend the array */ + for (i = js.j_lastj+1; i != js.j_lastj; i++) + { + if (i >= js.j_jobslots) + i = 0; + if (jobs[i] == 0) + break; + } + if (i == js.j_lastj) + i = js.j_jobslots; +#else + /* This doesn't wrap around yet. */ + for (i = js.j_lastj ? js.j_lastj + 1 : js.j_lastj; i < js.j_jobslots; i++) + if (jobs[i] == 0) + break; +#endif + } + + /* Do we need more room? */ + + /* First try compaction */ + if ((interactive_shell == 0 || subshell_environment) && i == js.j_jobslots && js.j_jobslots >= MAX_JOBS_IN_ARRAY) + i = compact_jobs_list (0); + + /* If we can't compact, reallocate */ + if (i == js.j_jobslots) + { + js.j_jobslots += JOB_SLOTS; + jobs = (JOB **)xrealloc (jobs, (js.j_jobslots * sizeof (JOB *))); + + for (j = i; j < js.j_jobslots; j++) + jobs[j] = (JOB *)NULL; + } + + /* Add the current pipeline to the job list. */ + if (the_pipeline) + { + register PROCESS *p; + int any_running, any_stopped, n; + + newjob = (JOB *)xmalloc (sizeof (JOB)); + + for (n = 1, p = the_pipeline; p->next != the_pipeline; n++, p = p->next) + ; + p->next = (PROCESS *)NULL; + newjob->pipe = REVERSE_LIST (the_pipeline, PROCESS *); + for (p = newjob->pipe; p->next; p = p->next) + ; + p->next = newjob->pipe; + + the_pipeline = (PROCESS *)NULL; + newjob->pgrp = pipeline_pgrp; + pipeline_pgrp = 0; + + newjob->flags = 0; + + /* Flag to see if in another pgrp. */ + if (job_control) + newjob->flags |= J_JOBCONTROL; + + /* Set the state of this pipeline. */ + p = newjob->pipe; + any_running = any_stopped = 0; + do + { + any_running |= PRUNNING (p); + any_stopped |= PSTOPPED (p); + p = p->next; + } + while (p != newjob->pipe); + + newjob->state = any_running ? JRUNNING : (any_stopped ? JSTOPPED : JDEAD); + newjob->wd = job_working_directory (); + newjob->deferred = deferred; + + newjob->j_cleanup = (sh_vptrfunc_t *)NULL; + newjob->cleanarg = (PTR_T) NULL; + + jobs[i] = newjob; + if (newjob->state == JDEAD && (newjob->flags & J_FOREGROUND)) + setjstatus (i); + if (newjob->state == JDEAD) + { + js.c_reaped += n; /* wouldn't have been done since this was not part of a job */ + js.j_ndead++; + } + js.c_injobs += n; + + js.j_lastj = i; + js.j_njobs++; + } + else + newjob = (JOB *)NULL; + + if (newjob) + js.j_lastmade = newjob; + + if (async) + { + if (newjob) + { + newjob->flags &= ~J_FOREGROUND; + newjob->flags |= J_ASYNC; + js.j_lastasync = newjob; + } + reset_current (); + } + else + { + if (newjob) + { + newjob->flags |= J_FOREGROUND; + /* + * !!!!! NOTE !!!!! (chet@ins.cwru.edu) + * + * The currently-accepted job control wisdom says to set the + * terminal's process group n+1 times in an n-step pipeline: + * once in the parent and once in each child. This is where + * the parent gives it away. + * + * Don't give the terminal away if this shell is an asynchronous + * subshell. + * + */ + if (job_control && newjob->pgrp && (subshell_environment&SUBSHELL_ASYNC) == 0) + maybe_give_terminal_to (shell_pgrp, newjob->pgrp, 0); + } + } + + stop_making_children (); + UNBLOCK_CHILD (oset); + return (newjob ? i : js.j_current); +} + +/* Functions to manage the list of exited background pids whose status has + been saved. */ + +static struct pidstat * +bgp_alloc (pid, status) + pid_t pid; + int status; +{ + struct pidstat *ps; + + ps = (struct pidstat *)xmalloc (sizeof (struct pidstat)); + ps->pid = pid; + ps->status = status; + ps->next = (struct pidstat *)0; + return ps; +} + +static struct pidstat * +bgp_add (pid, status) + pid_t pid; + int status; +{ + struct pidstat *ps; + + ps = bgp_alloc (pid, status); + + if (bgpids.list == 0) + { + bgpids.list = bgpids.end = ps; + bgpids.npid = 0; /* just to make sure */ + } + else + { + bgpids.end->next = ps; + bgpids.end = ps; + } + bgpids.npid++; + + if (bgpids.npid > js.c_childmax) + bgp_prune (); + + return ps; +} + +static int +bgp_delete (pid) + pid_t pid; +{ + struct pidstat *prev, *p; + + for (prev = p = bgpids.list; p; prev = p, p = p->next) + if (p->pid == pid) + { + prev->next = p->next; /* remove from list */ + break; + } + + if (p == 0) + return 0; /* not found */ + +#if defined (DEBUG) + itrace("bgp_delete: deleting %d", pid); +#endif + + /* Housekeeping in the border cases. */ + if (p == bgpids.list) + bgpids.list = bgpids.list->next; + else if (p == bgpids.end) + bgpids.end = prev; + + bgpids.npid--; + if (bgpids.npid == 0) + bgpids.list = bgpids.end = 0; + else if (bgpids.npid == 1) + bgpids.end = bgpids.list; /* just to make sure */ + + free (p); + return 1; +} + +/* Clear out the list of saved statuses */ +static void +bgp_clear () +{ + struct pidstat *ps, *p; + + for (ps = bgpids.list; ps; ) + { + p = ps; + ps = ps->next; + free (p); + } + bgpids.list = bgpids.end = 0; + bgpids.npid = 0; +} + +/* Search for PID in the list of saved background pids; return its status if + found. If not found, return -1. */ +static int +bgp_search (pid) + pid_t pid; +{ + struct pidstat *ps; + + for (ps = bgpids.list ; ps; ps = ps->next) + if (ps->pid == pid) + return ps->status; + return -1; +} + +static void +bgp_prune () +{ + struct pidstat *ps; + + while (bgpids.npid > js.c_childmax) + { + ps = bgpids.list; + bgpids.list = bgpids.list->next; + free (ps); + bgpids.npid--; + } +} + +/* Reset the values of js.j_lastj and js.j_firstj after one or both have + been deleted. The caller should check whether js.j_njobs is 0 before + calling this. This wraps around, but the rest of the code does not. At + this point, it should not matter. */ +static void +reset_job_indices () +{ + int old; + + if (jobs[js.j_firstj] == 0) + { + old = js.j_firstj++; + if (old >= js.j_jobslots) + old = js.j_jobslots - 1; + while (js.j_firstj != old) + { + if (js.j_firstj >= js.j_jobslots) + js.j_firstj = 0; + if (jobs[js.j_firstj] || js.j_firstj == old) /* needed if old == 0 */ + break; + js.j_firstj++; + } + if (js.j_firstj == old) + js.j_firstj = js.j_lastj = js.j_njobs = 0; + } + if (jobs[js.j_lastj] == 0) + { + old = js.j_lastj--; + if (old < 0) + old = 0; + while (js.j_lastj != old) + { + if (js.j_lastj < 0) + js.j_lastj = js.j_jobslots - 1; + if (jobs[js.j_lastj] || js.j_lastj == old) /* needed if old == js.j_jobslots */ + break; + js.j_lastj--; + } + if (js.j_lastj == old) + js.j_firstj = js.j_lastj = js.j_njobs = 0; + } +} + +/* Delete all DEAD jobs that the user had received notification about. */ +static void +cleanup_dead_jobs () +{ + register int i; + int os; + + if (js.j_jobslots == 0 || jobs_list_frozen) + return; + + QUEUE_SIGCHLD(os); + + /* XXX could use js.j_firstj and js.j_lastj here */ + for (i = 0; i < js.j_jobslots; i++) + { +#if defined (DEBUG) + if (i < js.j_firstj && jobs[i]) + itrace("cleanup_dead_jobs: job %d non-null before js.j_firstj (%d)", i, js.j_firstj); + if (i > js.j_lastj && jobs[i]) + itrace("cleanup_dead_jobs: job %d non-null after js.j_lastj (%d)", i, js.j_lastj); +#endif + + if (jobs[i] && DEADJOB (i) && IS_NOTIFIED (i)) + delete_job (i, 0); + } + +#if defined (COPROCESS_SUPPORT) + coproc_reap (); +#endif + + UNQUEUE_SIGCHLD(os); +} + +static int +processes_in_job (job) + int job; +{ + int nproc; + register PROCESS *p; + + nproc = 0; + p = jobs[job]->pipe; + do + { + p = p->next; + nproc++; + } + while (p != jobs[job]->pipe); + + return nproc; +} + +static void +delete_old_job (pid) + pid_t pid; +{ + PROCESS *p; + int job; + + job = find_job (pid, 0, &p); + if (job != NO_JOB) + { +#ifdef DEBUG + itrace ("delete_old_job: found pid %d in job %d with state %d", pid, job, jobs[job]->state); +#endif + if (JOBSTATE (job) == JDEAD) + delete_job (job, DEL_NOBGPID); + else + { +#ifdef DEBUG + internal_warning (_("forked pid %d appears in running job %d"), pid, job+1); +#endif + if (p) + p->pid = 0; + } + } +} + +/* Reallocate and compress the jobs list. This returns with a jobs array + whose size is a multiple of JOB_SLOTS and can hold the current number of + jobs. Heuristics are used to minimize the number of new reallocs. */ +static void +realloc_jobs_list () +{ + sigset_t set, oset; + int nsize, i, j, ncur, nprev; + JOB **nlist; + + ncur = nprev = NO_JOB; + nsize = ((js.j_njobs + JOB_SLOTS - 1) / JOB_SLOTS); + nsize *= JOB_SLOTS; + i = js.j_njobs % JOB_SLOTS; + if (i == 0 || i > (JOB_SLOTS >> 1)) + nsize += JOB_SLOTS; + + BLOCK_CHILD (set, oset); + nlist = (js.j_jobslots == nsize) ? jobs : (JOB **) xmalloc (nsize * sizeof (JOB *)); + + js.c_reaped = js.j_ndead = 0; + for (i = j = 0; i < js.j_jobslots; i++) + if (jobs[i]) + { + if (i == js.j_current) + ncur = j; + if (i == js.j_previous) + nprev = j; + nlist[j++] = jobs[i]; + if (jobs[i]->state == JDEAD) + { + js.j_ndead++; + js.c_reaped += processes_in_job (i); + } + } + +#if 0 + itrace ("realloc_jobs_list: resize jobs list from %d to %d", js.j_jobslots, nsize); + itrace ("realloc_jobs_list: j_lastj changed from %d to %d", js.j_lastj, (j > 0) ? j - 1 : 0); + itrace ("realloc_jobs_list: j_njobs changed from %d to %d", js.j_njobs, j); + itrace ("realloc_jobs_list: js.j_ndead %d js.c_reaped %d", js.j_ndead, js.c_reaped); +#endif + + js.j_firstj = 0; + js.j_lastj = (j > 0) ? j - 1 : 0; + js.j_njobs = j; + js.j_jobslots = nsize; + + /* Zero out remaining slots in new jobs list */ + for ( ; j < nsize; j++) + nlist[j] = (JOB *)NULL; + + if (jobs != nlist) + { + free (jobs); + jobs = nlist; + } + + if (ncur != NO_JOB) + js.j_current = ncur; + if (nprev != NO_JOB) + js.j_previous = nprev; + + /* Need to reset these */ + if (js.j_current == NO_JOB || js.j_previous == NO_JOB || js.j_current > js.j_lastj || js.j_previous > js.j_lastj) + reset_current (); + +#if 0 + itrace ("realloc_jobs_list: reset js.j_current (%d) and js.j_previous (%d)", js.j_current, js.j_previous); +#endif + + UNBLOCK_CHILD (oset); +} + +/* Compact the jobs list by removing dead jobs. Assume that we have filled + the jobs array to some predefined maximum. Called when the shell is not + the foreground process (subshell_environment != 0). Returns the first + available slot in the compacted list. If that value is js.j_jobslots, then + the list needs to be reallocated. The jobs array may be in new memory if + this returns > 0 and < js.j_jobslots. FLAGS is reserved for future use. */ +static int +compact_jobs_list (flags) + int flags; +{ + if (js.j_jobslots == 0 || jobs_list_frozen) + return js.j_jobslots; + + reap_dead_jobs (); + realloc_jobs_list (); + +#if 0 + itrace("compact_jobs_list: returning %d", (js.j_lastj || jobs[js.j_lastj]) ? js.j_lastj + 1 : 0); +#endif + + return ((js.j_lastj || jobs[js.j_lastj]) ? js.j_lastj + 1 : 0); +} + +/* Delete the job at INDEX from the job list. Must be called + with SIGCHLD blocked. */ +void +delete_job (job_index, dflags) + int job_index, dflags; +{ + register JOB *temp; + PROCESS *proc; + int ndel; + + if (js.j_jobslots == 0 || jobs_list_frozen) + return; + + if ((dflags & DEL_WARNSTOPPED) && subshell_environment == 0 && STOPPED (job_index)) + internal_warning (_("deleting stopped job %d with process group %ld"), job_index+1, (long)jobs[job_index]->pgrp); + temp = jobs[job_index]; + if (temp == 0) + return; + + if ((dflags & DEL_NOBGPID) == 0) + { + proc = find_last_proc (job_index, 0); + /* Could do this just for J_ASYNC jobs, but we save all. */ + if (proc) + bgp_add (proc->pid, process_exit_status (proc->status)); + } + + jobs[job_index] = (JOB *)NULL; + if (temp == js.j_lastmade) + js.j_lastmade = 0; + else if (temp == js.j_lastasync) + js.j_lastasync = 0; + + free (temp->wd); + ndel = discard_pipeline (temp->pipe); + + js.c_injobs -= ndel; + if (temp->state == JDEAD) + { + js.c_reaped -= ndel; + js.j_ndead--; + if (js.c_reaped < 0) + { +#ifdef DEBUG + itrace("delete_job (%d pgrp %d): js.c_reaped (%d) < 0 ndel = %d js.j_ndead = %d", job_index, temp->pgrp, js.c_reaped, ndel, js.j_ndead); +#endif + js.c_reaped = 0; + } + } + + if (temp->deferred) + dispose_command (temp->deferred); + + free (temp); + + js.j_njobs--; + if (js.j_njobs == 0) + js.j_firstj = js.j_lastj = 0; + else if (jobs[js.j_firstj] == 0 || jobs[js.j_lastj] == 0) + reset_job_indices (); + + if (job_index == js.j_current || job_index == js.j_previous) + reset_current (); +} + +/* Must be called with SIGCHLD blocked. */ +void +nohup_job (job_index) + int job_index; +{ + register JOB *temp; + + if (js.j_jobslots == 0) + return; + + if (temp = jobs[job_index]) + temp->flags |= J_NOHUP; +} + +/* Get rid of the data structure associated with a process chain. */ +static int +discard_pipeline (chain) + register PROCESS *chain; +{ + register PROCESS *this, *next; + int n; + + this = chain; + n = 0; + do + { + next = this->next; + FREE (this->command); + free (this); + n++; + this = next; + } + while (this != chain); + + return n; +} + +/* Add this process to the chain being built in the_pipeline. + NAME is the command string that will be exec'ed later. + PID is the process id of the child. */ +static void +add_process (name, pid) + char *name; + pid_t pid; +{ + PROCESS *t, *p; + +#if defined (RECYCLES_PIDS) + int j; + p = find_process (pid, 0, &j); + if (p) + { +# ifdef DEBUG + if (j == NO_JOB) + internal_warning (_("add_process: process %5ld (%s) in the_pipeline"), (long)p->pid, p->command); +# endif + if (PALIVE (p)) + internal_warning (_("add_process: pid %5ld (%s) marked as still alive"), (long)p->pid, p->command); + p->running = PS_RECYCLED; /* mark as recycled */ + } +#endif + + t = (PROCESS *)xmalloc (sizeof (PROCESS)); + t->next = the_pipeline; + t->pid = pid; + WSTATUS (t->status) = 0; + t->running = PS_RUNNING; + t->command = name; + the_pipeline = t; + + if (t->next == 0) + t->next = t; + else + { + p = t->next; + while (p->next != t->next) + p = p->next; + p->next = t; + } +} + +/* Create a (dummy) PROCESS with NAME, PID, and STATUS, and make it the last + process in jobs[JID]->pipe. Used by the lastpipe code. */ +void +append_process (name, pid, status, jid) + char *name; + pid_t pid; + int status; + int jid; +{ + PROCESS *t, *p; + + t = (PROCESS *)xmalloc (sizeof (PROCESS)); + t->next = (PROCESS *)NULL; + t->pid = pid; + /* set process exit status using offset discovered by configure */ + t->status = (status & 0xff) << WEXITSTATUS_OFFSET; + t->running = PS_DONE; + t->command = name; + + js.c_reaped++; /* XXX */ + + for (p = jobs[jid]->pipe; p->next != jobs[jid]->pipe; p = p->next) + ; + p->next = t; + t->next = jobs[jid]->pipe; +} + +#if 0 +/* Take the last job and make it the first job. Must be called with + SIGCHLD blocked. */ +int +rotate_the_pipeline () +{ + PROCESS *p; + + if (the_pipeline->next == the_pipeline) + return; + for (p = the_pipeline; p->next != the_pipeline; p = p->next) + ; + the_pipeline = p; +} + +/* Reverse the order of the processes in the_pipeline. Must be called with + SIGCHLD blocked. */ +int +reverse_the_pipeline () +{ + PROCESS *p, *n; + + if (the_pipeline->next == the_pipeline) + return; + + for (p = the_pipeline; p->next != the_pipeline; p = p->next) + ; + p->next = (PROCESS *)NULL; + + n = REVERSE_LIST (the_pipeline, PROCESS *); + + the_pipeline = n; + for (p = the_pipeline; p->next; p = p->next) + ; + p->next = the_pipeline; +} +#endif + +/* Map FUNC over the list of jobs. If FUNC returns non-zero, + then it is time to stop mapping, and that is the return value + for map_over_jobs. FUNC is called with a JOB, arg1, arg2, + and INDEX. */ +static int +map_over_jobs (func, arg1, arg2) + sh_job_map_func_t *func; + int arg1, arg2; +{ + register int i; + int result; + sigset_t set, oset; + + if (js.j_jobslots == 0) + return 0; + + BLOCK_CHILD (set, oset); + + /* XXX could use js.j_firstj here */ + for (i = result = 0; i < js.j_jobslots; i++) + { +#if defined (DEBUG) + if (i < js.j_firstj && jobs[i]) + itrace("map_over_jobs: job %d non-null before js.j_firstj (%d)", i, js.j_firstj); + if (i > js.j_lastj && jobs[i]) + itrace("map_over_jobs: job %d non-null after js.j_lastj (%d)", i, js.j_lastj); +#endif + if (jobs[i]) + { + result = (*func)(jobs[i], arg1, arg2, i); + if (result) + break; + } + } + + UNBLOCK_CHILD (oset); + + return (result); +} + +/* Cause all the jobs in the current pipeline to exit. */ +void +terminate_current_pipeline () +{ + if (pipeline_pgrp && pipeline_pgrp != shell_pgrp) + { + killpg (pipeline_pgrp, SIGTERM); + killpg (pipeline_pgrp, SIGCONT); + } +} + +/* Cause all stopped jobs to exit. */ +void +terminate_stopped_jobs () +{ + register int i; + + /* XXX could use js.j_firstj here */ + for (i = 0; i < js.j_jobslots; i++) + { + if (jobs[i] && STOPPED (i)) + { + killpg (jobs[i]->pgrp, SIGTERM); + killpg (jobs[i]->pgrp, SIGCONT); + } + } +} + +/* Cause all jobs, running or stopped, to receive a hangup signal. If + a job is marked J_NOHUP, don't send the SIGHUP. */ +void +hangup_all_jobs () +{ + register int i; + + /* XXX could use js.j_firstj here */ + for (i = 0; i < js.j_jobslots; i++) + { + if (jobs[i]) + { + if (jobs[i]->flags & J_NOHUP) + continue; + killpg (jobs[i]->pgrp, SIGHUP); + if (STOPPED (i)) + killpg (jobs[i]->pgrp, SIGCONT); + } + } +} + +void +kill_current_pipeline () +{ + stop_making_children (); + start_pipeline (); +} + +/* Return the pipeline that PID belongs to. Note that the pipeline + doesn't have to belong to a job. Must be called with SIGCHLD blocked. + If JOBP is non-null, return the index of the job containing PID. */ +static PROCESS * +find_pipeline (pid, alive_only, jobp) + pid_t pid; + int alive_only; + int *jobp; /* index into jobs list or NO_JOB */ +{ + int job; + PROCESS *p; + + /* See if this process is in the pipeline that we are building. */ + if (jobp) + *jobp = NO_JOB; + if (the_pipeline) + { + p = the_pipeline; + do + { + /* Return it if we found it. Don't ever return a recycled pid. */ + if (p->pid == pid && ((alive_only == 0 && PRECYCLED(p) == 0) || PALIVE(p))) + return (p); + + p = p->next; + } + while (p != the_pipeline); + } + + job = find_job (pid, alive_only, &p); + if (jobp) + *jobp = job; + return (job == NO_JOB) ? (PROCESS *)NULL : jobs[job]->pipe; +} + +/* Return the PROCESS * describing PID. If JOBP is non-null return the index + into the jobs array of the job containing PID. Must be called with + SIGCHLD blocked. */ +static PROCESS * +find_process (pid, alive_only, jobp) + pid_t pid; + int alive_only; + int *jobp; /* index into jobs list or NO_JOB */ +{ + PROCESS *p; + + p = find_pipeline (pid, alive_only, jobp); + while (p && p->pid != pid) + p = p->next; + return p; +} + +/* Return the job index that PID belongs to, or NO_JOB if it doesn't + belong to any job. Must be called with SIGCHLD blocked. */ +static int +find_job (pid, alive_only, procp) + pid_t pid; + int alive_only; + PROCESS **procp; +{ + register int i; + PROCESS *p; + + /* XXX could use js.j_firstj here, and should check js.j_lastj */ + for (i = 0; i < js.j_jobslots; i++) + { +#if defined (DEBUG) + if (i < js.j_firstj && jobs[i]) + itrace("find_job: job %d non-null before js.j_firstj (%d)", i, js.j_firstj); + if (i > js.j_lastj && jobs[i]) + itrace("find_job: job %d non-null after js.j_lastj (%d)", i, js.j_lastj); +#endif + if (jobs[i]) + { + p = jobs[i]->pipe; + + do + { + if (p->pid == pid && ((alive_only == 0 && PRECYCLED(p) == 0) || PALIVE(p))) + { + if (procp) + *procp = p; + return (i); + } + + p = p->next; + } + while (p != jobs[i]->pipe); + } + } + + return (NO_JOB); +} + +/* Find a job given a PID. If BLOCK is non-zero, block SIGCHLD as + required by find_job. */ +int +get_job_by_pid (pid, block) + pid_t pid; + int block; +{ + int job; + sigset_t set, oset; + + if (block) + BLOCK_CHILD (set, oset); + + job = find_job (pid, 0, NULL); + + if (block) + UNBLOCK_CHILD (oset); + + return job; +} + +/* Print descriptive information about the job with leader pid PID. */ +void +describe_pid (pid) + pid_t pid; +{ + int job; + sigset_t set, oset; + + BLOCK_CHILD (set, oset); + + job = find_job (pid, 0, NULL); + + if (job != NO_JOB) + fprintf (stderr, "[%d] %ld\n", job + 1, (long)pid); + else + programming_error (_("describe_pid: %ld: no such pid"), (long)pid); + + UNBLOCK_CHILD (oset); +} + +static char * +j_strsignal (s) + int s; +{ + char *x; + + x = strsignal (s); + if (x == 0) + { + x = retcode_name_buffer; + sprintf (x, _("Signal %d"), s); + } + return x; +} + +static char * +printable_job_status (j, p, format) + int j; + PROCESS *p; + int format; +{ + static char *temp; + int es; + + temp = _("Done"); + + if (STOPPED (j) && format == 0) + { + if (posixly_correct == 0 || p == 0 || (WIFSTOPPED (p->status) == 0)) + temp = _("Stopped"); + else + { + temp = retcode_name_buffer; + sprintf (temp, _("Stopped(%s)"), signal_name (WSTOPSIG (p->status))); + } + } + else if (RUNNING (j)) + temp = _("Running"); + else + { + if (WIFSTOPPED (p->status)) + temp = j_strsignal (WSTOPSIG (p->status)); + else if (WIFSIGNALED (p->status)) + temp = j_strsignal (WTERMSIG (p->status)); + else if (WIFEXITED (p->status)) + { + temp = retcode_name_buffer; + es = WEXITSTATUS (p->status); + if (es == 0) + strcpy (temp, _("Done")); + else if (posixly_correct) + sprintf (temp, _("Done(%d)"), es); + else + sprintf (temp, _("Exit %d"), es); + } + else + temp = _("Unknown status"); + } + + return temp; +} + +/* This is the way to print out information on a job if you + know the index. FORMAT is: + + JLIST_NORMAL) [1]+ Running emacs + JLIST_LONG ) [1]+ 2378 Running emacs + -1 ) [1]+ 2378 emacs + + JLIST_NORMAL) [1]+ Stopped ls | more + JLIST_LONG ) [1]+ 2369 Stopped ls + 2367 | more + JLIST_PID_ONLY) + Just list the pid of the process group leader (really + the process group). + JLIST_CHANGED_ONLY) + Use format JLIST_NORMAL, but list only jobs about which + the user has not been notified. */ + +/* Print status for pipeline P. If JOB_INDEX is >= 0, it is the index into + the JOBS array corresponding to this pipeline. FORMAT is as described + above. Must be called with SIGCHLD blocked. + + If you're printing a pipeline that's not in the jobs array, like the + current pipeline as it's being created, pass -1 for JOB_INDEX */ +static void +print_pipeline (p, job_index, format, stream) + PROCESS *p; + int job_index, format; + FILE *stream; +{ + PROCESS *first, *last, *show; + int es, name_padding; + char *temp; + + if (p == 0) + return; + + first = last = p; + while (last->next != first) + last = last->next; + + for (;;) + { + if (p != first) + fprintf (stream, format ? " " : " |"); + + if (format != JLIST_STANDARD) + fprintf (stream, "%5ld", (long)p->pid); + + fprintf (stream, " "); + + if (format > -1 && job_index >= 0) + { + show = format ? p : last; + temp = printable_job_status (job_index, show, format); + + if (p != first) + { + if (format) + { + if (show->running == first->running && + WSTATUS (show->status) == WSTATUS (first->status)) + temp = ""; + } + else + temp = (char *)NULL; + } + + if (temp) + { + fprintf (stream, "%s", temp); + + es = STRLEN (temp); + if (es == 0) + es = 2; /* strlen ("| ") */ + name_padding = LONGEST_SIGNAL_DESC - es; + + fprintf (stream, "%*s", name_padding, ""); + + if ((WIFSTOPPED (show->status) == 0) && + (WIFCONTINUED (show->status) == 0) && + WIFCORED (show->status)) + fprintf (stream, _("(core dumped) ")); + } + } + + if (p != first && format) + fprintf (stream, "| "); + + if (p->command) + fprintf (stream, "%s", p->command); + + if (p == last && job_index >= 0) + { + temp = current_working_directory (); + + if (RUNNING (job_index) && (IS_FOREGROUND (job_index) == 0)) + fprintf (stream, " &"); + + if (strcmp (temp, jobs[job_index]->wd) != 0) + fprintf (stream, + _(" (wd: %s)"), polite_directory_format (jobs[job_index]->wd)); + } + + if (format || (p == last)) + { + /* We need to add a CR only if this is an interactive shell, and + we're reporting the status of a completed job asynchronously. + We can't really check whether this particular job is being + reported asynchronously, so just add the CR if the shell is + currently interactive and asynchronous notification is enabled. */ + if (asynchronous_notification && interactive) + fprintf (stream, "\r\n"); + else + fprintf (stream, "\n"); + } + + if (p == last) + break; + p = p->next; + } + fflush (stream); +} + +/* Print information to STREAM about jobs[JOB_INDEX] according to FORMAT. + Must be called with SIGCHLD blocked or queued with queue_sigchld */ +static void +pretty_print_job (job_index, format, stream) + int job_index, format; + FILE *stream; +{ + register PROCESS *p; + + /* Format only pid information about the process group leader? */ + if (format == JLIST_PID_ONLY) + { + fprintf (stream, "%ld\n", (long)jobs[job_index]->pipe->pid); + return; + } + + if (format == JLIST_CHANGED_ONLY) + { + if (IS_NOTIFIED (job_index)) + return; + format = JLIST_STANDARD; + } + + if (format != JLIST_NONINTERACTIVE) + fprintf (stream, "[%d]%c ", job_index + 1, + (job_index == js.j_current) ? '+': + (job_index == js.j_previous) ? '-' : ' '); + + if (format == JLIST_NONINTERACTIVE) + format = JLIST_LONG; + + p = jobs[job_index]->pipe; + + print_pipeline (p, job_index, format, stream); + + /* We have printed information about this job. When the job's + status changes, waitchld () sets the notification flag to 0. */ + jobs[job_index]->flags |= J_NOTIFIED; +} + +static int +print_job (job, format, state, job_index) + JOB *job; + int format, state, job_index; +{ + if (state == -1 || (JOB_STATE)state == job->state) + pretty_print_job (job_index, format, stdout); + return (0); +} + +void +list_one_job (job, format, ignore, job_index) + JOB *job; + int format, ignore, job_index; +{ + pretty_print_job (job_index, format, stdout); +} + +void +list_stopped_jobs (format) + int format; +{ + cleanup_dead_jobs (); + map_over_jobs (print_job, format, (int)JSTOPPED); +} + +void +list_running_jobs (format) + int format; +{ + cleanup_dead_jobs (); + map_over_jobs (print_job, format, (int)JRUNNING); +} + +/* List jobs. If FORMAT is non-zero, then the long form of the information + is printed, else just a short version. */ +void +list_all_jobs (format) + int format; +{ + cleanup_dead_jobs (); + map_over_jobs (print_job, format, -1); +} + +/* Fork, handling errors. Returns the pid of the newly made child, or 0. + COMMAND is just for remembering the name of the command; we don't do + anything else with it. ASYNC_P says what to do with the tty. If + non-zero, then don't give it away. */ +pid_t +make_child (command, async_p) + char *command; + int async_p; +{ + int forksleep; + sigset_t set, oset; + pid_t pid; + + /* XXX - block SIGTERM here and unblock in child after fork resets the + set of pending signals? */ + sigemptyset (&set); + sigaddset (&set, SIGCHLD); + sigaddset (&set, SIGINT); + sigemptyset (&oset); + sigprocmask (SIG_BLOCK, &set, &oset); + + making_children (); + + forksleep = 1; + +#if defined (BUFFERED_INPUT) + /* If default_buffered_input is active, we are reading a script. If + the command is asynchronous, we have already duplicated /dev/null + as fd 0, but have not changed the buffered stream corresponding to + the old fd 0. We don't want to sync the stream in this case. */ + if (default_buffered_input != -1 && + (!async_p || default_buffered_input > 0)) + sync_buffered_stream (default_buffered_input); +#endif /* BUFFERED_INPUT */ + + RESET_SIGTERM; + + /* Create the child, handle severe errors. Retry on EAGAIN. */ + while ((pid = fork ()) < 0 && errno == EAGAIN && forksleep < FORKSLEEP_MAX) + { + /* bash-4.2 */ + /* If we can't create any children, try to reap some dead ones. */ + waitchld (-1, 0); + + sys_error ("fork: retry"); + RESET_SIGTERM; + + if (sleep (forksleep) != 0) + break; + forksleep <<= 1; + } + + if (pid != 0) + RESET_SIGTERM; + + if (pid < 0) + { + sys_error ("fork"); + + /* Kill all of the processes in the current pipeline. */ + terminate_current_pipeline (); + + /* Discard the current pipeline, if any. */ + if (the_pipeline) + kill_current_pipeline (); + + last_command_exit_value = EX_NOEXEC; + throw_to_top_level (); /* Reset signals, etc. */ + } + + if (pid == 0) + { + /* In the child. Give this child the right process group, set the + signals to the default state for a new process. */ + pid_t mypid; + + mypid = getpid (); +#if defined (BUFFERED_INPUT) + /* Close default_buffered_input if it's > 0. We don't close it if it's + 0 because that's the file descriptor used when redirecting input, + and it's wrong to close the file in that case. */ + unset_bash_input (0); +#endif /* BUFFERED_INPUT */ + + /* Restore top-level signal mask. */ + sigprocmask (SIG_SETMASK, &top_level_mask, (sigset_t *)NULL); + + if (job_control) + { + /* All processes in this pipeline belong in the same + process group. */ + + if (pipeline_pgrp == 0) /* This is the first child. */ + pipeline_pgrp = mypid; + + /* Check for running command in backquotes. */ + if (pipeline_pgrp == shell_pgrp) + ignore_tty_job_signals (); + else + default_tty_job_signals (); + + /* Set the process group before trying to mess with the terminal's + process group. This is mandated by POSIX. */ + /* This is in accordance with the Posix 1003.1 standard, + section B.7.2.4, which says that trying to set the terminal + process group with tcsetpgrp() to an unused pgrp value (like + this would have for the first child) is an error. Section + B.4.3.3, p. 237 also covers this, in the context of job control + shells. */ + if (setpgid (mypid, pipeline_pgrp) < 0) + sys_error (_("child setpgid (%ld to %ld)"), (long)mypid, (long)pipeline_pgrp); + + /* By convention (and assumption above), if + pipeline_pgrp == shell_pgrp, we are making a child for + command substitution. + In this case, we don't want to give the terminal to the + shell's process group (we could be in the middle of a + pipeline, for example). */ + if (async_p == 0 && pipeline_pgrp != shell_pgrp && ((subshell_environment&SUBSHELL_ASYNC) == 0)) + give_terminal_to (pipeline_pgrp, 0); + +#if defined (PGRP_PIPE) + if (pipeline_pgrp == mypid) + pipe_read (pgrp_pipe); +#endif + } + else /* Without job control... */ + { + if (pipeline_pgrp == 0) + pipeline_pgrp = shell_pgrp; + + /* If these signals are set to SIG_DFL, we encounter the curious + situation of an interactive ^Z to a running process *working* + and stopping the process, but being unable to do anything with + that process to change its state. On the other hand, if they + are set to SIG_IGN, jobs started from scripts do not stop when + the shell running the script gets a SIGTSTP and stops. */ + + default_tty_job_signals (); + } + +#if defined (PGRP_PIPE) + /* Release the process group pipe, since our call to setpgid () + is done. The last call to sh_closepipe is done in stop_pipeline. */ + sh_closepipe (pgrp_pipe); +#endif /* PGRP_PIPE */ + +#if 0 + /* Don't set last_asynchronous_pid in the child */ + if (async_p) + last_asynchronous_pid = mypid; /* XXX */ + else +#endif +#if defined (RECYCLES_PIDS) + if (last_asynchronous_pid == mypid) + /* Avoid pid aliasing. 1 seems like a safe, unusual pid value. */ + last_asynchronous_pid = 1; +#endif + } + else + { + /* In the parent. Remember the pid of the child just created + as the proper pgrp if this is the first child. */ + + if (job_control) + { + if (pipeline_pgrp == 0) + { + pipeline_pgrp = pid; + /* Don't twiddle terminal pgrps in the parent! This is the bug, + not the good thing of twiddling them in the child! */ + /* give_terminal_to (pipeline_pgrp, 0); */ + } + /* This is done on the recommendation of the Rationale section of + the POSIX 1003.1 standard, where it discusses job control and + shells. It is done to avoid possible race conditions. (Ref. + 1003.1 Rationale, section B.4.3.3, page 236). */ + setpgid (pid, pipeline_pgrp); + } + else + { + if (pipeline_pgrp == 0) + pipeline_pgrp = shell_pgrp; + } + + /* Place all processes into the jobs array regardless of the + state of job_control. */ + add_process (command, pid); + + if (async_p) + last_asynchronous_pid = pid; +#if defined (RECYCLES_PIDS) + else if (last_asynchronous_pid == pid) + /* Avoid pid aliasing. 1 seems like a safe, unusual pid value. */ + last_asynchronous_pid = 1; +#endif + + /* Delete the saved status for any job containing this PID in case it's + been reused. */ + delete_old_job (pid); + + /* Perform the check for pid reuse unconditionally. Some systems reuse + PIDs before giving a process CHILD_MAX/_SC_CHILD_MAX unique ones. */ + bgp_delete (pid); /* new process, discard any saved status */ + + last_made_pid = pid; + + /* keep stats */ + js.c_totforked++; + js.c_living++; + + /* Unblock SIGINT and SIGCHLD unless creating a pipeline, in which case + SIGCHLD remains blocked until all commands in the pipeline have been + created. */ + sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL); + } + + return (pid); +} + +/* These two functions are called only in child processes. */ +void +ignore_tty_job_signals () +{ + set_signal_handler (SIGTSTP, SIG_IGN); + set_signal_handler (SIGTTIN, SIG_IGN); + set_signal_handler (SIGTTOU, SIG_IGN); +} + +void +default_tty_job_signals () +{ + set_signal_handler (SIGTSTP, SIG_DFL); + set_signal_handler (SIGTTIN, SIG_DFL); + set_signal_handler (SIGTTOU, SIG_DFL); +} + +/* When we end a job abnormally, or if we stop a job, we set the tty to the + state kept in here. When a job ends normally, we set the state in here + to the state of the tty. */ + +static TTYSTRUCT shell_tty_info; + +#if defined (NEW_TTY_DRIVER) +static struct tchars shell_tchars; +static struct ltchars shell_ltchars; +#endif /* NEW_TTY_DRIVER */ + +#if defined (NEW_TTY_DRIVER) && defined (DRAIN_OUTPUT) +/* Since the BSD tty driver does not allow us to change the tty modes + while simultaneously waiting for output to drain and preserving + typeahead, we have to drain the output ourselves before calling + ioctl. We cheat by finding the length of the output queue, and + using select to wait for an appropriate length of time. This is + a hack, and should be labeled as such (it's a hastily-adapted + mutation of a `usleep' implementation). It's only reason for + existing is the flaw in the BSD tty driver. */ + +static int ttspeeds[] = +{ + 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, + 1800, 2400, 4800, 9600, 19200, 38400 +}; + +static void +draino (fd, ospeed) + int fd, ospeed; +{ + register int delay = ttspeeds[ospeed]; + int n; + + if (!delay) + return; + + while ((ioctl (fd, TIOCOUTQ, &n) == 0) && n) + { + if (n > (delay / 100)) + { + struct timeval tv; + + n *= 10; /* 2 bits more for conservativeness. */ + tv.tv_sec = n / delay; + tv.tv_usec = ((n % delay) * 1000000) / delay; + select (fd, (fd_set *)0, (fd_set *)0, (fd_set *)0, &tv); + } + else + break; + } +} +#endif /* NEW_TTY_DRIVER && DRAIN_OUTPUT */ + +/* Return the fd from which we are actually getting input. */ +#define input_tty() (shell_tty != -1) ? shell_tty : fileno (stderr) + +/* Fill the contents of shell_tty_info with the current tty info. */ +int +get_tty_state () +{ + int tty; + + tty = input_tty (); + if (tty != -1) + { +#if defined (NEW_TTY_DRIVER) + ioctl (tty, TIOCGETP, &shell_tty_info); + ioctl (tty, TIOCGETC, &shell_tchars); + ioctl (tty, TIOCGLTC, &shell_ltchars); +#endif /* NEW_TTY_DRIVER */ + +#if defined (TERMIO_TTY_DRIVER) + ioctl (tty, TCGETA, &shell_tty_info); +#endif /* TERMIO_TTY_DRIVER */ + +#if defined (TERMIOS_TTY_DRIVER) + if (tcgetattr (tty, &shell_tty_info) < 0) + { +#if 0 + /* Only print an error message if we're really interactive at + this time. */ + if (interactive) + sys_error ("[%ld: %d (%d)] tcgetattr", (long)getpid (), shell_level, tty); +#endif + return -1; + } +#endif /* TERMIOS_TTY_DRIVER */ + if (check_window_size) + get_new_window_size (0, (int *)0, (int *)0); + } + return 0; +} + +/* Make the current tty use the state in shell_tty_info. */ +int +set_tty_state () +{ + int tty; + + tty = input_tty (); + if (tty != -1) + { +#if defined (NEW_TTY_DRIVER) +# if defined (DRAIN_OUTPUT) + draino (tty, shell_tty_info.sg_ospeed); +# endif /* DRAIN_OUTPUT */ + ioctl (tty, TIOCSETN, &shell_tty_info); + ioctl (tty, TIOCSETC, &shell_tchars); + ioctl (tty, TIOCSLTC, &shell_ltchars); +#endif /* NEW_TTY_DRIVER */ + +#if defined (TERMIO_TTY_DRIVER) + ioctl (tty, TCSETAW, &shell_tty_info); +#endif /* TERMIO_TTY_DRIVER */ + +#if defined (TERMIOS_TTY_DRIVER) + if (tcsetattr (tty, TCSADRAIN, &shell_tty_info) < 0) + { + /* Only print an error message if we're really interactive at + this time. */ + if (interactive) + sys_error ("[%ld: %d (%d)] tcsetattr", (long)getpid (), shell_level, tty); + return -1; + } +#endif /* TERMIOS_TTY_DRIVER */ + } + return 0; +} + +/* Given an index into the jobs array JOB, return the PROCESS struct of the last + process in that job's pipeline. This is the one whose exit status + counts. Must be called with SIGCHLD blocked or queued. */ +static PROCESS * +find_last_proc (job, block) + int job; + int block; +{ + register PROCESS *p; + sigset_t set, oset; + + if (block) + BLOCK_CHILD (set, oset); + + p = jobs[job]->pipe; + while (p && p->next != jobs[job]->pipe) + p = p->next; + + if (block) + UNBLOCK_CHILD (oset); + + return (p); +} + +static pid_t +find_last_pid (job, block) + int job; + int block; +{ + PROCESS *p; + + p = find_last_proc (job, block); + /* Possible race condition here. */ + return p->pid; +} + +/* Wait for a particular child of the shell to finish executing. + This low-level function prints an error message if PID is not + a child of this shell. It returns -1 if it fails, or whatever + wait_for returns otherwise. If the child is not found in the + jobs table, it returns 127. */ +int +wait_for_single_pid (pid) + pid_t pid; +{ + register PROCESS *child; + sigset_t set, oset; + int r, job; + + BLOCK_CHILD (set, oset); + child = find_pipeline (pid, 0, (int *)NULL); + UNBLOCK_CHILD (oset); + + if (child == 0) + { + r = bgp_search (pid); + if (r >= 0) + return r; + } + + if (child == 0) + { + internal_error (_("wait: pid %ld is not a child of this shell"), (long)pid); + return (127); + } + + r = wait_for (pid); + + /* POSIX.2: if we just waited for a job, we can remove it from the jobs + table. */ + BLOCK_CHILD (set, oset); + job = find_job (pid, 0, NULL); + if (job != NO_JOB && jobs[job] && DEADJOB (job)) + jobs[job]->flags |= J_NOTIFIED; + UNBLOCK_CHILD (oset); + + /* If running in posix mode, remove the job from the jobs table immediately */ + if (posixly_correct) + { + cleanup_dead_jobs (); + bgp_delete (pid); + } + + return r; +} + +/* Wait for all of the background processes started by this shell to finish. */ +void +wait_for_background_pids () +{ + register int i, r, waited_for; + sigset_t set, oset; + pid_t pid; + + for (waited_for = 0;;) + { + BLOCK_CHILD (set, oset); + + /* find first running job; if none running in foreground, break */ + /* XXX could use js.j_firstj and js.j_lastj here */ + for (i = 0; i < js.j_jobslots; i++) + { +#if defined (DEBUG) + if (i < js.j_firstj && jobs[i]) + itrace("wait_for_background_pids: job %d non-null before js.j_firstj (%d)", i, js.j_firstj); + if (i > js.j_lastj && jobs[i]) + itrace("wait_for_background_pids: job %d non-null after js.j_lastj (%d)", i, js.j_lastj); +#endif + if (jobs[i] && RUNNING (i) && IS_FOREGROUND (i) == 0) + break; + } + if (i == js.j_jobslots) + { + UNBLOCK_CHILD (oset); + break; + } + + /* now wait for the last pid in that job. */ + pid = find_last_pid (i, 0); + UNBLOCK_CHILD (oset); + QUIT; + errno = 0; /* XXX */ + r = wait_for_single_pid (pid); + if (r == -1) + { + /* If we're mistaken about job state, compensate. */ + if (errno == ECHILD) + mark_all_jobs_as_dead (); + } + else + waited_for++; + } + + /* POSIX.2 says the shell can discard the statuses of all completed jobs if + `wait' is called with no arguments. */ + mark_dead_jobs_as_notified (1); + cleanup_dead_jobs (); + bgp_clear (); +} + +/* Make OLD_SIGINT_HANDLER the SIGINT signal handler. */ +#define INVALID_SIGNAL_HANDLER (SigHandler *)wait_for_background_pids +static SigHandler *old_sigint_handler = INVALID_SIGNAL_HANDLER; + +static int wait_sigint_received; +static int child_caught_sigint; +static int waiting_for_child; + +static void +restore_sigint_handler () +{ + if (old_sigint_handler != INVALID_SIGNAL_HANDLER) + { + set_signal_handler (SIGINT, old_sigint_handler); + old_sigint_handler = INVALID_SIGNAL_HANDLER; + waiting_for_child = 0; + } +} + +/* Handle SIGINT while we are waiting for children in a script to exit. + The `wait' builtin should be interruptible, but all others should be + effectively ignored (i.e. not cause the shell to exit). */ +static sighandler +wait_sigint_handler (sig) + int sig; +{ + SigHandler *sigint_handler; + + if (interrupt_immediately || + (this_shell_builtin && this_shell_builtin == wait_builtin)) + { + last_command_exit_value = 128+SIGINT; + restore_sigint_handler (); + /* If we got a SIGINT while in `wait', and SIGINT is trapped, do + what POSIX.2 says (see builtins/wait.def for more info). */ + if (this_shell_builtin && this_shell_builtin == wait_builtin && + signal_is_trapped (SIGINT) && + ((sigint_handler = trap_to_sighandler (SIGINT)) == trap_handler)) + { + trap_handler (SIGINT); /* set pending_traps[SIGINT] */ + wait_signal_received = SIGINT; + if (interrupt_immediately) + { + interrupt_immediately = 0; + longjmp (wait_intr_buf, 1); + } + else + /* Let CHECK_WAIT_INTR handle it in wait_for/waitchld */ + SIGRETURN (0); + } + else if (interrupt_immediately) + { + ADDINTERRUPT; + QUIT; + } + else /* wait_builtin but signal not trapped, treat as interrupt */ + kill (getpid (), SIGINT); + } + + /* XXX - should this be interrupt_state? If it is, the shell will act + as if it got the SIGINT interrupt. */ + if (waiting_for_child) + wait_sigint_received = 1; + else + { + last_command_exit_value = 128+SIGINT; + restore_sigint_handler (); + kill (getpid (), SIGINT); + } + + /* Otherwise effectively ignore the SIGINT and allow the running job to + be killed. */ + SIGRETURN (0); +} + +static int +process_exit_signal (status) + WAIT status; +{ + return (WIFSIGNALED (status) ? WTERMSIG (status) : 0); +} + +static int +process_exit_status (status) + WAIT status; +{ + if (WIFSIGNALED (status)) + return (128 + WTERMSIG (status)); + else if (WIFSTOPPED (status) == 0) + return (WEXITSTATUS (status)); + else + return (EXECUTION_SUCCESS); +} + +static WAIT +job_signal_status (job) + int job; +{ + register PROCESS *p; + WAIT s; + + p = jobs[job]->pipe; + do + { + s = p->status; + if (WIFSIGNALED(s) || WIFSTOPPED(s)) + break; + p = p->next; + } + while (p != jobs[job]->pipe); + + return s; +} + +/* Return the exit status of the last process in the pipeline for job JOB. + This is the exit status of the entire job. */ +static WAIT +raw_job_exit_status (job) + int job; +{ + register PROCESS *p; + int fail; + WAIT ret; + + if (pipefail_opt) + { + fail = 0; + p = jobs[job]->pipe; + do + { + if (WSTATUS (p->status) != EXECUTION_SUCCESS) + fail = WSTATUS(p->status); + p = p->next; + } + while (p != jobs[job]->pipe); + WSTATUS (ret) = fail; + return ret; + } + + for (p = jobs[job]->pipe; p->next != jobs[job]->pipe; p = p->next) + ; + return (p->status); +} + +/* Return the exit status of job JOB. This is the exit status of the last + (rightmost) process in the job's pipeline, modified if the job was killed + by a signal or stopped. */ +int +job_exit_status (job) + int job; +{ + return (process_exit_status (raw_job_exit_status (job))); +} + +int +job_exit_signal (job) + int job; +{ + return (process_exit_signal (raw_job_exit_status (job))); +} + +#define FIND_CHILD(pid, child) \ + do \ + { \ + child = find_pipeline (pid, 0, (int *)NULL); \ + if (child == 0) \ + { \ + give_terminal_to (shell_pgrp, 0); \ + UNBLOCK_CHILD (oset); \ + internal_error (_("wait_for: No record of process %ld"), (long)pid); \ + restore_sigint_handler (); \ + return (termination_state = 127); \ + } \ + } \ + while (0) + +/* Wait for pid (one of our children) to terminate, then + return the termination state. Returns 127 if PID is not found in + the jobs table. Returns -1 if waitchld() returns -1, indicating + that there are no unwaited-for child processes. */ +int +wait_for (pid) + pid_t pid; +{ + int job, termination_state, r; + WAIT s; + register PROCESS *child; + sigset_t set, oset; + + /* In the case that this code is interrupted, and we longjmp () out of it, + we are relying on the code in throw_to_top_level () to restore the + top-level signal mask. */ + child = 0; + BLOCK_CHILD (set, oset); + + /* Ignore interrupts while waiting for a job run without job control + to finish. We don't want the shell to exit if an interrupt is + received, only if one of the jobs run is killed via SIGINT. If + job control is not set, the job will be run in the same pgrp as + the shell, and the shell will see any signals the job gets. In + fact, we want this set every time the waiting shell and the waited- + for process are in the same process group, including command + substitution. */ + + /* This is possibly a race condition -- should it go in stop_pipeline? */ + wait_sigint_received = child_caught_sigint = 0; + if (job_control == 0 || (subshell_environment&SUBSHELL_COMSUB)) + { + old_sigint_handler = set_signal_handler (SIGINT, wait_sigint_handler); + waiting_for_child = 0; + if (old_sigint_handler == SIG_IGN) + set_signal_handler (SIGINT, old_sigint_handler); + } + + termination_state = last_command_exit_value; + + if (interactive && job_control == 0) + QUIT; + /* Check for terminating signals and exit the shell if we receive one */ + CHECK_TERMSIG; + + /* Check for a trapped signal interrupting the wait builtin and jump out */ + CHECK_WAIT_INTR; + + /* If we say wait_for (), then we have a record of this child somewhere. + If it and none of its peers are running, don't call waitchld(). */ + + job = NO_JOB; + do + { + if (pid != ANY_PID) + FIND_CHILD (pid, child); + + /* If this child is part of a job, then we are really waiting for the + job to finish. Otherwise, we are waiting for the child to finish. + We check for JDEAD in case the job state has been set by waitchld + after receipt of a SIGCHLD. */ + if (job == NO_JOB) + job = find_job (pid, 0, NULL); + + /* waitchld() takes care of setting the state of the job. If the job + has already exited before this is called, sigchld_handler will have + called waitchld and the state will be set to JDEAD. */ + + if (pid == ANY_PID || PRUNNING(child) || (job != NO_JOB && RUNNING (job))) + { +#if defined (WAITPID_BROKEN) /* SCOv4 */ + sigset_t suspend_set; + sigemptyset (&suspend_set); + sigsuspend (&suspend_set); +#else /* !WAITPID_BROKEN */ +# if defined (MUST_UNBLOCK_CHLD) + struct sigaction act, oact; + sigset_t nullset, chldset; + + sigemptyset (&nullset); + sigemptyset (&chldset); + sigprocmask (SIG_SETMASK, &nullset, &chldset); + act.sa_handler = SIG_DFL; + sigemptyset (&act.sa_mask); + sigemptyset (&oact.sa_mask); + act.sa_flags = 0; +# if defined (SA_RESTART) + act.sa_flags |= SA_RESTART; +# endif + sigaction (SIGCHLD, &act, &oact); +# endif /* MUST_UNBLOCK_CHLD */ + queue_sigchld = 1; + waiting_for_child++; + r = waitchld (pid, 1); /* XXX */ + waiting_for_child--; +#if 0 +itrace("wait_for: blocking wait for %d returns %d child = %p", (int)pid, r, child); +#endif +# if defined (MUST_UNBLOCK_CHLD) + sigaction (SIGCHLD, &oact, (struct sigaction *)NULL); + sigprocmask (SIG_SETMASK, &chldset, (sigset_t *)NULL); +# endif + queue_sigchld = 0; + if (r == -1 && errno == ECHILD && this_shell_builtin == wait_builtin) + { + termination_state = -1; + /* XXX - restore sigint handler here? */ + goto wait_for_return; + } + + /* If child is marked as running, but waitpid() returns -1/ECHILD, + there is something wrong. Somewhere, wait should have returned + that child's pid. Mark the child as not running and the job, + if it exists, as JDEAD. */ + if (r == -1 && errno == ECHILD) + { + if (child) + { + child->running = PS_DONE; + WSTATUS (child->status) = 0; /* XXX -- can't find true status */ + } + js.c_living = 0; /* no living child processes */ + if (job != NO_JOB) + { + jobs[job]->state = JDEAD; + js.c_reaped++; + js.j_ndead++; + } + if (pid == ANY_PID) + { + termination_state = -1; + break; + } + } +#endif /* WAITPID_BROKEN */ + } + + /* If the shell is interactive, and job control is disabled, see + if the foreground process has died due to SIGINT and jump out + of the wait loop if it has. waitchld has already restored the + old SIGINT signal handler. */ + if (interactive && job_control == 0) + QUIT; + /* Check for terminating signals and exit the shell if we receive one */ + CHECK_TERMSIG; + + /* Check for a trapped signal interrupting the wait builtin and jump out */ + CHECK_WAIT_INTR; + + if (pid == ANY_PID) + /* XXX - could set child but we don't have a handle on what waitchld + reaps. Leave termination_state alone. */ + goto wait_for_return; + } + while (PRUNNING (child) || (job != NO_JOB && RUNNING (job))); + + /* Restore the original SIGINT signal handler before we return. */ + restore_sigint_handler (); + + /* The exit state of the command is either the termination state of the + child, or the termination state of the job. If a job, the status + of the last child in the pipeline is the significant one. If the command + or job was terminated by a signal, note that value also. */ + termination_state = (job != NO_JOB) ? job_exit_status (job) + : process_exit_status (child->status); + last_command_exit_signal = (job != NO_JOB) ? job_exit_signal (job) + : process_exit_signal (child->status); + + /* XXX */ + if ((job != NO_JOB && JOBSTATE (job) == JSTOPPED) || WIFSTOPPED (child->status)) + termination_state = 128 + WSTOPSIG (child->status); + + if (job == NO_JOB || IS_JOBCONTROL (job)) + { + /* XXX - under what circumstances is a job not present in the jobs + table (job == NO_JOB)? + 1. command substitution + + In the case of command substitution, at least, it's probably not + the right thing to give the terminal to the shell's process group, + even though there is code in subst.c:command_substitute to work + around it. + + Things that don't: + $PROMPT_COMMAND execution + process substitution + */ +#if 0 +if (job == NO_JOB) + itrace("wait_for: job == NO_JOB, giving the terminal to shell_pgrp (%ld)", (long)shell_pgrp); +#endif + give_terminal_to (shell_pgrp, 0); + } + + /* If the command did not exit cleanly, or the job is just + being stopped, then reset the tty state back to what it + was before this command. Reset the tty state and notify + the user of the job termination only if the shell is + interactive. Clean up any dead jobs in either case. */ + if (job != NO_JOB) + { + if (interactive_shell && subshell_environment == 0) + { + /* This used to use `child->status'. That's wrong, however, for + pipelines. `child' is the first process in the pipeline. It's + likely that the process we want to check for abnormal termination + or stopping is the last process in the pipeline, especially if + it's long-lived and the first process is short-lived. Since we + know we have a job here, we can check all the processes in this + job's pipeline and see if one of them stopped or terminated due + to a signal. We might want to change this later to just check + the last process in the pipeline. If no process exits due to a + signal, S is left as the status of the last job in the pipeline. */ + s = job_signal_status (job); + + if (WIFSIGNALED (s) || WIFSTOPPED (s)) + { + set_tty_state (); + + /* If the current job was stopped or killed by a signal, and + the user has requested it, get a possibly new window size */ + if (check_window_size && (job == js.j_current || IS_FOREGROUND (job))) + get_new_window_size (0, (int *)0, (int *)0); + } + else + get_tty_state (); + + /* If job control is enabled, the job was started with job + control, the job was the foreground job, and it was killed + by SIGINT, then print a newline to compensate for the kernel + printing the ^C without a trailing newline. */ + if (job_control && IS_JOBCONTROL (job) && IS_FOREGROUND (job) && + WIFSIGNALED (s) && WTERMSIG (s) == SIGINT) + { + /* If SIGINT is not trapped and the shell is in a for, while, + or until loop, act as if the shell received SIGINT as + well, so the loop can be broken. This doesn't call the + SIGINT signal handler; maybe it should. */ + if (signal_is_trapped (SIGINT) == 0 && (loop_level || (shell_compatibility_level > 32 && executing_list))) + ADDINTERRUPT; + else + { + putchar ('\n'); + fflush (stdout); + } + } + } + else if ((subshell_environment & (SUBSHELL_COMSUB|SUBSHELL_PIPE)) && wait_sigint_received) + { + /* If waiting for a job in a subshell started to do command + substitution or to run a pipeline element that consists of + something like a while loop or a for loop, simulate getting + and being killed by the SIGINT to pass the status back to our + parent. */ + s = job_signal_status (job); + + if (child_caught_sigint == 0 && signal_is_trapped (SIGINT) == 0) + { + UNBLOCK_CHILD (oset); + old_sigint_handler = set_signal_handler (SIGINT, SIG_DFL); + if (old_sigint_handler == SIG_IGN) + restore_sigint_handler (); + else + kill (getpid (), SIGINT); + } + } + else if (interactive_shell == 0 && IS_FOREGROUND (job) && check_window_size) + get_new_window_size (0, (int *)0, (int *)0); + + /* Moved here from set_job_status_and_cleanup, which is in the SIGCHLD + signal handler path */ + if (DEADJOB (job) && IS_FOREGROUND (job) /*&& subshell_environment == 0*/) + setjstatus (job); + + /* If this job is dead, notify the user of the status. If the shell + is interactive, this will display a message on the terminal. If + the shell is not interactive, make sure we turn on the notify bit + so we don't get an unwanted message about the job's termination, + and so delete_job really clears the slot in the jobs table. */ + notify_and_cleanup (); + } + +wait_for_return: + + UNBLOCK_CHILD (oset); + + return (termination_state); +} + +/* Wait for the last process in the pipeline for JOB. Returns whatever + wait_for returns: the last process's termination state or -1 if there + are no unwaited-for child processes or an error occurs. */ +int +wait_for_job (job) + int job; +{ + pid_t pid; + int r; + sigset_t set, oset; + + BLOCK_CHILD(set, oset); + if (JOBSTATE (job) == JSTOPPED) + internal_warning (_("wait_for_job: job %d is stopped"), job+1); + + pid = find_last_pid (job, 0); + UNBLOCK_CHILD(oset); + r = wait_for (pid); + + /* POSIX.2: we can remove the job from the jobs table if we just waited + for it. */ + BLOCK_CHILD (set, oset); + if (job != NO_JOB && jobs[job] && DEADJOB (job)) + jobs[job]->flags |= J_NOTIFIED; + UNBLOCK_CHILD (oset); + + return r; +} + +/* Wait for any background job started by this shell to finish. Very + similar to wait_for_background_pids(). Returns the exit status of + the next exiting job, -1 if there are no background jobs. The caller + is responsible for translating -1 into the right return value. */ +int +wait_for_any_job () +{ + pid_t pid; + int i, r, waited_for; + sigset_t set, oset; + + if (jobs_list_frozen) + return -1; + + /* First see if there are any unnotified dead jobs that we can report on */ + BLOCK_CHILD (set, oset); + for (i = 0; i < js.j_jobslots; i++) + { + if (jobs[i] && DEADJOB (i) && IS_NOTIFIED (i) == 0) + { +return_job: + r = job_exit_status (i); + notify_of_job_status (); /* XXX */ + delete_job (i, 0); +#if defined (COPROCESS_SUPPORT) + coproc_reap (); +#endif + UNBLOCK_CHILD (oset); + return r; + } + } + UNBLOCK_CHILD (oset); + + /* At this point, we have no dead jobs in the jobs table. Wait until we + get one, even if it takes multiple pids exiting. */ + for (waited_for = 0;;) + { + /* Make sure there is a background job to wait for */ + BLOCK_CHILD (set, oset); + for (i = 0; i < js.j_jobslots; i++) + if (jobs[i] && RUNNING (i) && IS_FOREGROUND (i) == 0) + break; + if (i == js.j_jobslots) + { + UNBLOCK_CHILD (oset); + return -1; + } + + UNBLOCK_CHILD (oset); + + QUIT; + CHECK_TERMSIG; + CHECK_WAIT_INTR; + + errno = 0; + r = wait_for (ANY_PID); /* special sentinel value for wait_for */ + if (r == -1 && errno == ECHILD) + mark_all_jobs_as_dead (); + + /* Now we see if we have any dead jobs and return the first one */ + BLOCK_CHILD (set, oset); + for (i = 0; i < js.j_jobslots; i++) + if (jobs[i] && DEADJOB (i)) + goto return_job; + UNBLOCK_CHILD (oset); + } + + return -1; +} + +/* Print info about dead jobs, and then delete them from the list + of known jobs. This does not actually delete jobs when the + shell is not interactive, because the dead jobs are not marked + as notified. */ +void +notify_and_cleanup () +{ + if (jobs_list_frozen) + return; + + if (interactive || interactive_shell == 0 || sourcelevel) + notify_of_job_status (); + + cleanup_dead_jobs (); +} + +/* Make dead jobs disappear from the jobs array without notification. + This is used when the shell is not interactive. */ +void +reap_dead_jobs () +{ + mark_dead_jobs_as_notified (0); + cleanup_dead_jobs (); +} + +/* Return the next closest (chronologically) job to JOB which is in + STATE. STATE can be JSTOPPED, JRUNNING. NO_JOB is returned if + there is no next recent job. */ +static int +most_recent_job_in_state (job, state) + int job; + JOB_STATE state; +{ + register int i, result; + sigset_t set, oset; + + BLOCK_CHILD (set, oset); + + for (result = NO_JOB, i = job - 1; i >= 0; i--) + { + if (jobs[i] && (JOBSTATE (i) == state)) + { + result = i; + break; + } + } + + UNBLOCK_CHILD (oset); + + return (result); +} + +/* Return the newest *stopped* job older than JOB, or NO_JOB if not + found. */ +static int +job_last_stopped (job) + int job; +{ + return (most_recent_job_in_state (job, JSTOPPED)); +} + +/* Return the newest *running* job older than JOB, or NO_JOB if not + found. */ +static int +job_last_running (job) + int job; +{ + return (most_recent_job_in_state (job, JRUNNING)); +} + +/* Make JOB be the current job, and make previous be useful. Must be + called with SIGCHLD blocked. */ +static void +set_current_job (job) + int job; +{ + int candidate; + + if (js.j_current != job) + { + js.j_previous = js.j_current; + js.j_current = job; + } + + /* First choice for previous job is the old current job. */ + if (js.j_previous != js.j_current && + js.j_previous != NO_JOB && + jobs[js.j_previous] && + STOPPED (js.j_previous)) + return; + + /* Second choice: Newest stopped job that is older than + the current job. */ + candidate = NO_JOB; + if (STOPPED (js.j_current)) + { + candidate = job_last_stopped (js.j_current); + + if (candidate != NO_JOB) + { + js.j_previous = candidate; + return; + } + } + + /* If we get here, there is either only one stopped job, in which case it is + the current job and the previous job should be set to the newest running + job, or there are only running jobs and the previous job should be set to + the newest running job older than the current job. We decide on which + alternative to use based on whether or not JOBSTATE(js.j_current) is + JSTOPPED. */ + + candidate = RUNNING (js.j_current) ? job_last_running (js.j_current) + : job_last_running (js.j_jobslots); + + if (candidate != NO_JOB) + { + js.j_previous = candidate; + return; + } + + /* There is only a single job, and it is both `+' and `-'. */ + js.j_previous = js.j_current; +} + +/* Make current_job be something useful, if it isn't already. */ + +/* Here's the deal: The newest non-running job should be `+', and the + next-newest non-running job should be `-'. If there is only a single + stopped job, the js.j_previous is the newest non-running job. If there + are only running jobs, the newest running job is `+' and the + next-newest running job is `-'. Must be called with SIGCHLD blocked. */ + +static void +reset_current () +{ + int candidate; + + if (js.j_jobslots && js.j_current != NO_JOB && jobs[js.j_current] && STOPPED (js.j_current)) + candidate = js.j_current; + else + { + candidate = NO_JOB; + + /* First choice: the previous job. */ + if (js.j_previous != NO_JOB && jobs[js.j_previous] && STOPPED (js.j_previous)) + candidate = js.j_previous; + + /* Second choice: the most recently stopped job. */ + if (candidate == NO_JOB) + candidate = job_last_stopped (js.j_jobslots); + + /* Third choice: the newest running job. */ + if (candidate == NO_JOB) + candidate = job_last_running (js.j_jobslots); + } + + /* If we found a job to use, then use it. Otherwise, there + are no jobs period. */ + if (candidate != NO_JOB) + set_current_job (candidate); + else + js.j_current = js.j_previous = NO_JOB; +} + +/* Set up the job structures so we know the job and its processes are + all running. */ +static void +set_job_running (job) + int job; +{ + register PROCESS *p; + + /* Each member of the pipeline is now running. */ + p = jobs[job]->pipe; + + do + { + if (WIFSTOPPED (p->status)) + p->running = PS_RUNNING; /* XXX - could be PS_STOPPED */ + p = p->next; + } + while (p != jobs[job]->pipe); + + /* This means that the job is running. */ + JOBSTATE (job) = JRUNNING; +} + +/* Start a job. FOREGROUND if non-zero says to do that. Otherwise, + start the job in the background. JOB is a zero-based index into + JOBS. Returns -1 if it is unable to start a job, and the return + status of the job otherwise. */ +int +start_job (job, foreground) + int job, foreground; +{ + register PROCESS *p; + int already_running; + sigset_t set, oset; + char *wd, *s; + static TTYSTRUCT save_stty; + + BLOCK_CHILD (set, oset); + + if (DEADJOB (job)) + { + internal_error (_("%s: job has terminated"), this_command_name); + UNBLOCK_CHILD (oset); + return (-1); + } + + already_running = RUNNING (job); + + if (foreground == 0 && already_running) + { + internal_error (_("%s: job %d already in background"), this_command_name, job + 1); + UNBLOCK_CHILD (oset); + return (0); /* XPG6/SUSv3 says this is not an error */ + } + + wd = current_working_directory (); + + /* You don't know about the state of this job. Do you? */ + jobs[job]->flags &= ~J_NOTIFIED; + + if (foreground) + { + set_current_job (job); + jobs[job]->flags |= J_FOREGROUND; + } + + /* Tell the outside world what we're doing. */ + p = jobs[job]->pipe; + + if (foreground == 0) + { + /* POSIX.2 says `bg' doesn't give any indication about current or + previous job. */ + if (posixly_correct == 0) + s = (job == js.j_current) ? "+ ": ((job == js.j_previous) ? "- " : " "); + else + s = " "; + printf ("[%d]%s", job + 1, s); + } + + do + { + printf ("%s%s", + p->command ? p->command : "", + p->next != jobs[job]->pipe? " | " : ""); + p = p->next; + } + while (p != jobs[job]->pipe); + + if (foreground == 0) + printf (" &"); + + if (strcmp (wd, jobs[job]->wd) != 0) + printf (" (wd: %s)", polite_directory_format (jobs[job]->wd)); + + printf ("\n"); + + /* Run the job. */ + if (already_running == 0) + set_job_running (job); + + /* Save the tty settings before we start the job in the foreground. */ + if (foreground) + { + get_tty_state (); + save_stty = shell_tty_info; + /* Give the terminal to this job. */ + if (IS_JOBCONTROL (job)) + give_terminal_to (jobs[job]->pgrp, 0); + } + else + jobs[job]->flags &= ~J_FOREGROUND; + + /* If the job is already running, then don't bother jump-starting it. */ + if (already_running == 0) + { + jobs[job]->flags |= J_NOTIFIED; + killpg (jobs[job]->pgrp, SIGCONT); + } + + if (foreground) + { + pid_t pid; + int st; + + pid = find_last_pid (job, 0); + UNBLOCK_CHILD (oset); + st = wait_for (pid); + shell_tty_info = save_stty; + set_tty_state (); + return (st); + } + else + { + reset_current (); + UNBLOCK_CHILD (oset); + return (0); + } +} + +/* Give PID SIGNAL. This determines what job the pid belongs to (if any). + If PID does belong to a job, and the job is stopped, then CONTinue the + job after giving it SIGNAL. Returns -1 on failure. If GROUP is non-null, + then kill the process group associated with PID. */ +int +kill_pid (pid, sig, group) + pid_t pid; + int sig, group; +{ + register PROCESS *p; + int job, result, negative; + sigset_t set, oset; + + if (pid < -1) + { + pid = -pid; + group = negative = 1; + } + else + negative = 0; + + result = EXECUTION_SUCCESS; + if (group) + { + BLOCK_CHILD (set, oset); + p = find_pipeline (pid, 0, &job); + + if (job != NO_JOB) + { + jobs[job]->flags &= ~J_NOTIFIED; + + /* Kill process in backquotes or one started without job control? */ + + /* If we're passed a pid < -1, just call killpg and see what happens */ + if (negative && jobs[job]->pgrp == shell_pgrp) + result = killpg (pid, sig); + /* If we're killing using job control notification, for example, + without job control active, we have to do things ourselves. */ + else if (jobs[job]->pgrp == shell_pgrp) + { + p = jobs[job]->pipe; + do + { + if (PALIVE (p) == 0) + continue; /* avoid pid recycling problem */ + kill (p->pid, sig); + if (PEXITED (p) && (sig == SIGTERM || sig == SIGHUP)) + kill (p->pid, SIGCONT); + p = p->next; + } + while (p != jobs[job]->pipe); + } + else + { + result = killpg (jobs[job]->pgrp, sig); + if (p && STOPPED (job) && (sig == SIGTERM || sig == SIGHUP)) + killpg (jobs[job]->pgrp, SIGCONT); + /* If we're continuing a stopped job via kill rather than bg or + fg, emulate the `bg' behavior. */ + if (p && STOPPED (job) && (sig == SIGCONT)) + { + set_job_running (job); + jobs[job]->flags &= ~J_FOREGROUND; + jobs[job]->flags |= J_NOTIFIED; + } + } + } + else + result = killpg (pid, sig); + + UNBLOCK_CHILD (oset); + } + else + result = kill (pid, sig); + + return (result); +} + +/* sigchld_handler () flushes at least one of the children that we are + waiting for. It gets run when we have gotten a SIGCHLD signal. */ +static sighandler +sigchld_handler (sig) + int sig; +{ + int n, oerrno; + + oerrno = errno; + REINSTALL_SIGCHLD_HANDLER; + sigchld++; + n = 0; + if (queue_sigchld == 0) + n = waitchld (-1, 0); + errno = oerrno; + SIGRETURN (n); +} + +/* waitchld() reaps dead or stopped children. It's called by wait_for and + sigchld_handler, and runs until there aren't any children terminating any + more. + If BLOCK is 1, this is to be a blocking wait for a single child, although + an arriving SIGCHLD could cause the wait to be non-blocking. It returns + the number of children reaped, or -1 if there are no unwaited-for child + processes. */ +static int +waitchld (wpid, block) + pid_t wpid; + int block; +{ + WAIT status; + PROCESS *child; + pid_t pid; + + int call_set_current, last_stopped_job, job, children_exited, waitpid_flags; + static int wcontinued = WCONTINUED; /* run-time fix for glibc problem */ + + call_set_current = children_exited = 0; + last_stopped_job = NO_JOB; + + do + { + /* We don't want to be notified about jobs stopping if job control + is not active. XXX - was interactive_shell instead of job_control */ + waitpid_flags = (job_control && subshell_environment == 0) + ? (WUNTRACED|wcontinued) + : 0; + if (sigchld || block == 0) + waitpid_flags |= WNOHANG; + + /* Check for terminating signals and exit the shell if we receive one */ + CHECK_TERMSIG; + /* Check for a trapped signal interrupting the wait builtin and jump out */ + CHECK_WAIT_INTR; + + if (block == 1 && queue_sigchld == 0 && (waitpid_flags & WNOHANG) == 0) + { + internal_warning (_("waitchld: turning on WNOHANG to avoid indefinite block")); + waitpid_flags |= WNOHANG; + } + + pid = WAITPID (-1, &status, waitpid_flags); + +#if 0 +if (wpid != -1 && block) + itrace("waitchld: blocking waitpid returns %d", pid); +#endif + /* WCONTINUED may be rejected by waitpid as invalid even when defined */ + if (wcontinued && pid < 0 && errno == EINVAL) + { + wcontinued = 0; + continue; /* jump back to the test and retry without WCONTINUED */ + } + + /* The check for WNOHANG is to make sure we decrement sigchld only + if it was non-zero before we called waitpid. */ + if (sigchld > 0 && (waitpid_flags & WNOHANG)) + sigchld--; + + /* If waitpid returns -1 with errno == ECHILD, there are no more + unwaited-for child processes of this shell. */ + if (pid < 0 && errno == ECHILD) + { + if (children_exited == 0) + return -1; + else + break; + } + +#if 0 +itrace("waitchld: waitpid returns %d block = %d", pid, block); +#endif + /* If waitpid returns 0, there are running children. If it returns -1, + the only other error POSIX says it can return is EINTR. */ + CHECK_TERMSIG; + CHECK_WAIT_INTR; + + /* If waitpid returns -1/EINTR and the shell saw a SIGINT, then we + assume the child has blocked or handled SIGINT. In that case, we + require the child to actually die due to SIGINT to act on the + SIGINT we received; otherwise we assume the child handled it and + let it go. */ + if (pid < 0 && errno == EINTR && wait_sigint_received) + child_caught_sigint = 1; + + if (pid <= 0) + continue; /* jumps right to the test */ + + /* If the child process did die due to SIGINT, forget our assumption + that it caught or otherwise handled it. */ + if (WIFSIGNALED (status) && WTERMSIG (status) == SIGINT) + child_caught_sigint = 0; + + /* children_exited is used to run traps on SIGCHLD. We don't want to + run the trap if a process is just being continued. */ + if (WIFCONTINUED(status) == 0) + { + children_exited++; + js.c_living--; + } + + /* Locate our PROCESS for this pid. */ + child = find_process (pid, 1, &job); /* want living procs only */ + +#if defined (COPROCESS_SUPPORT) + coproc_pidchk (pid, WSTATUS(status)); +#endif + + /* It is not an error to have a child terminate that we did + not have a record of. This child could have been part of + a pipeline in backquote substitution. Even so, I'm not + sure child is ever non-zero. */ + if (child == 0) + { + if (WIFEXITED (status) || WIFSIGNALED (status)) + js.c_reaped++; + continue; + } + + /* Remember status, and whether or not the process is running. */ + child->status = status; + child->running = WIFCONTINUED(status) ? PS_RUNNING : PS_DONE; + + if (PEXITED (child)) + { + js.c_totreaped++; + if (job != NO_JOB) + js.c_reaped++; + } + + if (job == NO_JOB) + continue; + + call_set_current += set_job_status_and_cleanup (job); + + if (STOPPED (job)) + last_stopped_job = job; + else if (DEADJOB (job) && last_stopped_job == job) + last_stopped_job = NO_JOB; + } + while ((sigchld || block == 0) && pid > (pid_t)0); + + /* If a job was running and became stopped, then set the current + job. Otherwise, don't change a thing. */ + if (call_set_current) + { + if (last_stopped_job != NO_JOB) + set_current_job (last_stopped_job); + else + reset_current (); + } + + /* Call a SIGCHLD trap handler for each child that exits, if one is set. */ + if (job_control && signal_is_trapped (SIGCHLD) && children_exited && + trap_list[SIGCHLD] != (char *)IGNORE_SIG) + { + if (posixly_correct && this_shell_builtin && this_shell_builtin == wait_builtin) + { + interrupt_immediately = 0; + trap_handler (SIGCHLD); /* set pending_traps[SIGCHLD] */ + wait_signal_received = SIGCHLD; + /* If we're in a signal handler, let CHECK_WAIT_INTR pick it up; + run_pending_traps will call run_sigchld_trap later */ + if (sigchld == 0) + longjmp (wait_intr_buf, 1); + } + /* If not in posix mode and not executing the wait builtin, queue the + signal for later handling. Run the trap immediately if we are + executing the wait builtin, but don't break out of `wait'. */ + else if (sigchld) /* called from signal handler */ + queue_sigchld_trap (children_exited); + else if (running_trap) + queue_sigchld_trap (children_exited); + else if (this_shell_builtin == wait_builtin) + run_sigchld_trap (children_exited); + else + queue_sigchld_trap (children_exited); + } + + /* We have successfully recorded the useful information about this process + that has just changed state. If we notify asynchronously, and the job + that this process belongs to is no longer running, then notify the user + of that fact now. */ + if (asynchronous_notification && interactive) + notify_of_job_status (); + + return (children_exited); +} + +/* Set the status of JOB and perform any necessary cleanup if the job is + marked as JDEAD. + + Currently, the cleanup activity is restricted to handling any SIGINT + received while waiting for a foreground job to finish. */ +static int +set_job_status_and_cleanup (job) + int job; +{ + PROCESS *child; + int tstatus, job_state, any_stopped, any_tstped, call_set_current; + SigHandler *temp_handler; + + child = jobs[job]->pipe; + jobs[job]->flags &= ~J_NOTIFIED; + + call_set_current = 0; + + /* + * COMPUTE JOB STATUS + */ + + /* If all children are not running, but any of them is stopped, then + the job is stopped, not dead. */ + job_state = any_stopped = any_tstped = 0; + do + { + job_state |= PRUNNING (child); +#if 0 + if (PEXITED (child) && (WIFSTOPPED (child->status))) +#else + /* Only checking for WIFSTOPPED now, not for PS_DONE */ + if (PSTOPPED (child)) +#endif + { + any_stopped = 1; + any_tstped |= job_control && (WSTOPSIG (child->status) == SIGTSTP); + } + child = child->next; + } + while (child != jobs[job]->pipe); + + /* If job_state != 0, the job is still running, so don't bother with + setting the process exit status and job state unless we're + transitioning from stopped to running. */ + if (job_state != 0 && JOBSTATE(job) != JSTOPPED) + return 0; + + /* + * SET JOB STATUS + */ + + /* The job is either stopped or dead. Set the state of the job accordingly. */ + if (any_stopped) + { + jobs[job]->state = JSTOPPED; + jobs[job]->flags &= ~J_FOREGROUND; + call_set_current++; + /* Suspending a job with SIGTSTP breaks all active loops. */ + if (any_tstped && loop_level) + breaking = loop_level; + } + else if (job_state != 0) /* was stopped, now running */ + { + jobs[job]->state = JRUNNING; + call_set_current++; + } + else + { + jobs[job]->state = JDEAD; + js.j_ndead++; + +#if 0 + if (IS_FOREGROUND (job)) + setjstatus (job); +#endif + + /* If this job has a cleanup function associated with it, call it + with `cleanarg' as the single argument, then set the function + pointer to NULL so it is not inadvertently called twice. The + cleanup function is responsible for deallocating cleanarg. */ + if (jobs[job]->j_cleanup) + { + (*jobs[job]->j_cleanup) (jobs[job]->cleanarg); + jobs[job]->j_cleanup = (sh_vptrfunc_t *)NULL; + } + } + + /* + * CLEANUP + * + * Currently, we just do special things if we got a SIGINT while waiting + * for a foreground job to complete + */ + + if (JOBSTATE (job) == JDEAD) + { + /* If we're running a shell script and we get a SIGINT with a + SIGINT trap handler, but the foreground job handles it and + does not exit due to SIGINT, run the trap handler but do not + otherwise act as if we got the interrupt. */ + if (wait_sigint_received && interactive_shell == 0 && + child_caught_sigint && IS_FOREGROUND (job) && + signal_is_trapped (SIGINT)) + { + int old_frozen; + wait_sigint_received = 0; + last_command_exit_value = process_exit_status (child->status); + + old_frozen = jobs_list_frozen; + jobs_list_frozen = 1; + tstatus = maybe_call_trap_handler (SIGINT); + jobs_list_frozen = old_frozen; + } + + /* If the foreground job is killed by SIGINT when job control is not + active, we need to perform some special handling. + + The check of wait_sigint_received is a way to determine if the + SIGINT came from the keyboard (in which case the shell has already + seen it, and wait_sigint_received is non-zero, because keyboard + signals are sent to process groups) or via kill(2) to the foreground + process by another process (or itself). If the shell did receive the + SIGINT, it needs to perform normal SIGINT processing. */ + else if (wait_sigint_received && + child_caught_sigint == 0 && + IS_FOREGROUND (job) && IS_JOBCONTROL (job) == 0) + { + int old_frozen; + + wait_sigint_received = 0; + + /* If SIGINT is trapped, set the exit status so that the trap + handler can see it. */ + if (signal_is_trapped (SIGINT)) + last_command_exit_value = process_exit_status (child->status); + + /* If the signal is trapped, let the trap handler get it no matter + what and simply return if the trap handler returns. + maybe_call_trap_handler() may cause dead jobs to be removed from + the job table because of a call to execute_command. We work + around this by setting JOBS_LIST_FROZEN. */ + old_frozen = jobs_list_frozen; + jobs_list_frozen = 1; + tstatus = maybe_call_trap_handler (SIGINT); + jobs_list_frozen = old_frozen; + if (tstatus == 0 && old_sigint_handler != INVALID_SIGNAL_HANDLER) + { + /* wait_sigint_handler () has already seen SIGINT and + allowed the wait builtin to jump out. We need to + call the original SIGINT handler, if necessary. If + the original handler is SIG_DFL, we need to resend + the signal to ourselves. */ + + temp_handler = old_sigint_handler; + + /* Bogus. If we've reset the signal handler as the result + of a trap caught on SIGINT, then old_sigint_handler + will point to trap_handler, which now knows nothing about + SIGINT (if we reset the sighandler to the default). + In this case, we have to fix things up. What a crock. */ + if (temp_handler == trap_handler && signal_is_trapped (SIGINT) == 0) + temp_handler = trap_to_sighandler (SIGINT); + restore_sigint_handler (); + if (temp_handler == SIG_DFL) + termsig_handler (SIGINT); /* XXX */ + else if (temp_handler != SIG_IGN) + (*temp_handler) (SIGINT); + } + } + } + + return call_set_current; +} + +/* Build the array of values for the $PIPESTATUS variable from the set of + exit statuses of all processes in the job J. */ +static void +setjstatus (j) + int j; +{ +#if defined (ARRAY_VARS) + register int i; + register PROCESS *p; + + for (i = 1, p = jobs[j]->pipe; p->next != jobs[j]->pipe; p = p->next, i++) + ; + i++; + if (statsize < i) + { + pstatuses = (int *)xrealloc (pstatuses, i * sizeof (int)); + statsize = i; + } + i = 0; + p = jobs[j]->pipe; + do + { + pstatuses[i++] = process_exit_status (p->status); + p = p->next; + } + while (p != jobs[j]->pipe); + + pstatuses[i] = -1; /* sentinel */ + set_pipestatus_array (pstatuses, i); +#endif +} + +void +run_sigchld_trap (nchild) + int nchild; +{ + char *trap_command; + int i; + + /* Turn off the trap list during the call to parse_and_execute () + to avoid potentially infinite recursive calls. Preserve the + values of last_command_exit_value, last_made_pid, and the_pipeline + around the execution of the trap commands. */ + trap_command = savestring (trap_list[SIGCHLD]); + + begin_unwind_frame ("SIGCHLD trap"); + unwind_protect_int (last_command_exit_value); + unwind_protect_int (last_command_exit_signal); + unwind_protect_var (last_made_pid); + unwind_protect_int (interrupt_immediately); + unwind_protect_int (jobs_list_frozen); + unwind_protect_pointer (the_pipeline); + unwind_protect_pointer (subst_assign_varlist); + + /* We have to add the commands this way because they will be run + in reverse order of adding. We don't want maybe_set_sigchld_trap () + to reference freed memory. */ + add_unwind_protect (xfree, trap_command); + add_unwind_protect (maybe_set_sigchld_trap, trap_command); + + subst_assign_varlist = (WORD_LIST *)NULL; + the_pipeline = (PROCESS *)NULL; + + running_trap = SIGCHLD + 1; + + set_impossible_sigchld_trap (); + jobs_list_frozen = 1; + for (i = 0; i < nchild; i++) + { +#if 0 + interrupt_immediately = 1; +#endif + parse_and_execute (savestring (trap_command), "trap", SEVAL_NOHIST|SEVAL_RESETLINE); + } + + run_unwind_frame ("SIGCHLD trap"); + running_trap = 0; +} + +/* Function to call when you want to notify people of changes + in job status. This prints out all jobs which are pending + notification to stderr, and marks those printed as already + notified, thus making them candidates for cleanup. */ +static void +notify_of_job_status () +{ + register int job, termsig; + char *dir; + sigset_t set, oset; + WAIT s; + + if (jobs == 0 || js.j_jobslots == 0) + return; + + if (old_ttou != 0) + { + sigemptyset (&set); + sigaddset (&set, SIGCHLD); + sigaddset (&set, SIGTTOU); + sigemptyset (&oset); + sigprocmask (SIG_BLOCK, &set, &oset); + } + else + queue_sigchld++; + + /* XXX could use js.j_firstj here */ + for (job = 0, dir = (char *)NULL; job < js.j_jobslots; job++) + { + if (jobs[job] && IS_NOTIFIED (job) == 0) + { + s = raw_job_exit_status (job); + termsig = WTERMSIG (s); + + /* POSIX.2 says we have to hang onto the statuses of at most the + last CHILD_MAX background processes if the shell is running a + script. If the shell is running a script, either from a file + or standard input, don't print anything unless the job was + killed by a signal. */ + if (startup_state == 0 && WIFSIGNALED (s) == 0 && + ((DEADJOB (job) && IS_FOREGROUND (job) == 0) || STOPPED (job))) + continue; + +#if 0 + /* If job control is disabled, don't print the status messages. + Mark dead jobs as notified so that they get cleaned up. If + startup_state == 2, we were started to run `-c command', so + don't print anything. */ + if ((job_control == 0 && interactive_shell) || startup_state == 2) +#else + /* If job control is disabled, don't print the status messages. + Mark dead jobs as notified so that they get cleaned up. If + startup_state == 2 and subshell_environment has the + SUBSHELL_COMSUB bit turned on, we were started to run a command + substitution, so don't print anything. */ + if ((job_control == 0 && interactive_shell) || + (startup_state == 2 && (subshell_environment & SUBSHELL_COMSUB))) +#endif + { + /* POSIX.2 compatibility: if the shell is not interactive, + hang onto the job corresponding to the last asynchronous + pid until the user has been notified of its status or does + a `wait'. */ + if (DEADJOB (job) && (interactive_shell || (find_last_pid (job, 0) != last_asynchronous_pid))) + jobs[job]->flags |= J_NOTIFIED; + continue; + } + + /* Print info on jobs that are running in the background, + and on foreground jobs that were killed by anything + except SIGINT (and possibly SIGPIPE). */ + switch (JOBSTATE (job)) + { + case JDEAD: + if (interactive_shell == 0 && termsig && WIFSIGNALED (s) && + termsig != SIGINT && +#if defined (DONT_REPORT_SIGTERM) + termsig != SIGTERM && +#endif +#if defined (DONT_REPORT_SIGPIPE) + termsig != SIGPIPE && +#endif + signal_is_trapped (termsig) == 0) + { + /* Don't print `0' for a line number. */ + fprintf (stderr, _("%s: line %d: "), get_name_for_error (), (line_number == 0) ? 1 : line_number); + pretty_print_job (job, JLIST_NONINTERACTIVE, stderr); + } + else if (IS_FOREGROUND (job)) + { +#if !defined (DONT_REPORT_SIGPIPE) + if (termsig && WIFSIGNALED (s) && termsig != SIGINT) +#else + if (termsig && WIFSIGNALED (s) && termsig != SIGINT && termsig != SIGPIPE) +#endif + { + fprintf (stderr, "%s", j_strsignal (termsig)); + + if (WIFCORED (s)) + fprintf (stderr, _(" (core dumped)")); + + fprintf (stderr, "\n"); + } + } + else if (job_control) /* XXX job control test added */ + { + if (dir == 0) + dir = current_working_directory (); + pretty_print_job (job, JLIST_STANDARD, stderr); + if (dir && strcmp (dir, jobs[job]->wd) != 0) + fprintf (stderr, + _("(wd now: %s)\n"), polite_directory_format (dir)); + } + + jobs[job]->flags |= J_NOTIFIED; + break; + + case JSTOPPED: + fprintf (stderr, "\n"); + if (dir == 0) + dir = current_working_directory (); + pretty_print_job (job, JLIST_STANDARD, stderr); + if (dir && (strcmp (dir, jobs[job]->wd) != 0)) + fprintf (stderr, + _("(wd now: %s)\n"), polite_directory_format (dir)); + jobs[job]->flags |= J_NOTIFIED; + break; + + case JRUNNING: + case JMIXED: + break; + + default: + programming_error ("notify_of_job_status"); + } + } + } + if (old_ttou != 0) + sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL); + else + queue_sigchld--; +} + +/* Initialize the job control mechanism, and set up the tty stuff. */ +int +initialize_job_control (force) + int force; +{ + pid_t t; + int t_errno; + + t_errno = -1; + shell_pgrp = getpgid (0); + + if (shell_pgrp == -1) + { + sys_error (_("initialize_job_control: getpgrp failed")); + exit (1); + } + + /* We can only have job control if we are interactive unless we force it. */ + if (interactive == 0 && force == 0) + { + job_control = 0; + original_pgrp = NO_PID; + shell_tty = fileno (stderr); + } + else + { + shell_tty = -1; + + /* If forced_interactive is set, we skip the normal check that stderr + is attached to a tty, so we need to check here. If it's not, we + need to see whether we have a controlling tty by opening /dev/tty, + since trying to use job control tty pgrp manipulations on a non-tty + is going to fail. */ + if (forced_interactive && isatty (fileno (stderr)) == 0) + shell_tty = open ("/dev/tty", O_RDWR|O_NONBLOCK); + + /* Get our controlling terminal. If job_control is set, or + interactive is set, then this is an interactive shell no + matter where fd 2 is directed. */ + if (shell_tty == -1) + shell_tty = dup (fileno (stderr)); /* fd 2 */ + + if (shell_tty != -1) + shell_tty = move_to_high_fd (shell_tty, 1, -1); + + /* Compensate for a bug in systems that compiled the BSD + rlogind with DEBUG defined, like NeXT and Alliant. */ + if (shell_pgrp == 0) + { + shell_pgrp = getpid (); + setpgid (0, shell_pgrp); + tcsetpgrp (shell_tty, shell_pgrp); + } + + while ((terminal_pgrp = tcgetpgrp (shell_tty)) != -1) + { + if (shell_pgrp != terminal_pgrp) + { + SigHandler *ottin; + + ottin = set_signal_handler(SIGTTIN, SIG_DFL); + kill (0, SIGTTIN); + set_signal_handler (SIGTTIN, ottin); + continue; + } + break; + } + + if (terminal_pgrp == -1) + t_errno = errno; + + /* Make sure that we are using the new line discipline. */ + if (set_new_line_discipline (shell_tty) < 0) + { + sys_error (_("initialize_job_control: line discipline")); + job_control = 0; + } + else + { + original_pgrp = shell_pgrp; + shell_pgrp = getpid (); + + if ((original_pgrp != shell_pgrp) && (setpgid (0, shell_pgrp) < 0)) + { + sys_error (_("initialize_job_control: setpgid")); + shell_pgrp = original_pgrp; + } + + job_control = 1; + + /* If (and only if) we just set our process group to our pid, + thereby becoming a process group leader, and the terminal + is not in the same process group as our (new) process group, + then set the terminal's process group to our (new) process + group. If that fails, set our process group back to what it + was originally (so we can still read from the terminal) and + turn off job control. */ + if (shell_pgrp != original_pgrp && shell_pgrp != terminal_pgrp) + { + if (give_terminal_to (shell_pgrp, 0) < 0) + { + t_errno = errno; + setpgid (0, original_pgrp); + shell_pgrp = original_pgrp; + errno = t_errno; + sys_error (_("cannot set terminal process group (%d)"), shell_pgrp); + job_control = 0; + } + } + + if (job_control && ((t = tcgetpgrp (shell_tty)) == -1 || t != shell_pgrp)) + { + if (t_errno != -1) + errno = t_errno; + sys_error (_("cannot set terminal process group (%d)"), t); + job_control = 0; + } + } + if (job_control == 0) + internal_error (_("no job control in this shell")); + } + + if (shell_tty != fileno (stderr)) + SET_CLOSE_ON_EXEC (shell_tty); + + set_signal_handler (SIGCHLD, sigchld_handler); + + change_flag ('m', job_control ? '-' : '+'); + + if (interactive) + get_tty_state (); + + if (js.c_childmax < 0) + js.c_childmax = getmaxchild (); + if (js.c_childmax < 0) + js.c_childmax = DEFAULT_CHILD_MAX; + + return job_control; +} + +#ifdef DEBUG +void +debug_print_pgrps () +{ + itrace("original_pgrp = %ld shell_pgrp = %ld terminal_pgrp = %ld", + (long)original_pgrp, (long)shell_pgrp, (long)terminal_pgrp); + itrace("tcgetpgrp(%d) -> %ld, getpgid(0) -> %ld", + shell_tty, (long)tcgetpgrp (shell_tty), (long)getpgid(0)); +} +#endif + +/* Set the line discipline to the best this system has to offer. + Return -1 if this is not possible. */ +static int +set_new_line_discipline (tty) + int tty; +{ +#if defined (NEW_TTY_DRIVER) + int ldisc; + + if (ioctl (tty, TIOCGETD, &ldisc) < 0) + return (-1); + + if (ldisc != NTTYDISC) + { + ldisc = NTTYDISC; + + if (ioctl (tty, TIOCSETD, &ldisc) < 0) + return (-1); + } + return (0); +#endif /* NEW_TTY_DRIVER */ + +#if defined (TERMIO_TTY_DRIVER) +# if defined (TERMIO_LDISC) && (NTTYDISC) + if (ioctl (tty, TCGETA, &shell_tty_info) < 0) + return (-1); + + if (shell_tty_info.c_line != NTTYDISC) + { + shell_tty_info.c_line = NTTYDISC; + if (ioctl (tty, TCSETAW, &shell_tty_info) < 0) + return (-1); + } +# endif /* TERMIO_LDISC && NTTYDISC */ + return (0); +#endif /* TERMIO_TTY_DRIVER */ + +#if defined (TERMIOS_TTY_DRIVER) +# if defined (TERMIOS_LDISC) && defined (NTTYDISC) + if (tcgetattr (tty, &shell_tty_info) < 0) + return (-1); + + if (shell_tty_info.c_line != NTTYDISC) + { + shell_tty_info.c_line = NTTYDISC; + if (tcsetattr (tty, TCSADRAIN, &shell_tty_info) < 0) + return (-1); + } +# endif /* TERMIOS_LDISC && NTTYDISC */ + return (0); +#endif /* TERMIOS_TTY_DRIVER */ + +#if !defined (NEW_TTY_DRIVER) && !defined (TERMIO_TTY_DRIVER) && !defined (TERMIOS_TTY_DRIVER) + return (-1); +#endif +} + +/* Setup this shell to handle C-C, etc. */ +void +initialize_job_signals () +{ + if (interactive) + { + set_signal_handler (SIGINT, sigint_sighandler); + set_signal_handler (SIGTSTP, SIG_IGN); + set_signal_handler (SIGTTOU, SIG_IGN); + set_signal_handler (SIGTTIN, SIG_IGN); + } + else if (job_control) + { + old_tstp = set_signal_handler (SIGTSTP, sigstop_sighandler); + old_ttin = set_signal_handler (SIGTTIN, sigstop_sighandler); + old_ttou = set_signal_handler (SIGTTOU, sigstop_sighandler); + } + /* Leave these things alone for non-interactive shells without job + control. */ +} + +/* Here we handle CONT signals. */ +static sighandler +sigcont_sighandler (sig) + int sig; +{ + initialize_job_signals (); + set_signal_handler (SIGCONT, old_cont); + kill (getpid (), SIGCONT); + + SIGRETURN (0); +} + +/* Here we handle stop signals while we are running not as a login shell. */ +static sighandler +sigstop_sighandler (sig) + int sig; +{ + set_signal_handler (SIGTSTP, old_tstp); + set_signal_handler (SIGTTOU, old_ttou); + set_signal_handler (SIGTTIN, old_ttin); + + old_cont = set_signal_handler (SIGCONT, sigcont_sighandler); + + give_terminal_to (shell_pgrp, 0); + + kill (getpid (), sig); + + SIGRETURN (0); +} + +/* Give the terminal to PGRP. */ +int +give_terminal_to (pgrp, force) + pid_t pgrp; + int force; +{ + sigset_t set, oset; + int r, e; + + r = 0; + if (job_control || force) + { +itrace("give_terminal_to: giving terminal to %d", pgrp); + sigemptyset (&set); + sigaddset (&set, SIGTTOU); + sigaddset (&set, SIGTTIN); + sigaddset (&set, SIGTSTP); + sigaddset (&set, SIGCHLD); + sigemptyset (&oset); + sigprocmask (SIG_BLOCK, &set, &oset); + + if (tcsetpgrp (shell_tty, pgrp) < 0) + { + /* Maybe we should print an error message? */ +#if 0 + sys_error ("tcsetpgrp(%d) failed: pid %ld to pgrp %ld", + shell_tty, (long)getpid(), (long)pgrp); +#endif + r = -1; + e = errno; + } + else + terminal_pgrp = pgrp; + sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL); + } + + if (r == -1) + errno = e; + + return r; +} + +/* Give terminal to NPGRP iff it's currently owned by OPGRP. FLAGS are the + flags to pass to give_terminal_to(). */ +static int +maybe_give_terminal_to (opgrp, npgrp, flags) + pid_t opgrp, npgrp; + int flags; +{ + int tpgrp; + + tpgrp = tcgetpgrp (shell_tty); + if (tpgrp < 0 && errno == ENOTTY) + return -1; + if (tpgrp == npgrp) + { + terminal_pgrp = npgrp; + return 0; + } + else if (tpgrp != opgrp) + { +#if defined (DEBUG) + internal_warning ("maybe_give_terminal_to: terminal pgrp == %d shell pgrp = %d new pgrp = %d", tpgrp, opgrp, npgrp); +#endif + return -1; + } + else + return (give_terminal_to (npgrp, flags)); +} + +/* Clear out any jobs in the job array. This is intended to be used by + children of the shell, who should not have any job structures as baggage + when they start executing (forking subshells for parenthesized execution + and functions with pipes are the two that spring to mind). If RUNNING_ONLY + is nonzero, only running jobs are removed from the table. */ +void +delete_all_jobs (running_only) + int running_only; +{ + register int i; + sigset_t set, oset; + + BLOCK_CHILD (set, oset); + + /* XXX - need to set j_lastj, j_firstj appropriately if running_only != 0. */ + if (js.j_jobslots) + { + js.j_current = js.j_previous = NO_JOB; + + /* XXX could use js.j_firstj here */ + for (i = 0; i < js.j_jobslots; i++) + { +#if defined (DEBUG) + if (i < js.j_firstj && jobs[i]) + itrace("delete_all_jobs: job %d non-null before js.j_firstj (%d)", i, js.j_firstj); + if (i > js.j_lastj && jobs[i]) + itrace("delete_all_jobs: job %d non-null after js.j_lastj (%d)", i, js.j_lastj); +#endif + if (jobs[i] && (running_only == 0 || (running_only && RUNNING(i)))) + delete_job (i, DEL_WARNSTOPPED); + } + if (running_only == 0) + { + free ((char *)jobs); + js.j_jobslots = 0; + js.j_firstj = js.j_lastj = js.j_njobs = 0; + } + } + + if (running_only == 0) + bgp_clear (); + + UNBLOCK_CHILD (oset); +} + +/* Mark all jobs in the job array so that they don't get a SIGHUP when the + shell gets one. If RUNNING_ONLY is nonzero, mark only running jobs. */ +void +nohup_all_jobs (running_only) + int running_only; +{ + register int i; + sigset_t set, oset; + + BLOCK_CHILD (set, oset); + + if (js.j_jobslots) + { + /* XXX could use js.j_firstj here */ + for (i = 0; i < js.j_jobslots; i++) + if (jobs[i] && (running_only == 0 || (running_only && RUNNING(i)))) + nohup_job (i); + } + + UNBLOCK_CHILD (oset); +} + +int +count_all_jobs () +{ + int i, n; + sigset_t set, oset; + + /* This really counts all non-dead jobs. */ + BLOCK_CHILD (set, oset); + /* XXX could use js.j_firstj here */ + for (i = n = 0; i < js.j_jobslots; i++) + { +#if defined (DEBUG) + if (i < js.j_firstj && jobs[i]) + itrace("count_all_jobs: job %d non-null before js.j_firstj (%d)", i, js.j_firstj); + if (i > js.j_lastj && jobs[i]) + itrace("count_all_jobs: job %d non-null after js.j_lastj (%d)", i, js.j_lastj); +#endif + if (jobs[i] && DEADJOB(i) == 0) + n++; + } + UNBLOCK_CHILD (oset); + return n; +} + +static void +mark_all_jobs_as_dead () +{ + register int i; + sigset_t set, oset; + + if (js.j_jobslots == 0) + return; + + BLOCK_CHILD (set, oset); + + /* XXX could use js.j_firstj here */ + for (i = 0; i < js.j_jobslots; i++) + if (jobs[i]) + { + jobs[i]->state = JDEAD; + js.j_ndead++; + } + + UNBLOCK_CHILD (oset); +} + +/* Mark all dead jobs as notified, so delete_job () cleans them out + of the job table properly. POSIX.2 says we need to save the + status of the last CHILD_MAX jobs, so we count the number of dead + jobs and mark only enough as notified to save CHILD_MAX statuses. */ +static void +mark_dead_jobs_as_notified (force) + int force; +{ + register int i, ndead, ndeadproc; + sigset_t set, oset; + + if (js.j_jobslots == 0) + return; + + BLOCK_CHILD (set, oset); + + /* If FORCE is non-zero, we don't have to keep CHILD_MAX statuses + around; just run through the array. */ + if (force) + { + /* XXX could use js.j_firstj here */ + for (i = 0; i < js.j_jobslots; i++) + { + if (jobs[i] && DEADJOB (i) && (interactive_shell || (find_last_pid (i, 0) != last_asynchronous_pid))) + jobs[i]->flags |= J_NOTIFIED; + } + UNBLOCK_CHILD (oset); + return; + } + + /* Mark enough dead jobs as notified to keep CHILD_MAX processes left in the + array with the corresponding not marked as notified. This is a better + way to avoid pid aliasing and reuse problems than keeping the POSIX- + mandated CHILD_MAX jobs around. delete_job() takes care of keeping the + bgpids list regulated. */ + + /* Count the number of dead jobs */ + /* XXX could use js.j_firstj here */ + for (i = ndead = ndeadproc = 0; i < js.j_jobslots; i++) + { +#if defined (DEBUG) + if (i < js.j_firstj && jobs[i]) + itrace("mark_dead_jobs_as_notified: job %d non-null before js.j_firstj (%d)", i, js.j_firstj); + if (i > js.j_lastj && jobs[i]) + itrace("mark_dead_jobs_as_notified: job %d non-null after js.j_lastj (%d)", i, js.j_lastj); +#endif + if (jobs[i] && DEADJOB (i)) + { + ndead++; + ndeadproc += processes_in_job (i); + } + } + +#ifdef DEBUG +# if 0 + if (ndeadproc != js.c_reaped) + itrace("mark_dead_jobs_as_notified: ndeadproc (%d) != js.c_reaped (%d)", ndeadproc, js.c_reaped); +# endif + if (ndead != js.j_ndead) + itrace("mark_dead_jobs_as_notified: ndead (%d) != js.j_ndead (%d)", ndead, js.j_ndead); +#endif + + if (js.c_childmax < 0) + js.c_childmax = getmaxchild (); + if (js.c_childmax < 0) + js.c_childmax = DEFAULT_CHILD_MAX; + + /* Don't do anything if the number of dead processes is less than CHILD_MAX + and we're not forcing a cleanup. */ + if (ndeadproc <= js.c_childmax) + { + UNBLOCK_CHILD (oset); + return; + } + +#if 0 +itrace("mark_dead_jobs_as_notified: child_max = %d ndead = %d ndeadproc = %d", js.c_childmax, ndead, ndeadproc); +#endif + + /* Mark enough dead jobs as notified that we keep CHILD_MAX jobs in + the list. This isn't exactly right yet; changes need to be made + to stop_pipeline so we don't mark the newer jobs after we've + created CHILD_MAX slots in the jobs array. This needs to be + integrated with a way to keep the jobs array from growing without + bound. Maybe we wrap back around to 0 after we reach some max + limit, and there are sufficient job slots free (keep track of total + size of jobs array (js.j_jobslots) and running count of number of jobs + in jobs array. Then keep a job index corresponding to the `oldest job' + and start this loop there, wrapping around as necessary. In effect, + we turn the list into a circular buffer. */ + /* XXX could use js.j_firstj here */ + for (i = 0; i < js.j_jobslots; i++) + { + if (jobs[i] && DEADJOB (i) && (interactive_shell || (find_last_pid (i, 0) != last_asynchronous_pid))) + { +#if defined (DEBUG) + if (i < js.j_firstj && jobs[i]) + itrace("mark_dead_jobs_as_notified: job %d non-null before js.j_firstj (%d)", i, js.j_firstj); + if (i > js.j_lastj && jobs[i]) + itrace("mark_dead_jobs_as_notified: job %d non-null after js.j_lastj (%d)", i, js.j_lastj); +#endif + /* If marking this job as notified would drop us down below + child_max, don't mark it so we can keep at least child_max + statuses. XXX -- need to check what Posix actually says + about keeping statuses. */ + if ((ndeadproc -= processes_in_job (i)) <= js.c_childmax) + break; + jobs[i]->flags |= J_NOTIFIED; + } + } + + UNBLOCK_CHILD (oset); +} + +/* Here to allow other parts of the shell (like the trap stuff) to + freeze and unfreeze the jobs list. */ +void +freeze_jobs_list () +{ + jobs_list_frozen = 1; +} + +void +unfreeze_jobs_list () +{ + jobs_list_frozen = 0; +} + +/* Allow or disallow job control to take place. Returns the old value + of job_control. */ +int +set_job_control (arg) + int arg; +{ + int old; + + old = job_control; + job_control = arg; + + /* If we're turning on job control, reset pipeline_pgrp so make_child will + put new child processes into the right pgrp */ + if (job_control != old && job_control) + pipeline_pgrp = 0; + + return (old); +} + +/* Turn off all traces of job control. This is run by children of the shell + which are going to do shellsy things, like wait (), etc. */ +void +without_job_control () +{ + stop_making_children (); + start_pipeline (); +#if defined (PGRP_PIPE) + sh_closepipe (pgrp_pipe); +#endif + delete_all_jobs (0); + set_job_control (0); +} + +/* If this shell is interactive, terminate all stopped jobs and + restore the original terminal process group. This is done + before the `exec' builtin calls shell_execve. */ +void +end_job_control () +{ + if (interactive_shell) /* XXX - should it be interactive? */ + { + terminate_stopped_jobs (); + + if (original_pgrp >= 0) + give_terminal_to (original_pgrp, 1); + } + + if (original_pgrp >= 0) + setpgid (0, original_pgrp); +} + +/* Restart job control by closing shell tty and reinitializing. This is + called after an exec fails in an interactive shell and we do not exit. */ +void +restart_job_control () +{ + if (shell_tty != -1) + close (shell_tty); + initialize_job_control (0); +} + +void +set_maxchild (nchild) + int nchild; +{ + static int lmaxchild = -1; + + if (lmaxchild < 0) + lmaxchild = getmaxchild (); + if (lmaxchild < 0) + lmaxchild = DEFAULT_CHILD_MAX; + + /* Clamp value we set. Minimum is what Posix requires, maximum is defined + above as MAX_CHILD_MAX. */ + if (nchild < lmaxchild) + nchild = lmaxchild; + else if (nchild > MAX_CHILD_MAX) + nchild = MAX_CHILD_MAX; + + js.c_childmax = nchild; +} + +/* Set the handler to run when the shell receives a SIGCHLD signal. */ +void +set_sigchld_handler () +{ + set_signal_handler (SIGCHLD, sigchld_handler); +} + +#if defined (PGRP_PIPE) +/* Read from the read end of a pipe. This is how the process group leader + blocks until all of the processes in a pipeline have been made. */ +static void +pipe_read (pp) + int *pp; +{ + char ch; + + if (pp[1] >= 0) + { + close (pp[1]); + pp[1] = -1; + } + + if (pp[0] >= 0) + { + while (read (pp[0], &ch, 1) == -1 && errno == EINTR) + ; + } +} + +/* Functional interface closes our local-to-job-control pipes. */ +void +close_pgrp_pipe () +{ + sh_closepipe (pgrp_pipe); +} + +void +save_pgrp_pipe (p, clear) + int *p; + int clear; +{ + p[0] = pgrp_pipe[0]; + p[1] = pgrp_pipe[1]; + if (clear) + pgrp_pipe[0] = pgrp_pipe[1] = -1; +} + +void +restore_pgrp_pipe (p) + int *p; +{ + pgrp_pipe[0] = p[0]; + pgrp_pipe[1] = p[1]; +} + +#endif /* PGRP_PIPE */ diff --git a/lib/readline/display.c b/lib/readline/display.c index 8f04b3a25..913e0da0c 100644 --- a/lib/readline/display.c +++ b/lib/readline/display.c @@ -748,10 +748,9 @@ rl_redisplay () /* Now account for invisible characters in the current line. */ /* XXX - this assumes that the invisible characters may be split, but only between the first and the last lines. */ - temp += ((local_prompt_prefix == 0) ? ((newlines == 0) ? prompt_invis_chars_first_line - : ((newlines == prompt_lines_estimate) ? wrap_offset : prompt_invis_chars_first_line)) - : ((newlines == 0) ? wrap_offset : 0)); - + temp += (newlines == 0) ? prompt_invis_chars_first_line + : ((newlines == prompt_lines_estimate) ? wrap_offset : prompt_invis_chars_first_line); + inv_lbreaks[++newlines] = temp; #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0 && prompt_multibyte_chars > 0) diff --git a/lib/readline/undo.c b/lib/readline/undo.c index 32873d270..a3d40447c 100644 --- a/lib/readline/undo.c +++ b/lib/readline/undo.c @@ -178,6 +178,7 @@ rl_do_undo () { UNDO_LIST *release; int waiting_for_begin, start, end; + HIST_ENTRY *cur, *temp; #define TRANS(i) ((i) == -1 ? rl_point : ((i) == -2 ? rl_end : (i))) @@ -232,6 +233,18 @@ rl_do_undo () release = rl_undo_list; rl_undo_list = rl_undo_list->next; + + /* If we are editing a history entry, make sure the change is replicated + in the history entry's line */ + cur = current_history (); + if ((UNDO_LIST *)cur->data == release) + { + temp = replace_history_entry (where_history (), rl_line_buffer, (histdata_t)rl_undo_list); + xfree (temp->line); + FREE (temp->timestamp); + xfree (temp); + } + replace_history_data (-1, (histdata_t *)release, (histdata_t *)rl_undo_list); xfree (release); diff --git a/lib/readline/undo.c~ b/lib/readline/undo.c~ new file mode 100644 index 000000000..d98074e25 --- /dev/null +++ b/lib/readline/undo.c~ @@ -0,0 +1,353 @@ +/* readline.c -- a general facility for reading lines of input + with emacs style editing and completion. */ + +/* Copyright (C) 1987-2012 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (Readline), a library + for reading lines of text with interactive input and history editing. + + Readline is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Readline is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Readline. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#if defined (HAVE_UNISTD_H) +# include /* for _POSIX_VERSION */ +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" + +/* Some standard library routines. */ +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" +#include "xmalloc.h" + +extern void replace_history_data PARAMS((int, histdata_t *, histdata_t *)); + +/* Non-zero tells rl_delete_text and rl_insert_text to not add to + the undo list. */ +int _rl_doing_an_undo = 0; + +/* How many unclosed undo groups we currently have. */ +int _rl_undo_group_level = 0; + +/* The current undo list for THE_LINE. */ +UNDO_LIST *rl_undo_list = (UNDO_LIST *)NULL; + +/* **************************************************************** */ +/* */ +/* Undo, and Undoing */ +/* */ +/* **************************************************************** */ + +static UNDO_LIST * +alloc_undo_entry (what, start, end, text) + enum undo_code what; + int start, end; + char *text; +{ + UNDO_LIST *temp; + + temp = (UNDO_LIST *)xmalloc (sizeof (UNDO_LIST)); + temp->what = what; + temp->start = start; + temp->end = end; + temp->text = text; + + temp->next = (UNDO_LIST *)NULL; + return temp; +} + +/* Remember how to undo something. Concatenate some undos if that + seems right. */ +void +rl_add_undo (what, start, end, text) + enum undo_code what; + int start, end; + char *text; +{ + UNDO_LIST *temp; + + temp = alloc_undo_entry (what, start, end, text); + temp->next = rl_undo_list; + rl_undo_list = temp; +} + +/* Free an UNDO_LIST */ +void +_rl_free_undo_list (ul) + UNDO_LIST *ul; +{ + UNDO_LIST *release; + + while (ul) + { + release = ul; + ul = ul->next; + + if (release->what == UNDO_DELETE) + xfree (release->text); + + xfree (release); + } +} + +/* Free the existing undo list. */ +void +rl_free_undo_list () +{ + UNDO_LIST *release, *orig_list; + + orig_list = rl_undo_list; + _rl_free_undo_list (rl_undo_list); + rl_undo_list = (UNDO_LIST *)NULL; + replace_history_data (-1, (histdata_t *)orig_list, (histdata_t *)NULL); +} + +UNDO_LIST * +_rl_copy_undo_entry (entry) + UNDO_LIST *entry; +{ + UNDO_LIST *new; + + new = alloc_undo_entry (entry->what, entry->start, entry->end, (char *)NULL); + new->text = entry->text ? savestring (entry->text) : 0; + return new; +} + +UNDO_LIST * +_rl_copy_undo_list (head) + UNDO_LIST *head; +{ + UNDO_LIST *list, *new, *roving, *c; + + if (head == 0) + return head; + + list = head; + new = 0; + while (list) + { + c = _rl_copy_undo_entry (list); + if (new == 0) + roving = new = c; + else + { + roving->next = c; + roving = roving->next; + } + list = list->next; + } + + roving->next = 0; + return new; +} + +/* Undo the next thing in the list. Return 0 if there + is nothing to undo, or non-zero if there was. */ +int +rl_do_undo () +{ + UNDO_LIST *release; + int waiting_for_begin, start, end; + HIST_ENTRY *cur, *temp; + +#define TRANS(i) ((i) == -1 ? rl_point : ((i) == -2 ? rl_end : (i))) + + start = end = waiting_for_begin = 0; + do + { + if (rl_undo_list == 0) + return (0); + + _rl_doing_an_undo = 1; + RL_SETSTATE(RL_STATE_UNDOING); + + /* To better support vi-mode, a start or end value of -1 means + rl_point, and a value of -2 means rl_end. */ + if (rl_undo_list->what == UNDO_DELETE || rl_undo_list->what == UNDO_INSERT) + { + start = TRANS (rl_undo_list->start); + end = TRANS (rl_undo_list->end); + } + + switch (rl_undo_list->what) + { + /* Undoing deletes means inserting some text. */ + case UNDO_DELETE: + rl_point = start; + rl_insert_text (rl_undo_list->text); + xfree (rl_undo_list->text); + break; + + /* Undoing inserts means deleting some text. */ + case UNDO_INSERT: + rl_delete_text (start, end); + rl_point = start; + break; + + /* Undoing an END means undoing everything 'til we get to a BEGIN. */ + case UNDO_END: + waiting_for_begin++; + break; + + /* Undoing a BEGIN means that we are done with this group. */ + case UNDO_BEGIN: + if (waiting_for_begin) + waiting_for_begin--; + else + rl_ding (); + break; + } + + _rl_doing_an_undo = 0; + RL_UNSETSTATE(RL_STATE_UNDOING); + + /* If we are editing a history entry, make sure the change is replicated + in the history entry's line */ + cur = current_history (); + if ((UNDO_LIST *)cur->data == rl_undo_list) + { + temp = replace_history_entry (where_history (), rl_line_buffer, (histdata_t)rl_undo_list->next); + xfree (temp->line); + FREE (temp->timestamp); + xfree (temp); + } + + release = rl_undo_list; + rl_undo_list = rl_undo_list->next; + replace_history_data (-1, (histdata_t *)release, (histdata_t *)rl_undo_list); + + xfree (release); + } + while (waiting_for_begin); + + return (1); +} +#undef TRANS + +int +_rl_fix_last_undo_of_type (type, start, end) + int type, start, end; +{ + UNDO_LIST *rl; + + for (rl = rl_undo_list; rl; rl = rl->next) + { + if (rl->what == type) + { + rl->start = start; + rl->end = end; + return 0; + } + } + return 1; +} + +/* Begin a group. Subsequent undos are undone as an atomic operation. */ +int +rl_begin_undo_group () +{ + rl_add_undo (UNDO_BEGIN, 0, 0, 0); + _rl_undo_group_level++; + return 0; +} + +/* End an undo group started with rl_begin_undo_group (). */ +int +rl_end_undo_group () +{ + rl_add_undo (UNDO_END, 0, 0, 0); + _rl_undo_group_level--; + return 0; +} + +/* Save an undo entry for the text from START to END. */ +int +rl_modifying (start, end) + int start, end; +{ + if (start > end) + { + SWAP (start, end); + } + + if (start != end) + { + char *temp = rl_copy_text (start, end); + rl_begin_undo_group (); + rl_add_undo (UNDO_DELETE, start, end, temp); + rl_add_undo (UNDO_INSERT, start, end, (char *)NULL); + rl_end_undo_group (); + } + return 0; +} + +/* Revert the current line to its previous state. */ +int +rl_revert_line (count, key) + int count, key; +{ + if (rl_undo_list == 0) + rl_ding (); + else + { + while (rl_undo_list) + rl_do_undo (); +#if defined (VI_MODE) + if (rl_editing_mode == vi_mode) + rl_point = rl_mark = 0; /* rl_end should be set correctly */ +#endif + } + + return 0; +} + +/* Do some undoing of things that were done. */ +int +rl_undo_command (count, key) + int count, key; +{ + if (count < 0) + return 0; /* Nothing to do. */ + + while (count) + { + if (rl_do_undo ()) + count--; + else + { + rl_ding (); + break; + } + } + return 0; +} diff --git a/parse.y~ b/parse.y~ index 993d696dd..3dc7d1b4b 100644 --- a/parse.y~ +++ b/parse.y~ @@ -1430,7 +1430,10 @@ yy_readline_get () #if defined (JOB_CONTROL) if (job_control) +{ +itrace("yy_readline_get: give_terminal_to: %d", shell_pgrp); give_terminal_to (shell_pgrp, 0); +} #endif /* JOB_CONTROL */ old_sigint = (SigHandler *)IMPOSSIBLE_TRAP_HANDLER; @@ -1440,6 +1443,7 @@ yy_readline_get () old_sigint = (SigHandler *)set_signal_handler (SIGINT, sigint_sighandler); } +itrace("yy_readline_get: calling readline"); current_readline_line = readline (current_readline_prompt ? current_readline_prompt : ""); diff --git a/subst.c~ b/subst.c~ new file mode 100644 index 000000000..633b507a3 --- /dev/null +++ b/subst.c~ @@ -0,0 +1,9668 @@ +/* subst.c -- The part of the shell that does parameter, command, arithmetic, + and globbing substitutions. */ + +/* ``Have a little faith, there's magic in the night. You ain't a + beauty, but, hey, you're alright.'' */ + +/* Copyright (C) 1987-2013 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. + + Bash is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Bash is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bash. If not, see . +*/ + +#include "config.h" + +#include "bashtypes.h" +#include +#include "chartypes.h" +#if defined (HAVE_PWD_H) +# include +#endif +#include +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif + +#include "bashansi.h" +#include "posixstat.h" +#include "bashintl.h" + +#include "shell.h" +#include "parser.h" +#include "flags.h" +#include "jobs.h" +#include "execute_cmd.h" +#include "filecntl.h" +#include "trap.h" +#include "pathexp.h" +#include "mailcheck.h" + +#include "shmbutil.h" +#include "typemax.h" + +#include "builtins/getopt.h" +#include "builtins/common.h" + +#include "builtins/builtext.h" + +#include +#include + +#if !defined (errno) +extern int errno; +#endif /* !errno */ + +/* The size that strings change by. */ +#define DEFAULT_INITIAL_ARRAY_SIZE 112 +#define DEFAULT_ARRAY_SIZE 128 + +/* Variable types. */ +#define VT_VARIABLE 0 +#define VT_POSPARMS 1 +#define VT_ARRAYVAR 2 +#define VT_ARRAYMEMBER 3 +#define VT_ASSOCVAR 4 + +#define VT_STARSUB 128 /* $* or ${array[*]} -- used to split */ + +/* Flags for quoted_strchr */ +#define ST_BACKSL 0x01 +#define ST_CTLESC 0x02 +#define ST_SQUOTE 0x04 /* unused yet */ +#define ST_DQUOTE 0x08 /* unused yet */ + +/* Flags for the `pflags' argument to param_expand() */ +#define PF_NOCOMSUB 0x01 /* Do not perform command substitution */ +#define PF_IGNUNBOUND 0x02 /* ignore unbound vars even if -u set */ +#define PF_NOSPLIT2 0x04 /* same as W_NOSPLIT2 */ +#define PF_ASSIGNRHS 0x08 /* same as W_ASSIGNRHS */ + +/* These defs make it easier to use the editor. */ +#define LBRACE '{' +#define RBRACE '}' +#define LPAREN '(' +#define RPAREN ')' + +#if defined (HANDLE_MULTIBYTE) +#define WLPAREN L'(' +#define WRPAREN L')' +#endif + +/* Evaluates to 1 if C is one of the shell's special parameters whose length + can be taken, but is also one of the special expansion characters. */ +#define VALID_SPECIAL_LENGTH_PARAM(c) \ + ((c) == '-' || (c) == '?' || (c) == '#') + +/* Evaluates to 1 if C is one of the shell's special parameters for which an + indirect variable reference may be made. */ +#define VALID_INDIR_PARAM(c) \ + ((posixly_correct == 0 && (c) == '#') || (posixly_correct == 0 && (c) == '?') || (c) == '@' || (c) == '*') + +/* Evaluates to 1 if C is one of the OP characters that follows the parameter + in ${parameter[:]OPword}. */ +#define VALID_PARAM_EXPAND_CHAR(c) (sh_syntaxtab[(unsigned char)c] & CSUBSTOP) + +/* Evaluates to 1 if this is one of the shell's special variables. */ +#define SPECIAL_VAR(name, wi) \ + ((DIGIT (*name) && all_digits (name)) || \ + (name[1] == '\0' && (sh_syntaxtab[(unsigned char)*name] & CSPECVAR)) || \ + (wi && name[2] == '\0' && VALID_INDIR_PARAM (name[1]))) + +/* An expansion function that takes a string and a quoted flag and returns + a WORD_LIST *. Used as the type of the third argument to + expand_string_if_necessary(). */ +typedef WORD_LIST *EXPFUNC __P((char *, int)); + +/* Process ID of the last command executed within command substitution. */ +pid_t last_command_subst_pid = NO_PID; +pid_t current_command_subst_pid = NO_PID; + +/* Variables used to keep track of the characters in IFS. */ +SHELL_VAR *ifs_var; +char *ifs_value; +unsigned char ifs_cmap[UCHAR_MAX + 1]; +int ifs_is_set, ifs_is_null; + +#if defined (HANDLE_MULTIBYTE) +unsigned char ifs_firstc[MB_LEN_MAX]; +size_t ifs_firstc_len; +#else +unsigned char ifs_firstc; +#endif + +/* Sentinel to tell when we are performing variable assignments preceding a + command name and putting them into the environment. Used to make sure + we use the temporary environment when looking up variable values. */ +int assigning_in_environment; + +/* Used to hold a list of variable assignments preceding a command. Global + so the SIGCHLD handler in jobs.c can unwind-protect it when it runs a + SIGCHLD trap and so it can be saved and restored by the trap handlers. */ +WORD_LIST *subst_assign_varlist = (WORD_LIST *)NULL; + +/* Extern functions and variables from different files. */ +extern int last_command_exit_value, last_command_exit_signal; +extern int subshell_environment, line_number; +extern int subshell_level, parse_and_execute_level, sourcelevel; +extern int eof_encountered; +extern int return_catch_flag, return_catch_value; +extern pid_t dollar_dollar_pid; +extern int posixly_correct; +extern char *this_command_name; +extern struct fd_bitmap *current_fds_to_close; +extern int wordexp_only; +extern int expanding_redir; +extern int tempenv_assign_error; +extern int builtin_ignoring_errexit; + +#if !defined (HAVE_WCSDUP) && defined (HANDLE_MULTIBYTE) +extern wchar_t *wcsdup __P((const wchar_t *)); +#endif + +/* Non-zero means to allow unmatched globbed filenames to expand to + a null file. */ +int allow_null_glob_expansion; + +/* Non-zero means to throw an error when globbing fails to match anything. */ +int fail_glob_expansion; + +#if 0 +/* Variables to keep track of which words in an expanded word list (the + output of expand_word_list_internal) are the result of globbing + expansions. GLOB_ARGV_FLAGS is used by execute_cmd.c. + (CURRENTLY UNUSED). */ +char *glob_argv_flags; +static int glob_argv_flags_size; +#endif + +static WORD_LIST expand_word_error, expand_word_fatal; +static WORD_DESC expand_wdesc_error, expand_wdesc_fatal; +static char expand_param_error, expand_param_fatal; +static char extract_string_error, extract_string_fatal; + +/* Tell the expansion functions to not longjmp back to top_level on fatal + errors. Enabled when doing completion and prompt string expansion. */ +static int no_longjmp_on_fatal_error = 0; + +/* Set by expand_word_unsplit; used to inhibit splitting and re-joining + $* on $IFS, primarily when doing assignment statements. */ +static int expand_no_split_dollar_star = 0; + +/* A WORD_LIST of words to be expanded by expand_word_list_internal, + without any leading variable assignments. */ +static WORD_LIST *garglist = (WORD_LIST *)NULL; + +static char *quoted_substring __P((char *, int, int)); +static int quoted_strlen __P((char *)); +static char *quoted_strchr __P((char *, int, int)); + +static char *expand_string_if_necessary __P((char *, int, EXPFUNC *)); +static inline char *expand_string_to_string_internal __P((char *, int, EXPFUNC *)); +static WORD_LIST *call_expand_word_internal __P((WORD_DESC *, int, int, int *, int *)); +static WORD_LIST *expand_string_internal __P((char *, int)); +static WORD_LIST *expand_string_leave_quoted __P((char *, int)); +static WORD_LIST *expand_string_for_rhs __P((char *, int, int *, int *)); + +static WORD_LIST *list_quote_escapes __P((WORD_LIST *)); +static char *make_quoted_char __P((int)); +static WORD_LIST *quote_list __P((WORD_LIST *)); + +static int unquoted_substring __P((char *, char *)); +static int unquoted_member __P((int, char *)); + +#if defined (ARRAY_VARS) +static SHELL_VAR *do_compound_assignment __P((char *, char *, int)); +#endif +static int do_assignment_internal __P((const WORD_DESC *, int)); + +static char *string_extract_verbatim __P((char *, size_t, int *, char *, int)); +static char *string_extract __P((char *, int *, char *, int)); +static char *string_extract_double_quoted __P((char *, int *, int)); +static inline char *string_extract_single_quoted __P((char *, int *)); +static inline int skip_single_quoted __P((const char *, size_t, int)); +static int skip_double_quoted __P((char *, size_t, int)); +static char *extract_delimited_string __P((char *, int *, char *, char *, char *, int)); +static char *extract_dollar_brace_string __P((char *, int *, int, int)); +static int skip_matched_pair __P((const char *, int, int, int, int)); + +static char *pos_params __P((char *, int, int, int)); + +static unsigned char *mb_getcharlens __P((char *, int)); + +static char *remove_upattern __P((char *, char *, int)); +#if defined (HANDLE_MULTIBYTE) +static wchar_t *remove_wpattern __P((wchar_t *, size_t, wchar_t *, int)); +#endif +static char *remove_pattern __P((char *, char *, int)); + +static int match_upattern __P((char *, char *, int, char **, char **)); +#if defined (HANDLE_MULTIBYTE) +static int match_wpattern __P((wchar_t *, char **, size_t, wchar_t *, int, char **, char **)); +#endif +static int match_pattern __P((char *, char *, int, char **, char **)); +static int getpatspec __P((int, char *)); +static char *getpattern __P((char *, int, int)); +static char *variable_remove_pattern __P((char *, char *, int, int)); +static char *list_remove_pattern __P((WORD_LIST *, char *, int, int, int)); +static char *parameter_list_remove_pattern __P((int, char *, int, int)); +#ifdef ARRAY_VARS +static char *array_remove_pattern __P((SHELL_VAR *, char *, int, char *, int)); +#endif +static char *parameter_brace_remove_pattern __P((char *, char *, int, char *, int, int, int)); + +static char *process_substitute __P((char *, int)); + +static char *read_comsub __P((int, int, int *)); + +#ifdef ARRAY_VARS +static arrayind_t array_length_reference __P((char *)); +#endif + +static int valid_brace_expansion_word __P((char *, int)); +static int chk_atstar __P((char *, int, int *, int *)); +static int chk_arithsub __P((const char *, int)); + +static WORD_DESC *parameter_brace_expand_word __P((char *, int, int, int, arrayind_t *)); +static char *parameter_brace_find_indir __P((char *, int, int, int)); +static WORD_DESC *parameter_brace_expand_indir __P((char *, int, int, int *, int *)); +static WORD_DESC *parameter_brace_expand_rhs __P((char *, char *, int, int, int *, int *)); +static void parameter_brace_expand_error __P((char *, char *)); + +static int valid_length_expression __P((char *)); +static intmax_t parameter_brace_expand_length __P((char *)); + +static char *skiparith __P((char *, int)); +static int verify_substring_values __P((SHELL_VAR *, char *, char *, int, intmax_t *, intmax_t *)); +static int get_var_and_type __P((char *, char *, arrayind_t, int, int, SHELL_VAR **, char **)); +static char *mb_substring __P((char *, int, int)); +static char *parameter_brace_substring __P((char *, char *, int, char *, int, int)); + +static int shouldexp_replacement __P((char *)); + +static char *pos_params_pat_subst __P((char *, char *, char *, int)); + +static char *parameter_brace_patsub __P((char *, char *, int, char *, int, int)); + +static char *pos_params_casemod __P((char *, char *, int, int)); +static char *parameter_brace_casemod __P((char *, char *, int, int, char *, int, int)); + +static WORD_DESC *parameter_brace_expand __P((char *, int *, int, int, int *, int *)); +static WORD_DESC *param_expand __P((char *, int *, int, int *, int *, int *, int *, int)); + +static WORD_LIST *expand_word_internal __P((WORD_DESC *, int, int, int *, int *)); + +static WORD_LIST *word_list_split __P((WORD_LIST *)); + +static void exp_jump_to_top_level __P((int)); + +static WORD_LIST *separate_out_assignments __P((WORD_LIST *)); +static WORD_LIST *glob_expand_word_list __P((WORD_LIST *, int)); +#ifdef BRACE_EXPANSION +static WORD_LIST *brace_expand_word_list __P((WORD_LIST *, int)); +#endif +#if defined (ARRAY_VARS) +static int make_internal_declare __P((char *, char *)); +#endif +static WORD_LIST *shell_expand_word_list __P((WORD_LIST *, int)); +static WORD_LIST *expand_word_list_internal __P((WORD_LIST *, int)); + +/* **************************************************************** */ +/* */ +/* Utility Functions */ +/* */ +/* **************************************************************** */ + +#if defined (DEBUG) +void +dump_word_flags (flags) + int flags; +{ + int f; + + f = flags; + fprintf (stderr, "%d -> ", f); + if (f & W_ASSIGNASSOC) + { + f &= ~W_ASSIGNASSOC; + fprintf (stderr, "W_ASSIGNASSOC%s", f ? "|" : ""); + } + if (f & W_ASSIGNARRAY) + { + f &= ~W_ASSIGNARRAY; + fprintf (stderr, "W_ASSIGNARRAY%s", f ? "|" : ""); + } + if (f & W_HASCTLESC) + { + f &= ~W_HASCTLESC; + fprintf (stderr, "W_HASCTLESC%s", f ? "|" : ""); + } + if (f & W_NOPROCSUB) + { + f &= ~W_NOPROCSUB; + fprintf (stderr, "W_NOPROCSUB%s", f ? "|" : ""); + } + if (f & W_DQUOTE) + { + f &= ~W_DQUOTE; + fprintf (stderr, "W_DQUOTE%s", f ? "|" : ""); + } + if (f & W_HASQUOTEDNULL) + { + f &= ~W_HASQUOTEDNULL; + fprintf (stderr, "W_HASQUOTEDNULL%s", f ? "|" : ""); + } + if (f & W_ASSIGNARG) + { + f &= ~W_ASSIGNARG; + fprintf (stderr, "W_ASSIGNARG%s", f ? "|" : ""); + } + if (f & W_ASSNBLTIN) + { + f &= ~W_ASSNBLTIN; + fprintf (stderr, "W_ASSNBLTIN%s", f ? "|" : ""); + } + if (f & W_ASSNGLOBAL) + { + f &= ~W_ASSNGLOBAL; + fprintf (stderr, "W_ASSNGLOBAL%s", f ? "|" : ""); + } + if (f & W_ASSIGNINT) + { + f &= ~W_ASSIGNINT; + fprintf (stderr, "W_ASSIGNINT%s", f ? "|" : ""); + } + if (f & W_COMPASSIGN) + { + f &= ~W_COMPASSIGN; + fprintf (stderr, "W_COMPASSIGN%s", f ? "|" : ""); + } + if (f & W_NOEXPAND) + { + f &= ~W_NOEXPAND; + fprintf (stderr, "W_NOEXPAND%s", f ? "|" : ""); + } + if (f & W_ITILDE) + { + f &= ~W_ITILDE; + fprintf (stderr, "W_ITILDE%s", f ? "|" : ""); + } + if (f & W_NOTILDE) + { + f &= ~W_NOTILDE; + fprintf (stderr, "W_NOTILDE%s", f ? "|" : ""); + } + if (f & W_ASSIGNRHS) + { + f &= ~W_ASSIGNRHS; + fprintf (stderr, "W_ASSIGNRHS%s", f ? "|" : ""); + } + if (f & W_NOCOMSUB) + { + f &= ~W_NOCOMSUB; + fprintf (stderr, "W_NOCOMSUB%s", f ? "|" : ""); + } + if (f & W_DOLLARSTAR) + { + f &= ~W_DOLLARSTAR; + fprintf (stderr, "W_DOLLARSTAR%s", f ? "|" : ""); + } + if (f & W_DOLLARAT) + { + f &= ~W_DOLLARAT; + fprintf (stderr, "W_DOLLARAT%s", f ? "|" : ""); + } + if (f & W_TILDEEXP) + { + f &= ~W_TILDEEXP; + fprintf (stderr, "W_TILDEEXP%s", f ? "|" : ""); + } + if (f & W_NOSPLIT2) + { + f &= ~W_NOSPLIT2; + fprintf (stderr, "W_NOSPLIT2%s", f ? "|" : ""); + } + if (f & W_NOSPLIT) + { + f &= ~W_NOSPLIT; + fprintf (stderr, "W_NOSPLIT%s", f ? "|" : ""); + } + if (f & W_NOBRACE) + { + f &= ~W_NOBRACE; + fprintf (stderr, "W_NOBRACE%s", f ? "|" : ""); + } + if (f & W_NOGLOB) + { + f &= ~W_NOGLOB; + fprintf (stderr, "W_NOGLOB%s", f ? "|" : ""); + } + if (f & W_SPLITSPACE) + { + f &= ~W_SPLITSPACE; + fprintf (stderr, "W_SPLITSPACE%s", f ? "|" : ""); + } + if (f & W_ASSIGNMENT) + { + f &= ~W_ASSIGNMENT; + fprintf (stderr, "W_ASSIGNMENT%s", f ? "|" : ""); + } + if (f & W_QUOTED) + { + f &= ~W_QUOTED; + fprintf (stderr, "W_QUOTED%s", f ? "|" : ""); + } + if (f & W_HASDOLLAR) + { + f &= ~W_HASDOLLAR; + fprintf (stderr, "W_HASDOLLAR%s", f ? "|" : ""); + } + fprintf (stderr, "\n"); + fflush (stderr); +} +#endif + +#ifdef INCLUDE_UNUSED +static char * +quoted_substring (string, start, end) + char *string; + int start, end; +{ + register int len, l; + register char *result, *s, *r; + + len = end - start; + + /* Move to string[start], skipping quoted characters. */ + for (s = string, l = 0; *s && l < start; ) + { + if (*s == CTLESC) + { + s++; + continue; + } + l++; + if (*s == 0) + break; + } + + r = result = (char *)xmalloc (2*len + 1); /* save room for quotes */ + + /* Copy LEN characters, including quote characters. */ + s = string + l; + for (l = 0; l < len; s++) + { + if (*s == CTLESC) + *r++ = *s++; + *r++ = *s; + l++; + if (*s == 0) + break; + } + *r = '\0'; + return result; +} +#endif + +#ifdef INCLUDE_UNUSED +/* Return the length of S, skipping over quoted characters */ +static int +quoted_strlen (s) + char *s; +{ + register char *p; + int i; + + i = 0; + for (p = s; *p; p++) + { + if (*p == CTLESC) + { + p++; + if (*p == 0) + return (i + 1); + } + i++; + } + + return i; +} +#endif + +/* Find the first occurrence of character C in string S, obeying shell + quoting rules. If (FLAGS & ST_BACKSL) is non-zero, backslash-escaped + characters are skipped. If (FLAGS & ST_CTLESC) is non-zero, characters + escaped with CTLESC are skipped. */ +static char * +quoted_strchr (s, c, flags) + char *s; + int c, flags; +{ + register char *p; + + for (p = s; *p; p++) + { + if (((flags & ST_BACKSL) && *p == '\\') + || ((flags & ST_CTLESC) && *p == CTLESC)) + { + p++; + if (*p == '\0') + return ((char *)NULL); + continue; + } + else if (*p == c) + return p; + } + return ((char *)NULL); +} + +/* Return 1 if CHARACTER appears in an unquoted portion of + STRING. Return 0 otherwise. CHARACTER must be a single-byte character. */ +static int +unquoted_member (character, string) + int character; + char *string; +{ + size_t slen; + int sindex, c; + DECLARE_MBSTATE; + + slen = strlen (string); + sindex = 0; + while (c = string[sindex]) + { + if (c == character) + return (1); + + switch (c) + { + default: + ADVANCE_CHAR (string, slen, sindex); + break; + + case '\\': + sindex++; + if (string[sindex]) + ADVANCE_CHAR (string, slen, sindex); + break; + + case '\'': + sindex = skip_single_quoted (string, slen, ++sindex); + break; + + case '"': + sindex = skip_double_quoted (string, slen, ++sindex); + break; + } + } + return (0); +} + +/* Return 1 if SUBSTR appears in an unquoted portion of STRING. */ +static int +unquoted_substring (substr, string) + char *substr, *string; +{ + size_t slen; + int sindex, c, sublen; + DECLARE_MBSTATE; + + if (substr == 0 || *substr == '\0') + return (0); + + slen = strlen (string); + sublen = strlen (substr); + for (sindex = 0; c = string[sindex]; ) + { + if (STREQN (string + sindex, substr, sublen)) + return (1); + + switch (c) + { + case '\\': + sindex++; + if (string[sindex]) + ADVANCE_CHAR (string, slen, sindex); + break; + + case '\'': + sindex = skip_single_quoted (string, slen, ++sindex); + break; + + case '"': + sindex = skip_double_quoted (string, slen, ++sindex); + break; + + default: + ADVANCE_CHAR (string, slen, sindex); + break; + } + } + return (0); +} + +/* Most of the substitutions must be done in parallel. In order + to avoid using tons of unclear goto's, I have some functions + for manipulating malloc'ed strings. They all take INDX, a + pointer to an integer which is the offset into the string + where manipulation is taking place. They also take SIZE, a + pointer to an integer which is the current length of the + character array for this string. */ + +/* Append SOURCE to TARGET at INDEX. SIZE is the current amount + of space allocated to TARGET. SOURCE can be NULL, in which + case nothing happens. Gets rid of SOURCE by freeing it. + Returns TARGET in case the location has changed. */ +INLINE char * +sub_append_string (source, target, indx, size) + char *source, *target; + int *indx, *size; +{ + if (source) + { + int srclen, n; + + srclen = STRLEN (source); + if (srclen >= (int)(*size - *indx)) + { + n = srclen + *indx; + n = (n + DEFAULT_ARRAY_SIZE) - (n % DEFAULT_ARRAY_SIZE); + target = (char *)xrealloc (target, (*size = n)); + } + + FASTCOPY (source, target + *indx, srclen); + *indx += srclen; + target[*indx] = '\0'; + + free (source); + } + return (target); +} + +#if 0 +/* UNUSED */ +/* Append the textual representation of NUMBER to TARGET. + INDX and SIZE are as in SUB_APPEND_STRING. */ +char * +sub_append_number (number, target, indx, size) + intmax_t number; + int *indx, *size; + char *target; +{ + char *temp; + + temp = itos (number); + return (sub_append_string (temp, target, indx, size)); +} +#endif + +/* Extract a substring from STRING, starting at SINDEX and ending with + one of the characters in CHARLIST. Don't make the ending character + part of the string. Leave SINDEX pointing at the ending character. + Understand about backslashes in the string. If (flags & SX_VARNAME) + is non-zero, and array variables have been compiled into the shell, + everything between a `[' and a corresponding `]' is skipped over. + If (flags & SX_NOALLOC) is non-zero, don't return the substring, just + update SINDEX. If (flags & SX_REQMATCH) is non-zero, the string must + contain a closing character from CHARLIST. */ +static char * +string_extract (string, sindex, charlist, flags) + char *string; + int *sindex; + char *charlist; + int flags; +{ + register int c, i; + int found; + size_t slen; + char *temp; + DECLARE_MBSTATE; + + slen = (MB_CUR_MAX > 1) ? strlen (string + *sindex) + *sindex : 0; + i = *sindex; + found = 0; + while (c = string[i]) + { + if (c == '\\') + { + if (string[i + 1]) + i++; + else + break; + } +#if defined (ARRAY_VARS) + else if ((flags & SX_VARNAME) && c == '[') + { + int ni; + /* If this is an array subscript, skip over it and continue. */ + ni = skipsubscript (string, i, 0); + if (string[ni] == ']') + i = ni; + } +#endif + else if (MEMBER (c, charlist)) + { + found = 1; + break; + } + + ADVANCE_CHAR (string, slen, i); + } + + /* If we had to have a matching delimiter and didn't find one, return an + error and let the caller deal with it. */ + if ((flags & SX_REQMATCH) && found == 0) + { + *sindex = i; + return (&extract_string_error); + } + + temp = (flags & SX_NOALLOC) ? (char *)NULL : substring (string, *sindex, i); + *sindex = i; + + return (temp); +} + +/* Extract the contents of STRING as if it is enclosed in double quotes. + SINDEX, when passed in, is the offset of the character immediately + following the opening double quote; on exit, SINDEX is left pointing after + the closing double quote. If STRIPDQ is non-zero, unquoted double + quotes are stripped and the string is terminated by a null byte. + Backslashes between the embedded double quotes are processed. If STRIPDQ + is zero, an unquoted `"' terminates the string. */ +static char * +string_extract_double_quoted (string, sindex, stripdq) + char *string; + int *sindex, stripdq; +{ + size_t slen; + char *send; + int j, i, t; + unsigned char c; + char *temp, *ret; /* The new string we return. */ + int pass_next, backquote, si; /* State variables for the machine. */ + int dquote; + DECLARE_MBSTATE; + + slen = strlen (string + *sindex) + *sindex; + send = string + slen; + + pass_next = backquote = dquote = 0; + temp = (char *)xmalloc (1 + slen - *sindex); + + j = 0; + i = *sindex; + while (c = string[i]) + { + /* Process a character that was quoted by a backslash. */ + if (pass_next) + { + /* XXX - take another look at this in light of Interp 221 */ + /* Posix.2 sez: + + ``The backslash shall retain its special meaning as an escape + character only when followed by one of the characters: + $ ` " \ ''. + + If STRIPDQ is zero, we handle the double quotes here and let + expand_word_internal handle the rest. If STRIPDQ is non-zero, + we have already been through one round of backslash stripping, + and want to strip these backslashes only if DQUOTE is non-zero, + indicating that we are inside an embedded double-quoted string. */ + + /* If we are in an embedded quoted string, then don't strip + backslashes before characters for which the backslash + retains its special meaning, but remove backslashes in + front of other characters. If we are not in an + embedded quoted string, don't strip backslashes at all. + This mess is necessary because the string was already + surrounded by double quotes (and sh has some really weird + quoting rules). + The returned string will be run through expansion as if + it were double-quoted. */ + if ((stripdq == 0 && c != '"') || + (stripdq && ((dquote && (sh_syntaxtab[c] & CBSDQUOTE)) || dquote == 0))) + temp[j++] = '\\'; + pass_next = 0; + +add_one_character: + COPY_CHAR_I (temp, j, string, send, i); + continue; + } + + /* A backslash protects the next character. The code just above + handles preserving the backslash in front of any character but + a double quote. */ + if (c == '\\') + { + pass_next++; + i++; + continue; + } + + /* Inside backquotes, ``the portion of the quoted string from the + initial backquote and the characters up to the next backquote + that is not preceded by a backslash, having escape characters + removed, defines that command''. */ + if (backquote) + { + if (c == '`') + backquote = 0; + temp[j++] = c; + i++; + continue; + } + + if (c == '`') + { + temp[j++] = c; + backquote++; + i++; + continue; + } + + /* Pass everything between `$(' and the matching `)' or a quoted + ${ ... } pair through according to the Posix.2 specification. */ + if (c == '$' && ((string[i + 1] == LPAREN) || (string[i + 1] == LBRACE))) + { + int free_ret = 1; + + si = i + 2; + if (string[i + 1] == LPAREN) + ret = extract_command_subst (string, &si, 0); + else + ret = extract_dollar_brace_string (string, &si, Q_DOUBLE_QUOTES, 0); + + temp[j++] = '$'; + temp[j++] = string[i + 1]; + + /* Just paranoia; ret will not be 0 unless no_longjmp_on_fatal_error + is set. */ + if (ret == 0 && no_longjmp_on_fatal_error) + { + free_ret = 0; + ret = string + i + 2; + } + + for (t = 0; ret[t]; t++, j++) + temp[j] = ret[t]; + temp[j] = string[si]; + + if (string[si]) + { + j++; + i = si + 1; + } + else + i = si; + + if (free_ret) + free (ret); + continue; + } + + /* Add any character but a double quote to the quoted string we're + accumulating. */ + if (c != '"') + goto add_one_character; + + /* c == '"' */ + if (stripdq) + { + dquote ^= 1; + i++; + continue; + } + + break; + } + temp[j] = '\0'; + + /* Point to after the closing quote. */ + if (c) + i++; + *sindex = i; + + return (temp); +} + +/* This should really be another option to string_extract_double_quoted. */ +static int +skip_double_quoted (string, slen, sind) + char *string; + size_t slen; + int sind; +{ + int c, i; + char *ret; + int pass_next, backquote, si; + DECLARE_MBSTATE; + + pass_next = backquote = 0; + i = sind; + while (c = string[i]) + { + if (pass_next) + { + pass_next = 0; + ADVANCE_CHAR (string, slen, i); + continue; + } + else if (c == '\\') + { + pass_next++; + i++; + continue; + } + else if (backquote) + { + if (c == '`') + backquote = 0; + ADVANCE_CHAR (string, slen, i); + continue; + } + else if (c == '`') + { + backquote++; + i++; + continue; + } + else if (c == '$' && ((string[i + 1] == LPAREN) || (string[i + 1] == LBRACE))) + { + si = i + 2; + if (string[i + 1] == LPAREN) + ret = extract_command_subst (string, &si, SX_NOALLOC); + else + ret = extract_dollar_brace_string (string, &si, Q_DOUBLE_QUOTES, SX_NOALLOC); + + i = si + 1; + continue; + } + else if (c != '"') + { + ADVANCE_CHAR (string, slen, i); + continue; + } + else + break; + } + + if (c) + i++; + + return (i); +} + +/* Extract the contents of STRING as if it is enclosed in single quotes. + SINDEX, when passed in, is the offset of the character immediately + following the opening single quote; on exit, SINDEX is left pointing after + the closing single quote. */ +static inline char * +string_extract_single_quoted (string, sindex) + char *string; + int *sindex; +{ + register int i; + size_t slen; + char *t; + DECLARE_MBSTATE; + + /* Don't need slen for ADVANCE_CHAR unless multibyte chars possible. */ + slen = (MB_CUR_MAX > 1) ? strlen (string + *sindex) + *sindex : 0; + i = *sindex; + while (string[i] && string[i] != '\'') + ADVANCE_CHAR (string, slen, i); + + t = substring (string, *sindex, i); + + if (string[i]) + i++; + *sindex = i; + + return (t); +} + +static inline int +skip_single_quoted (string, slen, sind) + const char *string; + size_t slen; + int sind; +{ + register int c; + DECLARE_MBSTATE; + + c = sind; + while (string[c] && string[c] != '\'') + ADVANCE_CHAR (string, slen, c); + + if (string[c]) + c++; + return c; +} + +/* Just like string_extract, but doesn't hack backslashes or any of + that other stuff. Obeys CTLESC quoting. Used to do splitting on $IFS. */ +static char * +string_extract_verbatim (string, slen, sindex, charlist, flags) + char *string; + size_t slen; + int *sindex; + char *charlist; + int flags; +{ + register int i; +#if defined (HANDLE_MULTIBYTE) + size_t clen; + wchar_t *wcharlist; +#endif + int c; + char *temp; + DECLARE_MBSTATE; + + if (charlist[0] == '\'' && charlist[1] == '\0') + { + temp = string_extract_single_quoted (string, sindex); + --*sindex; /* leave *sindex at separator character */ + return temp; + } + + i = *sindex; +#if 0 + /* See how the MBLEN and ADVANCE_CHAR macros work to understand why we need + this only if MB_CUR_MAX > 1. */ + slen = (MB_CUR_MAX > 1) ? strlen (string + *sindex) + *sindex : 1; +#endif +#if defined (HANDLE_MULTIBYTE) + clen = strlen (charlist); + wcharlist = 0; +#endif + while (c = string[i]) + { +#if defined (HANDLE_MULTIBYTE) + size_t mblength; +#endif + if ((flags & SX_NOCTLESC) == 0 && c == CTLESC) + { + i += 2; + continue; + } + /* Even if flags contains SX_NOCTLESC, we let CTLESC quoting CTLNUL + through, to protect the CTLNULs from later calls to + remove_quoted_nulls. */ + else if ((flags & SX_NOESCCTLNUL) == 0 && c == CTLESC && string[i+1] == CTLNUL) + { + i += 2; + continue; + } + +#if defined (HANDLE_MULTIBYTE) + mblength = MBLEN (string + i, slen - i); + if (mblength > 1) + { + wchar_t wc; + mblength = mbtowc (&wc, string + i, slen - i); + if (MB_INVALIDCH (mblength)) + { + if (MEMBER (c, charlist)) + break; + } + else + { + if (wcharlist == 0) + { + size_t len; + len = mbstowcs (wcharlist, charlist, 0); + if (len == -1) + len = 0; + wcharlist = (wchar_t *)xmalloc (sizeof (wchar_t) * (len + 1)); + mbstowcs (wcharlist, charlist, len + 1); + } + + if (wcschr (wcharlist, wc)) + break; + } + } + else +#endif + if (MEMBER (c, charlist)) + break; + + ADVANCE_CHAR (string, slen, i); + } + +#if defined (HANDLE_MULTIBYTE) + FREE (wcharlist); +#endif + + temp = substring (string, *sindex, i); + *sindex = i; + + return (temp); +} + +/* Extract the $( construct in STRING, and return a new string. + Start extracting at (SINDEX) as if we had just seen "$(". + Make (SINDEX) get the position of the matching ")". ) + XFLAGS is additional flags to pass to other extraction functions. */ +char * +extract_command_subst (string, sindex, xflags) + char *string; + int *sindex; + int xflags; +{ + if (string[*sindex] == LPAREN) + return (extract_delimited_string (string, sindex, "$(", "(", ")", xflags|SX_COMMAND)); /*)*/ + else + { + xflags |= (no_longjmp_on_fatal_error ? SX_NOLONGJMP : 0); + return (xparse_dolparen (string, string+*sindex, sindex, xflags)); + } +} + +/* Extract the $[ construct in STRING, and return a new string. (]) + Start extracting at (SINDEX) as if we had just seen "$[". + Make (SINDEX) get the position of the matching "]". */ +char * +extract_arithmetic_subst (string, sindex) + char *string; + int *sindex; +{ + return (extract_delimited_string (string, sindex, "$[", "[", "]", 0)); /*]*/ +} + +#if defined (PROCESS_SUBSTITUTION) +/* Extract the <( or >( construct in STRING, and return a new string. + Start extracting at (SINDEX) as if we had just seen "<(". + Make (SINDEX) get the position of the matching ")". */ /*))*/ +char * +extract_process_subst (string, starter, sindex) + char *string; + char *starter; + int *sindex; +{ + return (extract_delimited_string (string, sindex, starter, "(", ")", SX_COMMAND)); +} +#endif /* PROCESS_SUBSTITUTION */ + +#if defined (ARRAY_VARS) +/* This can be fooled by unquoted right parens in the passed string. If + each caller verifies that the last character in STRING is a right paren, + we don't even need to call extract_delimited_string. */ +char * +extract_array_assignment_list (string, sindex) + char *string; + int *sindex; +{ + int slen; + char *ret; + + slen = strlen (string); /* ( */ + if (string[slen - 1] == ')') + { + ret = substring (string, *sindex, slen - 1); + *sindex = slen - 1; + return ret; + } + return 0; +} +#endif + +/* Extract and create a new string from the contents of STRING, a + character string delimited with OPENER and CLOSER. SINDEX is + the address of an int describing the current offset in STRING; + it should point to just after the first OPENER found. On exit, + SINDEX gets the position of the last character of the matching CLOSER. + If OPENER is more than a single character, ALT_OPENER, if non-null, + contains a character string that can also match CLOSER and thus + needs to be skipped. */ +static char * +extract_delimited_string (string, sindex, opener, alt_opener, closer, flags) + char *string; + int *sindex; + char *opener, *alt_opener, *closer; + int flags; +{ + int i, c, si; + size_t slen; + char *t, *result; + int pass_character, nesting_level, in_comment; + int len_closer, len_opener, len_alt_opener; + DECLARE_MBSTATE; + + slen = strlen (string + *sindex) + *sindex; + len_opener = STRLEN (opener); + len_alt_opener = STRLEN (alt_opener); + len_closer = STRLEN (closer); + + pass_character = in_comment = 0; + + nesting_level = 1; + i = *sindex; + + while (nesting_level) + { + c = string[i]; + + if (c == 0) + break; + + if (in_comment) + { + if (c == '\n') + in_comment = 0; + ADVANCE_CHAR (string, slen, i); + continue; + } + + if (pass_character) /* previous char was backslash */ + { + pass_character = 0; + ADVANCE_CHAR (string, slen, i); + continue; + } + + /* Not exactly right yet; should handle shell metacharacters and + multibyte characters, too. See COMMENT_BEGIN define in parse.y */ + if ((flags & SX_COMMAND) && c == '#' && (i == 0 || string[i - 1] == '\n' || shellblank (string[i - 1]))) + { + in_comment = 1; + ADVANCE_CHAR (string, slen, i); + continue; + } + + if (c == CTLESC || c == '\\') + { + pass_character++; + i++; + continue; + } + + /* Process a nested command substitution, but only if we're parsing an + arithmetic substitution. */ + if ((flags & SX_COMMAND) && string[i] == '$' && string[i+1] == LPAREN) + { + si = i + 2; + t = extract_command_subst (string, &si, flags|SX_NOALLOC); + i = si + 1; + continue; + } + + /* Process a nested OPENER. */ + if (STREQN (string + i, opener, len_opener)) + { + si = i + len_opener; + t = extract_delimited_string (string, &si, opener, alt_opener, closer, flags|SX_NOALLOC); + i = si + 1; + continue; + } + + /* Process a nested ALT_OPENER */ + if (len_alt_opener && STREQN (string + i, alt_opener, len_alt_opener)) + { + si = i + len_alt_opener; + t = extract_delimited_string (string, &si, alt_opener, alt_opener, closer, flags|SX_NOALLOC); + i = si + 1; + continue; + } + + /* If the current substring terminates the delimited string, decrement + the nesting level. */ + if (STREQN (string + i, closer, len_closer)) + { + i += len_closer - 1; /* move to last byte of the closer */ + nesting_level--; + if (nesting_level == 0) + break; + } + + /* Pass old-style command substitution through verbatim. */ + if (c == '`') + { + si = i + 1; + t = string_extract (string, &si, "`", flags|SX_NOALLOC); + i = si + 1; + continue; + } + + /* Pass single-quoted and double-quoted strings through verbatim. */ + if (c == '\'' || c == '"') + { + si = i + 1; + i = (c == '\'') ? skip_single_quoted (string, slen, si) + : skip_double_quoted (string, slen, si); + continue; + } + + /* move past this character, which was not special. */ + ADVANCE_CHAR (string, slen, i); + } + + if (c == 0 && nesting_level) + { + if (no_longjmp_on_fatal_error == 0) + { + last_command_exit_value = EXECUTION_FAILURE; + report_error (_("bad substitution: no closing `%s' in %s"), closer, string); + exp_jump_to_top_level (DISCARD); + } + else + { + *sindex = i; + return (char *)NULL; + } + } + + si = i - *sindex - len_closer + 1; + if (flags & SX_NOALLOC) + result = (char *)NULL; + else + { + result = (char *)xmalloc (1 + si); + strncpy (result, string + *sindex, si); + result[si] = '\0'; + } + *sindex = i; + + return (result); +} + +/* Extract a parameter expansion expression within ${ and } from STRING. + Obey the Posix.2 rules for finding the ending `}': count braces while + skipping over enclosed quoted strings and command substitutions. + SINDEX is the address of an int describing the current offset in STRING; + it should point to just after the first `{' found. On exit, SINDEX + gets the position of the matching `}'. QUOTED is non-zero if this + occurs inside double quotes. */ +/* XXX -- this is very similar to extract_delimited_string -- XXX */ +static char * +extract_dollar_brace_string (string, sindex, quoted, flags) + char *string; + int *sindex, quoted, flags; +{ + register int i, c; + size_t slen; + int pass_character, nesting_level, si, dolbrace_state; + char *result, *t; + DECLARE_MBSTATE; + + pass_character = 0; + nesting_level = 1; + slen = strlen (string + *sindex) + *sindex; + + /* The handling of dolbrace_state needs to agree with the code in parse.y: + parse_matched_pair(). The different initial value is to handle the + case where this function is called to parse the word in + ${param op word} (SX_WORD). */ + dolbrace_state = (flags & SX_WORD) ? DOLBRACE_WORD : DOLBRACE_PARAM; + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && (flags & SX_POSIXEXP)) + dolbrace_state = DOLBRACE_QUOTE; + + i = *sindex; + while (c = string[i]) + { + if (pass_character) + { + pass_character = 0; + ADVANCE_CHAR (string, slen, i); + continue; + } + + /* CTLESCs and backslashes quote the next character. */ + if (c == CTLESC || c == '\\') + { + pass_character++; + i++; + continue; + } + + if (string[i] == '$' && string[i+1] == LBRACE) + { + nesting_level++; + i += 2; + continue; + } + + if (c == RBRACE) + { + nesting_level--; + if (nesting_level == 0) + break; + i++; + continue; + } + + /* Pass the contents of old-style command substitutions through + verbatim. */ + if (c == '`') + { + si = i + 1; + t = string_extract (string, &si, "`", flags|SX_NOALLOC); + i = si + 1; + continue; + } + + /* Pass the contents of new-style command substitutions and + arithmetic substitutions through verbatim. */ + if (string[i] == '$' && string[i+1] == LPAREN) + { + si = i + 2; + t = extract_command_subst (string, &si, flags|SX_NOALLOC); + i = si + 1; + continue; + } + + /* Pass the contents of double-quoted strings through verbatim. */ + if (c == '"') + { + si = i + 1; + i = skip_double_quoted (string, slen, si); + /* skip_XXX_quoted leaves index one past close quote */ + continue; + } + + if (c == '\'') + { +/*itrace("extract_dollar_brace_string: c == single quote flags = %d quoted = %d dolbrace_state = %d", flags, quoted, dolbrace_state);*/ + if (posixly_correct && shell_compatibility_level > 42 && dolbrace_state != DOLBRACE_QUOTE && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))) + ADVANCE_CHAR (string, slen, i); + else + { + si = i + 1; + i = skip_single_quoted (string, slen, si); + } + + continue; + } + + /* move past this character, which was not special. */ + ADVANCE_CHAR (string, slen, i); + + /* This logic must agree with parse.y:parse_matched_pair, since they + share the same defines. */ + if (dolbrace_state == DOLBRACE_PARAM && c == '%' && (i - *sindex) > 1) + dolbrace_state = DOLBRACE_QUOTE; + else if (dolbrace_state == DOLBRACE_PARAM && c == '#' && (i - *sindex) > 1) + dolbrace_state = DOLBRACE_QUOTE; + else if (dolbrace_state == DOLBRACE_PARAM && c == '/' && (i - *sindex) > 1) + dolbrace_state = DOLBRACE_QUOTE2; /* XXX */ + else if (dolbrace_state == DOLBRACE_PARAM && c == '^' && (i - *sindex) > 1) + dolbrace_state = DOLBRACE_QUOTE; + else if (dolbrace_state == DOLBRACE_PARAM && c == ',' && (i - *sindex) > 1) + dolbrace_state = DOLBRACE_QUOTE; + else if (dolbrace_state == DOLBRACE_PARAM && strchr ("#%^,~:-=?+/", c) != 0) + dolbrace_state = DOLBRACE_OP; + else if (dolbrace_state == DOLBRACE_OP && strchr ("#%^,~:-=?+/", c) == 0) + dolbrace_state = DOLBRACE_WORD; + } + + if (c == 0 && nesting_level) + { + if (no_longjmp_on_fatal_error == 0) + { /* { */ + last_command_exit_value = EXECUTION_FAILURE; + report_error (_("bad substitution: no closing `%s' in %s"), "}", string); + exp_jump_to_top_level (DISCARD); + } + else + { + *sindex = i; + return ((char *)NULL); + } + } + + result = (flags & SX_NOALLOC) ? (char *)NULL : substring (string, *sindex, i); + *sindex = i; + + return (result); +} + +/* Remove backslashes which are quoting backquotes from STRING. Modifies + STRING, and returns a pointer to it. */ +char * +de_backslash (string) + char *string; +{ + register size_t slen; + register int i, j, prev_i; + DECLARE_MBSTATE; + + slen = strlen (string); + i = j = 0; + + /* Loop copying string[i] to string[j], i >= j. */ + while (i < slen) + { + if (string[i] == '\\' && (string[i + 1] == '`' || string[i + 1] == '\\' || + string[i + 1] == '$')) + i++; + prev_i = i; + ADVANCE_CHAR (string, slen, i); + if (j < prev_i) + do string[j++] = string[prev_i++]; while (prev_i < i); + else + j = i; + } + string[j] = '\0'; + + return (string); +} + +#if 0 +/*UNUSED*/ +/* Replace instances of \! in a string with !. */ +void +unquote_bang (string) + char *string; +{ + register int i, j; + register char *temp; + + temp = (char *)xmalloc (1 + strlen (string)); + + for (i = 0, j = 0; (temp[j] = string[i]); i++, j++) + { + if (string[i] == '\\' && string[i + 1] == '!') + { + temp[j] = '!'; + i++; + } + } + strcpy (string, temp); + free (temp); +} +#endif + +#define CQ_RETURN(x) do { no_longjmp_on_fatal_error = 0; return (x); } while (0) + +/* This function assumes s[i] == open; returns with s[ret] == close; used to + parse array subscripts. FLAGS & 1 means to not attempt to skip over + matched pairs of quotes or backquotes, or skip word expansions; it is + intended to be used after expansion has been performed and during final + assignment parsing (see arrayfunc.c:assign_compound_array_list()). */ +static int +skip_matched_pair (string, start, open, close, flags) + const char *string; + int start, open, close, flags; +{ + int i, pass_next, backq, si, c, count; + size_t slen; + char *temp, *ss; + DECLARE_MBSTATE; + + slen = strlen (string + start) + start; + no_longjmp_on_fatal_error = 1; + + i = start + 1; /* skip over leading bracket */ + count = 1; + pass_next = backq = 0; + ss = (char *)string; + while (c = string[i]) + { + if (pass_next) + { + pass_next = 0; + if (c == 0) + CQ_RETURN(i); + ADVANCE_CHAR (string, slen, i); + continue; + } + else if (c == '\\') + { + pass_next = 1; + i++; + continue; + } + else if (backq) + { + if (c == '`') + backq = 0; + ADVANCE_CHAR (string, slen, i); + continue; + } + else if ((flags & 1) == 0 && c == '`') + { + backq = 1; + i++; + continue; + } + else if ((flags & 1) == 0 && c == open) + { + count++; + i++; + continue; + } + else if (c == close) + { + count--; + if (count == 0) + break; + i++; + continue; + } + else if ((flags & 1) == 0 && (c == '\'' || c == '"')) + { + i = (c == '\'') ? skip_single_quoted (ss, slen, ++i) + : skip_double_quoted (ss, slen, ++i); + /* no increment, the skip functions increment past the closing quote. */ + } + else if ((flags&1) == 0 && c == '$' && (string[i+1] == LPAREN || string[i+1] == LBRACE)) + { + si = i + 2; + if (string[si] == '\0') + CQ_RETURN(si); + + if (string[i+1] == LPAREN) + temp = extract_delimited_string (ss, &si, "$(", "(", ")", SX_NOALLOC|SX_COMMAND); /* ) */ + else + temp = extract_dollar_brace_string (ss, &si, 0, SX_NOALLOC); + i = si; + if (string[i] == '\0') /* don't increment i past EOS in loop */ + break; + i++; + continue; + } + else + ADVANCE_CHAR (string, slen, i); + } + + CQ_RETURN(i); +} + +#if defined (ARRAY_VARS) +int +skipsubscript (string, start, flags) + const char *string; + int start, flags; +{ + return (skip_matched_pair (string, start, '[', ']', flags)); +} +#endif + +/* Skip characters in STRING until we find a character in DELIMS, and return + the index of that character. START is the index into string at which we + begin. This is similar in spirit to strpbrk, but it returns an index into + STRING and takes a starting index. This little piece of code knows quite + a lot of shell syntax. It's very similar to skip_double_quoted and other + functions of that ilk. */ +int +skip_to_delim (string, start, delims, flags) + char *string; + int start; + char *delims; + int flags; +{ + int i, pass_next, backq, si, c, invert, skipquote, skipcmd; + size_t slen; + char *temp, open[3]; + DECLARE_MBSTATE; + + slen = strlen (string + start) + start; + if (flags & SD_NOJMP) + no_longjmp_on_fatal_error = 1; + invert = (flags & SD_INVERT); + skipcmd = (flags & SD_NOSKIPCMD) == 0; + + i = start; + pass_next = backq = 0; + while (c = string[i]) + { + /* If this is non-zero, we should not let quote characters be delimiters + and the current character is a single or double quote. We should not + test whether or not it's a delimiter until after we skip single- or + double-quoted strings. */ + skipquote = ((flags & SD_NOQUOTEDELIM) && (c == '\'' || c =='"')); + if (pass_next) + { + pass_next = 0; + if (c == 0) + CQ_RETURN(i); + ADVANCE_CHAR (string, slen, i); + continue; + } + else if (c == '\\') + { + pass_next = 1; + i++; + continue; + } + else if (backq) + { + if (c == '`') + backq = 0; + ADVANCE_CHAR (string, slen, i); + continue; + } + else if (c == '`') + { + backq = 1; + i++; + continue; + } + else if (skipquote == 0 && invert == 0 && member (c, delims)) + break; + else if (c == '\'' || c == '"') + { + i = (c == '\'') ? skip_single_quoted (string, slen, ++i) + : skip_double_quoted (string, slen, ++i); + /* no increment, the skip functions increment past the closing quote. */ + } + else if (c == '$' && ((skipcmd && string[i+1] == LPAREN) || string[i+1] == LBRACE)) + { + si = i + 2; + if (string[si] == '\0') + CQ_RETURN(si); + + if (string[i+1] == LPAREN) + temp = extract_delimited_string (string, &si, "$(", "(", ")", SX_NOALLOC|SX_COMMAND); /* ) */ + else + temp = extract_dollar_brace_string (string, &si, 0, SX_NOALLOC); + i = si; + if (string[i] == '\0') /* don't increment i past EOS in loop */ + break; + i++; + continue; + } +#if defined (PROCESS_SUBSTITUTION) + else if (skipcmd && (c == '<' || c == '>') && string[i+1] == LPAREN) + { + si = i + 2; + if (string[si] == '\0') + CQ_RETURN(si); + temp = extract_process_subst (string, (c == '<') ? "<(" : ">(", &si); + free (temp); /* no SX_ALLOC here */ + i = si; + if (string[i] == '\0') + break; + i++; + continue; + } +#endif /* PROCESS_SUBSTITUTION */ +#if defined (EXTENDED_GLOB) + else if ((flags & SD_EXTGLOB) && extended_glob && string[i+1] == LPAREN && member (c, "?*+!@")) + { + si = i + 2; + if (string[si] == '\0') + CQ_RETURN(si); + + open[0] = c; + open[1] = LPAREN; + open[2] = '\0'; + temp = extract_delimited_string (string, &si, open, "(", ")", SX_NOALLOC); /* ) */ + + i = si; + if (string[i] == '\0') /* don't increment i past EOS in loop */ + break; + i++; + continue; + } +#endif + else if ((skipquote || invert) && (member (c, delims) == 0)) + break; + else + ADVANCE_CHAR (string, slen, i); + } + + CQ_RETURN(i); +} + +#if defined (READLINE) +/* Return 1 if the portion of STRING ending at EINDEX is quoted (there is + an unclosed quoted string), or if the character at EINDEX is quoted + by a backslash. NO_LONGJMP_ON_FATAL_ERROR is used to flag that the various + single and double-quoted string parsing functions should not return an + error if there are unclosed quotes or braces. The characters that this + recognizes need to be the same as the contents of + rl_completer_quote_characters. */ + +int +char_is_quoted (string, eindex) + char *string; + int eindex; +{ + int i, pass_next, c; + size_t slen; + DECLARE_MBSTATE; + + slen = strlen (string); + no_longjmp_on_fatal_error = 1; + i = pass_next = 0; + while (i <= eindex) + { + c = string[i]; + + if (pass_next) + { + pass_next = 0; + if (i >= eindex) /* XXX was if (i >= eindex - 1) */ + CQ_RETURN(1); + ADVANCE_CHAR (string, slen, i); + continue; + } + else if (c == '\\') + { + pass_next = 1; + i++; + continue; + } + else if (c == '\'' || c == '"') + { + i = (c == '\'') ? skip_single_quoted (string, slen, ++i) + : skip_double_quoted (string, slen, ++i); + if (i > eindex) + CQ_RETURN(1); + /* no increment, the skip_xxx functions go one past end */ + } + else + ADVANCE_CHAR (string, slen, i); + } + + CQ_RETURN(0); +} + +int +unclosed_pair (string, eindex, openstr) + char *string; + int eindex; + char *openstr; +{ + int i, pass_next, openc, olen; + size_t slen; + DECLARE_MBSTATE; + + slen = strlen (string); + olen = strlen (openstr); + i = pass_next = openc = 0; + while (i <= eindex) + { + if (pass_next) + { + pass_next = 0; + if (i >= eindex) /* XXX was if (i >= eindex - 1) */ + return 0; + ADVANCE_CHAR (string, slen, i); + continue; + } + else if (string[i] == '\\') + { + pass_next = 1; + i++; + continue; + } + else if (STREQN (string + i, openstr, olen)) + { + openc = 1 - openc; + i += olen; + } + else if (string[i] == '\'' || string[i] == '"') + { + i = (string[i] == '\'') ? skip_single_quoted (string, slen, i) + : skip_double_quoted (string, slen, i); + if (i > eindex) + return 0; + } + else + ADVANCE_CHAR (string, slen, i); + } + return (openc); +} + +/* Split STRING (length SLEN) at DELIMS, and return a WORD_LIST with the + individual words. If DELIMS is NULL, the current value of $IFS is used + to split the string, and the function follows the shell field splitting + rules. SENTINEL is an index to look for. NWP, if non-NULL, + gets the number of words in the returned list. CWP, if non-NULL, gets + the index of the word containing SENTINEL. Non-whitespace chars in + DELIMS delimit separate fields. */ +WORD_LIST * +split_at_delims (string, slen, delims, sentinel, flags, nwp, cwp) + char *string; + int slen; + char *delims; + int sentinel, flags; + int *nwp, *cwp; +{ + int ts, te, i, nw, cw, ifs_split, dflags; + char *token, *d, *d2; + WORD_LIST *ret, *tl; + + if (string == 0 || *string == '\0') + { + if (nwp) + *nwp = 0; + if (cwp) + *cwp = 0; + return ((WORD_LIST *)NULL); + } + + d = (delims == 0) ? ifs_value : delims; + ifs_split = delims == 0; + + /* Make d2 the non-whitespace characters in delims */ + d2 = 0; + if (delims) + { + size_t slength; +#if defined (HANDLE_MULTIBYTE) + size_t mblength = 1; +#endif + DECLARE_MBSTATE; + + slength = strlen (delims); + d2 = (char *)xmalloc (slength + 1); + i = ts = 0; + while (delims[i]) + { +#if defined (HANDLE_MULTIBYTE) + mbstate_t state_bak; + state_bak = state; + mblength = MBRLEN (delims + i, slength, &state); + if (MB_INVALIDCH (mblength)) + state = state_bak; + else if (mblength > 1) + { + memcpy (d2 + ts, delims + i, mblength); + ts += mblength; + i += mblength; + slength -= mblength; + continue; + } +#endif + if (whitespace (delims[i]) == 0) + d2[ts++] = delims[i]; + + i++; + slength--; + } + d2[ts] = '\0'; + } + + ret = (WORD_LIST *)NULL; + + /* Remove sequences of whitespace characters at the start of the string, as + long as those characters are delimiters. */ + for (i = 0; member (string[i], d) && spctabnl (string[i]); i++) + ; + if (string[i] == '\0') + return (ret); + + ts = i; + nw = 0; + cw = -1; + dflags = flags|SD_NOJMP; + while (1) + { + te = skip_to_delim (string, ts, d, dflags); + + /* If we have a non-whitespace delimiter character, use it to make a + separate field. This is just about what $IFS splitting does and + is closer to the behavior of the shell parser. */ + if (ts == te && d2 && member (string[ts], d2)) + { + te = ts + 1; + /* If we're using IFS splitting, the non-whitespace delimiter char + and any additional IFS whitespace delimits a field. */ + if (ifs_split) + while (member (string[te], d) && spctabnl (string[te])) + te++; + else + while (member (string[te], d2)) + te++; + } + + token = substring (string, ts, te); + + ret = add_string_to_list (token, ret); + free (token); + nw++; + + if (sentinel >= ts && sentinel <= te) + cw = nw; + + /* If the cursor is at whitespace just before word start, set the + sentinel word to the current word. */ + if (cwp && cw == -1 && sentinel == ts-1) + cw = nw; + + /* If the cursor is at whitespace between two words, make a new, empty + word, add it before (well, after, since the list is in reverse order) + the word we just added, and set the current word to that one. */ + if (cwp && cw == -1 && sentinel < ts) + { + tl = make_word_list (make_word (""), ret->next); + ret->next = tl; + cw = nw; + nw++; + } + + if (string[te] == 0) + break; + + i = te; + while (member (string[i], d) && (ifs_split || spctabnl(string[i]))) + i++; + + if (string[i]) + ts = i; + else + break; + } + + /* Special case for SENTINEL at the end of STRING. If we haven't found + the word containing SENTINEL yet, and the index we're looking for is at + the end of STRING (or past the end of the previously-found token, + possible if the end of the line is composed solely of IFS whitespace) + add an additional null argument and set the current word pointer to that. */ + if (cwp && cw == -1 && (sentinel >= slen || sentinel >= te)) + { + if (whitespace (string[sentinel - 1])) + { + token = ""; + ret = add_string_to_list (token, ret); + nw++; + } + cw = nw; + } + + if (nwp) + *nwp = nw; + if (cwp) + *cwp = cw; + + FREE (d2); + + return (REVERSE_LIST (ret, WORD_LIST *)); +} +#endif /* READLINE */ + +#if 0 +/* UNUSED */ +/* Extract the name of the variable to bind to from the assignment string. */ +char * +assignment_name (string) + char *string; +{ + int offset; + char *temp; + + offset = assignment (string, 0); + if (offset == 0) + return (char *)NULL; + temp = substring (string, 0, offset); + return (temp); +} +#endif + +/* **************************************************************** */ +/* */ +/* Functions to convert strings to WORD_LISTs and vice versa */ +/* */ +/* **************************************************************** */ + +/* Return a single string of all the words in LIST. SEP is the separator + to put between individual elements of LIST in the output string. */ +char * +string_list_internal (list, sep) + WORD_LIST *list; + char *sep; +{ + register WORD_LIST *t; + char *result, *r; + int word_len, sep_len, result_size; + + if (list == 0) + return ((char *)NULL); + + /* Short-circuit quickly if we don't need to separate anything. */ + if (list->next == 0) + return (savestring (list->word->word)); + + /* This is nearly always called with either sep[0] == 0 or sep[1] == 0. */ + sep_len = STRLEN (sep); + result_size = 0; + + for (t = list; t; t = t->next) + { + if (t != list) + result_size += sep_len; + result_size += strlen (t->word->word); + } + + r = result = (char *)xmalloc (result_size + 1); + + for (t = list; t; t = t->next) + { + if (t != list && sep_len) + { + if (sep_len > 1) + { + FASTCOPY (sep, r, sep_len); + r += sep_len; + } + else + *r++ = sep[0]; + } + + word_len = strlen (t->word->word); + FASTCOPY (t->word->word, r, word_len); + r += word_len; + } + + *r = '\0'; + return (result); +} + +/* Return a single string of all the words present in LIST, separating + each word with a space. */ +char * +string_list (list) + WORD_LIST *list; +{ + return (string_list_internal (list, " ")); +} + +/* An external interface that can be used by the rest of the shell to + obtain a string containing the first character in $IFS. Handles all + the multibyte complications. If LENP is non-null, it is set to the + length of the returned string. */ +char * +ifs_firstchar (lenp) + int *lenp; +{ + char *ret; + int len; + + ret = xmalloc (MB_LEN_MAX + 1); +#if defined (HANDLE_MULTIBYTE) + if (ifs_firstc_len == 1) + { + ret[0] = ifs_firstc[0]; + ret[1] = '\0'; + len = ret[0] ? 1 : 0; + } + else + { + memcpy (ret, ifs_firstc, ifs_firstc_len); + ret[len = ifs_firstc_len] = '\0'; + } +#else + ret[0] = ifs_firstc; + ret[1] = '\0'; + len = ret[0] ? 0 : 1; +#endif + + if (lenp) + *lenp = len; + + return ret; +} + +/* Return a single string of all the words present in LIST, obeying the + quoting rules for "$*", to wit: (P1003.2, draft 11, 3.5.2) "If the + expansion [of $*] appears within a double quoted string, it expands + to a single field with the value of each parameter separated by the + first character of the IFS variable, or by a if IFS is unset." */ +char * +string_list_dollar_star (list) + WORD_LIST *list; +{ + char *ret; +#if defined (HANDLE_MULTIBYTE) +# if defined (__GNUC__) + char sep[MB_CUR_MAX + 1]; +# else + char *sep = 0; +# endif +#else + char sep[2]; +#endif + +#if defined (HANDLE_MULTIBYTE) +# if !defined (__GNUC__) + sep = (char *)xmalloc (MB_CUR_MAX + 1); +# endif /* !__GNUC__ */ + if (ifs_firstc_len == 1) + { + sep[0] = ifs_firstc[0]; + sep[1] = '\0'; + } + else + { + memcpy (sep, ifs_firstc, ifs_firstc_len); + sep[ifs_firstc_len] = '\0'; + } +#else + sep[0] = ifs_firstc; + sep[1] = '\0'; +#endif + + ret = string_list_internal (list, sep); +#if defined (HANDLE_MULTIBYTE) && !defined (__GNUC__) + free (sep); +#endif + return ret; +} + +/* Turn $@ into a string. If (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) + is non-zero, the $@ appears within double quotes, and we should quote + the list before converting it into a string. If IFS is unset, and the + word is not quoted, we just need to quote CTLESC and CTLNUL characters + in the words in the list, because the default value of $IFS is + , IFS characters in the words in the list should + also be split. If IFS is null, and the word is not quoted, we need + to quote the words in the list to preserve the positional parameters + exactly. */ +char * +string_list_dollar_at (list, quoted) + WORD_LIST *list; + int quoted; +{ + char *ifs, *ret; +#if defined (HANDLE_MULTIBYTE) +# if defined (__GNUC__) + char sep[MB_CUR_MAX + 1]; +# else + char *sep = 0; +# endif /* !__GNUC__ */ +#else + char sep[2]; +#endif + WORD_LIST *tlist; + + /* XXX this could just be ifs = ifs_value; */ + ifs = ifs_var ? value_cell (ifs_var) : (char *)0; + +#if defined (HANDLE_MULTIBYTE) +# if !defined (__GNUC__) + sep = (char *)xmalloc (MB_CUR_MAX + 1); +# endif /* !__GNUC__ */ + if (ifs && *ifs) + { + if (ifs_firstc_len == 1) + { + sep[0] = ifs_firstc[0]; + sep[1] = '\0'; + } + else + { + memcpy (sep, ifs_firstc, ifs_firstc_len); + sep[ifs_firstc_len] = '\0'; + } + } + else + { + sep[0] = ' '; + sep[1] = '\0'; + } +#else + sep[0] = (ifs == 0 || *ifs == 0) ? ' ' : *ifs; + sep[1] = '\0'; +#endif + + /* XXX -- why call quote_list if ifs == 0? we can get away without doing + it now that quote_escapes quotes spaces */ + tlist = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES|Q_PATQUOTE)) + ? quote_list (list) + : list_quote_escapes (list); + + ret = string_list_internal (tlist, sep); +#if defined (HANDLE_MULTIBYTE) && !defined (__GNUC__) + free (sep); +#endif + return ret; +} + +/* Turn the positional parameters into a string, understanding quoting and + the various subtleties of using the first character of $IFS as the + separator. Calls string_list_dollar_at, string_list_dollar_star, and + string_list as appropriate. */ +char * +string_list_pos_params (pchar, list, quoted) + int pchar; + WORD_LIST *list; + int quoted; +{ + char *ret; + WORD_LIST *tlist; + + if (pchar == '*' && (quoted & Q_DOUBLE_QUOTES)) + { + tlist = quote_list (list); + word_list_remove_quoted_nulls (tlist); + ret = string_list_dollar_star (tlist); + } + else if (pchar == '*' && (quoted & Q_HERE_DOCUMENT)) + { + tlist = quote_list (list); + word_list_remove_quoted_nulls (tlist); + ret = string_list (tlist); + } + else if (pchar == '*') + { + /* Even when unquoted, string_list_dollar_star does the right thing + making sure that the first character of $IFS is used as the + separator. */ + ret = string_list_dollar_star (list); + } + else if (pchar == '@' && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))) + /* We use string_list_dollar_at, but only if the string is quoted, since + that quotes the escapes if it's not, which we don't want. We could + use string_list (the old code did), but that doesn't do the right + thing if the first character of $IFS is not a space. We use + string_list_dollar_star if the string is unquoted so we make sure that + the elements of $@ are separated by the first character of $IFS for + later splitting. */ + ret = string_list_dollar_at (list, quoted); + else if (pchar == '@') + ret = string_list_dollar_star (list); + else + ret = string_list ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) ? quote_list (list) : list); + + return ret; +} + +/* Return the list of words present in STRING. Separate the string into + words at any of the characters found in SEPARATORS. If QUOTED is + non-zero then word in the list will have its quoted flag set, otherwise + the quoted flag is left as make_word () deemed fit. + + This obeys the P1003.2 word splitting semantics. If `separators' is + exactly , then the splitting algorithm is that of + the Bourne shell, which treats any sequence of characters from `separators' + as a delimiter. If IFS is unset, which results in `separators' being set + to "", no splitting occurs. If separators has some other value, the + following rules are applied (`IFS white space' means zero or more + occurrences of , , or , as long as those characters + are in `separators'): + + 1) IFS white space is ignored at the start and the end of the + string. + 2) Each occurrence of a character in `separators' that is not + IFS white space, along with any adjacent occurrences of + IFS white space delimits a field. + 3) Any nonzero-length sequence of IFS white space delimits a field. + */ + +/* BEWARE! list_string strips null arguments. Don't call it twice and + expect to have "" preserved! */ + +/* This performs word splitting and quoted null character removal on + STRING. */ +#define issep(c) \ + (((separators)[0]) ? ((separators)[1] ? isifs(c) \ + : (c) == (separators)[0]) \ + : 0) + +WORD_LIST * +list_string (string, separators, quoted) + register char *string, *separators; + int quoted; +{ + WORD_LIST *result; + WORD_DESC *t; + char *current_word, *s; + int sindex, sh_style_split, whitesep, xflags; + size_t slen; + + if (!string || !*string) + return ((WORD_LIST *)NULL); + + sh_style_split = separators && separators[0] == ' ' && + separators[1] == '\t' && + separators[2] == '\n' && + separators[3] == '\0'; + for (xflags = 0, s = ifs_value; s && *s; s++) + { + if (*s == CTLESC) xflags |= SX_NOCTLESC; + else if (*s == CTLNUL) xflags |= SX_NOESCCTLNUL; + } + + slen = 0; + /* Remove sequences of whitespace at the beginning of STRING, as + long as those characters appear in IFS. Do not do this if + STRING is quoted or if there are no separator characters. */ + if (!quoted || !separators || !*separators) + { + for (s = string; *s && spctabnl (*s) && issep (*s); s++); + + if (!*s) + return ((WORD_LIST *)NULL); + + string = s; + } + + /* OK, now STRING points to a word that does not begin with white space. + The splitting algorithm is: + extract a word, stopping at a separator + skip sequences of spc, tab, or nl as long as they are separators + This obeys the field splitting rules in Posix.2. */ + slen = (MB_CUR_MAX > 1) ? strlen (string) : 1; + for (result = (WORD_LIST *)NULL, sindex = 0; string[sindex]; ) + { + /* Don't need string length in ADVANCE_CHAR or string_extract_verbatim + unless multibyte chars are possible. */ + current_word = string_extract_verbatim (string, slen, &sindex, separators, xflags); + if (current_word == 0) + break; + + /* If we have a quoted empty string, add a quoted null argument. We + want to preserve the quoted null character iff this is a quoted + empty string; otherwise the quoted null characters are removed + below. */ + if (QUOTED_NULL (current_word)) + { + t = alloc_word_desc (); + t->word = make_quoted_char ('\0'); + t->flags |= W_QUOTED|W_HASQUOTEDNULL; + result = make_word_list (t, result); + } + else if (current_word[0] != '\0') + { + /* If we have something, then add it regardless. However, + perform quoted null character removal on the current word. */ + remove_quoted_nulls (current_word); + result = add_string_to_list (current_word, result); + result->word->flags &= ~W_HASQUOTEDNULL; /* just to be sure */ + if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) + result->word->flags |= W_QUOTED; + } + + /* If we're not doing sequences of separators in the traditional + Bourne shell style, then add a quoted null argument. */ + else if (!sh_style_split && !spctabnl (string[sindex])) + { + t = alloc_word_desc (); + t->word = make_quoted_char ('\0'); + t->flags |= W_QUOTED|W_HASQUOTEDNULL; + result = make_word_list (t, result); + } + + free (current_word); + + /* Note whether or not the separator is IFS whitespace, used later. */ + whitesep = string[sindex] && spctabnl (string[sindex]); + + /* Move past the current separator character. */ + if (string[sindex]) + { + DECLARE_MBSTATE; + ADVANCE_CHAR (string, slen, sindex); + } + + /* Now skip sequences of space, tab, or newline characters if they are + in the list of separators. */ + while (string[sindex] && spctabnl (string[sindex]) && issep (string[sindex])) + sindex++; + + /* If the first separator was IFS whitespace and the current character + is a non-whitespace IFS character, it should be part of the current + field delimiter, not a separate delimiter that would result in an + empty field. Look at POSIX.2, 3.6.5, (3)(b). */ + if (string[sindex] && whitesep && issep (string[sindex]) && !spctabnl (string[sindex])) + { + sindex++; + /* An IFS character that is not IFS white space, along with any + adjacent IFS white space, shall delimit a field. (SUSv3) */ + while (string[sindex] && spctabnl (string[sindex]) && isifs (string[sindex])) + sindex++; + } + } + return (REVERSE_LIST (result, WORD_LIST *)); +} + +/* Parse a single word from STRING, using SEPARATORS to separate fields. + ENDPTR is set to the first character after the word. This is used by + the `read' builtin. This is never called with SEPARATORS != $IFS; + it should be simplified. + + XXX - this function is very similar to list_string; they should be + combined - XXX */ +char * +get_word_from_string (stringp, separators, endptr) + char **stringp, *separators, **endptr; +{ + register char *s; + char *current_word; + int sindex, sh_style_split, whitesep, xflags; + size_t slen; + + if (!stringp || !*stringp || !**stringp) + return ((char *)NULL); + + sh_style_split = separators && separators[0] == ' ' && + separators[1] == '\t' && + separators[2] == '\n' && + separators[3] == '\0'; + for (xflags = 0, s = ifs_value; s && *s; s++) + { + if (*s == CTLESC) xflags |= SX_NOCTLESC; + if (*s == CTLNUL) xflags |= SX_NOESCCTLNUL; + } + + s = *stringp; + slen = 0; + + /* Remove sequences of whitespace at the beginning of STRING, as + long as those characters appear in IFS. */ + if (sh_style_split || !separators || !*separators) + { + for (; *s && spctabnl (*s) && isifs (*s); s++); + + /* If the string is nothing but whitespace, update it and return. */ + if (!*s) + { + *stringp = s; + if (endptr) + *endptr = s; + return ((char *)NULL); + } + } + + /* OK, S points to a word that does not begin with white space. + Now extract a word, stopping at a separator, save a pointer to + the first character after the word, then skip sequences of spc, + tab, or nl as long as they are separators. + + This obeys the field splitting rules in Posix.2. */ + sindex = 0; + /* Don't need string length in ADVANCE_CHAR or string_extract_verbatim + unless multibyte chars are possible. */ + slen = (MB_CUR_MAX > 1) ? strlen (s) : 1; + current_word = string_extract_verbatim (s, slen, &sindex, separators, xflags); + + /* Set ENDPTR to the first character after the end of the word. */ + if (endptr) + *endptr = s + sindex; + + /* Note whether or not the separator is IFS whitespace, used later. */ + whitesep = s[sindex] && spctabnl (s[sindex]); + + /* Move past the current separator character. */ + if (s[sindex]) + { + DECLARE_MBSTATE; + ADVANCE_CHAR (s, slen, sindex); + } + + /* Now skip sequences of space, tab, or newline characters if they are + in the list of separators. */ + while (s[sindex] && spctabnl (s[sindex]) && isifs (s[sindex])) + sindex++; + + /* If the first separator was IFS whitespace and the current character is + a non-whitespace IFS character, it should be part of the current field + delimiter, not a separate delimiter that would result in an empty field. + Look at POSIX.2, 3.6.5, (3)(b). */ + if (s[sindex] && whitesep && isifs (s[sindex]) && !spctabnl (s[sindex])) + { + sindex++; + /* An IFS character that is not IFS white space, along with any adjacent + IFS white space, shall delimit a field. */ + while (s[sindex] && spctabnl (s[sindex]) && isifs (s[sindex])) + sindex++; + } + + /* Update STRING to point to the next field. */ + *stringp = s + sindex; + return (current_word); +} + +/* Remove IFS white space at the end of STRING. Start at the end + of the string and walk backwards until the beginning of the string + or we find a character that's not IFS white space and not CTLESC. + Only let CTLESC escape a white space character if SAW_ESCAPE is + non-zero. */ +char * +strip_trailing_ifs_whitespace (string, separators, saw_escape) + char *string, *separators; + int saw_escape; +{ + char *s; + + s = string + STRLEN (string) - 1; + while (s > string && ((spctabnl (*s) && isifs (*s)) || + (saw_escape && *s == CTLESC && spctabnl (s[1])))) + s--; + *++s = '\0'; + return string; +} + +#if 0 +/* UNUSED */ +/* Split STRING into words at whitespace. Obeys shell-style quoting with + backslashes, single and double quotes. */ +WORD_LIST * +list_string_with_quotes (string) + char *string; +{ + WORD_LIST *list; + char *token, *s; + size_t s_len; + int c, i, tokstart, len; + + for (s = string; s && *s && spctabnl (*s); s++) + ; + if (s == 0 || *s == 0) + return ((WORD_LIST *)NULL); + + s_len = strlen (s); + tokstart = i = 0; + list = (WORD_LIST *)NULL; + while (1) + { + c = s[i]; + if (c == '\\') + { + i++; + if (s[i]) + i++; + } + else if (c == '\'') + i = skip_single_quoted (s, s_len, ++i); + else if (c == '"') + i = skip_double_quoted (s, s_len, ++i); + else if (c == 0 || spctabnl (c)) + { + /* We have found the end of a token. Make a word out of it and + add it to the word list. */ + token = substring (s, tokstart, i); + list = add_string_to_list (token, list); + free (token); + while (spctabnl (s[i])) + i++; + if (s[i]) + tokstart = i; + else + break; + } + else + i++; /* normal character */ + } + return (REVERSE_LIST (list, WORD_LIST *)); +} +#endif + +/********************************************************/ +/* */ +/* Functions to perform assignment statements */ +/* */ +/********************************************************/ + +#if defined (ARRAY_VARS) +static SHELL_VAR * +do_compound_assignment (name, value, flags) + char *name, *value; + int flags; +{ + SHELL_VAR *v; + int mklocal, mkassoc, mkglobal; + WORD_LIST *list; + + mklocal = flags & ASS_MKLOCAL; + mkassoc = flags & ASS_MKASSOC; + mkglobal = flags & ASS_MKGLOBAL; + + if (mklocal && variable_context) + { + v = find_variable (name); + list = expand_compound_array_assignment (v, value, flags); + if (mkassoc) + v = make_local_assoc_variable (name); + else if (v == 0 || (array_p (v) == 0 && assoc_p (v) == 0) || v->context != variable_context) + v = make_local_array_variable (name, 0); + if (v) + assign_compound_array_list (v, list, flags); + } + /* In a function but forcing assignment in global context */ + else if (mkglobal && variable_context) + { + v = find_global_variable (name); + list = expand_compound_array_assignment (v, value, flags); + if (v == 0 && mkassoc) + v = make_new_assoc_variable (name); + else if (v && mkassoc && assoc_p (v) == 0) + v = convert_var_to_assoc (v); + else if (v == 0) + v = make_new_array_variable (name); + else if (v && mkassoc == 0 && array_p (v) == 0) + v = convert_var_to_array (v); + if (v) + assign_compound_array_list (v, list, flags); + } + else + v = assign_array_from_string (name, value, flags); + + return (v); +} +#endif + +/* Given STRING, an assignment string, get the value of the right side + of the `=', and bind it to the left side. If EXPAND is true, then + perform parameter expansion, command substitution, and arithmetic + expansion on the right-hand side. Perform tilde expansion in any + case. Do not perform word splitting on the result of expansion. */ +static int +do_assignment_internal (word, expand) + const WORD_DESC *word; + int expand; +{ + int offset, appendop, assign_list, aflags, retval; + char *name, *value, *temp; + SHELL_VAR *entry; +#if defined (ARRAY_VARS) + char *t; + int ni; +#endif + const char *string; + + if (word == 0 || word->word == 0) + return 0; + + appendop = assign_list = aflags = 0; + string = word->word; + offset = assignment (string, 0); + name = savestring (string); + value = (char *)NULL; + + if (name[offset] == '=') + { + if (name[offset - 1] == '+') + { + appendop = 1; + name[offset - 1] = '\0'; + } + + name[offset] = 0; /* might need this set later */ + temp = name + offset + 1; + +#if defined (ARRAY_VARS) + if (expand && (word->flags & W_COMPASSIGN)) + { + assign_list = ni = 1; + value = extract_array_assignment_list (temp, &ni); + } + else +#endif + if (expand && temp[0]) + value = expand_string_if_necessary (temp, 0, expand_string_assignment); + else + value = savestring (temp); + } + + if (value == 0) + { + value = (char *)xmalloc (1); + value[0] = '\0'; + } + + if (echo_command_at_execute) + { + if (appendop) + name[offset - 1] = '+'; + xtrace_print_assignment (name, value, assign_list, 1); + if (appendop) + name[offset - 1] = '\0'; + } + +#define ASSIGN_RETURN(r) do { FREE (value); free (name); return (r); } while (0) + + if (appendop) + aflags |= ASS_APPEND; + +#if defined (ARRAY_VARS) + if (t = mbschr (name, '[')) /*]*/ + { + if (assign_list) + { + report_error (_("%s: cannot assign list to array member"), name); + ASSIGN_RETURN (0); + } + entry = assign_array_element (name, value, aflags); + if (entry == 0) + ASSIGN_RETURN (0); + } + else if (assign_list) + { + if ((word->flags & W_ASSIGNARG) && (word->flags & W_ASSNGLOBAL) == 0) + aflags |= ASS_MKLOCAL; + if ((word->flags & W_ASSIGNARG) && (word->flags & W_ASSNGLOBAL)) + aflags |= ASS_MKGLOBAL; + if (word->flags & W_ASSIGNASSOC) + aflags |= ASS_MKASSOC; + entry = do_compound_assignment (name, value, aflags); + } + else +#endif /* ARRAY_VARS */ + entry = bind_variable (name, value, aflags); + + stupidly_hack_special_variables (name); + + /* Return 1 if the assignment seems to have been performed correctly. */ + if (entry == 0 || readonly_p (entry)) + retval = 0; /* assignment failure */ + else if (noassign_p (entry)) + { + last_command_exit_value = EXECUTION_FAILURE; + retval = 1; /* error status, but not assignment failure */ + } + else + retval = 1; + + if (entry && retval != 0 && noassign_p (entry) == 0) + VUNSETATTR (entry, att_invisible); + + ASSIGN_RETURN (retval); +} + +/* Perform the assignment statement in STRING, and expand the + right side by doing tilde, command and parameter expansion. */ +int +do_assignment (string) + char *string; +{ + WORD_DESC td; + + td.flags = W_ASSIGNMENT; + td.word = string; + + return do_assignment_internal (&td, 1); +} + +int +do_word_assignment (word, flags) + WORD_DESC *word; + int flags; +{ + return do_assignment_internal (word, 1); +} + +/* Given STRING, an assignment string, get the value of the right side + of the `=', and bind it to the left side. Do not perform any word + expansions on the right hand side. */ +int +do_assignment_no_expand (string) + char *string; +{ + WORD_DESC td; + + td.flags = W_ASSIGNMENT; + td.word = string; + + return (do_assignment_internal (&td, 0)); +} + +/*************************************************** + * * + * Functions to manage the positional parameters * + * * + ***************************************************/ + +/* Return the word list that corresponds to `$*'. */ +WORD_LIST * +list_rest_of_args () +{ + register WORD_LIST *list, *args; + int i; + + /* Break out of the loop as soon as one of the dollar variables is null. */ + for (i = 1, list = (WORD_LIST *)NULL; i < 10 && dollar_vars[i]; i++) + list = make_word_list (make_bare_word (dollar_vars[i]), list); + + for (args = rest_of_args; args; args = args->next) + list = make_word_list (make_bare_word (args->word->word), list); + + return (REVERSE_LIST (list, WORD_LIST *)); +} + +int +number_of_args () +{ + register WORD_LIST *list; + int n; + + for (n = 0; n < 9 && dollar_vars[n+1]; n++) + ; + for (list = rest_of_args; list; list = list->next) + n++; + return n; +} + +/* Return the value of a positional parameter. This handles values > 10. */ +char * +get_dollar_var_value (ind) + intmax_t ind; +{ + char *temp; + WORD_LIST *p; + + if (ind < 10) + temp = dollar_vars[ind] ? savestring (dollar_vars[ind]) : (char *)NULL; + else /* We want something like ${11} */ + { + ind -= 10; + for (p = rest_of_args; p && ind--; p = p->next) + ; + temp = p ? savestring (p->word->word) : (char *)NULL; + } + return (temp); +} + +/* Make a single large string out of the dollar digit variables, + and the rest_of_args. If DOLLAR_STAR is 1, then obey the special + case of "$*" with respect to IFS. */ +char * +string_rest_of_args (dollar_star) + int dollar_star; +{ + register WORD_LIST *list; + char *string; + + list = list_rest_of_args (); + string = dollar_star ? string_list_dollar_star (list) : string_list (list); + dispose_words (list); + return (string); +} + +/* Return a string containing the positional parameters from START to + END, inclusive. If STRING[0] == '*', we obey the rules for $*, + which only makes a difference if QUOTED is non-zero. If QUOTED includes + Q_HERE_DOCUMENT or Q_DOUBLE_QUOTES, this returns a quoted list, otherwise + no quoting chars are added. */ +static char * +pos_params (string, start, end, quoted) + char *string; + int start, end, quoted; +{ + WORD_LIST *save, *params, *h, *t; + char *ret; + int i; + + /* see if we can short-circuit. if start == end, we want 0 parameters. */ + if (start == end) + return ((char *)NULL); + + save = params = list_rest_of_args (); + if (save == 0) + return ((char *)NULL); + + if (start == 0) /* handle ${@:0[:x]} specially */ + { + t = make_word_list (make_word (dollar_vars[0]), params); + save = params = t; + } + + for (i = start ? 1 : 0; params && i < start; i++) + params = params->next; + if (params == 0) + return ((char *)NULL); + for (h = t = params; params && i < end; i++) + { + t = params; + params = params->next; + } + + t->next = (WORD_LIST *)NULL; + + ret = string_list_pos_params (string[0], h, quoted); + + if (t != params) + t->next = params; + + dispose_words (save); + return (ret); +} + +/******************************************************************/ +/* */ +/* Functions to expand strings to strings or WORD_LISTs */ +/* */ +/******************************************************************/ + +#if defined (PROCESS_SUBSTITUTION) +#define EXP_CHAR(s) (s == '$' || s == '`' || s == '<' || s == '>' || s == CTLESC || s == '~') +#else +#define EXP_CHAR(s) (s == '$' || s == '`' || s == CTLESC || s == '~') +#endif + +/* If there are any characters in STRING that require full expansion, + then call FUNC to expand STRING; otherwise just perform quote + removal if necessary. This returns a new string. */ +static char * +expand_string_if_necessary (string, quoted, func) + char *string; + int quoted; + EXPFUNC *func; +{ + WORD_LIST *list; + size_t slen; + int i, saw_quote; + char *ret; + DECLARE_MBSTATE; + + /* Don't need string length for ADVANCE_CHAR unless multibyte chars possible. */ + slen = (MB_CUR_MAX > 1) ? strlen (string) : 0; + i = saw_quote = 0; + while (string[i]) + { + if (EXP_CHAR (string[i])) + break; + else if (string[i] == '\'' || string[i] == '\\' || string[i] == '"') + saw_quote = 1; + ADVANCE_CHAR (string, slen, i); + } + + if (string[i]) + { + list = (*func) (string, quoted); + if (list) + { + ret = string_list (list); + dispose_words (list); + } + else + ret = (char *)NULL; + } + else if (saw_quote && ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) == 0)) + ret = string_quote_removal (string, quoted); + else + ret = savestring (string); + + return ret; +} + +static inline char * +expand_string_to_string_internal (string, quoted, func) + char *string; + int quoted; + EXPFUNC *func; +{ + WORD_LIST *list; + char *ret; + + if (string == 0 || *string == '\0') + return ((char *)NULL); + + list = (*func) (string, quoted); + if (list) + { + ret = string_list (list); + dispose_words (list); + } + else + ret = (char *)NULL; + + return (ret); +} + +char * +expand_string_to_string (string, quoted) + char *string; + int quoted; +{ + return (expand_string_to_string_internal (string, quoted, expand_string)); +} + +char * +expand_string_unsplit_to_string (string, quoted) + char *string; + int quoted; +{ + return (expand_string_to_string_internal (string, quoted, expand_string_unsplit)); +} + +char * +expand_assignment_string_to_string (string, quoted) + char *string; + int quoted; +{ + return (expand_string_to_string_internal (string, quoted, expand_string_assignment)); +} + +char * +expand_arith_string (string, quoted) + char *string; + int quoted; +{ + WORD_DESC td; + WORD_LIST *list, *tlist; + size_t slen; + int i, saw_quote; + char *ret; + DECLARE_MBSTATE; + + /* Don't need string length for ADVANCE_CHAR unless multibyte chars possible. */ + slen = (MB_CUR_MAX > 1) ? strlen (string) : 0; + i = saw_quote = 0; + while (string[i]) + { + if (EXP_CHAR (string[i])) + break; + else if (string[i] == '\'' || string[i] == '\\' || string[i] == '"') + saw_quote = 1; + ADVANCE_CHAR (string, slen, i); + } + + if (string[i]) + { + /* This is expanded version of expand_string_internal as it's called by + expand_string_leave_quoted */ + td.flags = W_NOPROCSUB; /* don't want process substitution */ + td.word = savestring (string); + list = call_expand_word_internal (&td, quoted, 0, (int *)NULL, (int *)NULL); + /* This takes care of the calls from expand_string_leave_quoted and + expand_string */ + if (list) + { + tlist = word_list_split (list); + dispose_words (list); + list = tlist; + if (list) + dequote_list (list); + } + /* This comes from expand_string_if_necessary */ + if (list) + { + ret = string_list (list); + dispose_words (list); + } + else + ret = (char *)NULL; + FREE (td.word); + } + else if (saw_quote && ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) == 0)) + ret = string_quote_removal (string, quoted); + else + ret = savestring (string); + + return ret; +} + +#if defined (COND_COMMAND) +/* Just remove backslashes in STRING. Returns a new string. */ +char * +remove_backslashes (string) + char *string; +{ + char *r, *ret, *s; + + r = ret = (char *)xmalloc (strlen (string) + 1); + for (s = string; s && *s; ) + { + if (*s == '\\') + s++; + if (*s == 0) + break; + *r++ = *s++; + } + *r = '\0'; + return ret; +} + +/* This needs better error handling. */ +/* Expand W for use as an argument to a unary or binary operator in a + [[...]] expression. If SPECIAL is 1, this is the rhs argument + to the != or == operator, and should be treated as a pattern. In + this case, we quote the string specially for the globbing code. If + SPECIAL is 2, this is an rhs argument for the =~ operator, and should + be quoted appropriately for regcomp/regexec. The caller is responsible + for removing the backslashes if the unquoted word is needed later. */ +char * +cond_expand_word (w, special) + WORD_DESC *w; + int special; +{ + char *r, *p; + WORD_LIST *l; + int qflags; + + if (w->word == 0 || w->word[0] == '\0') + return ((char *)NULL); + + w->flags |= W_NOSPLIT2; + l = call_expand_word_internal (w, 0, 0, (int *)0, (int *)0); + if (l) + { + if (special == 0) + { + dequote_list (l); + r = string_list (l); + } + else + { + qflags = QGLOB_CVTNULL; + if (special == 2) + qflags |= QGLOB_REGEXP; + p = string_list (l); + r = quote_string_for_globbing (p, qflags); + free (p); + } + dispose_words (l); + } + else + r = (char *)NULL; + + return r; +} +#endif + +/* Call expand_word_internal to expand W and handle error returns. + A convenience function for functions that don't want to handle + any errors or free any memory before aborting. */ +static WORD_LIST * +call_expand_word_internal (w, q, i, c, e) + WORD_DESC *w; + int q, i, *c, *e; +{ + WORD_LIST *result; + + result = expand_word_internal (w, q, i, c, e); + if (result == &expand_word_error || result == &expand_word_fatal) + { + /* By convention, each time this error is returned, w->word has + already been freed (it sometimes may not be in the fatal case, + but that doesn't result in a memory leak because we're going + to exit in most cases). */ + w->word = (char *)NULL; + last_command_exit_value = EXECUTION_FAILURE; + exp_jump_to_top_level ((result == &expand_word_error) ? DISCARD : FORCE_EOF); + /* NOTREACHED */ + return (NULL); + } + else + return (result); +} + +/* Perform parameter expansion, command substitution, and arithmetic + expansion on STRING, as if it were a word. Leave the result quoted. + Since this does not perform word splitting, it leaves quoted nulls + in the result. */ +static WORD_LIST * +expand_string_internal (string, quoted) + char *string; + int quoted; +{ + WORD_DESC td; + WORD_LIST *tresult; + + if (string == 0 || *string == 0) + return ((WORD_LIST *)NULL); + + td.flags = 0; + td.word = savestring (string); + + tresult = call_expand_word_internal (&td, quoted, 0, (int *)NULL, (int *)NULL); + + FREE (td.word); + return (tresult); +} + +/* Expand STRING by performing parameter expansion, command substitution, + and arithmetic expansion. Dequote the resulting WORD_LIST before + returning it, but do not perform word splitting. The call to + remove_quoted_nulls () is in here because word splitting normally + takes care of quote removal. */ +WORD_LIST * +expand_string_unsplit (string, quoted) + char *string; + int quoted; +{ + WORD_LIST *value; + + if (string == 0 || *string == '\0') + return ((WORD_LIST *)NULL); + + expand_no_split_dollar_star = 1; + value = expand_string_internal (string, quoted); + expand_no_split_dollar_star = 0; + + if (value) + { + if (value->word) + { + remove_quoted_nulls (value->word->word); + value->word->flags &= ~W_HASQUOTEDNULL; + } + dequote_list (value); + } + return (value); +} + +/* Expand the rhs of an assignment statement */ +WORD_LIST * +expand_string_assignment (string, quoted) + char *string; + int quoted; +{ + WORD_DESC td; + WORD_LIST *value; + + if (string == 0 || *string == '\0') + return ((WORD_LIST *)NULL); + + expand_no_split_dollar_star = 1; + + td.flags = W_ASSIGNRHS; + td.word = savestring (string); + value = call_expand_word_internal (&td, quoted, 0, (int *)NULL, (int *)NULL); + FREE (td.word); + + expand_no_split_dollar_star = 0; + + if (value) + { + if (value->word) + { + remove_quoted_nulls (value->word->word); + value->word->flags &= ~W_HASQUOTEDNULL; + } + dequote_list (value); + } + return (value); +} + + +/* Expand one of the PS? prompt strings. This is a sort of combination of + expand_string_unsplit and expand_string_internal, but returns the + passed string when an error occurs. Might want to trap other calls + to jump_to_top_level here so we don't endlessly loop. */ +WORD_LIST * +expand_prompt_string (string, quoted, wflags) + char *string; + int quoted; + int wflags; +{ + WORD_LIST *value; + WORD_DESC td; + + if (string == 0 || *string == 0) + return ((WORD_LIST *)NULL); + + td.flags = wflags; + td.word = savestring (string); + + no_longjmp_on_fatal_error = 1; + value = expand_word_internal (&td, quoted, 0, (int *)NULL, (int *)NULL); + no_longjmp_on_fatal_error = 0; + + if (value == &expand_word_error || value == &expand_word_fatal) + { + value = make_word_list (make_bare_word (string), (WORD_LIST *)NULL); + return value; + } + FREE (td.word); + if (value) + { + if (value->word) + { + remove_quoted_nulls (value->word->word); + value->word->flags &= ~W_HASQUOTEDNULL; + } + dequote_list (value); + } + return (value); +} + +/* Expand STRING just as if you were expanding a word, but do not dequote + the resultant WORD_LIST. This is called only from within this file, + and is used to correctly preserve quoted characters when expanding + things like ${1+"$@"}. This does parameter expansion, command + substitution, arithmetic expansion, and word splitting. */ +static WORD_LIST * +expand_string_leave_quoted (string, quoted) + char *string; + int quoted; +{ + WORD_LIST *tlist; + WORD_LIST *tresult; + + if (string == 0 || *string == '\0') + return ((WORD_LIST *)NULL); + + tlist = expand_string_internal (string, quoted); + + if (tlist) + { + tresult = word_list_split (tlist); + dispose_words (tlist); + return (tresult); + } + return ((WORD_LIST *)NULL); +} + +/* This does not perform word splitting or dequote the WORD_LIST + it returns. */ +static WORD_LIST * +expand_string_for_rhs (string, quoted, dollar_at_p, has_dollar_at) + char *string; + int quoted, *dollar_at_p, *has_dollar_at; +{ + WORD_DESC td; + WORD_LIST *tresult; + + if (string == 0 || *string == '\0') + return (WORD_LIST *)NULL; + + td.flags = W_NOSPLIT2; /* no splitting, remove "" and '' */ + td.word = string; + tresult = call_expand_word_internal (&td, quoted, 1, dollar_at_p, has_dollar_at); + return (tresult); +} + +/* Expand STRING just as if you were expanding a word. This also returns + a list of words. Note that filename globbing is *NOT* done for word + or string expansion, just when the shell is expanding a command. This + does parameter expansion, command substitution, arithmetic expansion, + and word splitting. Dequote the resultant WORD_LIST before returning. */ +WORD_LIST * +expand_string (string, quoted) + char *string; + int quoted; +{ + WORD_LIST *result; + + if (string == 0 || *string == '\0') + return ((WORD_LIST *)NULL); + + result = expand_string_leave_quoted (string, quoted); + return (result ? dequote_list (result) : result); +} + +/*************************************************** + * * + * Functions to handle quoting chars * + * * + ***************************************************/ + +/* Conventions: + + A string with s[0] == CTLNUL && s[1] == 0 is a quoted null string. + The parser passes CTLNUL as CTLESC CTLNUL. */ + +/* Quote escape characters in string s, but no other characters. This is + used to protect CTLESC and CTLNUL in variable values from the rest of + the word expansion process after the variable is expanded (word splitting + and filename generation). If IFS is null, we quote spaces as well, just + in case we split on spaces later (in the case of unquoted $@, we will + eventually attempt to split the entire word on spaces). Corresponding + code exists in dequote_escapes. Even if we don't end up splitting on + spaces, quoting spaces is not a problem. This should never be called on + a string that is quoted with single or double quotes or part of a here + document (effectively double-quoted). */ +char * +quote_escapes (string) + char *string; +{ + register char *s, *t; + size_t slen; + char *result, *send; + int quote_spaces, skip_ctlesc, skip_ctlnul; + DECLARE_MBSTATE; + + slen = strlen (string); + send = string + slen; + + quote_spaces = (ifs_value && *ifs_value == 0); + + for (skip_ctlesc = skip_ctlnul = 0, s = ifs_value; s && *s; s++) + skip_ctlesc |= *s == CTLESC, skip_ctlnul |= *s == CTLNUL; + + t = result = (char *)xmalloc ((slen * 2) + 1); + s = string; + + while (*s) + { + if ((skip_ctlesc == 0 && *s == CTLESC) || (skip_ctlnul == 0 && *s == CTLNUL) || (quote_spaces && *s == ' ')) + *t++ = CTLESC; + COPY_CHAR_P (t, s, send); + } + *t = '\0'; + return (result); +} + +static WORD_LIST * +list_quote_escapes (list) + WORD_LIST *list; +{ + register WORD_LIST *w; + char *t; + + for (w = list; w; w = w->next) + { + t = w->word->word; + w->word->word = quote_escapes (t); + free (t); + } + return list; +} + +/* Inverse of quote_escapes; remove CTLESC protecting CTLESC or CTLNUL. + + The parser passes us CTLESC as CTLESC CTLESC and CTLNUL as CTLESC CTLNUL. + This is necessary to make unquoted CTLESC and CTLNUL characters in the + data stream pass through properly. + + We need to remove doubled CTLESC characters inside quoted strings before + quoting the entire string, so we do not double the number of CTLESC + characters. + + Also used by parts of the pattern substitution code. */ +char * +dequote_escapes (string) + char *string; +{ + register char *s, *t, *s1; + size_t slen; + char *result, *send; + int quote_spaces; + DECLARE_MBSTATE; + + if (string == 0) + return string; + + slen = strlen (string); + send = string + slen; + + t = result = (char *)xmalloc (slen + 1); + + if (strchr (string, CTLESC) == 0) + return (strcpy (result, string)); + + quote_spaces = (ifs_value && *ifs_value == 0); + + s = string; + while (*s) + { + if (*s == CTLESC && (s[1] == CTLESC || s[1] == CTLNUL || (quote_spaces && s[1] == ' '))) + { + s++; + if (*s == '\0') + break; + } + COPY_CHAR_P (t, s, send); + } + *t = '\0'; + return result; +} + +/* Return a new string with the quoted representation of character C. + This turns "" into QUOTED_NULL, so the W_HASQUOTEDNULL flag needs to be + set in any resultant WORD_DESC where this value is the word. */ +static char * +make_quoted_char (c) + int c; +{ + char *temp; + + temp = (char *)xmalloc (3); + if (c == 0) + { + temp[0] = CTLNUL; + temp[1] = '\0'; + } + else + { + temp[0] = CTLESC; + temp[1] = c; + temp[2] = '\0'; + } + return (temp); +} + +/* Quote STRING, returning a new string. This turns "" into QUOTED_NULL, so + the W_HASQUOTEDNULL flag needs to be set in any resultant WORD_DESC where + this value is the word. */ +char * +quote_string (string) + char *string; +{ + register char *t; + size_t slen; + char *result, *send; + + if (*string == 0) + { + result = (char *)xmalloc (2); + result[0] = CTLNUL; + result[1] = '\0'; + } + else + { + DECLARE_MBSTATE; + + slen = strlen (string); + send = string + slen; + + result = (char *)xmalloc ((slen * 2) + 1); + + for (t = result; string < send; ) + { + *t++ = CTLESC; + COPY_CHAR_P (t, string, send); + } + *t = '\0'; + } + return (result); +} + +/* De-quote quoted characters in STRING. */ +char * +dequote_string (string) + char *string; +{ + register char *s, *t; + size_t slen; + char *result, *send; + DECLARE_MBSTATE; + + slen = strlen (string); + + t = result = (char *)xmalloc (slen + 1); + + if (QUOTED_NULL (string)) + { + result[0] = '\0'; + return (result); + } + + /* If no character in the string can be quoted, don't bother examining + each character. Just return a copy of the string passed to us. */ + if (strchr (string, CTLESC) == NULL) + return (strcpy (result, string)); + + send = string + slen; + s = string; + while (*s) + { + if (*s == CTLESC) + { + s++; + if (*s == '\0') + break; + } + COPY_CHAR_P (t, s, send); + } + + *t = '\0'; + return (result); +} + +/* Quote the entire WORD_LIST list. */ +static WORD_LIST * +quote_list (list) + WORD_LIST *list; +{ + register WORD_LIST *w; + char *t; + + for (w = list; w; w = w->next) + { + t = w->word->word; + w->word->word = quote_string (t); + if (*t == 0) + w->word->flags |= W_HASQUOTEDNULL; /* XXX - turn on W_HASQUOTEDNULL here? */ + w->word->flags |= W_QUOTED; + free (t); + } + return list; +} + +/* De-quote quoted characters in each word in LIST. */ +WORD_LIST * +dequote_list (list) + WORD_LIST *list; +{ + register char *s; + register WORD_LIST *tlist; + + for (tlist = list; tlist; tlist = tlist->next) + { + s = dequote_string (tlist->word->word); + if (QUOTED_NULL (tlist->word->word)) + tlist->word->flags &= ~W_HASQUOTEDNULL; + free (tlist->word->word); + tlist->word->word = s; + } + return list; +} + +/* Remove CTLESC protecting a CTLESC or CTLNUL in place. Return the passed + string. */ +char * +remove_quoted_escapes (string) + char *string; +{ + char *t; + + if (string) + { + t = dequote_escapes (string); + strcpy (string, t); + free (t); + } + + return (string); +} + +/* Perform quoted null character removal on STRING. We don't allow any + quoted null characters in the middle or at the ends of strings because + of how expand_word_internal works. remove_quoted_nulls () turns + STRING into an empty string iff it only consists of a quoted null, + and removes all unquoted CTLNUL characters. */ +char * +remove_quoted_nulls (string) + char *string; +{ + register size_t slen; + register int i, j, prev_i; + DECLARE_MBSTATE; + + if (strchr (string, CTLNUL) == 0) /* XXX */ + return string; /* XXX */ + + slen = strlen (string); + i = j = 0; + + while (i < slen) + { + if (string[i] == CTLESC) + { + /* Old code had j++, but we cannot assume that i == j at this + point -- what if a CTLNUL has already been removed from the + string? We don't want to drop the CTLESC or recopy characters + that we've already copied down. */ + i++; string[j++] = CTLESC; + if (i == slen) + break; + } + else if (string[i] == CTLNUL) + { + i++; + continue; + } + + prev_i = i; + ADVANCE_CHAR (string, slen, i); + if (j < prev_i) + { + do string[j++] = string[prev_i++]; while (prev_i < i); + } + else + j = i; + } + string[j] = '\0'; + + return (string); +} + +/* Perform quoted null character removal on each element of LIST. + This modifies LIST. */ +void +word_list_remove_quoted_nulls (list) + WORD_LIST *list; +{ + register WORD_LIST *t; + + for (t = list; t; t = t->next) + { + remove_quoted_nulls (t->word->word); + t->word->flags &= ~W_HASQUOTEDNULL; + } +} + +/* **************************************************************** */ +/* */ +/* Functions for Matching and Removing Patterns */ +/* */ +/* **************************************************************** */ + +#if defined (HANDLE_MULTIBYTE) +#if 0 /* Currently unused */ +static unsigned char * +mb_getcharlens (string, len) + char *string; + int len; +{ + int i, offset, last; + unsigned char *ret; + char *p; + DECLARE_MBSTATE; + + i = offset = 0; + last = 0; + ret = (unsigned char *)xmalloc (len); + memset (ret, 0, len); + while (string[last]) + { + ADVANCE_CHAR (string, len, offset); + ret[last] = offset - last; + last = offset; + } + return ret; +} +#endif +#endif + +/* Remove the portion of PARAM matched by PATTERN according to OP, where OP + can have one of 4 values: + RP_LONG_LEFT remove longest matching portion at start of PARAM + RP_SHORT_LEFT remove shortest matching portion at start of PARAM + RP_LONG_RIGHT remove longest matching portion at end of PARAM + RP_SHORT_RIGHT remove shortest matching portion at end of PARAM +*/ + +#define RP_LONG_LEFT 1 +#define RP_SHORT_LEFT 2 +#define RP_LONG_RIGHT 3 +#define RP_SHORT_RIGHT 4 + +/* Returns its first argument if nothing matched; new memory otherwise */ +static char * +remove_upattern (param, pattern, op) + char *param, *pattern; + int op; +{ + register int len; + register char *end; + register char *p, *ret, c; + + len = STRLEN (param); + end = param + len; + + switch (op) + { + case RP_LONG_LEFT: /* remove longest match at start */ + for (p = end; p >= param; p--) + { + c = *p; *p = '\0'; + if (strmatch (pattern, param, FNMATCH_EXTFLAG) != FNM_NOMATCH) + { + *p = c; + return (savestring (p)); + } + *p = c; + + } + break; + + case RP_SHORT_LEFT: /* remove shortest match at start */ + for (p = param; p <= end; p++) + { + c = *p; *p = '\0'; + if (strmatch (pattern, param, FNMATCH_EXTFLAG) != FNM_NOMATCH) + { + *p = c; + return (savestring (p)); + } + *p = c; + } + break; + + case RP_LONG_RIGHT: /* remove longest match at end */ + for (p = param; p <= end; p++) + { + if (strmatch (pattern, p, FNMATCH_EXTFLAG) != FNM_NOMATCH) + { + c = *p; *p = '\0'; + ret = savestring (param); + *p = c; + return (ret); + } + } + break; + + case RP_SHORT_RIGHT: /* remove shortest match at end */ + for (p = end; p >= param; p--) + { + if (strmatch (pattern, p, FNMATCH_EXTFLAG) != FNM_NOMATCH) + { + c = *p; *p = '\0'; + ret = savestring (param); + *p = c; + return (ret); + } + } + break; + } + + return (param); /* no match, return original string */ +} + +#if defined (HANDLE_MULTIBYTE) +/* Returns its first argument if nothing matched; new memory otherwise */ +static wchar_t * +remove_wpattern (wparam, wstrlen, wpattern, op) + wchar_t *wparam; + size_t wstrlen; + wchar_t *wpattern; + int op; +{ + wchar_t wc, *ret; + int n; + + switch (op) + { + case RP_LONG_LEFT: /* remove longest match at start */ + for (n = wstrlen; n >= 0; n--) + { + wc = wparam[n]; wparam[n] = L'\0'; + if (wcsmatch (wpattern, wparam, FNMATCH_EXTFLAG) != FNM_NOMATCH) + { + wparam[n] = wc; + return (wcsdup (wparam + n)); + } + wparam[n] = wc; + } + break; + + case RP_SHORT_LEFT: /* remove shortest match at start */ + for (n = 0; n <= wstrlen; n++) + { + wc = wparam[n]; wparam[n] = L'\0'; + if (wcsmatch (wpattern, wparam, FNMATCH_EXTFLAG) != FNM_NOMATCH) + { + wparam[n] = wc; + return (wcsdup (wparam + n)); + } + wparam[n] = wc; + } + break; + + case RP_LONG_RIGHT: /* remove longest match at end */ + for (n = 0; n <= wstrlen; n++) + { + if (wcsmatch (wpattern, wparam + n, FNMATCH_EXTFLAG) != FNM_NOMATCH) + { + wc = wparam[n]; wparam[n] = L'\0'; + ret = wcsdup (wparam); + wparam[n] = wc; + return (ret); + } + } + break; + + case RP_SHORT_RIGHT: /* remove shortest match at end */ + for (n = wstrlen; n >= 0; n--) + { + if (wcsmatch (wpattern, wparam + n, FNMATCH_EXTFLAG) != FNM_NOMATCH) + { + wc = wparam[n]; wparam[n] = L'\0'; + ret = wcsdup (wparam); + wparam[n] = wc; + return (ret); + } + } + break; + } + + return (wparam); /* no match, return original string */ +} +#endif /* HANDLE_MULTIBYTE */ + +static char * +remove_pattern (param, pattern, op) + char *param, *pattern; + int op; +{ + char *xret; + + if (param == NULL) + return (param); + if (*param == '\0' || pattern == NULL || *pattern == '\0') /* minor optimization */ + return (savestring (param)); + +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1) + { + wchar_t *ret, *oret; + size_t n; + wchar_t *wparam, *wpattern; + mbstate_t ps; + + n = xdupmbstowcs (&wpattern, NULL, pattern); + if (n == (size_t)-1) + { + xret = remove_upattern (param, pattern, op); + return ((xret == param) ? savestring (param) : xret); + } + n = xdupmbstowcs (&wparam, NULL, param); + + if (n == (size_t)-1) + { + free (wpattern); + xret = remove_upattern (param, pattern, op); + return ((xret == param) ? savestring (param) : xret); + } + oret = ret = remove_wpattern (wparam, n, wpattern, op); + /* Don't bother to convert wparam back to multibyte string if nothing + matched; just return copy of original string */ + if (ret == wparam) + { + free (wparam); + free (wpattern); + return (savestring (param)); + } + + free (wparam); + free (wpattern); + + n = strlen (param); + xret = (char *)xmalloc (n + 1); + memset (&ps, '\0', sizeof (mbstate_t)); + n = wcsrtombs (xret, (const wchar_t **)&ret, n, &ps); + xret[n] = '\0'; /* just to make sure */ + free (oret); + return xret; + } + else +#endif + { + xret = remove_upattern (param, pattern, op); + return ((xret == param) ? savestring (param) : xret); + } +} + +/* Match PAT anywhere in STRING and return the match boundaries. + This returns 1 in case of a successful match, 0 otherwise. SP + and EP are pointers into the string where the match begins and + ends, respectively. MTYPE controls what kind of match is attempted. + MATCH_BEG and MATCH_END anchor the match at the beginning and end + of the string, respectively. The longest match is returned. */ +static int +match_upattern (string, pat, mtype, sp, ep) + char *string, *pat; + int mtype; + char **sp, **ep; +{ + int c, len, mlen; + register char *p, *p1, *npat; + char *end; + int n1; + + /* If the pattern doesn't match anywhere in the string, go ahead and + short-circuit right away. A minor optimization, saves a bunch of + unnecessary calls to strmatch (up to N calls for a string of N + characters) if the match is unsuccessful. To preserve the semantics + of the substring matches below, we make sure that the pattern has + `*' as first and last character, making a new pattern if necessary. */ + /* XXX - check this later if I ever implement `**' with special meaning, + since this will potentially result in `**' at the beginning or end */ + len = STRLEN (pat); + if (pat[0] != '*' || (pat[0] == '*' && pat[1] == LPAREN && extended_glob) || pat[len - 1] != '*') + { + p = npat = (char *)xmalloc (len + 3); + p1 = pat; + if (*p1 != '*' || (*p1 == '*' && p1[1] == LPAREN && extended_glob)) + *p++ = '*'; + while (*p1) + *p++ = *p1++; + if (p1[-1] != '*' || p[-2] == '\\') + *p++ = '*'; + *p = '\0'; + } + else + npat = pat; + c = strmatch (npat, string, FNMATCH_EXTFLAG); + if (npat != pat) + free (npat); + if (c == FNM_NOMATCH) + return (0); + + len = STRLEN (string); + end = string + len; + + mlen = umatchlen (pat, len); + + switch (mtype) + { + case MATCH_ANY: + for (p = string; p <= end; p++) + { + if (match_pattern_char (pat, p)) + { + p1 = (mlen == -1) ? end : p + mlen; + /* p1 - p = length of portion of string to be considered + p = current position in string + mlen = number of characters consumed by match (-1 for entire string) + end = end of string + we want to break immediately if the potential match len + is greater than the number of characters remaining in the + string + */ + if (p1 > end) + break; + for ( ; p1 >= p; p1--) + { + c = *p1; *p1 = '\0'; + if (strmatch (pat, p, FNMATCH_EXTFLAG) == 0) + { + *p1 = c; + *sp = p; + *ep = p1; + return 1; + } + *p1 = c; +#if 1 + /* If MLEN != -1, we have a fixed length pattern. */ + if (mlen != -1) + break; +#endif + } + } + } + + return (0); + + case MATCH_BEG: + if (match_pattern_char (pat, string) == 0) + return (0); + + for (p = (mlen == -1) ? end : string + mlen; p >= string; p--) + { + c = *p; *p = '\0'; + if (strmatch (pat, string, FNMATCH_EXTFLAG) == 0) + { + *p = c; + *sp = string; + *ep = p; + return 1; + } + *p = c; + /* If MLEN != -1, we have a fixed length pattern. */ + if (mlen != -1) + break; + } + + return (0); + + case MATCH_END: + for (p = end - ((mlen == -1) ? len : mlen); p <= end; p++) + { + if (strmatch (pat, p, FNMATCH_EXTFLAG) == 0) + { + *sp = p; + *ep = end; + return 1; + } + /* If MLEN != -1, we have a fixed length pattern. */ + if (mlen != -1) + break; + } + + return (0); + } + + return (0); +} + +#if defined (HANDLE_MULTIBYTE) +/* Match WPAT anywhere in WSTRING and return the match boundaries. + This returns 1 in case of a successful match, 0 otherwise. Wide + character version. */ +static int +match_wpattern (wstring, indices, wstrlen, wpat, mtype, sp, ep) + wchar_t *wstring; + char **indices; + size_t wstrlen; + wchar_t *wpat; + int mtype; + char **sp, **ep; +{ + wchar_t wc, *wp, *nwpat, *wp1; + size_t len; + int mlen; + int n, n1, n2, simple; + + simple = (wpat[0] != L'\\' && wpat[0] != L'*' && wpat[0] != L'?' && wpat[0] != L'['); +#if defined (EXTENDED_GLOB) + if (extended_glob) + simple &= (wpat[1] != L'(' || (wpat[0] != L'*' && wpat[0] != L'?' && wpat[0] != L'+' && wpat[0] != L'!' && wpat[0] != L'@')); /*)*/ +#endif + + /* If the pattern doesn't match anywhere in the string, go ahead and + short-circuit right away. A minor optimization, saves a bunch of + unnecessary calls to strmatch (up to N calls for a string of N + characters) if the match is unsuccessful. To preserve the semantics + of the substring matches below, we make sure that the pattern has + `*' as first and last character, making a new pattern if necessary. */ + len = wcslen (wpat); + if (wpat[0] != L'*' || (wpat[0] == L'*' && wpat[1] == WLPAREN && extended_glob) || wpat[len - 1] != L'*') + { + wp = nwpat = (wchar_t *)xmalloc ((len + 3) * sizeof (wchar_t)); + wp1 = wpat; + if (*wp1 != L'*' || (*wp1 == '*' && wp1[1] == WLPAREN && extended_glob)) + *wp++ = L'*'; + while (*wp1 != L'\0') + *wp++ = *wp1++; + if (wp1[-1] != L'*' || wp1[-2] == L'\\') + *wp++ = L'*'; + *wp = '\0'; + } + else + nwpat = wpat; + len = wcsmatch (nwpat, wstring, FNMATCH_EXTFLAG); + if (nwpat != wpat) + free (nwpat); + if (len == FNM_NOMATCH) + return (0); + + mlen = wmatchlen (wpat, wstrlen); + +/* itrace("wmatchlen (%ls) -> %d", wpat, mlen); */ + switch (mtype) + { + case MATCH_ANY: + for (n = 0; n <= wstrlen; n++) + { + n2 = simple ? (*wpat == wstring[n]) : match_pattern_wchar (wpat, wstring + n); + if (n2) + { + n1 = (mlen == -1) ? wstrlen : n + mlen; + if (n1 > wstrlen) + break; + + for ( ; n1 >= n; n1--) + { + wc = wstring[n1]; wstring[n1] = L'\0'; + if (wcsmatch (wpat, wstring + n, FNMATCH_EXTFLAG) == 0) + { + wstring[n1] = wc; + *sp = indices[n]; + *ep = indices[n1]; + return 1; + } + wstring[n1] = wc; + /* If MLEN != -1, we have a fixed length pattern. */ + if (mlen != -1) + break; + } + } + } + + return (0); + + case MATCH_BEG: + if (match_pattern_wchar (wpat, wstring) == 0) + return (0); + + for (n = (mlen == -1) ? wstrlen : mlen; n >= 0; n--) + { + wc = wstring[n]; wstring[n] = L'\0'; + if (wcsmatch (wpat, wstring, FNMATCH_EXTFLAG) == 0) + { + wstring[n] = wc; + *sp = indices[0]; + *ep = indices[n]; + return 1; + } + wstring[n] = wc; + /* If MLEN != -1, we have a fixed length pattern. */ + if (mlen != -1) + break; + } + + return (0); + + case MATCH_END: + for (n = wstrlen - ((mlen == -1) ? wstrlen : mlen); n <= wstrlen; n++) + { + if (wcsmatch (wpat, wstring + n, FNMATCH_EXTFLAG) == 0) + { + *sp = indices[n]; + *ep = indices[wstrlen]; + return 1; + } + /* If MLEN != -1, we have a fixed length pattern. */ + if (mlen != -1) + break; + } + + return (0); + } + + return (0); +} +#endif /* HANDLE_MULTIBYTE */ + +static int +match_pattern (string, pat, mtype, sp, ep) + char *string, *pat; + int mtype; + char **sp, **ep; +{ +#if defined (HANDLE_MULTIBYTE) + int ret; + size_t n; + wchar_t *wstring, *wpat; + char **indices; + size_t slen, plen, mslen, mplen; +#endif + + if (string == 0 || *string == 0 || pat == 0 || *pat == 0) + return (0); + +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1) + { + if (mbsmbchar (string) == 0 && mbsmbchar (pat) == 0) + return (match_upattern (string, pat, mtype, sp, ep)); + + n = xdupmbstowcs (&wpat, NULL, pat); + if (n == (size_t)-1) + return (match_upattern (string, pat, mtype, sp, ep)); + n = xdupmbstowcs (&wstring, &indices, string); + if (n == (size_t)-1) + { + free (wpat); + return (match_upattern (string, pat, mtype, sp, ep)); + } + ret = match_wpattern (wstring, indices, n, wpat, mtype, sp, ep); + + free (wpat); + free (wstring); + free (indices); + + return (ret); + } + else +#endif + return (match_upattern (string, pat, mtype, sp, ep)); +} + +static int +getpatspec (c, value) + int c; + char *value; +{ + if (c == '#') + return ((*value == '#') ? RP_LONG_LEFT : RP_SHORT_LEFT); + else /* c == '%' */ + return ((*value == '%') ? RP_LONG_RIGHT : RP_SHORT_RIGHT); +} + +/* Posix.2 says that the WORD should be run through tilde expansion, + parameter expansion, command substitution and arithmetic expansion. + This leaves the result quoted, so quote_string_for_globbing () has + to be called to fix it up for strmatch (). If QUOTED is non-zero, + it means that the entire expression was enclosed in double quotes. + This means that quoting characters in the pattern do not make any + special pattern characters quoted. For example, the `*' in the + following retains its special meaning: "${foo#'*'}". */ +static char * +getpattern (value, quoted, expandpat) + char *value; + int quoted, expandpat; +{ + char *pat, *tword; + WORD_LIST *l; +#if 0 + int i; +#endif + /* There is a problem here: how to handle single or double quotes in the + pattern string when the whole expression is between double quotes? + POSIX.2 says that enclosing double quotes do not cause the pattern to + be quoted, but does that leave us a problem with @ and array[@] and their + expansions inside a pattern? */ +#if 0 + if (expandpat && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && *tword) + { + i = 0; + pat = string_extract_double_quoted (tword, &i, 1); + free (tword); + tword = pat; + } +#endif + + /* expand_string_for_rhs () leaves WORD quoted and does not perform + word splitting. */ + l = *value ? expand_string_for_rhs (value, + (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) ? Q_PATQUOTE : quoted, + (int *)NULL, (int *)NULL) + : (WORD_LIST *)0; + pat = string_list (l); + dispose_words (l); + if (pat) + { + tword = quote_string_for_globbing (pat, QGLOB_CVTNULL); + free (pat); + pat = tword; + } + return (pat); +} + +#if 0 +/* Handle removing a pattern from a string as a result of ${name%[%]value} + or ${name#[#]value}. */ +static char * +variable_remove_pattern (value, pattern, patspec, quoted) + char *value, *pattern; + int patspec, quoted; +{ + char *tword; + + tword = remove_pattern (value, pattern, patspec); + + return (tword); +} +#endif + +static char * +list_remove_pattern (list, pattern, patspec, itype, quoted) + WORD_LIST *list; + char *pattern; + int patspec, itype, quoted; +{ + WORD_LIST *new, *l; + WORD_DESC *w; + char *tword; + + for (new = (WORD_LIST *)NULL, l = list; l; l = l->next) + { + tword = remove_pattern (l->word->word, pattern, patspec); + w = alloc_word_desc (); + w->word = tword ? tword : savestring (""); + new = make_word_list (w, new); + } + + l = REVERSE_LIST (new, WORD_LIST *); + tword = string_list_pos_params (itype, l, quoted); + dispose_words (l); + + return (tword); +} + +static char * +parameter_list_remove_pattern (itype, pattern, patspec, quoted) + int itype; + char *pattern; + int patspec, quoted; +{ + char *ret; + WORD_LIST *list; + + list = list_rest_of_args (); + if (list == 0) + return ((char *)NULL); + ret = list_remove_pattern (list, pattern, patspec, itype, quoted); + dispose_words (list); + return (ret); +} + +#if defined (ARRAY_VARS) +static char * +array_remove_pattern (var, pattern, patspec, varname, quoted) + SHELL_VAR *var; + char *pattern; + int patspec; + char *varname; /* so we can figure out how it's indexed */ + int quoted; +{ + ARRAY *a; + HASH_TABLE *h; + int itype; + char *ret; + WORD_LIST *list; + SHELL_VAR *v; + + /* compute itype from varname here */ + v = array_variable_part (varname, &ret, 0); + + /* XXX */ + if (v && invisible_p (var)) + return ((char *)NULL); + + itype = ret[0]; + + a = (v && array_p (v)) ? array_cell (v) : 0; + h = (v && assoc_p (v)) ? assoc_cell (v) : 0; + + list = a ? array_to_word_list (a) : (h ? assoc_to_word_list (h) : 0); + if (list == 0) + return ((char *)NULL); + ret = list_remove_pattern (list, pattern, patspec, itype, quoted); + dispose_words (list); + + return ret; +} +#endif /* ARRAY_VARS */ + +static char * +parameter_brace_remove_pattern (varname, value, ind, patstr, rtype, quoted, flags) + char *varname, *value; + int ind; + char *patstr; + int rtype, quoted, flags; +{ + int vtype, patspec, starsub; + char *temp1, *val, *pattern; + SHELL_VAR *v; + + if (value == 0) + return ((char *)NULL); + + this_command_name = varname; + + vtype = get_var_and_type (varname, value, ind, quoted, flags, &v, &val); + if (vtype == -1) + return ((char *)NULL); + + starsub = vtype & VT_STARSUB; + vtype &= ~VT_STARSUB; + + patspec = getpatspec (rtype, patstr); + if (patspec == RP_LONG_LEFT || patspec == RP_LONG_RIGHT) + patstr++; + + /* Need to pass getpattern newly-allocated memory in case of expansion -- + the expansion code will free the passed string on an error. */ + temp1 = savestring (patstr); + pattern = getpattern (temp1, quoted, 1); + free (temp1); + + temp1 = (char *)NULL; /* shut up gcc */ + switch (vtype) + { + case VT_VARIABLE: + case VT_ARRAYMEMBER: + temp1 = remove_pattern (val, pattern, patspec); + if (vtype == VT_VARIABLE) + FREE (val); + if (temp1) + { + val = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) + ? quote_string (temp1) + : quote_escapes (temp1); + free (temp1); + temp1 = val; + } + break; +#if defined (ARRAY_VARS) + case VT_ARRAYVAR: + temp1 = array_remove_pattern (v, pattern, patspec, varname, quoted); + if (temp1 && ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) == 0)) + { + val = quote_escapes (temp1); + free (temp1); + temp1 = val; + } + break; +#endif + case VT_POSPARMS: + temp1 = parameter_list_remove_pattern (varname[0], pattern, patspec, quoted); + if (temp1 && ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) == 0)) + { + val = quote_escapes (temp1); + free (temp1); + temp1 = val; + } + break; + } + + FREE (pattern); + return temp1; +} + +/******************************************* + * * + * Functions to expand WORD_DESCs * + * * + *******************************************/ + +/* Expand WORD, performing word splitting on the result. This does + parameter expansion, command substitution, arithmetic expansion, + word splitting, and quote removal. */ + +WORD_LIST * +expand_word (word, quoted) + WORD_DESC *word; + int quoted; +{ + WORD_LIST *result, *tresult; + + tresult = call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL); + result = word_list_split (tresult); + dispose_words (tresult); + return (result ? dequote_list (result) : result); +} + +/* Expand WORD, but do not perform word splitting on the result. This + does parameter expansion, command substitution, arithmetic expansion, + and quote removal. */ +WORD_LIST * +expand_word_unsplit (word, quoted) + WORD_DESC *word; + int quoted; +{ + WORD_LIST *result; + + expand_no_split_dollar_star = 1; +#if defined (HANDLE_MULTIBYTE) + if (ifs_firstc[0] == 0) +#else + if (ifs_firstc == 0) +#endif + word->flags |= W_NOSPLIT; + word->flags |= W_NOSPLIT2; + result = call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL); + expand_no_split_dollar_star = 0; + + return (result ? dequote_list (result) : result); +} + +/* Perform shell expansions on WORD, but do not perform word splitting or + quote removal on the result. Virtually identical to expand_word_unsplit; + could be combined if implementations don't diverge. */ +WORD_LIST * +expand_word_leave_quoted (word, quoted) + WORD_DESC *word; + int quoted; +{ + WORD_LIST *result; + + expand_no_split_dollar_star = 1; +#if defined (HANDLE_MULTIBYTE) + if (ifs_firstc[0] == 0) +#else + if (ifs_firstc == 0) +#endif + word->flags |= W_NOSPLIT; + word->flags |= W_NOSPLIT2; + result = call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL); + expand_no_split_dollar_star = 0; + + return result; +} + +#if defined (PROCESS_SUBSTITUTION) + +/*****************************************************************/ +/* */ +/* Hacking Process Substitution */ +/* */ +/*****************************************************************/ + +#if !defined (HAVE_DEV_FD) +/* Named pipes must be removed explicitly with `unlink'. This keeps a list + of FIFOs the shell has open. unlink_fifo_list will walk the list and + unlink all of them. add_fifo_list adds the name of an open FIFO to the + list. NFIFO is a count of the number of FIFOs in the list. */ +#define FIFO_INCR 20 + +struct temp_fifo { + char *file; + pid_t proc; +}; + +static struct temp_fifo *fifo_list = (struct temp_fifo *)NULL; +static int nfifo; +static int fifo_list_size; + +char * +copy_fifo_list (sizep) + int *sizep; +{ + if (sizep) + *sizep = 0; + return (char *)NULL; +} + +static void +add_fifo_list (pathname) + char *pathname; +{ + if (nfifo >= fifo_list_size - 1) + { + fifo_list_size += FIFO_INCR; + fifo_list = (struct temp_fifo *)xrealloc (fifo_list, + fifo_list_size * sizeof (struct temp_fifo)); + } + + fifo_list[nfifo].file = savestring (pathname); + nfifo++; +} + +void +unlink_fifo (i) + int i; +{ + if ((fifo_list[i].proc == -1) || (kill(fifo_list[i].proc, 0) == -1)) + { + unlink (fifo_list[i].file); + free (fifo_list[i].file); + fifo_list[i].file = (char *)NULL; + fifo_list[i].proc = -1; + } +} + +void +unlink_fifo_list () +{ + int saved, i, j; + + if (nfifo == 0) + return; + + for (i = saved = 0; i < nfifo; i++) + { + if ((fifo_list[i].proc == -1) || (kill(fifo_list[i].proc, 0) == -1)) + { + unlink (fifo_list[i].file); + free (fifo_list[i].file); + fifo_list[i].file = (char *)NULL; + fifo_list[i].proc = -1; + } + else + saved++; + } + + /* If we didn't remove some of the FIFOs, compact the list. */ + if (saved) + { + for (i = j = 0; i < nfifo; i++) + if (fifo_list[i].file) + { + fifo_list[j].file = fifo_list[i].file; + fifo_list[j].proc = fifo_list[i].proc; + j++; + } + nfifo = j; + } + else + nfifo = 0; +} + +/* Take LIST, which is a bitmap denoting active FIFOs in fifo_list + from some point in the past, and close all open FIFOs in fifo_list + that are not marked as active in LIST. If LIST is NULL, close + everything in fifo_list. LSIZE is the number of elements in LIST, in + case it's larger than fifo_list_size (size of fifo_list). */ +void +close_new_fifos (list, lsize) + char *list; + int lsize; +{ + int i; + + if (list == 0) + { + unlink_fifo_list (); + return; + } + + for (i = 0; i < lsize; i++) + if (list[i] == 0 && i < fifo_list_size && fifo_list[i].proc != -1) + unlink_fifo (i); + + for (i = lsize; i < fifo_list_size; i++) + unlink_fifo (i); +} + +int +fifos_pending () +{ + return nfifo; +} + +int +num_fifos () +{ + return nfifo; +} + +static char * +make_named_pipe () +{ + char *tname; + + tname = sh_mktmpname ("sh-np", MT_USERANDOM|MT_USETMPDIR); + if (mkfifo (tname, 0600) < 0) + { + free (tname); + return ((char *)NULL); + } + + add_fifo_list (tname); + return (tname); +} + +#else /* HAVE_DEV_FD */ + +/* DEV_FD_LIST is a bitmap of file descriptors attached to pipes the shell + has open to children. NFDS is a count of the number of bits currently + set in DEV_FD_LIST. TOTFDS is a count of the highest possible number + of open files. */ +static char *dev_fd_list = (char *)NULL; +static int nfds; +static int totfds; /* The highest possible number of open files. */ + +char * +copy_fifo_list (sizep) + int *sizep; +{ + char *ret; + + if (nfds == 0 || totfds == 0) + { + if (sizep) + *sizep = 0; + return (char *)NULL; + } + + if (sizep) + *sizep = totfds; + ret = (char *)xmalloc (totfds); + return (memcpy (ret, dev_fd_list, totfds)); +} + +static void +add_fifo_list (fd) + int fd; +{ + if (dev_fd_list == 0 || fd >= totfds) + { + int ofds; + + ofds = totfds; + totfds = getdtablesize (); + if (totfds < 0 || totfds > 256) + totfds = 256; + if (fd >= totfds) + totfds = fd + 2; + + dev_fd_list = (char *)xrealloc (dev_fd_list, totfds); + memset (dev_fd_list + ofds, '\0', totfds - ofds); + } + + dev_fd_list[fd] = 1; + nfds++; +} + +int +fifos_pending () +{ + return 0; /* used for cleanup; not needed with /dev/fd */ +} + +int +num_fifos () +{ + return nfds; +} + +void +unlink_fifo (fd) + int fd; +{ + if (dev_fd_list[fd]) + { + close (fd); + dev_fd_list[fd] = 0; + nfds--; + } +} + +void +unlink_fifo_list () +{ + register int i; + + if (nfds == 0) + return; + + for (i = 0; nfds && i < totfds; i++) + unlink_fifo (i); + + nfds = 0; +} + +/* Take LIST, which is a snapshot copy of dev_fd_list from some point in + the past, and close all open fds in dev_fd_list that are not marked + as open in LIST. If LIST is NULL, close everything in dev_fd_list. + LSIZE is the number of elements in LIST, in case it's larger than + totfds (size of dev_fd_list). */ +void +close_new_fifos (list, lsize) + char *list; + int lsize; +{ + int i; + + if (list == 0) + { + unlink_fifo_list (); + return; + } + + for (i = 0; i < lsize; i++) + if (list[i] == 0 && i < totfds && dev_fd_list[i]) + unlink_fifo (i); + + for (i = lsize; i < totfds; i++) + unlink_fifo (i); +} + +#if defined (NOTDEF) +print_dev_fd_list () +{ + register int i; + + fprintf (stderr, "pid %ld: dev_fd_list:", (long)getpid ()); + fflush (stderr); + + for (i = 0; i < totfds; i++) + { + if (dev_fd_list[i]) + fprintf (stderr, " %d", i); + } + fprintf (stderr, "\n"); +} +#endif /* NOTDEF */ + +static char * +make_dev_fd_filename (fd) + int fd; +{ + char *ret, intbuf[INT_STRLEN_BOUND (int) + 1], *p; + + ret = (char *)xmalloc (sizeof (DEV_FD_PREFIX) + 8); + + strcpy (ret, DEV_FD_PREFIX); + p = inttostr (fd, intbuf, sizeof (intbuf)); + strcpy (ret + sizeof (DEV_FD_PREFIX) - 1, p); + + add_fifo_list (fd); + return (ret); +} + +#endif /* HAVE_DEV_FD */ + +/* Return a filename that will open a connection to the process defined by + executing STRING. HAVE_DEV_FD, if defined, means open a pipe and return + a filename in /dev/fd corresponding to a descriptor that is one of the + ends of the pipe. If not defined, we use named pipes on systems that have + them. Systems without /dev/fd and named pipes are out of luck. + + OPEN_FOR_READ_IN_CHILD, if 1, means open the named pipe for reading or + use the read end of the pipe and dup that file descriptor to fd 0 in + the child. If OPEN_FOR_READ_IN_CHILD is 0, we open the named pipe for + writing or use the write end of the pipe in the child, and dup that + file descriptor to fd 1 in the child. The parent does the opposite. */ + +static char * +process_substitute (string, open_for_read_in_child) + char *string; + int open_for_read_in_child; +{ + char *pathname; + int fd, result; + pid_t old_pid, pid; +#if defined (HAVE_DEV_FD) + int parent_pipe_fd, child_pipe_fd; + int fildes[2]; +#endif /* HAVE_DEV_FD */ +#if defined (JOB_CONTROL) + pid_t old_pipeline_pgrp; +#endif + + if (!string || !*string || wordexp_only) + return ((char *)NULL); + +#if !defined (HAVE_DEV_FD) + pathname = make_named_pipe (); +#else /* HAVE_DEV_FD */ + if (pipe (fildes) < 0) + { + sys_error (_("cannot make pipe for process substitution")); + return ((char *)NULL); + } + /* If OPEN_FOR_READ_IN_CHILD == 1, we want to use the write end of + the pipe in the parent, otherwise the read end. */ + parent_pipe_fd = fildes[open_for_read_in_child]; + child_pipe_fd = fildes[1 - open_for_read_in_child]; + /* Move the parent end of the pipe to some high file descriptor, to + avoid clashes with FDs used by the script. */ + parent_pipe_fd = move_to_high_fd (parent_pipe_fd, 1, 64); + + pathname = make_dev_fd_filename (parent_pipe_fd); +#endif /* HAVE_DEV_FD */ + + if (pathname == 0) + { + sys_error (_("cannot make pipe for process substitution")); + return ((char *)NULL); + } + + old_pid = last_made_pid; + +#if defined (JOB_CONTROL) + old_pipeline_pgrp = pipeline_pgrp; + pipeline_pgrp = shell_pgrp; + save_pipeline (1); +#endif /* JOB_CONTROL */ + + pid = make_child ((char *)NULL, 1); + if (pid == 0) + { + reset_terminating_signals (); /* XXX */ + free_pushed_string_input (); + /* Cancel traps, in trap.c. */ + restore_original_signals (); /* XXX - what about special builtins? bash-4.2 */ + setup_async_signals (); + subshell_environment |= SUBSHELL_COMSUB|SUBSHELL_PROCSUB; + } + +#if defined (JOB_CONTROL) + set_sigchld_handler (); + stop_making_children (); + /* XXX - should we only do this in the parent? (as in command subst) */ + pipeline_pgrp = old_pipeline_pgrp; +#endif /* JOB_CONTROL */ + + if (pid < 0) + { + sys_error (_("cannot make child for process substitution")); + free (pathname); +#if defined (HAVE_DEV_FD) + close (parent_pipe_fd); + close (child_pipe_fd); +#endif /* HAVE_DEV_FD */ + return ((char *)NULL); + } + + if (pid > 0) + { +#if defined (JOB_CONTROL) + restore_pipeline (1); +#endif + +#if !defined (HAVE_DEV_FD) + fifo_list[nfifo-1].proc = pid; +#endif + + last_made_pid = old_pid; + +#if defined (JOB_CONTROL) && defined (PGRP_PIPE) + close_pgrp_pipe (); +#endif /* JOB_CONTROL && PGRP_PIPE */ + +#if defined (HAVE_DEV_FD) + close (child_pipe_fd); +#endif /* HAVE_DEV_FD */ + + return (pathname); + } + + set_sigint_handler (); + +#if defined (JOB_CONTROL) + set_job_control (0); +#endif /* JOB_CONTROL */ + +#if !defined (HAVE_DEV_FD) + /* Open the named pipe in the child. */ + fd = open (pathname, open_for_read_in_child ? O_RDONLY : O_WRONLY); + if (fd < 0) + { + /* Two separate strings for ease of translation. */ + if (open_for_read_in_child) + sys_error (_("cannot open named pipe %s for reading"), pathname); + else + sys_error (_("cannot open named pipe %s for writing"), pathname); + + exit (127); + } + if (open_for_read_in_child) + { + if (sh_unset_nodelay_mode (fd) < 0) + { + sys_error (_("cannot reset nodelay mode for fd %d"), fd); + exit (127); + } + } +#else /* HAVE_DEV_FD */ + fd = child_pipe_fd; +#endif /* HAVE_DEV_FD */ + + if (dup2 (fd, open_for_read_in_child ? 0 : 1) < 0) + { + sys_error (_("cannot duplicate named pipe %s as fd %d"), pathname, + open_for_read_in_child ? 0 : 1); + exit (127); + } + + if (fd != (open_for_read_in_child ? 0 : 1)) + close (fd); + + /* Need to close any files that this process has open to pipes inherited + from its parent. */ + if (current_fds_to_close) + { + close_fd_bitmap (current_fds_to_close); + current_fds_to_close = (struct fd_bitmap *)NULL; + } + +#if defined (HAVE_DEV_FD) + /* Make sure we close the parent's end of the pipe and clear the slot + in the fd list so it is not closed later, if reallocated by, for + instance, pipe(2). */ + close (parent_pipe_fd); + dev_fd_list[parent_pipe_fd] = 0; +#endif /* HAVE_DEV_FD */ + + /* subshells shouldn't have this flag, which controls using the temporary + environment for variable lookups. */ + expanding_redir = 0; + + result = parse_and_execute (string, "process substitution", (SEVAL_NONINT|SEVAL_NOHIST)); + +#if !defined (HAVE_DEV_FD) + /* Make sure we close the named pipe in the child before we exit. */ + close (open_for_read_in_child ? 0 : 1); +#endif /* !HAVE_DEV_FD */ + + last_command_exit_value = result; + result = run_exit_trap (); + exit (result); + /*NOTREACHED*/ +} +#endif /* PROCESS_SUBSTITUTION */ + +/***********************************/ +/* */ +/* Command Substitution */ +/* */ +/***********************************/ + +static char * +read_comsub (fd, quoted, rflag) + int fd, quoted; + int *rflag; +{ + char *istring, buf[128], *bufp, *s; + int istring_index, istring_size, c, tflag, skip_ctlesc, skip_ctlnul; + ssize_t bufn; + + istring = (char *)NULL; + istring_index = istring_size = bufn = tflag = 0; + + for (skip_ctlesc = skip_ctlnul = 0, s = ifs_value; s && *s; s++) + skip_ctlesc |= *s == CTLESC, skip_ctlnul |= *s == CTLNUL; + + /* Read the output of the command through the pipe. This may need to be + changed to understand multibyte characters in the future. */ + while (1) + { + if (fd < 0) + break; + if (--bufn <= 0) + { + bufn = zread (fd, buf, sizeof (buf)); + if (bufn <= 0) + break; + bufp = buf; + } + c = *bufp++; + + if (c == 0) + { +#if 0 + internal_warning ("read_comsub: ignored null byte in input"); +#endif + continue; + } + + /* Add the character to ISTRING, possibly after resizing it. */ + RESIZE_MALLOCED_BUFFER (istring, istring_index, 2, istring_size, DEFAULT_ARRAY_SIZE); + + /* This is essentially quote_string inline */ + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) /* || c == CTLESC || c == CTLNUL */) + istring[istring_index++] = CTLESC; + /* Escape CTLESC and CTLNUL in the output to protect those characters + from the rest of the word expansions (word splitting and globbing.) + This is essentially quote_escapes inline. */ + else if (skip_ctlesc == 0 && c == CTLESC) + { + tflag |= W_HASCTLESC; + istring[istring_index++] = CTLESC; + } + else if ((skip_ctlnul == 0 && c == CTLNUL) || (c == ' ' && (ifs_value && *ifs_value == 0))) + istring[istring_index++] = CTLESC; + + istring[istring_index++] = c; + +#if 0 +#if defined (__CYGWIN__) + if (c == '\n' && istring_index > 1 && istring[istring_index - 2] == '\r') + { + istring_index--; + istring[istring_index - 1] = '\n'; + } +#endif +#endif + } + + if (istring) + istring[istring_index] = '\0'; + + /* If we read no output, just return now and save ourselves some + trouble. */ + if (istring_index == 0) + { + FREE (istring); + if (rflag) + *rflag = tflag; + return (char *)NULL; + } + + /* Strip trailing newlines from the output of the command. */ + if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) + { + while (istring_index > 0) + { + if (istring[istring_index - 1] == '\n') + { + --istring_index; + + /* If the newline was quoted, remove the quoting char. */ + if (istring[istring_index - 1] == CTLESC) + --istring_index; + } + else + break; + } + istring[istring_index] = '\0'; + } + else + strip_trailing (istring, istring_index - 1, 1); + + if (rflag) + *rflag = tflag; + return istring; +} + +/* Perform command substitution on STRING. This returns a WORD_DESC * with the + contained string possibly quoted. */ +WORD_DESC * +command_substitute (string, quoted) + char *string; + int quoted; +{ + pid_t pid, old_pid, old_pipeline_pgrp, old_async_pid; + char *istring; + int result, fildes[2], function_value, pflags, rc, tflag; + WORD_DESC *ret; + + istring = (char *)NULL; + + /* Don't fork () if there is no need to. In the case of no command to + run, just return NULL. */ + if (!string || !*string || (string[0] == '\n' && !string[1])) + return ((WORD_DESC *)NULL); + + if (wordexp_only && read_but_dont_execute) + { + last_command_exit_value = EX_WEXPCOMSUB; + jump_to_top_level (EXITPROG); + } + + /* We're making the assumption here that the command substitution will + eventually run a command from the file system. Since we'll run + maybe_make_export_env in this subshell before executing that command, + the parent shell and any other shells it starts will have to remake + the environment. If we make it before we fork, other shells won't + have to. Don't bother if we have any temporary variable assignments, + though, because the export environment will be remade after this + command completes anyway, but do it if all the words to be expanded + are variable assignments. */ + if (subst_assign_varlist == 0 || garglist == 0) + maybe_make_export_env (); /* XXX */ + + /* Flags to pass to parse_and_execute() */ + pflags = (interactive && sourcelevel == 0) ? SEVAL_RESETLINE : 0; + + /* Pipe the output of executing STRING into the current shell. */ + if (pipe (fildes) < 0) + { + sys_error (_("cannot make pipe for command substitution")); + goto error_exit; + } + + old_pid = last_made_pid; +#if defined (JOB_CONTROL) + old_pipeline_pgrp = pipeline_pgrp; + /* Don't reset the pipeline pgrp if we're already a subshell in a pipeline. */ + if ((subshell_environment & SUBSHELL_PIPE) == 0) + pipeline_pgrp = shell_pgrp; + cleanup_the_pipeline (); +#endif /* JOB_CONTROL */ + + old_async_pid = last_asynchronous_pid; + pid = make_child ((char *)NULL, subshell_environment&SUBSHELL_ASYNC); + last_asynchronous_pid = old_async_pid; + + if (pid == 0) + { + /* Reset the signal handlers in the child, but don't free the + trap strings. Set a flag noting that we have to free the + trap strings if we run trap to change a signal disposition. */ + reset_signal_handlers (); + subshell_environment |= SUBSHELL_RESETTRAP; + } + +#if defined (JOB_CONTROL) + /* XXX DO THIS ONLY IN PARENT ? XXX */ + set_sigchld_handler (); + stop_making_children (); + if (pid != 0) + pipeline_pgrp = old_pipeline_pgrp; +#else + stop_making_children (); +#endif /* JOB_CONTROL */ + + if (pid < 0) + { + sys_error (_("cannot make child for command substitution")); + error_exit: + + last_made_pid = old_pid; + + FREE (istring); + close (fildes[0]); + close (fildes[1]); + return ((WORD_DESC *)NULL); + } + + if (pid == 0) + { + set_sigint_handler (); /* XXX */ + + free_pushed_string_input (); + + if (dup2 (fildes[1], 1) < 0) + { + sys_error (_("command_substitute: cannot duplicate pipe as fd 1")); + exit (EXECUTION_FAILURE); + } + + /* If standard output is closed in the parent shell + (such as after `exec >&-'), file descriptor 1 will be + the lowest available file descriptor, and end up in + fildes[0]. This can happen for stdin and stderr as well, + but stdout is more important -- it will cause no output + to be generated from this command. */ + if ((fildes[1] != fileno (stdin)) && + (fildes[1] != fileno (stdout)) && + (fildes[1] != fileno (stderr))) + close (fildes[1]); + + if ((fildes[0] != fileno (stdin)) && + (fildes[0] != fileno (stdout)) && + (fildes[0] != fileno (stderr))) + close (fildes[0]); + +#ifdef __CYGWIN__ + /* Let stdio know the fd may have changed from text to binary mode, and + make sure to preserve stdout line buffering. */ + freopen (NULL, "w", stdout); + sh_setlinebuf (stdout); +#endif /* __CYGWIN__ */ + + /* The currently executing shell is not interactive. */ + interactive = 0; + + /* This is a subshell environment. */ + subshell_environment |= SUBSHELL_COMSUB; + + /* When not in POSIX mode, command substitution does not inherit + the -e flag. */ + if (posixly_correct == 0) + { + builtin_ignoring_errexit = 0; + change_flag ('e', FLAG_OFF); + set_shellopts (); + } + + remove_quoted_escapes (string); + + startup_state = 2; /* see if we can avoid a fork */ + /* Give command substitution a place to jump back to on failure, + so we don't go back up to main (). */ + result = setjmp_nosigs (top_level); + + /* If we're running a command substitution inside a shell function, + trap `return' so we don't return from the function in the subshell + and go off to never-never land. */ + if (result == 0 && return_catch_flag) + function_value = setjmp_nosigs (return_catch); + else + function_value = 0; + + if (result == ERREXIT) + rc = last_command_exit_value; + else if (result == EXITPROG) + rc = last_command_exit_value; + else if (result) + rc = EXECUTION_FAILURE; + else if (function_value) + rc = return_catch_value; + else + { + subshell_level++; + rc = parse_and_execute (string, "command substitution", pflags|SEVAL_NOHIST); + subshell_level--; + } + + last_command_exit_value = rc; + rc = run_exit_trap (); +#if defined (PROCESS_SUBSTITUTION) + unlink_fifo_list (); +#endif + exit (rc); + } + else + { +#if defined (JOB_CONTROL) && defined (PGRP_PIPE) + close_pgrp_pipe (); +#endif /* JOB_CONTROL && PGRP_PIPE */ +itrace("command_substitute: child pid = %d", pid); + + close (fildes[1]); + + tflag = 0; + istring = read_comsub (fildes[0], quoted, &tflag); + + close (fildes[0]); + + current_command_subst_pid = pid; + last_command_exit_value = wait_for (pid); + last_command_subst_pid = pid; + last_made_pid = old_pid; + +#if defined (JOB_CONTROL) + /* If last_command_exit_value > 128, then the substituted command + was terminated by a signal. If that signal was SIGINT, then send + SIGINT to ourselves. This will break out of loops, for instance. */ + if (last_command_exit_value == (128 + SIGINT) && last_command_exit_signal == SIGINT) + kill (getpid (), SIGINT); + + /* wait_for gives the terminal back to shell_pgrp. If some other + process group should have it, give it away to that group here. + pipeline_pgrp is non-zero only while we are constructing a + pipeline, so what we are concerned about is whether or not that + pipeline was started in the background. A pipeline started in + the background should never get the tty back here. */ + if (interactive && pipeline_pgrp != (pid_t)0 && (subshell_environment & SUBSHELL_ASYNC) == 0) +{ +itrace("command_substitute: giving terminal to %d: job control = %d", pipeline_pgrp, job_control); + give_terminal_to (pipeline_pgrp, 0); +} +#endif /* JOB_CONTROL */ + + ret = alloc_word_desc (); + ret->word = istring; + ret->flags = tflag; + + return ret; + } +} + +/******************************************************** + * * + * Utility functions for parameter expansion * + * * + ********************************************************/ + +#if defined (ARRAY_VARS) + +static arrayind_t +array_length_reference (s) + char *s; +{ + int len; + arrayind_t ind; + char *akey; + char *t, c; + ARRAY *array; + HASH_TABLE *h; + SHELL_VAR *var; + + var = array_variable_part (s, &t, &len); + + /* If unbound variables should generate an error, report one and return + failure. */ + if ((var == 0 || invisible_p (var) || (assoc_p (var) == 0 && array_p (var) == 0)) && unbound_vars_is_error) + { + c = *--t; + *t = '\0'; + last_command_exit_value = EXECUTION_FAILURE; + err_unboundvar (s); + *t = c; + return (-1); + } + else if (var == 0 || invisible_p (var)) + return 0; + + /* We support a couple of expansions for variables that are not arrays. + We'll return the length of the value for v[0], and 1 for v[@] or + v[*]. Return 0 for everything else. */ + + array = array_p (var) ? array_cell (var) : (ARRAY *)NULL; + h = assoc_p (var) ? assoc_cell (var) : (HASH_TABLE *)NULL; + + if (ALL_ELEMENT_SUB (t[0]) && t[1] == ']') + { + if (assoc_p (var)) + return (h ? assoc_num_elements (h) : 0); + else if (array_p (var)) + return (array ? array_num_elements (array) : 0); + else + return (var_isset (var) ? 1 : 0); + } + + if (assoc_p (var)) + { + t[len - 1] = '\0'; + akey = expand_assignment_string_to_string (t, 0); /* [ */ + t[len - 1] = ']'; + if (akey == 0 || *akey == 0) + { + err_badarraysub (t); + FREE (akey); + return (-1); + } + t = assoc_reference (assoc_cell (var), akey); + free (akey); + } + else + { + ind = array_expand_index (var, t, len); + /* negative subscripts to indexed arrays count back from end */ + if (var && array_p (var) && ind < 0) + ind = array_max_index (array_cell (var)) + 1 + ind; + if (ind < 0) + { + err_badarraysub (t); + return (-1); + } + if (array_p (var)) + t = array_reference (array, ind); + else + t = (ind == 0) ? value_cell (var) : (char *)NULL; + } + + len = MB_STRLEN (t); + return (len); +} +#endif /* ARRAY_VARS */ + +static int +valid_brace_expansion_word (name, var_is_special) + char *name; + int var_is_special; +{ + if (DIGIT (*name) && all_digits (name)) + return 1; + else if (var_is_special) + return 1; +#if defined (ARRAY_VARS) + else if (valid_array_reference (name)) + return 1; +#endif /* ARRAY_VARS */ + else if (legal_identifier (name)) + return 1; + else + return 0; +} + +static int +chk_atstar (name, quoted, quoted_dollar_atp, contains_dollar_at) + char *name; + int quoted; + int *quoted_dollar_atp, *contains_dollar_at; +{ + char *temp1; + + if (name == 0) + { + if (quoted_dollar_atp) + *quoted_dollar_atp = 0; + if (contains_dollar_at) + *contains_dollar_at = 0; + return 0; + } + + /* check for $@ and $* */ + if (name[0] == '@' && name[1] == 0) + { + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp) + *quoted_dollar_atp = 1; + if (contains_dollar_at) + *contains_dollar_at = 1; + return 1; + } + else if (name[0] == '*' && name[1] == '\0' && quoted == 0) + { + if (contains_dollar_at) + *contains_dollar_at = 1; + return 1; + } + + /* Now check for ${array[@]} and ${array[*]} */ +#if defined (ARRAY_VARS) + else if (valid_array_reference (name)) + { + temp1 = mbschr (name, '['); + if (temp1 && temp1[1] == '@' && temp1[2] == ']') + { + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp) + *quoted_dollar_atp = 1; + if (contains_dollar_at) + *contains_dollar_at = 1; + return 1; + } /* [ */ + /* ${array[*]}, when unquoted, should be treated like ${array[@]}, + which should result in separate words even when IFS is unset. */ + if (temp1 && temp1[1] == '*' && temp1[2] == ']' && quoted == 0) + { + if (contains_dollar_at) + *contains_dollar_at = 1; + return 1; + } + } +#endif + return 0; +} + +/* Parameter expand NAME, and return a new string which is the expansion, + or NULL if there was no expansion. + VAR_IS_SPECIAL is non-zero if NAME is one of the special variables in + the shell, e.g., "@", "$", "*", etc. QUOTED, if non-zero, means that + NAME was found inside of a double-quoted expression. */ +static WORD_DESC * +parameter_brace_expand_word (name, var_is_special, quoted, pflags, indp) + char *name; + int var_is_special, quoted, pflags; + arrayind_t *indp; +{ + WORD_DESC *ret; + char *temp, *tt; + intmax_t arg_index; + SHELL_VAR *var; + int atype, rflags; + arrayind_t ind; + + ret = 0; + temp = 0; + rflags = 0; + + if (indp) + *indp = INTMAX_MIN; + + /* Handle multiple digit arguments, as in ${11}. */ + if (legal_number (name, &arg_index)) + { + tt = get_dollar_var_value (arg_index); + if (tt) + temp = (*tt && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))) + ? quote_string (tt) + : quote_escapes (tt); + else + temp = (char *)NULL; + FREE (tt); + } + else if (var_is_special) /* ${@} */ + { + int sindex; + tt = (char *)xmalloc (2 + strlen (name)); + tt[sindex = 0] = '$'; + strcpy (tt + 1, name); + + ret = param_expand (tt, &sindex, quoted, (int *)NULL, (int *)NULL, + (int *)NULL, (int *)NULL, pflags); + free (tt); + } +#if defined (ARRAY_VARS) + else if (valid_array_reference (name)) + { +expand_arrayref: + /* XXX - does this leak if name[@] or name[*]? */ + if (pflags & PF_ASSIGNRHS) + { + temp = array_variable_name (name, &tt, (int *)0); + if (ALL_ELEMENT_SUB (tt[0]) && tt[1] == ']') + temp = array_value (name, quoted|Q_DOUBLE_QUOTES, 0, &atype, &ind); + else + temp = array_value (name, quoted, 0, &atype, &ind); + } + else + temp = array_value (name, quoted, 0, &atype, &ind); + if (atype == 0 && temp) + { + temp = (*temp && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))) + ? quote_string (temp) + : quote_escapes (temp); + rflags |= W_ARRAYIND; + if (indp) + *indp = ind; + } + else if (atype == 1 && temp && QUOTED_NULL (temp) && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))) + rflags |= W_HASQUOTEDNULL; + } +#endif + else if (var = find_variable (name)) + { + if (var_isset (var) && invisible_p (var) == 0) + { +#if defined (ARRAY_VARS) + if (assoc_p (var)) + temp = assoc_reference (assoc_cell (var), "0"); + else if (array_p (var)) + temp = array_reference (array_cell (var), 0); + else + temp = value_cell (var); +#else + temp = value_cell (var); +#endif + + if (temp) + temp = (*temp && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))) + ? quote_string (temp) + : quote_escapes (temp); + } + else + temp = (char *)NULL; + } + else if (var = find_variable_last_nameref (name)) + { + temp = nameref_cell (var); +#if defined (ARRAY_VARS) + /* Handle expanding nameref whose value is x[n] */ + if (temp && *temp && valid_array_reference (temp)) + { + name = temp; + goto expand_arrayref; + } + else +#endif + /* y=2 ; typeset -n x=y; echo ${x} is not the same as echo ${2} in ksh */ + if (temp && *temp && legal_identifier (temp) == 0) + { + last_command_exit_value = EXECUTION_FAILURE; + report_error (_("%s: invalid variable name for name reference"), temp); + temp = &expand_param_error; + } + else + temp = (char *)NULL; + } + else + temp = (char *)NULL; + + if (ret == 0) + { + ret = alloc_word_desc (); + ret->word = temp; + ret->flags |= rflags; + } + return ret; +} + +static char * +parameter_brace_find_indir (name, var_is_special, quoted, find_nameref) + char *name; + int var_is_special, quoted, find_nameref; +{ + char *temp, *t; + WORD_DESC *w; + SHELL_VAR *v; + + if (find_nameref && var_is_special == 0 && (v = find_variable_last_nameref (name)) && + nameref_p (v) && (t = nameref_cell (v)) && *t) + return (savestring (t)); + + /* If var_is_special == 0, and name is not an array reference, this does + more expansion than necessary. It should really look up the variable's + value and not try to expand it. */ + w = parameter_brace_expand_word (name, var_is_special, quoted, PF_IGNUNBOUND, 0); + t = w->word; + /* Have to dequote here if necessary */ + if (t) + { + temp = (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) + ? dequote_string (t) + : dequote_escapes (t); + free (t); + t = temp; + } + dispose_word_desc (w); + + return t; +} + +/* Expand an indirect reference to a variable: ${!NAME} expands to the + value of the variable whose name is the value of NAME. */ +static WORD_DESC * +parameter_brace_expand_indir (name, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at) + char *name; + int var_is_special, quoted; + int *quoted_dollar_atp, *contains_dollar_at; +{ + char *temp, *t; + WORD_DESC *w; + SHELL_VAR *v; + + /* See if it's a nameref first, behave in ksh93-compatible fashion. + There is at least one incompatibility: given ${!foo[0]} where foo=bar, + bash performs an indirect lookup on foo[0] and expands the result; + ksh93 expands bar[0]. We could do that here -- there are enough usable + primitives to do that -- but do not at this point. */ + if (var_is_special == 0 && (v = find_variable_last_nameref (name))) + { + if (nameref_p (v) && (t = nameref_cell (v)) && *t) + { + w = alloc_word_desc (); + w->word = savestring (t); + w->flags = 0; + return w; + } + } + + t = parameter_brace_find_indir (name, var_is_special, quoted, 0); + + chk_atstar (t, quoted, quoted_dollar_atp, contains_dollar_at); + if (t == 0) + return (WORD_DESC *)NULL; + + w = parameter_brace_expand_word (t, SPECIAL_VAR(t, 0), quoted, 0, 0); + free (t); + + return w; +} + +/* Expand the right side of a parameter expansion of the form ${NAMEcVALUE}, + depending on the value of C, the separating character. C can be one of + "-", "+", or "=". QUOTED is true if the entire brace expression occurs + between double quotes. */ +static WORD_DESC * +parameter_brace_expand_rhs (name, value, c, quoted, qdollaratp, hasdollarat) + char *name, *value; + int c, quoted, *qdollaratp, *hasdollarat; +{ + WORD_DESC *w; + WORD_LIST *l; + char *t, *t1, *temp; + int hasdol; + + /* If the entire expression is between double quotes, we want to treat + the value as a double-quoted string, with the exception that we strip + embedded unescaped double quotes (for sh backwards compatibility). */ + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && *value) + { + hasdol = 0; + temp = string_extract_double_quoted (value, &hasdol, 1); + } + else + temp = value; + + w = alloc_word_desc (); + hasdol = 0; + /* XXX was 0 not quoted */ + l = *temp ? expand_string_for_rhs (temp, quoted, &hasdol, (int *)NULL) + : (WORD_LIST *)0; + if (hasdollarat) + *hasdollarat = hasdol || (l && l->next); + if (temp != value) + free (temp); + if (l) + { + /* The expansion of TEMP returned something. We need to treat things + slightly differently if HASDOL is non-zero. If we have "$@", the + individual words have already been quoted. We need to turn them + into a string with the words separated by the first character of + $IFS without any additional quoting, so string_list_dollar_at won't + do the right thing. We use string_list_dollar_star instead. */ + temp = (hasdol || l->next) ? string_list_dollar_star (l) : string_list (l); + + /* If l->next is not null, we know that TEMP contained "$@", since that + is the only expansion that creates more than one word. */ + if (qdollaratp && ((hasdol && quoted) || l->next)) + *qdollaratp = 1; + /* If we have a quoted null result (QUOTED_NULL(temp)) and the word is + a quoted null (l->next == 0 && QUOTED_NULL(l->word->word)), the + flags indicate it (l->word->flags & W_HASQUOTEDNULL), and the + expansion is quoted (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) + (which is more paranoia than anything else), we need to return the + quoted null string and set the flags to indicate it. */ + if (l->next == 0 && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && QUOTED_NULL (temp) && QUOTED_NULL (l->word->word) && (l->word->flags & W_HASQUOTEDNULL)) + { + w->flags |= W_HASQUOTEDNULL; + } + dispose_words (l); + } + else if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && hasdol) + { + /* The brace expansion occurred between double quotes and there was + a $@ in TEMP. It does not matter if the $@ is quoted, as long as + it does not expand to anything. In this case, we want to return + a quoted empty string. */ + temp = make_quoted_char ('\0'); + w->flags |= W_HASQUOTEDNULL; + } + else + temp = (char *)NULL; + + if (c == '-' || c == '+') + { + w->word = temp; + return w; + } + + /* c == '=' */ + t = temp ? savestring (temp) : savestring (""); + t1 = dequote_string (t); + free (t); +#if defined (ARRAY_VARS) + if (valid_array_reference (name)) + assign_array_element (name, t1, 0); + else +#endif /* ARRAY_VARS */ + bind_variable (name, t1, 0); +#if 0 + if (STREQ (name, "IFS") == 0) +#endif + stupidly_hack_special_variables (name); + + /* From Posix group discussion Feb-March 2010. Issue 7 0000221 */ + free (temp); + + w->word = t1; + return w; +} + +/* Deal with the right hand side of a ${name:?value} expansion in the case + that NAME is null or not set. If VALUE is non-null it is expanded and + used as the error message to print, otherwise a standard message is + printed. */ +static void +parameter_brace_expand_error (name, value) + char *name, *value; +{ + WORD_LIST *l; + char *temp; + + last_command_exit_value = EXECUTION_FAILURE; /* ensure it's non-zero */ + if (value && *value) + { + l = expand_string (value, 0); + temp = string_list (l); + report_error ("%s: %s", name, temp ? temp : ""); /* XXX was value not "" */ + FREE (temp); + dispose_words (l); + } + else + report_error (_("%s: parameter null or not set"), name); + + /* Free the data we have allocated during this expansion, since we + are about to longjmp out. */ + free (name); + FREE (value); +} + +/* Return 1 if NAME is something for which parameter_brace_expand_length is + OK to do. */ +static int +valid_length_expression (name) + char *name; +{ + return (name[1] == '\0' || /* ${#} */ + ((sh_syntaxtab[(unsigned char) name[1]] & CSPECVAR) && name[2] == '\0') || /* special param */ + (DIGIT (name[1]) && all_digits (name + 1)) || /* ${#11} */ +#if defined (ARRAY_VARS) + valid_array_reference (name + 1) || /* ${#a[7]} */ +#endif + legal_identifier (name + 1)); /* ${#PS1} */ +} + +/* Handle the parameter brace expansion that requires us to return the + length of a parameter. */ +static intmax_t +parameter_brace_expand_length (name) + char *name; +{ + char *t, *newname; + intmax_t number, arg_index; + WORD_LIST *list; +#if defined (ARRAY_VARS) + SHELL_VAR *var; +#endif + + if (name[1] == '\0') /* ${#} */ + number = number_of_args (); + else if ((name[1] == '@' || name[1] == '*') && name[2] == '\0') /* ${#@}, ${#*} */ + number = number_of_args (); + else if ((sh_syntaxtab[(unsigned char) name[1]] & CSPECVAR) && name[2] == '\0') + { + /* Take the lengths of some of the shell's special parameters. */ + switch (name[1]) + { + case '-': + t = which_set_flags (); + break; + case '?': + t = itos (last_command_exit_value); + break; + case '$': + t = itos (dollar_dollar_pid); + break; + case '!': + if (last_asynchronous_pid == NO_PID) + t = (char *)NULL; /* XXX - error if set -u set? */ + else + t = itos (last_asynchronous_pid); + break; + case '#': + t = itos (number_of_args ()); + break; + } + number = STRLEN (t); + FREE (t); + } +#if defined (ARRAY_VARS) + else if (valid_array_reference (name + 1)) + number = array_length_reference (name + 1); +#endif /* ARRAY_VARS */ + else + { + number = 0; + + if (legal_number (name + 1, &arg_index)) /* ${#1} */ + { + t = get_dollar_var_value (arg_index); + if (t == 0 && unbound_vars_is_error) + return INTMAX_MIN; + number = MB_STRLEN (t); + FREE (t); + } +#if defined (ARRAY_VARS) + else if ((var = find_variable (name + 1)) && (invisible_p (var) == 0) && (array_p (var) || assoc_p (var))) + { + if (assoc_p (var)) + t = assoc_reference (assoc_cell (var), "0"); + else + t = array_reference (array_cell (var), 0); + if (t == 0 && unbound_vars_is_error) + return INTMAX_MIN; + number = MB_STRLEN (t); + } +#endif + else /* ${#PS1} */ + { + newname = savestring (name); + newname[0] = '$'; + list = expand_string (newname, Q_DOUBLE_QUOTES); + t = list ? string_list (list) : (char *)NULL; + free (newname); + if (list) + dispose_words (list); + + number = t ? MB_STRLEN (t) : 0; + FREE (t); + } + } + + return (number); +} + +/* Skip characters in SUBSTR until DELIM. SUBSTR is an arithmetic expression, + so we do some ad-hoc parsing of an arithmetic expression to find + the first DELIM, instead of using strchr(3). Two rules: + 1. If the substring contains a `(', read until closing `)'. + 2. If the substring contains a `?', read past one `:' for each `?'. +*/ + +static char * +skiparith (substr, delim) + char *substr; + int delim; +{ + size_t sublen; + int skipcol, pcount, i; + DECLARE_MBSTATE; + + sublen = strlen (substr); + i = skipcol = pcount = 0; + while (substr[i]) + { + /* Balance parens */ + if (substr[i] == LPAREN) + { + pcount++; + i++; + continue; + } + if (substr[i] == RPAREN && pcount) + { + pcount--; + i++; + continue; + } + if (pcount) + { + ADVANCE_CHAR (substr, sublen, i); + continue; + } + + /* Skip one `:' for each `?' */ + if (substr[i] == ':' && skipcol) + { + skipcol--; + i++; + continue; + } + if (substr[i] == delim) + break; + if (substr[i] == '?') + { + skipcol++; + i++; + continue; + } + ADVANCE_CHAR (substr, sublen, i); + } + + return (substr + i); +} + +/* Verify and limit the start and end of the desired substring. If + VTYPE == 0, a regular shell variable is being used; if it is 1, + then the positional parameters are being used; if it is 2, then + VALUE is really a pointer to an array variable that should be used. + Return value is 1 if both values were OK, 0 if there was a problem + with an invalid expression, or -1 if the values were out of range. */ +static int +verify_substring_values (v, value, substr, vtype, e1p, e2p) + SHELL_VAR *v; + char *value, *substr; + int vtype; + intmax_t *e1p, *e2p; +{ + char *t, *temp1, *temp2; + arrayind_t len; + int expok; +#if defined (ARRAY_VARS) + ARRAY *a; + HASH_TABLE *h; +#endif + + /* duplicate behavior of strchr(3) */ + t = skiparith (substr, ':'); + if (*t && *t == ':') + *t = '\0'; + else + t = (char *)0; + + temp1 = expand_arith_string (substr, Q_DOUBLE_QUOTES); + *e1p = evalexp (temp1, &expok); + free (temp1); + if (expok == 0) + return (0); + + len = -1; /* paranoia */ + switch (vtype) + { + case VT_VARIABLE: + case VT_ARRAYMEMBER: + len = MB_STRLEN (value); + break; + case VT_POSPARMS: + len = number_of_args () + 1; + if (*e1p == 0) + len++; /* add one arg if counting from $0 */ + break; +#if defined (ARRAY_VARS) + case VT_ARRAYVAR: + /* For arrays, the first value deals with array indices. Negative + offsets count from one past the array's maximum index. Associative + arrays treat the number of elements as the maximum index. */ + if (assoc_p (v)) + { + h = assoc_cell (v); + len = assoc_num_elements (h) + (*e1p < 0); + } + else + { + a = (ARRAY *)value; + len = array_max_index (a) + (*e1p < 0); /* arrays index from 0 to n - 1 */ + } + break; +#endif + } + + if (len == -1) /* paranoia */ + return -1; + + if (*e1p < 0) /* negative offsets count from end */ + *e1p += len; + + if (*e1p > len || *e1p < 0) + return (-1); + +#if defined (ARRAY_VARS) + /* For arrays, the second offset deals with the number of elements. */ + if (vtype == VT_ARRAYVAR) + len = assoc_p (v) ? assoc_num_elements (h) : array_num_elements (a); +#endif + + if (t) + { + t++; + temp2 = savestring (t); + temp1 = expand_arith_string (temp2, Q_DOUBLE_QUOTES); + free (temp2); + t[-1] = ':'; + *e2p = evalexp (temp1, &expok); + free (temp1); + if (expok == 0) + return (0); +#if 1 + if ((vtype == VT_ARRAYVAR || vtype == VT_POSPARMS) && *e2p < 0) +#else + /* bash-4.3: allow positional parameter length < 0 to count backwards + from end of positional parameters */ + if (vtype == VT_ARRAYVAR && *e2p < 0) +#endif + { + internal_error (_("%s: substring expression < 0"), t); + return (0); + } +#if defined (ARRAY_VARS) + /* In order to deal with sparse arrays, push the intelligence about how + to deal with the number of elements desired down to the array- + specific functions. */ + if (vtype != VT_ARRAYVAR) +#endif + { + if (*e2p < 0) + { + *e2p += len; + if (*e2p < 0 || *e2p < *e1p) + { + internal_error (_("%s: substring expression < 0"), t); + return (0); + } + } + else + *e2p += *e1p; /* want E2 chars starting at E1 */ + if (*e2p > len) + *e2p = len; + } + } + else + *e2p = len; + + return (1); +} + +/* Return the type of variable specified by VARNAME (simple variable, + positional param, or array variable). Also return the value specified + by VARNAME (value of a variable or a reference to an array element). + QUOTED is the standard description of quoting state, using Q_* defines. + FLAGS is currently a set of flags to pass to array_value. If IND is + non-null and not INTMAX_MIN, and FLAGS includes AV_USEIND, IND is + passed to array_value so the array index is not computed again. + If this returns VT_VARIABLE, the caller assumes that CTLESC and CTLNUL + characters in the value are quoted with CTLESC and takes appropriate + steps. For convenience, *VALP is set to the dequoted VALUE. */ +static int +get_var_and_type (varname, value, ind, quoted, flags, varp, valp) + char *varname, *value; + arrayind_t ind; + int quoted, flags; + SHELL_VAR **varp; + char **valp; +{ + int vtype, want_indir; + char *temp, *vname; + WORD_DESC *wd; +#if defined (ARRAY_VARS) + SHELL_VAR *v; +#endif + arrayind_t lind; + + want_indir = *varname == '!' && + (legal_variable_starter ((unsigned char)varname[1]) || DIGIT (varname[1]) + || VALID_INDIR_PARAM (varname[1])); + if (want_indir) + vname = parameter_brace_find_indir (varname+1, SPECIAL_VAR (varname, 1), quoted, 1); + else + vname = varname; + + /* This sets vtype to VT_VARIABLE or VT_POSPARMS */ + vtype = (vname[0] == '@' || vname[0] == '*') && vname[1] == '\0'; + if (vtype == VT_POSPARMS && vname[0] == '*') + vtype |= VT_STARSUB; + *varp = (SHELL_VAR *)NULL; + +#if defined (ARRAY_VARS) + if (valid_array_reference (vname)) + { + v = array_variable_part (vname, &temp, (int *)0); + /* If we want to signal array_value to use an already-computed index, + set LIND to that index */ + lind = (ind != INTMAX_MIN && (flags & AV_USEIND)) ? ind : 0; + if (v && invisible_p (v)) + { + vtype = VT_ARRAYMEMBER; + *varp = (SHELL_VAR *)NULL; + *valp = (char *)NULL; + } + if (v && (array_p (v) || assoc_p (v))) + { /* [ */ + if (ALL_ELEMENT_SUB (temp[0]) && temp[1] == ']') + { + /* Callers have to differentiate between indexed and associative */ + vtype = VT_ARRAYVAR; + if (temp[0] == '*') + vtype |= VT_STARSUB; + *valp = array_p (v) ? (char *)array_cell (v) : (char *)assoc_cell (v); + } + else + { + vtype = VT_ARRAYMEMBER; + *valp = array_value (vname, Q_DOUBLE_QUOTES, flags, (int *)NULL, &lind); + } + *varp = v; + } + else if (v && (ALL_ELEMENT_SUB (temp[0]) && temp[1] == ']')) + { + vtype = VT_VARIABLE; + *varp = v; + if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) + *valp = dequote_string (value); + else + *valp = dequote_escapes (value); + } + else + { + vtype = VT_ARRAYMEMBER; + *varp = v; + *valp = array_value (vname, Q_DOUBLE_QUOTES, flags, (int *)NULL, &lind); + } + } + else if ((v = find_variable (vname)) && (invisible_p (v) == 0) && (assoc_p (v) || array_p (v))) + { + vtype = VT_ARRAYMEMBER; + *varp = v; + *valp = assoc_p (v) ? assoc_reference (assoc_cell (v), "0") : array_reference (array_cell (v), 0); + } + else +#endif + { + if (value && vtype == VT_VARIABLE) + { + if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) + *valp = dequote_string (value); + else + *valp = dequote_escapes (value); + } + else + *valp = value; + } + + if (want_indir) + free (vname); + + return vtype; +} + +/******************************************************/ +/* */ +/* Functions to extract substrings of variable values */ +/* */ +/******************************************************/ + +#if defined (HANDLE_MULTIBYTE) +/* Character-oriented rather than strictly byte-oriented substrings. S and + E, rather being strict indices into STRING, indicate character (possibly + multibyte character) positions that require calculation. + Used by the ${param:offset[:length]} expansion. */ +static char * +mb_substring (string, s, e) + char *string; + int s, e; +{ + char *tt; + int start, stop, i, slen; + DECLARE_MBSTATE; + + start = 0; + /* Don't need string length in ADVANCE_CHAR unless multibyte chars possible. */ + slen = (MB_CUR_MAX > 1) ? STRLEN (string) : 0; + + i = s; + while (string[start] && i--) + ADVANCE_CHAR (string, slen, start); + stop = start; + i = e - s; + while (string[stop] && i--) + ADVANCE_CHAR (string, slen, stop); + tt = substring (string, start, stop); + return tt; +} +#endif + +/* Process a variable substring expansion: ${name:e1[:e2]}. If VARNAME + is `@', use the positional parameters; otherwise, use the value of + VARNAME. If VARNAME is an array variable, use the array elements. */ + +static char * +parameter_brace_substring (varname, value, ind, substr, quoted, flags) + char *varname, *value; + int ind; + char *substr; + int quoted, flags; +{ + intmax_t e1, e2; + int vtype, r, starsub; + char *temp, *val, *tt, *oname; + SHELL_VAR *v; + + if (value == 0) + return ((char *)NULL); + + oname = this_command_name; + this_command_name = varname; + + vtype = get_var_and_type (varname, value, ind, quoted, flags, &v, &val); + if (vtype == -1) + { + this_command_name = oname; + return ((char *)NULL); + } + + starsub = vtype & VT_STARSUB; + vtype &= ~VT_STARSUB; + + r = verify_substring_values (v, val, substr, vtype, &e1, &e2); + this_command_name = oname; + if (r <= 0) + { + if (vtype == VT_VARIABLE) + FREE (val); + return ((r == 0) ? &expand_param_error : (char *)NULL); + } + + switch (vtype) + { + case VT_VARIABLE: + case VT_ARRAYMEMBER: +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1) + tt = mb_substring (val, e1, e2); + else +#endif + tt = substring (val, e1, e2); + + if (vtype == VT_VARIABLE) + FREE (val); + if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) + temp = quote_string (tt); + else + temp = tt ? quote_escapes (tt) : (char *)NULL; + FREE (tt); + break; + case VT_POSPARMS: + tt = pos_params (varname, e1, e2, quoted); + if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) == 0) + { + temp = tt ? quote_escapes (tt) : (char *)NULL; + FREE (tt); + } + else + temp = tt; + break; +#if defined (ARRAY_VARS) + case VT_ARRAYVAR: + if (assoc_p (v)) + /* we convert to list and take first e2 elements starting at e1th + element -- officially undefined for now */ + temp = assoc_subrange (assoc_cell (v), e1, e2, starsub, quoted); + else + /* We want E2 to be the number of elements desired (arrays can be sparse, + so verify_substring_values just returns the numbers specified and we + rely on array_subrange to understand how to deal with them). */ + temp = array_subrange (array_cell (v), e1, e2, starsub, quoted); + /* array_subrange now calls array_quote_escapes as appropriate, so the + caller no longer needs to. */ + break; +#endif + default: + temp = (char *)NULL; + } + + return temp; +} + +/****************************************************************/ +/* */ +/* Functions to perform pattern substitution on variable values */ +/* */ +/****************************************************************/ + +static int +shouldexp_replacement (s) + char *s; +{ + register char *p; + + for (p = s; p && *p; p++) + { + if (*p == '\\') + p++; + else if (*p == '&') + return 1; + } + return 0; +} + +char * +pat_subst (string, pat, rep, mflags) + char *string, *pat, *rep; + int mflags; +{ + char *ret, *s, *e, *str, *rstr, *mstr; + int rsize, rptr, l, replen, mtype, rxpand, rslen, mlen; + + if (string == 0) + return (savestring ("")); + + mtype = mflags & MATCH_TYPEMASK; + +#if 0 /* bash-4.2 ? */ + rxpand = (rep && *rep) ? shouldexp_replacement (rep) : 0; +#else + rxpand = 0; +#endif + + /* Special cases: + * 1. A null pattern with mtype == MATCH_BEG means to prefix STRING + * with REP and return the result. + * 2. A null pattern with mtype == MATCH_END means to append REP to + * STRING and return the result. + * These don't understand or process `&' in the replacement string. + */ + if ((pat == 0 || *pat == 0) && (mtype == MATCH_BEG || mtype == MATCH_END)) + { + replen = STRLEN (rep); + l = STRLEN (string); + ret = (char *)xmalloc (replen + l + 2); + if (replen == 0) + strcpy (ret, string); + else if (mtype == MATCH_BEG) + { + strcpy (ret, rep); + strcpy (ret + replen, string); + } + else + { + strcpy (ret, string); + strcpy (ret + l, rep); + } + return (ret); + } + + ret = (char *)xmalloc (rsize = 64); + ret[0] = '\0'; + + for (replen = STRLEN (rep), rptr = 0, str = string;;) + { + if (match_pattern (str, pat, mtype, &s, &e) == 0) + break; + l = s - str; + + if (rxpand) + { + int x; + mlen = e - s; + mstr = xmalloc (mlen + 1); + for (x = 0; x < mlen; x++) + mstr[x] = s[x]; + mstr[mlen] = '\0'; + rstr = strcreplace (rep, '&', mstr, 0); + rslen = strlen (rstr); + } + else + { + rstr = rep; + rslen = replen; + } + + RESIZE_MALLOCED_BUFFER (ret, rptr, (l + rslen), rsize, 64); + + /* OK, now copy the leading unmatched portion of the string (from + str to s) to ret starting at rptr (the current offset). Then copy + the replacement string at ret + rptr + (s - str). Increment + rptr (if necessary) and str and go on. */ + if (l) + { + strncpy (ret + rptr, str, l); + rptr += l; + } + if (replen) + { + strncpy (ret + rptr, rstr, rslen); + rptr += rslen; + } + str = e; /* e == end of match */ + + if (rstr != rep) + free (rstr); + + if (((mflags & MATCH_GLOBREP) == 0) || mtype != MATCH_ANY) + break; + + if (s == e) + { + /* On a zero-length match, make sure we copy one character, since + we increment one character to avoid infinite recursion. */ + RESIZE_MALLOCED_BUFFER (ret, rptr, 1, rsize, 64); + ret[rptr++] = *str++; + e++; /* avoid infinite recursion on zero-length match */ + } + } + + /* Now copy the unmatched portion of the input string */ + if (str && *str) + { + RESIZE_MALLOCED_BUFFER (ret, rptr, STRLEN(str) + 1, rsize, 64); + strcpy (ret + rptr, str); + } + else + ret[rptr] = '\0'; + + return ret; +} + +/* Do pattern match and replacement on the positional parameters. */ +static char * +pos_params_pat_subst (string, pat, rep, mflags) + char *string, *pat, *rep; + int mflags; +{ + WORD_LIST *save, *params; + WORD_DESC *w; + char *ret; + int pchar, qflags; + + save = params = list_rest_of_args (); + if (save == 0) + return ((char *)NULL); + + for ( ; params; params = params->next) + { + ret = pat_subst (params->word->word, pat, rep, mflags); + w = alloc_word_desc (); + w->word = ret ? ret : savestring (""); + dispose_word (params->word); + params->word = w; + } + + pchar = (mflags & MATCH_STARSUB) == MATCH_STARSUB ? '*' : '@'; + qflags = (mflags & MATCH_QUOTED) == MATCH_QUOTED ? Q_DOUBLE_QUOTES : 0; + + ret = string_list_pos_params (pchar, save, qflags); + + dispose_words (save); + + return (ret); +} + +/* Perform pattern substitution on VALUE, which is the expansion of + VARNAME. PATSUB is an expression supplying the pattern to match + and the string to substitute. QUOTED is a flags word containing + the type of quoting currently in effect. */ +static char * +parameter_brace_patsub (varname, value, ind, patsub, quoted, flags) + char *varname, *value; + int ind; + char *patsub; + int quoted, flags; +{ + int vtype, mflags, starsub, delim; + char *val, *temp, *pat, *rep, *p, *lpatsub, *tt; + SHELL_VAR *v; + + if (value == 0) + return ((char *)NULL); + + this_command_name = varname; + + vtype = get_var_and_type (varname, value, ind, quoted, flags, &v, &val); + if (vtype == -1) + return ((char *)NULL); + + starsub = vtype & VT_STARSUB; + vtype &= ~VT_STARSUB; + + mflags = 0; + /* PATSUB is never NULL when this is called. */ + if (*patsub == '/') + { + mflags |= MATCH_GLOBREP; + patsub++; + } + + /* Malloc this because expand_string_if_necessary or one of the expansion + functions in its call chain may free it on a substitution error. */ + lpatsub = savestring (patsub); + + if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) + mflags |= MATCH_QUOTED; + + if (starsub) + mflags |= MATCH_STARSUB; + + /* If the pattern starts with a `/', make sure we skip over it when looking + for the replacement delimiter. */ + delim = skip_to_delim (lpatsub, ((*patsub == '/') ? 1 : 0), "/", 0); + if (lpatsub[delim] == '/') + { + lpatsub[delim] = 0; + rep = lpatsub + delim + 1; + } + else + rep = (char *)NULL; + + if (rep && *rep == '\0') + rep = (char *)NULL; + + /* Perform the same expansions on the pattern as performed by the + pattern removal expansions. */ + pat = getpattern (lpatsub, quoted, 1); + + if (rep) + { + /* We want to perform quote removal on the expanded replacement even if + the entire expansion is double-quoted because the parser and string + extraction functions treated quotes in the replacement string as + special. THIS IS NOT BACKWARDS COMPATIBLE WITH BASH-4.2. */ + if (shell_compatibility_level > 42) + rep = expand_string_if_necessary (rep, quoted & ~(Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT), expand_string_unsplit); + /* This is the bash-4.2 code. */ + else if ((mflags & MATCH_QUOTED) == 0) + rep = expand_string_if_necessary (rep, quoted, expand_string_unsplit); + else + rep = expand_string_to_string_internal (rep, quoted, expand_string_unsplit); + } + + /* ksh93 doesn't allow the match specifier to be a part of the expanded + pattern. This is an extension. Make sure we don't anchor the pattern + at the beginning or end of the string if we're doing global replacement, + though. */ + p = pat; + if (mflags & MATCH_GLOBREP) + mflags |= MATCH_ANY; + else if (pat && pat[0] == '#') + { + mflags |= MATCH_BEG; + p++; + } + else if (pat && pat[0] == '%') + { + mflags |= MATCH_END; + p++; + } + else + mflags |= MATCH_ANY; + + /* OK, we now want to substitute REP for PAT in VAL. If + flags & MATCH_GLOBREP is non-zero, the substitution is done + everywhere, otherwise only the first occurrence of PAT is + replaced. The pattern matching code doesn't understand + CTLESC quoting CTLESC and CTLNUL so we use the dequoted variable + values passed in (VT_VARIABLE) so the pattern substitution + code works right. We need to requote special chars after + we're done for VT_VARIABLE and VT_ARRAYMEMBER, and for the + other cases if QUOTED == 0, since the posparams and arrays + indexed by * or @ do special things when QUOTED != 0. */ + + switch (vtype) + { + case VT_VARIABLE: + case VT_ARRAYMEMBER: + temp = pat_subst (val, p, rep, mflags); + if (vtype == VT_VARIABLE) + FREE (val); + if (temp) + { + tt = (mflags & MATCH_QUOTED) ? quote_string (temp) : quote_escapes (temp); + free (temp); + temp = tt; + } + break; + case VT_POSPARMS: + temp = pos_params_pat_subst (val, p, rep, mflags); + if (temp && (mflags & MATCH_QUOTED) == 0) + { + tt = quote_escapes (temp); + free (temp); + temp = tt; + } + break; +#if defined (ARRAY_VARS) + case VT_ARRAYVAR: + temp = assoc_p (v) ? assoc_patsub (assoc_cell (v), p, rep, mflags) + : array_patsub (array_cell (v), p, rep, mflags); + /* Don't call quote_escapes anymore; array_patsub calls + array_quote_escapes as appropriate before adding the + space separators; ditto for assoc_patsub. */ + break; +#endif + } + + FREE (pat); + FREE (rep); + free (lpatsub); + + return temp; +} + +/****************************************************************/ +/* */ +/* Functions to perform case modification on variable values */ +/* */ +/****************************************************************/ + +/* Do case modification on the positional parameters. */ + +static char * +pos_params_modcase (string, pat, modop, mflags) + char *string, *pat; + int modop; + int mflags; +{ + WORD_LIST *save, *params; + WORD_DESC *w; + char *ret; + int pchar, qflags; + + save = params = list_rest_of_args (); + if (save == 0) + return ((char *)NULL); + + for ( ; params; params = params->next) + { + ret = sh_modcase (params->word->word, pat, modop); + w = alloc_word_desc (); + w->word = ret ? ret : savestring (""); + dispose_word (params->word); + params->word = w; + } + + pchar = (mflags & MATCH_STARSUB) == MATCH_STARSUB ? '*' : '@'; + qflags = (mflags & MATCH_QUOTED) == MATCH_QUOTED ? Q_DOUBLE_QUOTES : 0; + + ret = string_list_pos_params (pchar, save, qflags); + dispose_words (save); + + return (ret); +} + +/* Perform case modification on VALUE, which is the expansion of + VARNAME. MODSPEC is an expression supplying the type of modification + to perform. QUOTED is a flags word containing the type of quoting + currently in effect. */ +static char * +parameter_brace_casemod (varname, value, ind, modspec, patspec, quoted, flags) + char *varname, *value; + int ind, modspec; + char *patspec; + int quoted, flags; +{ + int vtype, starsub, modop, mflags, x; + char *val, *temp, *pat, *p, *lpat, *tt; + SHELL_VAR *v; + + if (value == 0) + return ((char *)NULL); + + this_command_name = varname; + + vtype = get_var_and_type (varname, value, ind, quoted, flags, &v, &val); + if (vtype == -1) + return ((char *)NULL); + + starsub = vtype & VT_STARSUB; + vtype &= ~VT_STARSUB; + + modop = 0; + mflags = 0; + if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) + mflags |= MATCH_QUOTED; + if (starsub) + mflags |= MATCH_STARSUB; + + p = patspec; + if (modspec == '^') + { + x = p && p[0] == modspec; + modop = x ? CASE_UPPER : CASE_UPFIRST; + p += x; + } + else if (modspec == ',') + { + x = p && p[0] == modspec; + modop = x ? CASE_LOWER : CASE_LOWFIRST; + p += x; + } + else if (modspec == '~') + { + x = p && p[0] == modspec; + modop = x ? CASE_TOGGLEALL : CASE_TOGGLE; + p += x; + } + + lpat = p ? savestring (p) : 0; + /* Perform the same expansions on the pattern as performed by the + pattern removal expansions. FOR LATER */ + pat = lpat ? getpattern (lpat, quoted, 1) : 0; + + /* OK, now we do the case modification. */ + switch (vtype) + { + case VT_VARIABLE: + case VT_ARRAYMEMBER: + temp = sh_modcase (val, pat, modop); + if (vtype == VT_VARIABLE) + FREE (val); + if (temp) + { + tt = (mflags & MATCH_QUOTED) ? quote_string (temp) : quote_escapes (temp); + free (temp); + temp = tt; + } + break; + + case VT_POSPARMS: + temp = pos_params_modcase (val, pat, modop, mflags); + if (temp && (mflags & MATCH_QUOTED) == 0) + { + tt = quote_escapes (temp); + free (temp); + temp = tt; + } + break; + +#if defined (ARRAY_VARS) + case VT_ARRAYVAR: + temp = assoc_p (v) ? assoc_modcase (assoc_cell (v), pat, modop, mflags) + : array_modcase (array_cell (v), pat, modop, mflags); + /* Don't call quote_escapes; array_modcase calls array_quote_escapes + as appropriate before adding the space separators; ditto for + assoc_modcase. */ + break; +#endif + } + + FREE (pat); + free (lpat); + + return temp; +} + +/* Check for unbalanced parens in S, which is the contents of $(( ... )). If + any occur, this must be a nested command substitution, so return 0. + Otherwise, return 1. A valid arithmetic expression must always have a + ( before a matching ), so any cases where there are more right parens + means that this must not be an arithmetic expression, though the parser + will not accept it without a balanced total number of parens. */ +static int +chk_arithsub (s, len) + const char *s; + int len; +{ + int i, count; + DECLARE_MBSTATE; + + i = count = 0; + while (i < len) + { + if (s[i] == LPAREN) + count++; + else if (s[i] == RPAREN) + { + count--; + if (count < 0) + return 0; + } + + switch (s[i]) + { + default: + ADVANCE_CHAR (s, len, i); + break; + + case '\\': + i++; + if (s[i]) + ADVANCE_CHAR (s, len, i); + break; + + case '\'': + i = skip_single_quoted (s, len, ++i); + break; + + case '"': + i = skip_double_quoted ((char *)s, len, ++i); + break; + } + } + + return (count == 0); +} + +/****************************************************************/ +/* */ +/* Functions to perform parameter expansion on a string */ +/* */ +/****************************************************************/ + +/* ${[#][!]name[[:][^[^]][,[,]]#[#]%[%]-=?+[word][:e1[:e2]]]} */ +static WORD_DESC * +parameter_brace_expand (string, indexp, quoted, pflags, quoted_dollar_atp, contains_dollar_at) + char *string; + int *indexp, quoted, *quoted_dollar_atp, *contains_dollar_at, pflags; +{ + int check_nullness, var_is_set, var_is_null, var_is_special; + int want_substring, want_indir, want_patsub, want_casemod; + char *name, *value, *temp, *temp1; + WORD_DESC *tdesc, *ret; + int t_index, sindex, c, tflag, modspec; + intmax_t number; + arrayind_t ind; + + temp = temp1 = value = (char *)NULL; + var_is_set = var_is_null = var_is_special = check_nullness = 0; + want_substring = want_indir = want_patsub = want_casemod = 0; + + sindex = *indexp; + t_index = ++sindex; + /* ${#var} doesn't have any of the other parameter expansions on it. */ + if (string[t_index] == '#' && legal_variable_starter (string[t_index+1])) /* {{ */ + name = string_extract (string, &t_index, "}", SX_VARNAME); + else +#if defined (CASEMOD_EXPANSIONS) + /* To enable case-toggling expansions using the `~' operator character + change the 1 to 0. */ +# if defined (CASEMOD_CAPCASE) + name = string_extract (string, &t_index, "#%^,~:-=?+/}", SX_VARNAME); +# else + name = string_extract (string, &t_index, "#%^,:-=?+/}", SX_VARNAME); +# endif /* CASEMOD_CAPCASE */ +#else + name = string_extract (string, &t_index, "#%:-=?+/}", SX_VARNAME); +#endif /* CASEMOD_EXPANSIONS */ + + ret = 0; + tflag = 0; + + ind = INTMAX_MIN; + + /* If the name really consists of a special variable, then make sure + that we have the entire name. We don't allow indirect references + to special variables except `#', `?', `@' and `*'. */ + if ((sindex == t_index && VALID_SPECIAL_LENGTH_PARAM (string[t_index])) || + (sindex == t_index - 1 && string[sindex] == '!' && VALID_INDIR_PARAM (string[t_index]))) + { + t_index++; + temp1 = string_extract (string, &t_index, "#%:-=?+/}", 0); + name = (char *)xrealloc (name, 3 + (strlen (temp1))); + *name = string[sindex]; + if (string[sindex] == '!') + { + /* indirect reference of $#, $?, $@, or $* */ + name[1] = string[sindex + 1]; + strcpy (name + 2, temp1); + } + else + strcpy (name + 1, temp1); + free (temp1); + } + sindex = t_index; + + /* Find out what character ended the variable name. Then + do the appropriate thing. */ + if (c = string[sindex]) + sindex++; + + /* If c is followed by one of the valid parameter expansion + characters, move past it as normal. If not, assume that + a substring specification is being given, and do not move + past it. */ + if (c == ':' && VALID_PARAM_EXPAND_CHAR (string[sindex])) + { + check_nullness++; + if (c = string[sindex]) + sindex++; + } + else if (c == ':' && string[sindex] != RBRACE) + want_substring = 1; + else if (c == '/' /* && string[sindex] != RBRACE */) /* XXX */ + want_patsub = 1; +#if defined (CASEMOD_EXPANSIONS) + else if (c == '^' || c == ',' || c == '~') + { + modspec = c; + want_casemod = 1; + } +#endif + + /* Catch the valid and invalid brace expressions that made it through the + tests above. */ + /* ${#-} is a valid expansion and means to take the length of $-. + Similarly for ${#?} and ${##}... */ + if (name[0] == '#' && name[1] == '\0' && check_nullness == 0 && + VALID_SPECIAL_LENGTH_PARAM (c) && string[sindex] == RBRACE) + { + name = (char *)xrealloc (name, 3); + name[1] = c; + name[2] = '\0'; + c = string[sindex++]; + } + + /* ...but ${#%}, ${#:}, ${#=}, ${#+}, and ${#/} are errors. */ + if (name[0] == '#' && name[1] == '\0' && check_nullness == 0 && + member (c, "%:=+/") && string[sindex] == RBRACE) + { + temp = (char *)NULL; + goto bad_substitution; + } + + /* Indirect expansion begins with a `!'. A valid indirect expansion is + either a variable name, one of the positional parameters or a special + variable that expands to one of the positional parameters. */ + want_indir = *name == '!' && + (legal_variable_starter ((unsigned char)name[1]) || DIGIT (name[1]) + || VALID_INDIR_PARAM (name[1])); + + /* Determine the value of this variable. */ + + /* Check for special variables, directly referenced. */ + if (SPECIAL_VAR (name, want_indir)) + var_is_special++; + + /* Check for special expansion things, like the length of a parameter */ + if (*name == '#' && name[1]) + { + /* If we are not pointing at the character just after the + closing brace, then we haven't gotten all of the name. + Since it begins with a special character, this is a bad + substitution. Also check NAME for validity before trying + to go on. */ + if (string[sindex - 1] != RBRACE || (valid_length_expression (name) == 0)) + { + temp = (char *)NULL; + goto bad_substitution; + } + + number = parameter_brace_expand_length (name); + if (number == INTMAX_MIN && unbound_vars_is_error) + { + last_command_exit_value = EXECUTION_FAILURE; + err_unboundvar (name+1); + free (name); + return (interactive_shell ? &expand_wdesc_error : &expand_wdesc_fatal); + } + free (name); + + *indexp = sindex; + if (number < 0) + return (&expand_wdesc_error); + else + { + ret = alloc_word_desc (); + ret->word = itos (number); + return ret; + } + } + + /* ${@} is identical to $@. */ + if (name[0] == '@' && name[1] == '\0') + { + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp) + *quoted_dollar_atp = 1; + + if (contains_dollar_at) + *contains_dollar_at = 1; + + tflag |= W_DOLLARAT; + } + + /* Process ${!PREFIX*} expansion. */ + if (want_indir && string[sindex - 1] == RBRACE && + (string[sindex - 2] == '*' || string[sindex - 2] == '@') && + legal_variable_starter ((unsigned char) name[1])) + { + char **x; + WORD_LIST *xlist; + + temp1 = savestring (name + 1); + number = strlen (temp1); + temp1[number - 1] = '\0'; + x = all_variables_matching_prefix (temp1); + xlist = strvec_to_word_list (x, 0, 0); + if (string[sindex - 2] == '*') + temp = string_list_dollar_star (xlist); + else + { + temp = string_list_dollar_at (xlist, quoted); + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp) + *quoted_dollar_atp = 1; + if (contains_dollar_at) + *contains_dollar_at = 1; + + tflag |= W_DOLLARAT; + } + free (x); + dispose_words (xlist); + free (temp1); + *indexp = sindex; + + free (name); + + ret = alloc_word_desc (); + ret->word = temp; + ret->flags = tflag; /* XXX */ + return ret; + } + +#if defined (ARRAY_VARS) + /* Process ${!ARRAY[@]} and ${!ARRAY[*]} expansion. */ /* [ */ + if (want_indir && string[sindex - 1] == RBRACE && + string[sindex - 2] == ']' && valid_array_reference (name+1)) + { + char *x, *x1; + + temp1 = savestring (name + 1); + x = array_variable_name (temp1, &x1, (int *)0); /* [ */ + FREE (x); + if (ALL_ELEMENT_SUB (x1[0]) && x1[1] == ']') + { + temp = array_keys (temp1, quoted); /* handles assoc vars too */ + if (x1[0] == '@') + { + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp) + *quoted_dollar_atp = 1; + if (contains_dollar_at) + *contains_dollar_at = 1; + + tflag |= W_DOLLARAT; + } + + free (temp1); + *indexp = sindex; + + ret = alloc_word_desc (); + ret->word = temp; + ret->flags = tflag; /* XXX */ + return ret; + } + + free (temp1); + } +#endif /* ARRAY_VARS */ + + /* Make sure that NAME is valid before trying to go on. */ + if (valid_brace_expansion_word (want_indir ? name + 1 : name, + var_is_special) == 0) + { + temp = (char *)NULL; + goto bad_substitution; + } + + if (want_indir) + tdesc = parameter_brace_expand_indir (name + 1, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at); + else + tdesc = parameter_brace_expand_word (name, var_is_special, quoted, PF_IGNUNBOUND|(pflags&(PF_NOSPLIT2|PF_ASSIGNRHS)), &ind); + + if (tdesc) + { + temp = tdesc->word; + tflag = tdesc->flags; + dispose_word_desc (tdesc); + } + else + temp = (char *)0; + + if (temp == &expand_param_error || temp == &expand_param_fatal) + { + FREE (name); + FREE (value); + return (temp == &expand_param_error ? &expand_wdesc_error : &expand_wdesc_fatal); + } + +#if defined (ARRAY_VARS) + if (valid_array_reference (name)) + chk_atstar (name, quoted, quoted_dollar_atp, contains_dollar_at); +#endif + + var_is_set = temp != (char *)0; + var_is_null = check_nullness && (var_is_set == 0 || *temp == 0); + /* XXX - this may not need to be restricted to special variables */ + if (check_nullness) + var_is_null |= var_is_set && var_is_special && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && QUOTED_NULL (temp); + + /* Get the rest of the stuff inside the braces. */ + if (c && c != RBRACE) + { + /* Extract the contents of the ${ ... } expansion + according to the Posix.2 rules. */ + value = extract_dollar_brace_string (string, &sindex, quoted, (c == '%' || c == '#' || c =='/' || c == '^' || c == ',' || c ==':') ? SX_POSIXEXP|SX_WORD : SX_WORD); + if (string[sindex] == RBRACE) + sindex++; + else + goto bad_substitution; + } + else + value = (char *)NULL; + + *indexp = sindex; + + /* All the cases where an expansion can possibly generate an unbound + variable error. */ + if (want_substring || want_patsub || want_casemod || c == '#' || c == '%' || c == RBRACE) + { + if (var_is_set == 0 && unbound_vars_is_error && ((name[0] != '@' && name[0] != '*') || name[1])) + { + last_command_exit_value = EXECUTION_FAILURE; + err_unboundvar (name); + FREE (value); + FREE (temp); + free (name); + return (interactive_shell ? &expand_wdesc_error : &expand_wdesc_fatal); + } + } + + /* If this is a substring spec, process it and add the result. */ + if (want_substring) + { + temp1 = parameter_brace_substring (name, temp, ind, value, quoted, (tflag & W_ARRAYIND) ? AV_USEIND : 0); + FREE (name); + FREE (value); + FREE (temp); + + if (temp1 == &expand_param_error) + return (&expand_wdesc_error); + else if (temp1 == &expand_param_fatal) + return (&expand_wdesc_fatal); + + ret = alloc_word_desc (); + ret->word = temp1; + if (temp1 && QUOTED_NULL (temp1) && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))) + ret->flags |= W_QUOTED|W_HASQUOTEDNULL; + return ret; + } + else if (want_patsub) + { + temp1 = parameter_brace_patsub (name, temp, ind, value, quoted, (tflag & W_ARRAYIND) ? AV_USEIND : 0); + FREE (name); + FREE (value); + FREE (temp); + + if (temp1 == &expand_param_error) + return (&expand_wdesc_error); + else if (temp1 == &expand_param_fatal) + return (&expand_wdesc_fatal); + + ret = alloc_word_desc (); + ret->word = temp1; + if (temp1 && QUOTED_NULL (temp1) && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))) + ret->flags |= W_QUOTED|W_HASQUOTEDNULL; + return ret; + } +#if defined (CASEMOD_EXPANSIONS) + else if (want_casemod) + { + temp1 = parameter_brace_casemod (name, temp, ind, modspec, value, quoted, (tflag & W_ARRAYIND) ? AV_USEIND : 0); + FREE (name); + FREE (value); + FREE (temp); + + if (temp1 == &expand_param_error) + return (&expand_wdesc_error); + else if (temp1 == &expand_param_fatal) + return (&expand_wdesc_fatal); + + ret = alloc_word_desc (); + ret->word = temp1; + if (temp1 && QUOTED_NULL (temp1) && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))) + ret->flags |= W_QUOTED|W_HASQUOTEDNULL; + return ret; + } +#endif + + /* Do the right thing based on which character ended the variable name. */ + switch (c) + { + default: + case '\0': + bad_substitution: + last_command_exit_value = EXECUTION_FAILURE; + report_error (_("%s: bad substitution"), string ? string : "??"); + FREE (value); + FREE (temp); + free (name); + return &expand_wdesc_error; + + case RBRACE: + break; + + case '#': /* ${param#[#]pattern} */ + case '%': /* ${param%[%]pattern} */ + if (value == 0 || *value == '\0' || temp == 0 || *temp == '\0') + { + FREE (value); + break; + } + temp1 = parameter_brace_remove_pattern (name, temp, ind, value, c, quoted, (tflag & W_ARRAYIND) ? AV_USEIND : 0); + free (temp); + free (value); + free (name); + + ret = alloc_word_desc (); + ret->word = temp1; + if (temp1 && QUOTED_NULL (temp1) && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))) + ret->flags |= W_QUOTED|W_HASQUOTEDNULL; + return ret; + + case '-': + case '=': + case '?': + case '+': + if (var_is_set && var_is_null == 0) + { + /* If the operator is `+', we don't want the value of the named + variable for anything, just the value of the right hand side. */ + if (c == '+') + { + /* XXX -- if we're double-quoted and the named variable is "$@", + we want to turn off any special handling of "$@" -- + we're not using it, so whatever is on the rhs applies. */ + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp) + *quoted_dollar_atp = 0; + if (contains_dollar_at) + *contains_dollar_at = 0; + + FREE (temp); + if (value) + { + /* From Posix discussion on austin-group list. Issue 221 + requires that backslashes escaping `}' inside + double-quoted ${...} be removed. */ + if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) + quoted |= Q_DOLBRACE; + ret = parameter_brace_expand_rhs (name, value, c, + quoted, + quoted_dollar_atp, + contains_dollar_at); + /* XXX - fix up later, esp. noting presence of + W_HASQUOTEDNULL in ret->flags */ + free (value); + } + else + temp = (char *)NULL; + } + else + { + FREE (value); + } + /* Otherwise do nothing; just use the value in TEMP. */ + } + else /* VAR not set or VAR is NULL. */ + { + FREE (temp); + temp = (char *)NULL; + if (c == '=' && var_is_special) + { + last_command_exit_value = EXECUTION_FAILURE; + report_error (_("$%s: cannot assign in this way"), name); + free (name); + free (value); + return &expand_wdesc_error; + } + else if (c == '?') + { + parameter_brace_expand_error (name, value); + return (interactive_shell ? &expand_wdesc_error : &expand_wdesc_fatal); + } + else if (c != '+') + { + /* XXX -- if we're double-quoted and the named variable is "$@", + we want to turn off any special handling of "$@" -- + we're not using it, so whatever is on the rhs applies. */ + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp) + *quoted_dollar_atp = 0; + if (contains_dollar_at) + *contains_dollar_at = 0; + + /* From Posix discussion on austin-group list. Issue 221 requires + that backslashes escaping `}' inside double-quoted ${...} be + removed. */ + if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) + quoted |= Q_DOLBRACE; + ret = parameter_brace_expand_rhs (name, value, c, quoted, + quoted_dollar_atp, + contains_dollar_at); + /* XXX - fix up later, esp. noting presence of + W_HASQUOTEDNULL in tdesc->flags */ + } + free (value); + } + + break; + } + free (name); + + if (ret == 0) + { + ret = alloc_word_desc (); + ret->flags = tflag; + ret->word = temp; + } + return (ret); +} + +/* Expand a single ${xxx} expansion. The braces are optional. When + the braces are used, parameter_brace_expand() does the work, + possibly calling param_expand recursively. */ +static WORD_DESC * +param_expand (string, sindex, quoted, expanded_something, + contains_dollar_at, quoted_dollar_at_p, had_quoted_null_p, + pflags) + char *string; + int *sindex, quoted, *expanded_something, *contains_dollar_at; + int *quoted_dollar_at_p, *had_quoted_null_p, pflags; +{ + char *temp, *temp1, uerror[3]; + int zindex, t_index, expok; + unsigned char c; + intmax_t number; + SHELL_VAR *var; + WORD_LIST *list; + WORD_DESC *tdesc, *ret; + int tflag; + + zindex = *sindex; + c = string[++zindex]; + + temp = (char *)NULL; + ret = tdesc = (WORD_DESC *)NULL; + tflag = 0; + + /* Do simple cases first. Switch on what follows '$'. */ + switch (c) + { + /* $0 .. $9? */ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + temp1 = dollar_vars[TODIGIT (c)]; + if (unbound_vars_is_error && temp1 == (char *)NULL) + { + uerror[0] = '$'; + uerror[1] = c; + uerror[2] = '\0'; + last_command_exit_value = EXECUTION_FAILURE; + err_unboundvar (uerror); + return (interactive_shell ? &expand_wdesc_error : &expand_wdesc_fatal); + } + if (temp1) + temp = (*temp1 && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))) + ? quote_string (temp1) + : quote_escapes (temp1); + else + temp = (char *)NULL; + + break; + + /* $$ -- pid of the invoking shell. */ + case '$': + temp = itos (dollar_dollar_pid); + break; + + /* $# -- number of positional parameters. */ + case '#': + temp = itos (number_of_args ()); + break; + + /* $? -- return value of the last synchronous command. */ + case '?': + temp = itos (last_command_exit_value); + break; + + /* $- -- flags supplied to the shell on invocation or by `set'. */ + case '-': + temp = which_set_flags (); + break; + + /* $! -- Pid of the last asynchronous command. */ + case '!': + /* If no asynchronous pids have been created, expand to nothing. + If `set -u' has been executed, and no async processes have + been created, this is an expansion error. */ + if (last_asynchronous_pid == NO_PID) + { + if (expanded_something) + *expanded_something = 0; + temp = (char *)NULL; + if (unbound_vars_is_error) + { + uerror[0] = '$'; + uerror[1] = c; + uerror[2] = '\0'; + last_command_exit_value = EXECUTION_FAILURE; + err_unboundvar (uerror); + return (interactive_shell ? &expand_wdesc_error : &expand_wdesc_fatal); + } + } + else + temp = itos (last_asynchronous_pid); + break; + + /* The only difference between this and $@ is when the arg is quoted. */ + case '*': /* `$*' */ + list = list_rest_of_args (); + +#if 0 + /* According to austin-group posix proposal by Geoff Clare in + <20090505091501.GA10097@squonk.masqnet> of 5 May 2009: + + "The shell shall write a message to standard error and + immediately exit when it tries to expand an unset parameter + other than the '@' and '*' special parameters." + */ + + if (list == 0 && unbound_vars_is_error && (pflags & PF_IGNUNBOUND) == 0) + { + uerror[0] = '$'; + uerror[1] = '*'; + uerror[2] = '\0'; + last_command_exit_value = EXECUTION_FAILURE; + err_unboundvar (uerror); + return (interactive_shell ? &expand_wdesc_error : &expand_wdesc_fatal); + } +#endif + + /* If there are no command-line arguments, this should just + disappear if there are other characters in the expansion, + even if it's quoted. */ + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && list == 0) + temp = (char *)NULL; + else if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES|Q_PATQUOTE)) + { + /* If we have "$*" we want to make a string of the positional + parameters, separated by the first character of $IFS, and + quote the whole string, including the separators. If IFS + is unset, the parameters are separated by ' '; if $IFS is + null, the parameters are concatenated. */ + temp = (quoted & (Q_DOUBLE_QUOTES|Q_PATQUOTE)) ? string_list_dollar_star (list) : string_list (list); + if (temp) + { + temp1 = quote_string (temp); + if (*temp == 0) + tflag |= W_HASQUOTEDNULL; + free (temp); + temp = temp1; + } + } + else + { + /* We check whether or not we're eventually going to split $* here, + for example when IFS is empty and we are processing the rhs of + an assignment statement. In that case, we don't separate the + arguments at all. Otherwise, if the $* is not quoted it is + identical to $@ */ +# if defined (HANDLE_MULTIBYTE) + if (expand_no_split_dollar_star && ifs_firstc[0] == 0) +# else + if (expand_no_split_dollar_star && ifs_firstc == 0) +# endif + temp = string_list_dollar_star (list); + else + { + temp = string_list_dollar_at (list, quoted); + if (quoted == 0 && (ifs_is_set == 0 || ifs_is_null)) + tflag |= W_SPLITSPACE; + } + + if (expand_no_split_dollar_star == 0 && contains_dollar_at) + *contains_dollar_at = 1; + } + + dispose_words (list); + break; + + /* When we have "$@" what we want is "$1" "$2" "$3" ... This + means that we have to turn quoting off after we split into + the individually quoted arguments so that the final split + on the first character of $IFS is still done. */ + case '@': /* `$@' */ + list = list_rest_of_args (); + +#if 0 + /* According to austin-group posix proposal by Geoff Clare in + <20090505091501.GA10097@squonk.masqnet> of 5 May 2009: + + "The shell shall write a message to standard error and + immediately exit when it tries to expand an unset parameter + other than the '@' and '*' special parameters." + */ + + if (list == 0 && unbound_vars_is_error && (pflags & PF_IGNUNBOUND) == 0) + { + uerror[0] = '$'; + uerror[1] = '@'; + uerror[2] = '\0'; + last_command_exit_value = EXECUTION_FAILURE; + err_unboundvar (uerror); + return (interactive_shell ? &expand_wdesc_error : &expand_wdesc_fatal); + } +#endif + + /* We want to flag the fact that we saw this. We can't turn + off quoting entirely, because other characters in the + string might need it (consider "\"$@\""), but we need some + way to signal that the final split on the first character + of $IFS should be done, even though QUOTED is 1. */ + /* XXX - should this test include Q_PATQUOTE? */ + if (quoted_dollar_at_p && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))) + *quoted_dollar_at_p = 1; + if (contains_dollar_at) + *contains_dollar_at = 1; + + /* We want to separate the positional parameters with the first + character of $IFS in case $IFS is something other than a space. + We also want to make sure that splitting is done no matter what -- + according to POSIX.2, this expands to a list of the positional + parameters no matter what IFS is set to. */ + temp = string_list_dollar_at (list, (pflags & PF_ASSIGNRHS) ? (quoted|Q_DOUBLE_QUOTES) : quoted); + + tflag |= W_DOLLARAT; + dispose_words (list); + break; + + case LBRACE: + tdesc = parameter_brace_expand (string, &zindex, quoted, pflags, + quoted_dollar_at_p, + contains_dollar_at); + + if (tdesc == &expand_wdesc_error || tdesc == &expand_wdesc_fatal) + return (tdesc); + temp = tdesc ? tdesc->word : (char *)0; + + /* XXX */ + /* Quoted nulls should be removed if there is anything else + in the string. */ + /* Note that we saw the quoted null so we can add one back at + the end of this function if there are no other characters + in the string, discard TEMP, and go on. The exception to + this is when we have "${@}" and $1 is '', since $@ needs + special handling. */ + if (tdesc && tdesc->word && (tdesc->flags & W_HASQUOTEDNULL) && QUOTED_NULL (temp)) + { + if (had_quoted_null_p) + *had_quoted_null_p = 1; + if (*quoted_dollar_at_p == 0) + { + free (temp); + tdesc->word = temp = (char *)NULL; + } + + } + + ret = tdesc; + goto return0; + + /* Do command or arithmetic substitution. */ + case LPAREN: + /* We have to extract the contents of this paren substitution. */ + t_index = zindex + 1; + temp = extract_command_subst (string, &t_index, 0); + zindex = t_index; + + /* For Posix.2-style `$(( ))' arithmetic substitution, + extract the expression and pass it to the evaluator. */ + if (temp && *temp == LPAREN) + { + char *temp2; + temp1 = temp + 1; + temp2 = savestring (temp1); + t_index = strlen (temp2) - 1; + + if (temp2[t_index] != RPAREN) + { + free (temp2); + goto comsub; + } + + /* Cut off ending `)' */ + temp2[t_index] = '\0'; + + if (chk_arithsub (temp2, t_index) == 0) + { + free (temp2); +#if 0 + internal_warning (_("future versions of the shell will force evaluation as an arithmetic substitution")); +#endif + goto comsub; + } + + /* Expand variables found inside the expression. */ + temp1 = expand_arith_string (temp2, Q_DOUBLE_QUOTES); + free (temp2); + +arithsub: + /* No error messages. */ + this_command_name = (char *)NULL; + number = evalexp (temp1, &expok); + free (temp); + free (temp1); + if (expok == 0) + { + if (interactive_shell == 0 && posixly_correct) + { + last_command_exit_value = EXECUTION_FAILURE; + return (&expand_wdesc_fatal); + } + else + return (&expand_wdesc_error); + } + temp = itos (number); + break; + } + +comsub: + if (pflags & PF_NOCOMSUB) + /* we need zindex+1 because string[zindex] == RPAREN */ + temp1 = substring (string, *sindex, zindex+1); + else + { + tdesc = command_substitute (temp, quoted); + temp1 = tdesc ? tdesc->word : (char *)NULL; + if (tdesc) + dispose_word_desc (tdesc); + } + FREE (temp); + temp = temp1; + break; + + /* Do POSIX.2d9-style arithmetic substitution. This will probably go + away in a future bash release. */ + case '[': + /* Extract the contents of this arithmetic substitution. */ + t_index = zindex + 1; + temp = extract_arithmetic_subst (string, &t_index); + zindex = t_index; + if (temp == 0) + { + temp = savestring (string); + if (expanded_something) + *expanded_something = 0; + goto return0; + } + + /* Do initial variable expansion. */ + temp1 = expand_arith_string (temp, Q_DOUBLE_QUOTES); + + goto arithsub; + + default: + /* Find the variable in VARIABLE_LIST. */ + temp = (char *)NULL; + + for (t_index = zindex; (c = string[zindex]) && legal_variable_char (c); zindex++) + ; + temp1 = (zindex > t_index) ? substring (string, t_index, zindex) : (char *)NULL; + + /* If this isn't a variable name, then just output the `$'. */ + if (temp1 == 0 || *temp1 == '\0') + { + FREE (temp1); + temp = (char *)xmalloc (2); + temp[0] = '$'; + temp[1] = '\0'; + if (expanded_something) + *expanded_something = 0; + goto return0; + } + + /* If the variable exists, return its value cell. */ + var = find_variable (temp1); + + if (var && invisible_p (var) == 0 && var_isset (var)) + { +#if defined (ARRAY_VARS) + if (assoc_p (var) || array_p (var)) + { + temp = array_p (var) ? array_reference (array_cell (var), 0) + : assoc_reference (assoc_cell (var), "0"); + if (temp) + temp = (*temp && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))) + ? quote_string (temp) + : quote_escapes (temp); + else if (unbound_vars_is_error) + goto unbound_variable; + } + else +#endif + { + temp = value_cell (var); + + temp = (*temp && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))) + ? quote_string (temp) + : quote_escapes (temp); + } + + free (temp1); + + goto return0; + } + else if (var = find_variable_last_nameref (temp1)) + { + temp = nameref_cell (var); +#if defined (ARRAY_VARS) + if (temp && *temp && valid_array_reference (temp)) + { + tdesc = parameter_brace_expand_word (temp, SPECIAL_VAR (temp, 0), quoted, pflags, (arrayind_t *)NULL); + if (tdesc == &expand_wdesc_error || tdesc == &expand_wdesc_fatal) + return (tdesc); + ret = tdesc; + goto return0; + } + else +#endif + /* y=2 ; typeset -n x=y; echo $x is not the same as echo $2 in ksh */ + if (temp && *temp && legal_identifier (temp) == 0) + { + last_command_exit_value = EXECUTION_FAILURE; + report_error (_("%s: invalid variable name for name reference"), temp); + return (&expand_wdesc_error); /* XXX */ + } + else + temp = (char *)NULL; + } + + temp = (char *)NULL; + +unbound_variable: + if (unbound_vars_is_error) + { + last_command_exit_value = EXECUTION_FAILURE; + err_unboundvar (temp1); + } + else + { + free (temp1); + goto return0; + } + + free (temp1); + last_command_exit_value = EXECUTION_FAILURE; + return ((unbound_vars_is_error && interactive_shell == 0) + ? &expand_wdesc_fatal + : &expand_wdesc_error); + } + + if (string[zindex]) + zindex++; + +return0: + *sindex = zindex; + + if (ret == 0) + { + ret = alloc_word_desc (); + ret->flags = tflag; /* XXX */ + ret->word = temp; + } + return ret; +} + +/* Make a word list which is the result of parameter and variable + expansion, command substitution, arithmetic substitution, and + quote removal of WORD. Return a pointer to a WORD_LIST which is + the result of the expansion. If WORD contains a null word, the + word list returned is also null. + + QUOTED contains flag values defined in shell.h. + + ISEXP is used to tell expand_word_internal that the word should be + treated as the result of an expansion. This has implications for + how IFS characters in the word are treated. + + CONTAINS_DOLLAR_AT and EXPANDED_SOMETHING are return values; when non-null + they point to an integer value which receives information about expansion. + CONTAINS_DOLLAR_AT gets non-zero if WORD contained "$@", else zero. + EXPANDED_SOMETHING get non-zero if WORD contained any parameter expansions, + else zero. + + This only does word splitting in the case of $@ expansion. In that + case, we split on ' '. */ + +/* Values for the local variable quoted_state. */ +#define UNQUOTED 0 +#define PARTIALLY_QUOTED 1 +#define WHOLLY_QUOTED 2 + +static WORD_LIST * +expand_word_internal (word, quoted, isexp, contains_dollar_at, expanded_something) + WORD_DESC *word; + int quoted, isexp; + int *contains_dollar_at; + int *expanded_something; +{ + WORD_LIST *list; + WORD_DESC *tword; + + /* The intermediate string that we build while expanding. */ + char *istring; + + /* The current size of the above object. */ + int istring_size; + + /* Index into ISTRING. */ + int istring_index; + + /* Temporary string storage. */ + char *temp, *temp1; + + /* The text of WORD. */ + register char *string; + + /* The size of STRING. */ + size_t string_size; + + /* The index into STRING. */ + int sindex; + + /* This gets 1 if we see a $@ while quoted. */ + int quoted_dollar_at; + + /* One of UNQUOTED, PARTIALLY_QUOTED, or WHOLLY_QUOTED, depending on + whether WORD contains no quoting characters, a partially quoted + string (e.g., "xx"ab), or is fully quoted (e.g., "xxab"). */ + int quoted_state; + + /* State flags */ + int had_quoted_null; + int has_dollar_at, temp_has_dollar_at; + int split_on_spaces; + int tflag; + int pflags; /* flags passed to param_expand */ + + int assignoff; /* If assignment, offset of `=' */ + + register unsigned char c; /* Current character. */ + int t_index; /* For calls to string_extract_xxx. */ + + char twochars[2]; + + DECLARE_MBSTATE; + + istring = (char *)xmalloc (istring_size = DEFAULT_INITIAL_ARRAY_SIZE); + istring[istring_index = 0] = '\0'; + quoted_dollar_at = had_quoted_null = has_dollar_at = 0; + split_on_spaces = 0; + quoted_state = UNQUOTED; + + string = word->word; + if (string == 0) + goto finished_with_string; + /* Don't need the string length for the SADD... and COPY_ macros unless + multibyte characters are possible. */ + string_size = (MB_CUR_MAX > 1) ? strlen (string) : 1; + + if (contains_dollar_at) + *contains_dollar_at = 0; + + assignoff = -1; + + /* Begin the expansion. */ + + for (sindex = 0; ;) + { + c = string[sindex]; + + /* Case on top-level character. */ + switch (c) + { + case '\0': + goto finished_with_string; + + case CTLESC: + sindex++; +#if HANDLE_MULTIBYTE + if (MB_CUR_MAX > 1 && string[sindex]) + { + SADD_MBQCHAR_BODY(temp, string, sindex, string_size); + } + else +#endif + { + temp = (char *)xmalloc (3); + temp[0] = CTLESC; + temp[1] = c = string[sindex]; + temp[2] = '\0'; + } + +dollar_add_string: + if (string[sindex]) + sindex++; + +add_string: + if (temp) + { + istring = sub_append_string (temp, istring, &istring_index, &istring_size); + temp = (char *)0; + } + + break; + +#if defined (PROCESS_SUBSTITUTION) + /* Process substitution. */ + case '<': + case '>': + { + if (string[++sindex] != LPAREN || (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || (word->flags & (W_DQUOTE|W_NOPROCSUB)) || posixly_correct) + { + sindex--; /* add_character: label increments sindex */ + goto add_character; + } + else + t_index = sindex + 1; /* skip past both '<' and LPAREN */ + + temp1 = extract_process_subst (string, (c == '<') ? "<(" : ">(", &t_index); /*))*/ + sindex = t_index; + + /* If the process substitution specification is `<()', we want to + open the pipe for writing in the child and produce output; if + it is `>()', we want to open the pipe for reading in the child + and consume input. */ + temp = temp1 ? process_substitute (temp1, (c == '>')) : (char *)0; + + FREE (temp1); + + goto dollar_add_string; + } +#endif /* PROCESS_SUBSTITUTION */ + + case '=': + /* Posix.2 section 3.6.1 says that tildes following `=' in words + which are not assignment statements are not expanded. If the + shell isn't in posix mode, though, we perform tilde expansion + on `likely candidate' unquoted assignment statements (flags + include W_ASSIGNMENT but not W_QUOTED). A likely candidate + contains an unquoted :~ or =~. Something to think about: we + now have a flag that says to perform tilde expansion on arguments + to `assignment builtins' like declare and export that look like + assignment statements. We now do tilde expansion on such words + even in POSIX mode. */ + if (word->flags & (W_ASSIGNRHS|W_NOTILDE)) + { + if (isexp == 0 && (word->flags & (W_NOSPLIT|W_NOSPLIT2)) == 0 && isifs (c)) + goto add_ifs_character; + else + goto add_character; + } + /* If we're not in posix mode or forcing assignment-statement tilde + expansion, note where the `=' appears in the word and prepare to + do tilde expansion following the first `='. */ + if ((word->flags & W_ASSIGNMENT) && + (posixly_correct == 0 || (word->flags & W_TILDEEXP)) && + assignoff == -1 && sindex > 0) + assignoff = sindex; + if (sindex == assignoff && string[sindex+1] == '~') /* XXX */ + word->flags |= W_ITILDE; +#if 0 + else if ((word->flags & W_ASSIGNMENT) && + (posixly_correct == 0 || (word->flags & W_TILDEEXP)) && + string[sindex+1] == '~') + word->flags |= W_ITILDE; +#endif + if (isexp == 0 && (word->flags & (W_NOSPLIT|W_NOSPLIT2)) == 0 && isifs (c)) + goto add_ifs_character; + else + goto add_character; + + case ':': + if (word->flags & W_NOTILDE) + { + if (isexp == 0 && (word->flags & (W_NOSPLIT|W_NOSPLIT2)) == 0 && isifs (c)) + goto add_ifs_character; + else + goto add_character; + } + + if ((word->flags & (W_ASSIGNMENT|W_ASSIGNRHS|W_TILDEEXP)) && + string[sindex+1] == '~') + word->flags |= W_ITILDE; + + if (isexp == 0 && (word->flags & (W_NOSPLIT|W_NOSPLIT2)) == 0 && isifs (c)) + goto add_ifs_character; + else + goto add_character; + + case '~': + /* If the word isn't supposed to be tilde expanded, or we're not + at the start of a word or after an unquoted : or = in an + assignment statement, we don't do tilde expansion. */ + if ((word->flags & (W_NOTILDE|W_DQUOTE)) || + (sindex > 0 && ((word->flags & W_ITILDE) == 0)) || + (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))) + { + word->flags &= ~W_ITILDE; + if (isexp == 0 && (word->flags & (W_NOSPLIT|W_NOSPLIT2)) == 0 && isifs (c) && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) == 0) + goto add_ifs_character; + else + goto add_character; + } + + if (word->flags & W_ASSIGNRHS) + tflag = 2; + else if (word->flags & (W_ASSIGNMENT|W_TILDEEXP)) + tflag = 1; + else + tflag = 0; + + temp = bash_tilde_find_word (string + sindex, tflag, &t_index); + + word->flags &= ~W_ITILDE; + + if (temp && *temp && t_index > 0) + { + temp1 = bash_tilde_expand (temp, tflag); + if (temp1 && *temp1 == '~' && STREQ (temp, temp1)) + { + FREE (temp); + FREE (temp1); + goto add_character; /* tilde expansion failed */ + } + free (temp); + temp = temp1; + sindex += t_index; + goto add_quoted_string; /* XXX was add_string */ + } + else + { + FREE (temp); + goto add_character; + } + + case '$': + if (expanded_something) + *expanded_something = 1; + + temp_has_dollar_at = 0; + pflags = (word->flags & W_NOCOMSUB) ? PF_NOCOMSUB : 0; + if (word->flags & W_NOSPLIT2) + pflags |= PF_NOSPLIT2; + if (word->flags & W_ASSIGNRHS) + pflags |= PF_ASSIGNRHS; + tword = param_expand (string, &sindex, quoted, expanded_something, + &temp_has_dollar_at, "ed_dollar_at, + &had_quoted_null, pflags); + has_dollar_at += temp_has_dollar_at; + split_on_spaces += (tword->flags & W_SPLITSPACE); + + if (tword == &expand_wdesc_error || tword == &expand_wdesc_fatal) + { + free (string); + free (istring); + return ((tword == &expand_wdesc_error) ? &expand_word_error + : &expand_word_fatal); + } + if (contains_dollar_at && has_dollar_at) + *contains_dollar_at = 1; + + if (tword && (tword->flags & W_HASQUOTEDNULL)) + had_quoted_null = 1; + + temp = tword ? tword->word : (char *)NULL; + dispose_word_desc (tword); + + /* Kill quoted nulls; we will add them back at the end of + expand_word_internal if nothing else in the string */ + if (had_quoted_null && temp && QUOTED_NULL (temp)) + { + FREE (temp); + temp = (char *)NULL; + } + + goto add_string; + break; + + case '`': /* Backquoted command substitution. */ + { + t_index = sindex++; + + temp = string_extract (string, &sindex, "`", SX_REQMATCH); + /* The test of sindex against t_index is to allow bare instances of + ` to pass through, for backwards compatibility. */ + if (temp == &extract_string_error || temp == &extract_string_fatal) + { + if (sindex - 1 == t_index) + { + sindex = t_index; + goto add_character; + } + last_command_exit_value = EXECUTION_FAILURE; + report_error (_("bad substitution: no closing \"`\" in %s") , string+t_index); + free (string); + free (istring); + return ((temp == &extract_string_error) ? &expand_word_error + : &expand_word_fatal); + } + + if (expanded_something) + *expanded_something = 1; + + if (word->flags & W_NOCOMSUB) + /* sindex + 1 because string[sindex] == '`' */ + temp1 = substring (string, t_index, sindex + 1); + else + { + de_backslash (temp); + tword = command_substitute (temp, quoted); + temp1 = tword ? tword->word : (char *)NULL; + if (tword) + dispose_word_desc (tword); + } + FREE (temp); + temp = temp1; + goto dollar_add_string; + } + + case '\\': + if (string[sindex + 1] == '\n') + { + sindex += 2; + continue; + } + + c = string[++sindex]; + + if (quoted & Q_HERE_DOCUMENT) + tflag = CBSHDOC; + else if (quoted & Q_DOUBLE_QUOTES) + tflag = CBSDQUOTE; + else + tflag = 0; + + /* From Posix discussion on austin-group list: Backslash escaping + a } in ${...} is removed. Issue 0000221 */ + if ((quoted & Q_DOLBRACE) && c == RBRACE) + { + SCOPY_CHAR_I (twochars, CTLESC, c, string, sindex, string_size); + } + /* This is the fix for " $@\ " */ + else if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && ((sh_syntaxtab[c] & tflag) == 0) && isexp == 0 && isifs (c)) + { + RESIZE_MALLOCED_BUFFER (istring, istring_index, 2, istring_size, + DEFAULT_ARRAY_SIZE); + istring[istring_index++] = CTLESC; + istring[istring_index++] = '\\'; + istring[istring_index] = '\0'; + + SCOPY_CHAR_I (twochars, CTLESC, c, string, sindex, string_size); + } + else if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && ((sh_syntaxtab[c] & tflag) == 0)) + { + SCOPY_CHAR_I (twochars, '\\', c, string, sindex, string_size); + } + else if (c == 0) + { + c = CTLNUL; + sindex--; /* add_character: label increments sindex */ + goto add_character; + } + else + { + SCOPY_CHAR_I (twochars, CTLESC, c, string, sindex, string_size); + } + + sindex++; +add_twochars: + /* BEFORE jumping here, we need to increment sindex if appropriate */ + RESIZE_MALLOCED_BUFFER (istring, istring_index, 2, istring_size, + DEFAULT_ARRAY_SIZE); + istring[istring_index++] = twochars[0]; + istring[istring_index++] = twochars[1]; + istring[istring_index] = '\0'; + + break; + + case '"': + if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))) + goto add_character; + + t_index = ++sindex; + temp = string_extract_double_quoted (string, &sindex, 0); + + /* If the quotes surrounded the entire string, then the + whole word was quoted. */ + quoted_state = (t_index == 1 && string[sindex] == '\0') + ? WHOLLY_QUOTED + : PARTIALLY_QUOTED; + + if (temp && *temp) + { + tword = alloc_word_desc (); + tword->word = temp; + + temp = (char *)NULL; + + temp_has_dollar_at = 0; /* XXX */ + /* Need to get W_HASQUOTEDNULL flag through this function. */ + list = expand_word_internal (tword, Q_DOUBLE_QUOTES, 0, &temp_has_dollar_at, (int *)NULL); + has_dollar_at += temp_has_dollar_at; + + if (list == &expand_word_error || list == &expand_word_fatal) + { + free (istring); + free (string); + /* expand_word_internal has already freed temp_word->word + for us because of the way it prints error messages. */ + tword->word = (char *)NULL; + dispose_word (tword); + return list; + } + + dispose_word (tword); + + /* "$@" (a double-quoted dollar-at) expands into nothing, + not even a NULL word, when there are no positional + parameters. */ + if (list == 0 && has_dollar_at) + { + quoted_dollar_at++; + break; + } + + /* If we get "$@", we know we have expanded something, so we + need to remember it for the final split on $IFS. This is + a special case; it's the only case where a quoted string + can expand into more than one word. It's going to come back + from the above call to expand_word_internal as a list with + a single word, in which all characters are quoted and + separated by blanks. What we want to do is to turn it back + into a list for the next piece of code. */ + if (list) + dequote_list (list); + + if (list && list->word && (list->word->flags & W_HASQUOTEDNULL)) + had_quoted_null = 1; /* XXX */ + + if (has_dollar_at) + { + quoted_dollar_at++; + if (contains_dollar_at) + *contains_dollar_at = 1; + if (expanded_something) + *expanded_something = 1; + } + } + else + { + /* What we have is "". This is a minor optimization. */ + FREE (temp); + list = (WORD_LIST *)NULL; + } + + /* The code above *might* return a list (consider the case of "$@", + where it returns "$1", "$2", etc.). We can't throw away the + rest of the list, and we have to make sure each word gets added + as quoted. We test on tresult->next: if it is non-NULL, we + quote the whole list, save it to a string with string_list, and + add that string. We don't need to quote the results of this + (and it would be wrong, since that would quote the separators + as well), so we go directly to add_string. */ + if (list) + { + if (list->next) + { + /* Testing quoted_dollar_at makes sure that "$@" is + split correctly when $IFS does not contain a space. */ + temp = quoted_dollar_at + ? string_list_dollar_at (list, Q_DOUBLE_QUOTES) + : string_list (quote_list (list)); + dispose_words (list); + goto add_string; + } + else + { + temp = savestring (list->word->word); + tflag = list->word->flags; + dispose_words (list); + + /* If the string is not a quoted null string, we want + to remove any embedded unquoted CTLNUL characters. + We do not want to turn quoted null strings back into + the empty string, though. We do this because we + want to remove any quoted nulls from expansions that + contain other characters. For example, if we have + x"$*"y or "x$*y" and there are no positional parameters, + the $* should expand into nothing. */ + /* We use the W_HASQUOTEDNULL flag to differentiate the + cases: a quoted null character as above and when + CTLNUL is contained in the (non-null) expansion + of some variable. We use the had_quoted_null flag to + pass the value through this function to its caller. */ + if ((tflag & W_HASQUOTEDNULL) && QUOTED_NULL (temp) == 0) + remove_quoted_nulls (temp); /* XXX */ + } + } + else + temp = (char *)NULL; + + /* We do not want to add quoted nulls to strings that are only + partially quoted; we can throw them away. The exception to + this is when we are going to be performing word splitting, + since we have to preserve a null argument if the next character + will cause word splitting. */ + if (temp == 0 && quoted_state == PARTIALLY_QUOTED && (word->flags & (W_NOSPLIT|W_NOSPLIT2))) + continue; + + add_quoted_string: + + if (temp) + { + temp1 = temp; + temp = quote_string (temp); + free (temp1); + goto add_string; + } + else + { + /* Add NULL arg. */ + c = CTLNUL; + sindex--; /* add_character: label increments sindex */ + goto add_character; + } + + /* break; */ + + case '\'': + if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))) + goto add_character; + + t_index = ++sindex; + temp = string_extract_single_quoted (string, &sindex); + + /* If the entire STRING was surrounded by single quotes, + then the string is wholly quoted. */ + quoted_state = (t_index == 1 && string[sindex] == '\0') + ? WHOLLY_QUOTED + : PARTIALLY_QUOTED; + + /* If all we had was '', it is a null expansion. */ + if (*temp == '\0') + { + free (temp); + temp = (char *)NULL; + } + else + remove_quoted_escapes (temp); /* ??? */ + + /* We do not want to add quoted nulls to strings that are only + partially quoted; such nulls are discarded. */ + if (temp == 0 && (quoted_state == PARTIALLY_QUOTED)) + continue; + + /* If we have a quoted null expansion, add a quoted NULL to istring. */ + if (temp == 0) + { + c = CTLNUL; + sindex--; /* add_character: label increments sindex */ + goto add_character; + } + else + goto add_quoted_string; + + /* break; */ + + default: + /* This is the fix for " $@ " */ + add_ifs_character: + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || (isexp == 0 && isifs (c))) + { + if (string[sindex]) /* from old goto dollar_add_string */ + sindex++; + if (c == 0) + { + c = CTLNUL; + goto add_character; + } + else + { +#if HANDLE_MULTIBYTE + if (MB_CUR_MAX > 1) + sindex--; + + if (MB_CUR_MAX > 1) + { + SADD_MBQCHAR_BODY(temp, string, sindex, string_size); + } + else +#endif + { + twochars[0] = CTLESC; + twochars[1] = c; + goto add_twochars; + } + } + } + + SADD_MBCHAR (temp, string, sindex, string_size); + + add_character: + RESIZE_MALLOCED_BUFFER (istring, istring_index, 1, istring_size, + DEFAULT_ARRAY_SIZE); + istring[istring_index++] = c; + istring[istring_index] = '\0'; + + /* Next character. */ + sindex++; + } + } + +finished_with_string: + /* OK, we're ready to return. If we have a quoted string, and + quoted_dollar_at is not set, we do no splitting at all; otherwise + we split on ' '. The routines that call this will handle what to + do if nothing has been expanded. */ + + /* Partially and wholly quoted strings which expand to the empty + string are retained as an empty arguments. Unquoted strings + which expand to the empty string are discarded. The single + exception is the case of expanding "$@" when there are no + positional parameters. In that case, we discard the expansion. */ + + /* Because of how the code that handles "" and '' in partially + quoted strings works, we need to make ISTRING into a QUOTED_NULL + if we saw quoting characters, but the expansion was empty. + "" and '' are tossed away before we get to this point when + processing partially quoted strings. This makes "" and $xxx"" + equivalent when xxx is unset. We also look to see whether we + saw a quoted null from a ${} expansion and add one back if we + need to. */ + + /* If we expand to nothing and there were no single or double quotes + in the word, we throw it away. Otherwise, we return a NULL word. + The single exception is for $@ surrounded by double quotes when + there are no positional parameters. In that case, we also throw + the word away. */ + + if (*istring == '\0') + { + if (quoted_dollar_at == 0 && (had_quoted_null || quoted_state == PARTIALLY_QUOTED)) + { + istring[0] = CTLNUL; + istring[1] = '\0'; + tword = make_bare_word (istring); + tword->flags |= W_HASQUOTEDNULL; /* XXX */ + list = make_word_list (tword, (WORD_LIST *)NULL); + if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) + tword->flags |= W_QUOTED; + } + /* According to sh, ksh, and Posix.2, if a word expands into nothing + and a double-quoted "$@" appears anywhere in it, then the entire + word is removed. */ + else if (quoted_state == UNQUOTED || quoted_dollar_at) + list = (WORD_LIST *)NULL; +#if 0 + else + { + tword = make_bare_word (istring); + if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) + tword->flags |= W_QUOTED; + list = make_word_list (tword, (WORD_LIST *)NULL); + } +#else + else + list = (WORD_LIST *)NULL; +#endif + } + else if (word->flags & W_NOSPLIT) + { + tword = make_bare_word (istring); + if (word->flags & W_ASSIGNMENT) + tword->flags |= W_ASSIGNMENT; /* XXX */ + if (word->flags & W_COMPASSIGN) + tword->flags |= W_COMPASSIGN; /* XXX */ + if (word->flags & W_NOGLOB) + tword->flags |= W_NOGLOB; /* XXX */ + if (word->flags & W_NOBRACE) + tword->flags |= W_NOBRACE; /* XXX */ + if (word->flags & W_NOEXPAND) + tword->flags |= W_NOEXPAND; /* XXX */ + if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) + tword->flags |= W_QUOTED; + if (had_quoted_null && QUOTED_NULL (istring)) + tword->flags |= W_HASQUOTEDNULL; + list = make_word_list (tword, (WORD_LIST *)NULL); + } + else + { + char *ifs_chars; + + ifs_chars = (quoted_dollar_at || has_dollar_at) ? ifs_value : (char *)NULL; + + /* If we have $@, we need to split the results no matter what. If + IFS is unset or NULL, string_list_dollar_at has separated the + positional parameters with a space, so we split on space (we have + set ifs_chars to " \t\n" above if ifs is unset). If IFS is set, + string_list_dollar_at has separated the positional parameters + with the first character of $IFS, so we split on $IFS. If + SPLIT_ON_SPACES is set, we expanded $* (unquoted) with IFS either + unset or null, and we want to make sure that we split on spaces + regardless of what else has happened to IFS since the expansion. */ + if (split_on_spaces) + list = list_string (istring, " ", 1); /* XXX quoted == 1? */ + else if (has_dollar_at && ifs_chars) + list = list_string (istring, *ifs_chars ? ifs_chars : " ", 1); + else + { + tword = make_bare_word (istring); + if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) || (quoted_state == WHOLLY_QUOTED)) + tword->flags |= W_QUOTED; + if (word->flags & W_ASSIGNMENT) + tword->flags |= W_ASSIGNMENT; + if (word->flags & W_COMPASSIGN) + tword->flags |= W_COMPASSIGN; + if (word->flags & W_NOGLOB) + tword->flags |= W_NOGLOB; + if (word->flags & W_NOBRACE) + tword->flags |= W_NOBRACE; + if (word->flags & W_NOEXPAND) + tword->flags |= W_NOEXPAND; + if (had_quoted_null && QUOTED_NULL (istring)) + tword->flags |= W_HASQUOTEDNULL; /* XXX */ + list = make_word_list (tword, (WORD_LIST *)NULL); + } + } + + free (istring); + return (list); +} + +/* **************************************************************** */ +/* */ +/* Functions for Quote Removal */ +/* */ +/* **************************************************************** */ + +/* Perform quote removal on STRING. If QUOTED > 0, assume we are obeying the + backslash quoting rules for within double quotes or a here document. */ +char * +string_quote_removal (string, quoted) + char *string; + int quoted; +{ + size_t slen; + char *r, *result_string, *temp, *send; + int sindex, tindex, dquote; + unsigned char c; + DECLARE_MBSTATE; + + /* The result can be no longer than the original string. */ + slen = strlen (string); + send = string + slen; + + r = result_string = (char *)xmalloc (slen + 1); + + for (dquote = sindex = 0; c = string[sindex];) + { + switch (c) + { + case '\\': + c = string[++sindex]; + if (c == 0) + { + *r++ = '\\'; + break; + } + if (((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || dquote) && (sh_syntaxtab[c] & CBSDQUOTE) == 0) + *r++ = '\\'; + /* FALLTHROUGH */ + + default: + SCOPY_CHAR_M (r, string, send, sindex); + break; + + case '\'': + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || dquote) + { + *r++ = c; + sindex++; + break; + } + tindex = sindex + 1; + temp = string_extract_single_quoted (string, &tindex); + if (temp) + { + strcpy (r, temp); + r += strlen (r); + free (temp); + } + sindex = tindex; + break; + + case '"': + dquote = 1 - dquote; + sindex++; + break; + } + } + *r = '\0'; + return (result_string); +} + +#if 0 +/* UNUSED */ +/* Perform quote removal on word WORD. This allocates and returns a new + WORD_DESC *. */ +WORD_DESC * +word_quote_removal (word, quoted) + WORD_DESC *word; + int quoted; +{ + WORD_DESC *w; + char *t; + + t = string_quote_removal (word->word, quoted); + w = alloc_word_desc (); + w->word = t ? t : savestring (""); + return (w); +} + +/* Perform quote removal on all words in LIST. If QUOTED is non-zero, + the members of the list are treated as if they are surrounded by + double quotes. Return a new list, or NULL if LIST is NULL. */ +WORD_LIST * +word_list_quote_removal (list, quoted) + WORD_LIST *list; + int quoted; +{ + WORD_LIST *result, *t, *tresult, *e; + + for (t = list, result = (WORD_LIST *)NULL; t; t = t->next) + { + tresult = make_word_list (word_quote_removal (t->word, quoted), (WORD_LIST *)NULL); +#if 0 + result = (WORD_LIST *) list_append (result, tresult); +#else + if (result == 0) + result = e = tresult; + else + { + e->next = tresult; + while (e->next) + e = e->next; + } +#endif + } + return (result); +} +#endif + +/******************************************* + * * + * Functions to perform word splitting * + * * + *******************************************/ + +void +setifs (v) + SHELL_VAR *v; +{ + char *t; + unsigned char uc; + + ifs_var = v; + ifs_value = (v && value_cell (v)) ? value_cell (v) : " \t\n"; + + ifs_is_set = ifs_var != 0; + ifs_is_null = ifs_is_set && (*ifs_value == 0); + + /* Should really merge ifs_cmap with sh_syntaxtab. XXX - doesn't yet + handle multibyte chars in IFS */ + memset (ifs_cmap, '\0', sizeof (ifs_cmap)); + for (t = ifs_value ; t && *t; t++) + { + uc = *t; + ifs_cmap[uc] = 1; + } + +#if defined (HANDLE_MULTIBYTE) + if (ifs_value == 0) + { + ifs_firstc[0] = '\0'; + ifs_firstc_len = 1; + } + else + { + size_t ifs_len; + ifs_len = strnlen (ifs_value, MB_CUR_MAX); + ifs_firstc_len = MBLEN (ifs_value, ifs_len); + if (ifs_firstc_len == 1 || ifs_firstc_len == 0 || MB_INVALIDCH (ifs_firstc_len)) + { + ifs_firstc[0] = ifs_value[0]; + ifs_firstc[1] = '\0'; + ifs_firstc_len = 1; + } + else + memcpy (ifs_firstc, ifs_value, ifs_firstc_len); + } +#else + ifs_firstc = ifs_value ? *ifs_value : 0; +#endif +} + +char * +getifs () +{ + return ifs_value; +} + +/* This splits a single word into a WORD LIST on $IFS, but only if the word + is not quoted. list_string () performs quote removal for us, even if we + don't do any splitting. */ +WORD_LIST * +word_split (w, ifs_chars) + WORD_DESC *w; + char *ifs_chars; +{ + WORD_LIST *result; + + if (w) + { + char *xifs; + + xifs = ((w->flags & W_QUOTED) || ifs_chars == 0) ? "" : ifs_chars; + result = list_string (w->word, xifs, w->flags & W_QUOTED); + } + else + result = (WORD_LIST *)NULL; + + return (result); +} + +/* Perform word splitting on LIST and return the RESULT. It is possible + to return (WORD_LIST *)NULL. */ +static WORD_LIST * +word_list_split (list) + WORD_LIST *list; +{ + WORD_LIST *result, *t, *tresult, *e; + + for (t = list, result = (WORD_LIST *)NULL; t; t = t->next) + { + tresult = word_split (t->word, ifs_value); + if (result == 0) + result = e = tresult; + else + { + e->next = tresult; + while (e->next) + e = e->next; + } + } + return (result); +} + +/************************************************** + * * + * Functions to expand an entire WORD_LIST * + * * + **************************************************/ + +/* Do any word-expansion-specific cleanup and jump to top_level */ +static void +exp_jump_to_top_level (v) + int v; +{ + set_pipestatus_from_exit (last_command_exit_value); + + /* Cleanup code goes here. */ + expand_no_split_dollar_star = 0; /* XXX */ + expanding_redir = 0; + assigning_in_environment = 0; + + if (parse_and_execute_level == 0) + top_level_cleanup (); /* from sig.c */ + + jump_to_top_level (v); +} + +/* Put NLIST (which is a WORD_LIST * of only one element) at the front of + ELIST, and set ELIST to the new list. */ +#define PREPEND_LIST(nlist, elist) \ + do { nlist->next = elist; elist = nlist; } while (0) + +/* Separate out any initial variable assignments from TLIST. If set -k has + been executed, remove all assignment statements from TLIST. Initial + variable assignments and other environment assignments are placed + on SUBST_ASSIGN_VARLIST. */ +static WORD_LIST * +separate_out_assignments (tlist) + WORD_LIST *tlist; +{ + register WORD_LIST *vp, *lp; + + if (tlist == 0) + return ((WORD_LIST *)NULL); + + if (subst_assign_varlist) + dispose_words (subst_assign_varlist); /* Clean up after previous error */ + + subst_assign_varlist = (WORD_LIST *)NULL; + vp = lp = tlist; + + /* Separate out variable assignments at the start of the command. + Loop invariant: vp->next == lp + Loop postcondition: + lp = list of words left after assignment statements skipped + tlist = original list of words + */ + while (lp && (lp->word->flags & W_ASSIGNMENT)) + { + vp = lp; + lp = lp->next; + } + + /* If lp != tlist, we have some initial assignment statements. + We make SUBST_ASSIGN_VARLIST point to the list of assignment + words and TLIST point to the remaining words. */ + if (lp != tlist) + { + subst_assign_varlist = tlist; + /* ASSERT(vp->next == lp); */ + vp->next = (WORD_LIST *)NULL; /* terminate variable list */ + tlist = lp; /* remainder of word list */ + } + + /* vp == end of variable list */ + /* tlist == remainder of original word list without variable assignments */ + if (!tlist) + /* All the words in tlist were assignment statements */ + return ((WORD_LIST *)NULL); + + /* ASSERT(tlist != NULL); */ + /* ASSERT((tlist->word->flags & W_ASSIGNMENT) == 0); */ + + /* If the -k option is in effect, we need to go through the remaining + words, separate out the assignment words, and place them on + SUBST_ASSIGN_VARLIST. */ + if (place_keywords_in_env) + { + WORD_LIST *tp; /* tp == running pointer into tlist */ + + tp = tlist; + lp = tlist->next; + + /* Loop Invariant: tp->next == lp */ + /* Loop postcondition: tlist == word list without assignment statements */ + while (lp) + { + if (lp->word->flags & W_ASSIGNMENT) + { + /* Found an assignment statement, add this word to end of + subst_assign_varlist (vp). */ + if (!subst_assign_varlist) + subst_assign_varlist = vp = lp; + else + { + vp->next = lp; + vp = lp; + } + + /* Remove the word pointed to by LP from TLIST. */ + tp->next = lp->next; + /* ASSERT(vp == lp); */ + lp->next = (WORD_LIST *)NULL; + lp = tp->next; + } + else + { + tp = lp; + lp = lp->next; + } + } + } + return (tlist); +} + +#define WEXP_VARASSIGN 0x001 +#define WEXP_BRACEEXP 0x002 +#define WEXP_TILDEEXP 0x004 +#define WEXP_PARAMEXP 0x008 +#define WEXP_PATHEXP 0x010 + +/* All of the expansions, including variable assignments at the start of + the list. */ +#define WEXP_ALL (WEXP_VARASSIGN|WEXP_BRACEEXP|WEXP_TILDEEXP|WEXP_PARAMEXP|WEXP_PATHEXP) + +/* All of the expansions except variable assignments at the start of + the list. */ +#define WEXP_NOVARS (WEXP_BRACEEXP|WEXP_TILDEEXP|WEXP_PARAMEXP|WEXP_PATHEXP) + +/* All of the `shell expansions': brace expansion, tilde expansion, parameter + expansion, command substitution, arithmetic expansion, word splitting, and + quote removal. */ +#define WEXP_SHELLEXP (WEXP_BRACEEXP|WEXP_TILDEEXP|WEXP_PARAMEXP) + +/* Take the list of words in LIST and do the various substitutions. Return + a new list of words which is the expanded list, and without things like + variable assignments. */ + +WORD_LIST * +expand_words (list) + WORD_LIST *list; +{ + return (expand_word_list_internal (list, WEXP_ALL)); +} + +/* Same as expand_words (), but doesn't hack variable or environment + variables. */ +WORD_LIST * +expand_words_no_vars (list) + WORD_LIST *list; +{ + return (expand_word_list_internal (list, WEXP_NOVARS)); +} + +WORD_LIST * +expand_words_shellexp (list) + WORD_LIST *list; +{ + return (expand_word_list_internal (list, WEXP_SHELLEXP)); +} + +static WORD_LIST * +glob_expand_word_list (tlist, eflags) + WORD_LIST *tlist; + int eflags; +{ + char **glob_array, *temp_string; + register int glob_index; + WORD_LIST *glob_list, *output_list, *disposables, *next; + WORD_DESC *tword; + + output_list = disposables = (WORD_LIST *)NULL; + glob_array = (char **)NULL; + while (tlist) + { + /* For each word, either globbing is attempted or the word is + added to orig_list. If globbing succeeds, the results are + added to orig_list and the word (tlist) is added to the list + of disposable words. If globbing fails and failed glob + expansions are left unchanged (the shell default), the + original word is added to orig_list. If globbing fails and + failed glob expansions are removed, the original word is + added to the list of disposable words. orig_list ends up + in reverse order and requires a call to REVERSE_LIST to + be set right. After all words are examined, the disposable + words are freed. */ + next = tlist->next; + + /* If the word isn't an assignment and contains an unquoted + pattern matching character, then glob it. */ + if ((tlist->word->flags & W_NOGLOB) == 0 && + unquoted_glob_pattern_p (tlist->word->word)) + { + glob_array = shell_glob_filename (tlist->word->word); + + /* Handle error cases. + I don't think we should report errors like "No such file + or directory". However, I would like to report errors + like "Read failed". */ + + if (glob_array == 0 || GLOB_FAILED (glob_array)) + { + glob_array = (char **)xmalloc (sizeof (char *)); + glob_array[0] = (char *)NULL; + } + + /* Dequote the current word in case we have to use it. */ + if (glob_array[0] == NULL) + { + temp_string = dequote_string (tlist->word->word); + free (tlist->word->word); + tlist->word->word = temp_string; + } + + /* Make the array into a word list. */ + glob_list = (WORD_LIST *)NULL; + for (glob_index = 0; glob_array[glob_index]; glob_index++) + { + tword = make_bare_word (glob_array[glob_index]); + glob_list = make_word_list (tword, glob_list); + } + + if (glob_list) + { + output_list = (WORD_LIST *)list_append (glob_list, output_list); + PREPEND_LIST (tlist, disposables); + } + else if (fail_glob_expansion != 0) + { + last_command_exit_value = EXECUTION_FAILURE; + report_error (_("no match: %s"), tlist->word->word); + exp_jump_to_top_level (DISCARD); + } + else if (allow_null_glob_expansion == 0) + { + /* Failed glob expressions are left unchanged. */ + PREPEND_LIST (tlist, output_list); + } + else + { + /* Failed glob expressions are removed. */ + PREPEND_LIST (tlist, disposables); + } + } + else + { + /* Dequote the string. */ + temp_string = dequote_string (tlist->word->word); + free (tlist->word->word); + tlist->word->word = temp_string; + PREPEND_LIST (tlist, output_list); + } + + strvec_dispose (glob_array); + glob_array = (char **)NULL; + + tlist = next; + } + + if (disposables) + dispose_words (disposables); + + if (output_list) + output_list = REVERSE_LIST (output_list, WORD_LIST *); + + return (output_list); +} + +#if defined (BRACE_EXPANSION) +static WORD_LIST * +brace_expand_word_list (tlist, eflags) + WORD_LIST *tlist; + int eflags; +{ + register char **expansions; + char *temp_string; + WORD_LIST *disposables, *output_list, *next; + WORD_DESC *w; + int eindex; + + for (disposables = output_list = (WORD_LIST *)NULL; tlist; tlist = next) + { + next = tlist->next; + + if (tlist->word->flags & W_NOBRACE) + { +/*itrace("brace_expand_word_list: %s: W_NOBRACE", tlist->word->word);*/ + PREPEND_LIST (tlist, output_list); + continue; + } + + if ((tlist->word->flags & (W_COMPASSIGN|W_ASSIGNARG)) == (W_COMPASSIGN|W_ASSIGNARG)) + { +/*itrace("brace_expand_word_list: %s: W_COMPASSIGN|W_ASSIGNARG", tlist->word->word);*/ + PREPEND_LIST (tlist, output_list); + continue; + } + + /* Only do brace expansion if the word has a brace character. If + not, just add the word list element to BRACES and continue. In + the common case, at least when running shell scripts, this will + degenerate to a bunch of calls to `mbschr', and then what is + basically a reversal of TLIST into BRACES, which is corrected + by a call to REVERSE_LIST () on BRACES when the end of TLIST + is reached. */ + if (mbschr (tlist->word->word, LBRACE)) + { + expansions = brace_expand (tlist->word->word); + + for (eindex = 0; temp_string = expansions[eindex]; eindex++) + { + w = alloc_word_desc (); + w->word = temp_string; + + /* If brace expansion didn't change the word, preserve + the flags. We may want to preserve the flags + unconditionally someday -- XXX */ + if (STREQ (temp_string, tlist->word->word)) + w->flags = tlist->word->flags; + else + w = make_word_flags (w, temp_string); + + output_list = make_word_list (w, output_list); + } + free (expansions); + + /* Add TLIST to the list of words to be freed after brace + expansion has been performed. */ + PREPEND_LIST (tlist, disposables); + } + else + PREPEND_LIST (tlist, output_list); + } + + if (disposables) + dispose_words (disposables); + + if (output_list) + output_list = REVERSE_LIST (output_list, WORD_LIST *); + + return (output_list); +} +#endif + +#if defined (ARRAY_VARS) +/* Take WORD, a compound associative array assignment, and internally run + 'declare -A w', where W is the variable name portion of WORD. */ +static int +make_internal_declare (word, option) + char *word; + char *option; +{ + int t; + WORD_LIST *wl; + WORD_DESC *w; + + w = make_word (word); + + t = assignment (w->word, 0); + w->word[t] = '\0'; + + wl = make_word_list (w, (WORD_LIST *)NULL); + wl = make_word_list (make_word (option), wl); + + return (declare_builtin (wl)); +} +#endif + +static WORD_LIST * +shell_expand_word_list (tlist, eflags) + WORD_LIST *tlist; + int eflags; +{ + WORD_LIST *expanded, *orig_list, *new_list, *next, *temp_list; + int expanded_something, has_dollar_at; + char *temp_string; + + /* We do tilde expansion all the time. This is what 1003.2 says. */ + new_list = (WORD_LIST *)NULL; + for (orig_list = tlist; tlist; tlist = next) + { + temp_string = tlist->word->word; + + next = tlist->next; + +#if defined (ARRAY_VARS) + /* If this is a compound array assignment to a builtin that accepts + such assignments (e.g., `declare'), take the assignment and perform + it separately, handling the semantics of declarations inside shell + functions. This avoids the double-evaluation of such arguments, + because `declare' does some evaluation of compound assignments on + its own. */ + if ((tlist->word->flags & (W_COMPASSIGN|W_ASSIGNARG)) == (W_COMPASSIGN|W_ASSIGNARG)) + { + int t; + char opts[8], opti; + + opti = 0; + if (tlist->word->flags & (W_ASSIGNASSOC|W_ASSNGLOBAL|W_ASSIGNARRAY)) + opts[opti++] = '-'; + + if ((tlist->word->flags & (W_ASSIGNASSOC|W_ASSNGLOBAL)) == (W_ASSIGNASSOC|W_ASSNGLOBAL)) + { + opts[opti++] = 'g'; + opts[opti++] = 'A'; + } + else if (tlist->word->flags & W_ASSIGNASSOC) + opts[opti++] = 'A'; + else if ((tlist->word->flags & (W_ASSIGNARRAY|W_ASSNGLOBAL)) == (W_ASSIGNARRAY|W_ASSNGLOBAL)) + { + opts[opti++] = 'g'; + opts[opti++] = 'a'; + } + else if (tlist->word->flags & W_ASSIGNARRAY) + opts[opti++] = 'a'; + else if (tlist->word->flags & W_ASSNGLOBAL) + opts[opti++] = 'g'; + +#if 0 + /* If we have special handling note the integer attribute */ + if (opti > 0 && (tlist->word->flags & W_ASSIGNINT)) + opts[opti++] = 'i'; +#endif + + opts[opti] = '\0'; + if (opti > 0) + make_internal_declare (tlist->word->word, opts); + + t = do_word_assignment (tlist->word, 0); + if (t == 0) + { + last_command_exit_value = EXECUTION_FAILURE; + exp_jump_to_top_level (DISCARD); + } + + /* Now transform the word as ksh93 appears to do and go on */ + t = assignment (tlist->word->word, 0); + tlist->word->word[t] = '\0'; + tlist->word->flags &= ~(W_ASSIGNMENT|W_NOSPLIT|W_COMPASSIGN|W_ASSIGNARG|W_ASSIGNASSOC|W_ASSIGNARRAY); + } +#endif + + expanded_something = 0; + expanded = expand_word_internal + (tlist->word, 0, 0, &has_dollar_at, &expanded_something); + + if (expanded == &expand_word_error || expanded == &expand_word_fatal) + { + /* By convention, each time this error is returned, + tlist->word->word has already been freed. */ + tlist->word->word = (char *)NULL; + + /* Dispose our copy of the original list. */ + dispose_words (orig_list); + /* Dispose the new list we're building. */ + dispose_words (new_list); + + last_command_exit_value = EXECUTION_FAILURE; + if (expanded == &expand_word_error) + exp_jump_to_top_level (DISCARD); + else + exp_jump_to_top_level (FORCE_EOF); + } + + /* Don't split words marked W_NOSPLIT. */ + if (expanded_something && (tlist->word->flags & W_NOSPLIT) == 0) + { + temp_list = word_list_split (expanded); + dispose_words (expanded); + } + else + { + /* If no parameter expansion, command substitution, process + substitution, or arithmetic substitution took place, then + do not do word splitting. We still have to remove quoted + null characters from the result. */ + word_list_remove_quoted_nulls (expanded); + temp_list = expanded; + } + + expanded = REVERSE_LIST (temp_list, WORD_LIST *); + new_list = (WORD_LIST *)list_append (expanded, new_list); + } + + if (orig_list) + dispose_words (orig_list); + + if (new_list) + new_list = REVERSE_LIST (new_list, WORD_LIST *); + + return (new_list); +} + +/* The workhorse for expand_words () and expand_words_no_vars (). + First arg is LIST, a WORD_LIST of words. + Second arg EFLAGS is a flags word controlling which expansions are + performed. + + This does all of the substitutions: brace expansion, tilde expansion, + parameter expansion, command substitution, arithmetic expansion, + process substitution, word splitting, and pathname expansion, according + to the bits set in EFLAGS. Words with the W_QUOTED or W_NOSPLIT bits + set, or for which no expansion is done, do not undergo word splitting. + Words with the W_NOGLOB bit set do not undergo pathname expansion; words + with W_NOBRACE set do not undergo brace expansion (see + brace_expand_word_list above). */ +static WORD_LIST * +expand_word_list_internal (list, eflags) + WORD_LIST *list; + int eflags; +{ + WORD_LIST *new_list, *temp_list; + int tint; + + tempenv_assign_error = 0; + if (list == 0) + return ((WORD_LIST *)NULL); + + garglist = new_list = copy_word_list (list); + if (eflags & WEXP_VARASSIGN) + { + garglist = new_list = separate_out_assignments (new_list); + if (new_list == 0) + { + if (subst_assign_varlist) + { + /* All the words were variable assignments, so they are placed + into the shell's environment. */ + for (temp_list = subst_assign_varlist; temp_list; temp_list = temp_list->next) + { + this_command_name = (char *)NULL; /* no arithmetic errors */ + tint = do_word_assignment (temp_list->word, 0); + /* Variable assignment errors in non-interactive shells + running in Posix.2 mode cause the shell to exit. */ + if (tint == 0) + { + last_command_exit_value = EXECUTION_FAILURE; + if (interactive_shell == 0 && posixly_correct) + exp_jump_to_top_level (FORCE_EOF); + else + exp_jump_to_top_level (DISCARD); + } + } + dispose_words (subst_assign_varlist); + subst_assign_varlist = (WORD_LIST *)NULL; + } + return ((WORD_LIST *)NULL); + } + } + + /* Begin expanding the words that remain. The expansions take place on + things that aren't really variable assignments. */ + +#if defined (BRACE_EXPANSION) + /* Do brace expansion on this word if there are any brace characters + in the string. */ + if ((eflags & WEXP_BRACEEXP) && brace_expansion && new_list) + new_list = brace_expand_word_list (new_list, eflags); +#endif /* BRACE_EXPANSION */ + + /* Perform the `normal' shell expansions: tilde expansion, parameter and + variable substitution, command substitution, arithmetic expansion, + and word splitting. */ + new_list = shell_expand_word_list (new_list, eflags); + + /* Okay, we're almost done. Now let's just do some filename + globbing. */ + if (new_list) + { + if ((eflags & WEXP_PATHEXP) && disallow_filename_globbing == 0) + /* Glob expand the word list unless globbing has been disabled. */ + new_list = glob_expand_word_list (new_list, eflags); + else + /* Dequote the words, because we're not performing globbing. */ + new_list = dequote_list (new_list); + } + + if ((eflags & WEXP_VARASSIGN) && subst_assign_varlist) + { + sh_wassign_func_t *assign_func; + int is_special_builtin, is_builtin_or_func; + + /* If the remainder of the words expand to nothing, Posix.2 requires + that the variable and environment assignments affect the shell's + environment. */ + assign_func = new_list ? assign_in_env : do_word_assignment; + tempenv_assign_error = 0; + + is_builtin_or_func = (new_list && new_list->word && (find_shell_builtin (new_list->word->word) || find_function (new_list->word->word))); + /* Posix says that special builtins exit if a variable assignment error + occurs in an assignment preceding it. */ + is_special_builtin = (posixly_correct && new_list && new_list->word && find_special_builtin (new_list->word->word)); + + for (temp_list = subst_assign_varlist; temp_list; temp_list = temp_list->next) + { + this_command_name = (char *)NULL; + assigning_in_environment = (assign_func == assign_in_env); + tint = (*assign_func) (temp_list->word, is_builtin_or_func); + assigning_in_environment = 0; + /* Variable assignment errors in non-interactive shells running + in Posix.2 mode cause the shell to exit. */ + if (tint == 0) + { + if (assign_func == do_word_assignment) + { + last_command_exit_value = EXECUTION_FAILURE; + if (interactive_shell == 0 && posixly_correct && is_special_builtin) + exp_jump_to_top_level (FORCE_EOF); + else + exp_jump_to_top_level (DISCARD); + } + else + tempenv_assign_error++; + } + } + + dispose_words (subst_assign_varlist); + subst_assign_varlist = (WORD_LIST *)NULL; + } + + return (new_list); +}