1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
|
This is the Bash FAQ, version 2.1, for Bash version 2.0.
This document contains a set of frequently-asked questions concerning
Bash, the GNU Bourne-Again Shell. Bash is a freely-available command
interpreter with advanced features for both interactive use and shell
programming.
Another good source of basic information about shells is the collection
of FAQ articles periodically posted to comp.unix.shell.
Questions and comments concerning this document should be sent to
chet@po.cwru.edu.
This document is available for anonymous FTP with the URL
ftp://slc2.ins.cwru.edu/pub/bash/FAQ
----------
Contents:
Section A: The Basics
1) What is it?
2) What's the latest version?
3) Where can I get it?
4) On what machines will bash run?
5) How can I build bash with gcc?
6) How can I make bash my login shell?
7) I just changed my login shell to bash, and now I can't FTP into my
machine. Why not?
8) What's the `POSIX 1003.2 standard'?
9) What is the bash `posix mode'?
Section B: The latest version
10) What's new in version 2.0?
11) Are there any user-visible incompatibilities between bash-2.0 and
bash-1.14.7?
Section C: Differences from other Unix shells
12) How does bash differ from sh, the Bourne shell?
13) How does bash differ from the Korn shell, version ksh88?
14) Which new features in ksh-93 are not in bash, and which are?
Section D: Why does bash do some things differently than other Unix shells?
15) Why does bash run a different version of `command' than
`which command' says it will?
16) Why doesn't bash treat brace expansions exactly like csh?
17) Why doesn't bash have csh variable modifiers?
18) How can I make my csh aliases work when I convert to bash?
19) How can I pipe standard output and standard error from one command to
another, like csh does with `|&'?
20) Now that I've converted from ksh to bash, are there equivalents to
ksh features like autoloaded functions and the `whence' command?
Section E: How can I get bash to do certain things, and why does bash do
things the way it does?
21) Why is the bash builtin `test' slightly different from /bin/test?
22) Why does bash sometimes say `Broken pipe'?
23) How can I get bash to read and display eight-bit characters?
24) How do I write a function `x' to replace builtin command `x', but
still invoke the command from within the function?
25) When I have terminal escape sequences in my prompt, why does bash
wrap lines at the wrong column?
26) How can I find the value of a shell variable whose name is the value
of another shell variable?
27) If I pipe the output of a command into `read variable', why doesn't
the output show up in $variable when the read command finishes?
28) I have a bunch of shell scripts that use backslash-escaped characters
in arguments to `echo'. Bash doesn't interpret these characters. Why
not, and how can I make it understand them?
29) Why doesn't a while or for loop get suspended when I type ^Z?
30) How can I make the bash `time' reserved word print timing output that
looks like the output from my system's /usr/bin/time?
Section F: Things to watch out for on certain Unix versions
31) Why can't I use command line editing in my `cmdtool'?
32) I built bash on Solaris 2. Why do globbing expansions and filename
completion chop off the first few characters of each filename?
33) Why does bash dump core after I interrupt username completion or
`~user' tilde expansion on a machine running NIS?
34) I'm running SVR4.2. Why is the line erased every time I type `@'?
35) Why does bash report syntax errors when my C News scripts use a
redirection before a subshell command?
Section G: Where do I go from here?
36) How do I report bugs in bash, and where should I look for fixes and
advice?
37) What kind of bash documentation is there?
38) What's coming in future versions?
39) What's on the bash `wish list'?
40) When will the next release appear?
----------
Section A: The Basics
1) What is it?
Bash is a Unix command interpreter (shell). It is an implementation of
the Posix 1003.2 shell standard, and resembles the Korn and System V
shells.
Bash contains a number of enhancements over those shells, both
for interactive use and shell programming. Features geared
toward interactive use include command line editing, command
history, job control, aliases, and prompt expansion. Programming
features include additional variable expansions, shell
arithmetic, and a number of variables and options to control
shell behavior.
Bash was originally written by Brian Fox of the Free Software
Foundation. The current developer and maintainer is Chet Ramey
of Case Western Reserve University.
2) What's the latest version?
The latest version is 2.0, first made available on December 23, 1996.
3) Where can I get it?
Bash is the GNU project's shell, and so is available from the
master GNU archive site, prep.ai.mit.edu, and its mirrors. The
latest version is also available for FTP from slc2.ins.cwru.edu,
the maintainer's machine. The following URLs tell how to get
version 2.0:
ftp://prep.ai.mit.edu/pub/gnu/bash-2.0.tar.gz
ftp://slc2.ins.cwru.edu/pub/dist/bash-2.0.tar.gz
Formatted versions of the documentation are available with the URLs:
ftp://prep.ai.mit.edu/pub/gnu/bash-doc-2.0.tar.gz
ftp://slc2.ins.cwru.edu/pub/dist/bash-doc-2.0.tar.gz
4) On what machines will bash run?
Bash has been ported to nearly every version of UNIX. All you
should have to do to build it on a machine for which a port
exists is to type `configure' and then `make'. The build process
will attempt to discover the version of UNIX you have and tailor
itself accordingly, using a script created by GNU autoconf.
More information appears in the file `INSTALL' in the distribution.
5) How can I build bash with gcc?
Bash configures to use gcc by default if it is available. Read the
file INSTALL in the distribution for more information.
6) How can I make bash my login shell?
Some machines let you use `chsh' to change your login shell. Other
systems use `passwd -s'. If one of these works for you, that's all
you need. Note that many systems require the full pathname to a shell
to appear in /etc/shells before you can make it your login shell. For
this, you may need the assistance of your friendly local system
administrator.
If you cannot do this, you can still use bash as your login shell, but
you need to perform some tricks. The basic idea is to add a command
to your login shell's startup file to replace your login shell with
bash.
For example, if your login shell is csh or tcsh, and you have installed
bash in /usr/gnu/bin/bash, add the following line to ~/.login:
if ( -f /usr/gnu/bin/bash ) exec /usr/gnu/bin/bash --login
(the `--login' tells bash that it is a login shell).
It's not a good idea to put this command into ~/.cshrc, because every
csh you run without the `-f' option, even ones started to run csh scripts,
reads that file. If you must put the command in ~/.cshrc, use something
like
if ( $?prompt ) exec /usr/gnu/bin/bash --login
to ensure that bash is exec'd only when the csh is interactive.
If your login shell is sh or ksh, you have to do two things. First, add
a line similar to the above to ~/.profile:
[ -f /usr/gnu/bin/bash ] && exec /usr/gnu/bin/bash --login
Next, create an empty file in your home directory named `.bash_profile'.
The existence of this file will prevent the exec'd bash from trying to
read ~/.profile, and re-execing itself over and over again. ~/.bash_profile
is the file bash tries to read initialization commands from when it is
invoked as a login shell.
7) I just changed my login shell to bash, and now I can't FTP into my
machine. Why not?
You must add the full pathname to bash to the file /etc/shells. As
noted in the answer to the previous question, many systems require
this before you can make bash your login shell.
Most versions of ftpd use this file to prohibit `special' users
such as `uucp' and `news' from using FTP.
8) What's the `POSIX 1003.2 standard'?
POSIX is a name originally coined by Richard Stallman for a
family of open system standards based on UNIX. There are a
number of aspects of UNIX under consideration for
standardization, from the basic system services at the system
call and C library level to applications and tools to system
administration and management. Each area of standardization is
assigned to a working group in the 1003 series.
The POSIX Shell and Utilities standard has been developed by IEEE
Working Group 1003.2 (POSIX.2). It concentrates on the command
interpreter interface and utility programs commonly executed from
the command line or by other programs. An initial version of the
standard has been approved and published by the IEEE, and work is
currently underway to update it.
Bash is concerned with the aspects of the shell's behavior
defined by POSIX.2. The shell command language has of course
been standardized, including the basic flow control and program
execution constructs, I/O redirection and pipelining, argument
handling, variable expansion, and quoting.
The `special' builtins, which must be implemented as part of the
shell to provide the desired functionality, are specified as
being part of the shell; examples of these are `eval' and
`export'. Other utilities appear in the sections of POSIX.2 not
devoted to the shell which are commonly (and in some cases must
be) implemented as builtin commands, such as `read' and `test'.
POSIX.2 also specifies aspects of the shell's interactive
behavior as part of the UPE, including job control and command
line editing. Only vi-style line editing commands have been
standardized; emacs editing commands were left out due to
objections.
9) What is the bash `posix mode'?
Although bash is an implementation of the POSIX.2 shell
specification, there are areas where the bash default behavior
differs from that spec. The bash `posix mode' changes the bash
behavior in these areas so that it obeys the spec more closely.
Posix mode is entered by starting bash with the --posix option or
executing `set -o posix' after bash is running.
The specific aspects of bash which change when posix mode is
active are listed in the file CWRU/POSIX.NOTES in the bash
distribution. They are also listed in a section in the Bash
Reference Manual.
Section B: The latest version
10) What's new in version 2.0?
This version contains extensive changes and new features. Here's a
short list:
new `time' reserved word to time pipelines, shell builtins, and
shell functions
one-dimensional arrays with a new compound assignment statement,
appropriate expansion constructs and modifications to some
of the builtins (read, declare, etc.) to use them
new quoting syntaxes for ANSI-C string expansion and locale-specific
string translation
new expansions to do substring extraction, pattern replacement, and
indirect variable expansion
new builtins: `disown' and `shopt'
new variables: HISTIGNORE, SHELLOPTS, PIPESTATUS, DIRSTACK, GLOBIGNORE,
MACHTYPE, BASH_VERSINFO
special handling of many unused or redundant variables removed
(e.g., $notify, $glob_dot_filenames, $no_exit_on_failed_exec)
dynamic loading of new builtin commands; many loadable examples provided
new prompt expansions: \a, \e, \n, \H, \T, \@, \v, \V
history and aliases available in shell scripts
new readline variables: enable-keypad, mark-directories, input-meta,
visible-stats, disable-completion, comment-begin
new readline commands to manipulate the mark and operate on the region
new readline emacs mode commands and bindings for ksh-88 compatibility
updated and extended builtins
new DEBUG trap
expanded (and now documented) restricted shell mode
implementation stuff:
autoconf-based configuration
nearly all of the bugs reported since version 1.14 have been fixed
most builtins converted to use builtin `getopt' for consistency
most builtins use -p option to display output in a reusable form
(for consistency)
grammar tighter and smaller (66 reduce-reduce conflicts gone)
lots of code now smaller and faster
test suite greatly expanded
11) Are there any user-visible incompatibilities between bash-2.0 and
bash-1.14.7?
There are a few incompatibilities between version 1.14.7 and version 2.0.
They are detailed in the file COMPAT in the bash-2.0 distribution.
Section C: Differences from other Unix shells
12) How does bash differ from sh, the Bourne shell?
This is a non-comprehensive list of features that differentiate bash
from the SVR4.2 shell. The bash manual page explains these more
completely.
Things bash has that sh does not:
long invocation options
`!' reserved word to invert pipeline return value
`time' reserved word to time pipelines and shell builtins
the `function' reserved word
the select compound command and reserved word
new $'...' and $"..." quoting
the $(...) form of command substitution
the ${#param} parameter value length operator
the ${!param} indirect parameter expansion operator
the ${param:length[:offset]} parameter substring operator
the ${param/pat[/string]} parameter pattern substitution operator
expansions to perform substring removal (${p%[%]w}, ${p#[#]w})
expansion of positional parameters beyond $9 with ${num}
variables: BASH, BASH_VERSION, BASH_VERSINFO, UID, EUID, REPLY,
TIMEFORMAT, PPID, PWD, OLDPWD, SHLVL, RANDOM, SECONDS,
LINENO, HISTCMD, HOSTTYPE, OSTYPE, MACHTYPE, HOSTNAME,
ENV, PS3, PS4, DIRSTACK, PIPESTATUS, HISTSIZE, HISTFILE,
HISTFILESIZE, HISTCONTROL, HISTIGNORE, GLOBIGNORE,
PROMPT_COMMAND, FCEDIT, FIGNORE, IGNOREEOF, INPUTRC,
SHELLOPTS, OPTERR, HOSTFILE, TMOUT, histchars, auto_resume
DEBUG trap
variable arrays with new compound assignment syntax
redirections: <>, &>, >|
prompt string special char translation and variable expansion
auto-export of modified values of variables in initial environment
command search finds functions before builtins
bash return builtin will exit a file sourced with `.'
builtins: cd -/-L/-P, exec -l/-c/-a, echo -e/-E, hash -p.
export -n/-f/-p/name=value, pwd -L/-P, read -e/-p/-a,
readonly -a/-f/name=value, trap -l, set +o,
set -b/-m/-o option/-h/-p/-B/-C/-H/-P,
unset -f/-v, ulimit -m/-p/-u,
type -a/-p/-t, suspend -f, kill -n,
test -o optname/s1 == s2/s1 < s2/s1 > s2/-nt/-ot/-ef/-O/-G/-S
bash reads ~/.bashrc for interactive shells, $ENV for non-interactive
bash restricted shell mode is more extensive
bash allows functions and variables with the same name
brace expansion
tilde expansion
arithmetic expansion with $((...)) and `let' builtin
process substitution
aliases and alias/unalias builtins
local variables in functions and `local' builtin
readline and command-line editing
command history and history/fc builtins
csh-like history expansion
other new bash builtins: bind, command, builtin, declare/typeset,
dirs, enable, fc, help, history, logout,
popd, pushd, disown, shopt
exported functions
filename generation when using output redirection (command >a*)
variable assignments preceding commands affect only that command,
even for builtins and functions
posix mode
Things sh has that bash does not:
uses variable SHACCT to do shell accounting
includes `stop' builtin (bash can use alias stop='kill -s STOP')
`newgrp' builtin
turns on job control if called as `jsh'
ulimit attempts to set both soft & hard limits if -S/-H not given
$TIMEOUT (like bash $TMOUT)
`^' is a synonym for `|'
new SVR4.2 sh builtins: mldmode, priv
Implementation differences:
redirection to/from compound commands causes sh to create a subshell
bash does not allow unbalanced quotes; sh silently inserts them at EOF
bash does not mess with signal 11
sh sets (euid, egid) to (uid, gid) if -p not supplied and uid < 100
bash splits only the results of expansions on IFS, using POSIX.2
field splitting rules; sh splits all words on IFS
sh does not allow MAILCHECK to be unset (?)
sh does not allow traps on SIGALRM or SIGCHLD
bash allows multiple option arguments when invoked (e.g. -x -v);
sh allows only a single option argument (`sh -x -v' attempts
to open a file named `-v', and, on SunOS 4.1.4, dumps core)
sh exits a script if any builtin fails; bash exits only if one of
the POSIX.2 `special' builtins fails
13) How does bash differ from the Korn shell, version ksh88?
Things bash has or uses that ksh88 does not:
long invocation options
`!' reserved word
posix mode and posix conformance
command hashing
tilde expansion for assignment statements that look like $PATH
process substitution with named pipes if /dev/fd is not available
the ${!param} indirect parameter expansion operator
the ${param:length[:offset]} parameter substring operator
the ${param/pat[/string]} parameter pattern substitution operator
variables: BASH, BASH_VERSION, BASH_VERSINFO, UID, EUID, SHLVL,
TIMEFORMAT, HISTCMD, HOSTTYPE, OSTYPE, MACHTYPE,
HISTFILESIZE, HISTIGNORE, HISTCONTROL, PROMPT_COMMAND,
IGNOREEOF, FIGNORE, INPUTRC, HOSTFILE, DIRSTACK,
PIPESTATUS, HOSTNAME, OPTERR, SHELLOPTS, GLOBIGNORE,
histchars, auto_resume
prompt expansion with backslash escapes and command substitution
redirection: &> (stdout and stderr)
more extensive and extensible editing and completion
builtins: bind, builtin, command, declare, dirs, echo -e/-E, enable,
exec -l/-c/-a, fc -s, export -n/-f/-p, hash, help, history,
jobs -x/-r/-s, kill -s/-n/-l, local, logout, popd, pushd,
read -e/-p/-a, readonly -a/-n/-f/-p, set -o braceexpand/
-o histexpand/-o interactive-comments/-o notify/-o physical/
-o posix/-o hashall/-o onecmd/-h/-B/-C/-b/-H/-P, set +o,
suspend, trap -l, type, typeset -a/-F/-p, ulimit -u,
umask -S, alias -p, shopt, disown
`!' csh-style history expansion
Things ksh88 has or uses that bash does not:
new version of test: [[...]]
tracked aliases
$(<file)
variables: ERRNO, FPATH, COLUMNS, LINES, EDITOR, VISUAL
extended pattern matching with egrep-style pattern lists
co-processes (|&, >&p, <&p)
weirdly-scoped functions
typeset +f to list all function names without definitions
text of command history kept in a file, not memory
builtins: alias -x, cd old new, fc -e -, newgrp, print,
read -p/-s/-u/var?prompt, set -A/-o gmacs/
-o bgnice/-o markdirs/-o nolog/-o trackall/-o viraw/-s,
typeset -H/-L/-R/-A/-ft/-fu/-fx/-l/-u/-t, whence
Implementation differences:
ksh runs last command of a pipeline in parent shell context
ksh ulimit sets hard and soft limits by default
bash has brace expansion by default (ksh88 compile-time option)
bash has fixed startup file for all interactive shells; ksh reads $ENV
bash has exported functions
bash command search finds functions before builtins
14) Which new features in ksh-93 are not in bash, and which are?
New things in ksh-93 not in bash-2.0:
associative arrays
floating point arithmetic
++, --, comma arithmetic operators
math library functions
${!name[sub]} name of subscript for associative array
${!prefix*} and {!prefix@} variable name prefix expansions
`.' is allowed in variable names to create a hierarchical namespace
more extensive compound assignment syntax
discipline functions
`sleep' and `getconf' builtins (bash has loadable versions)
typeset -n and `nameref' variables
KEYBD trap
variables: .sh.edchar, .sh.edmode, .sh.edcol, .sh.edtext, HISTEDIT,
.sh.version, .sh.name, .sh.subscript, .sh.value
backreferences in pattern matching
print -f and printf (bash has loadable versions)
`fc' has been renamed to `hist'
read -t/-d
`.' can execute shell functions
ENV processed only for interactive shells
New things in ksh-93 present in bash-2.0:
?: arithmetic operator
expansions: ${!param}, ${param:len[:offset]}, ${param/pat[/str]}
compound array assignment
the `!' reserved word
loadable builtins -- but ksh uses `builtin' while bash uses `enable'
`command', `builtin', `disown' builtins
new $'...' and $"..." quoting
FIGNORE (but bash uses GLOBIGNORE), HISTCMD
set -o notify/-C
changes to kill builtin
read -A (bash uses read -a)
trap -p
exec -c/-a
`.' restores the positional parameters when it completes
POSIX.2 `test'
umask -S
unalias -a
command and arithmetic substitution performed on PS1, PS4, and ENV
command name completion
Section D: Why does bash do some things differently than other Unix shells?
15) Why does bash run a different version of `command' than
`which command' says it will?
`which' is actually a csh script that assumes you're running csh.
It reads the csh startup files from your home directory and uses
those to determine which `command' will be invoked. Since bash
doesn't use any of those startup files, there's a good chance
that your bash environment differs from your csh environment.
16) Why doesn't bash treat brace expansions exactly like csh?
The only difference between bash and csh brace expansion is that
bash requires a brace expression to contain at least one unquoted
comma if it is to be expanded. Any brace-surrounded word not
containing an unquoted comma is left unchanged by the brace
expansion code. This affords the greatest degree of sh
compatibility.
Bash, ksh, zsh, and pd-ksh all implement brace expansion this way.
17) Why doesn't bash have csh variable modifiers?
Posix has specified a more powerful, albeit somewhat more cryptic,
mechanism cribbed from ksh, and bash implements it.
${parameter%word}
Remove smallest suffix pattern. The WORD is expanded to produce
a pattern. It then expands to the value of PARAMETER, with the
smallest portion of the suffix matched by the pattern deleted.
x=file.c
echo ${x%.c}.o
-->file.o
${parameter%%word}
Remove largest suffix pattern. The WORD is expanded to produce
a pattern. It then expands to the value of PARAMETER, with the
largest portion of the suffix matched by the pattern deleted.
x=posix/src/std
echo ${x%%/*}
-->posix
${parameter#word}
Remove smallest prefix pattern. The WORD is expanded to produce
a pattern. It then expands to the value of PARAMETER, with the
smallest portion of the prefix matched by the pattern deleted.
x=$HOME/src/cmd
echo ${x#$HOME}
-->/src/cmd
${parameter##word}
Remove largest prefix pattern. The WORD is expanded to produce
a pattern. It then expands to the value of PARAMETER, with the
largest portion of the prefix matched by the pattern deleted.
x=/one/two/three
echo ${x##*/}
-->three
Given
a=/a/b/c/d
b=b.xxx
csh bash result
--- ---- ------
$a:h ${a%/*} /a/b/c
$a:t ${a##*/} d
$b:r ${b%.*} b
$b:e ${b##*.} xxx
18) How can I make my csh aliases work when I convert to bash?
Bash uses a different syntax to support aliases than csh does.
The details can be found in the documentation. We have provided
a shell script which does most of the work of conversion for you;
this script can be found in ./examples/misc/alias-conv.sh. Here is
how you use it:
Start csh in the normal way for you. (e.g., `csh')
Pipe the output of `alias' through `alias-conv.sh', saving the
results into `bash_aliases':
alias | alias-conv.sh >bash_aliases
Edit `bash_aliases', carefully reading through any created
functions. You will need to change the names of some csh specific
variables to the bash equivalents. The script converts $cwd to
$PWD, $term to $TERM, $home to $HOME, $user to $USER, and $prompt
to $PS1. You may also have to add quotes to avoid unwanted
expansion.
For example, the csh alias:
alias cd 'cd \!*; echo $cwd'
is converted to the bash function:
cd () { command cd "$@"; echo $PWD ; }
The only thing that needs to be done is to quote $PWD:
cd () { command cd "$@"; echo "$PWD" ; }
Merge the edited file into your ~/.bashrc.
There is an additional, more ambitious, script in
examples/misc/cshtobash that attempts to convert your entire csh
environment to its bash equivalent. This script can be run as
simply `cshtobash' to convert your normal interactive
environment, or as `cshtobash ~/.login' to convert your login
environment.
19) How can I pipe standard output and standard error from one command to
another, like csh does with `|&'?
Use
command 2>&1 | command2
The key is to remember that piping is performed before redirection, so
file descriptor 1 points to the pipe when it is duplicated onto file
descriptor 2.
20) Now that I've converted from ksh to bash, are there equivalents to
ksh features like autoloaded functions and the `whence' command?
There are features in ksh-88 that do not have direct bash equivalents.
Most, however, can be emulated with very little trouble.
ksh-88 feature Bash equivalent
-------------- ---------------
[[...]] can usually use [...]; minor differences (no
pattern matching, for one)
compiled-in aliases set up aliases in .bashrc; some ksh aliases are
bash builtins (hash, history, type)
$(<file) $(cat file)
extended patterns no good substitute
coprocesses named pipe pairs (one for read, one for write)
typeset +f declare -F
cd, print, whence function substitutes in examples/functions/kshenv
autoloaded functions examples/functions/autoload is the same as typeset -fu
read var?prompt read -p prompt var
Section E: How can I get bash to do certain things, and why does bash do
things the way it does?
21) Why is the bash builtin `test' slightly different from /bin/test?
The specific example used here is [ ! x -o x ], which is false.
Bash's builtin `test' implements the Posix.2 spec, which can be
summarized as follows (the wording is due to David Korn):
Here is the set of rules for processing test arguments.
0 Args: False
1 Arg: True iff argument is not null.
2 Args: If first arg is !, True iff second argument is null.
If first argument is unary, then true if unary test is true
Otherwise error.
3 Args: If second argument is a binary operator, do binary test of $1 $3
If first argument is !, negate two argument test of $2 $3
If first argument is `(' and third argument is `)', do the
one-argument test of the second argument.
Otherwise error.
4 Args: If first argument is !, negate three argument test of $2 $3 $4.
Otherwise unspecified
5 or more Args: unspecified. (Historical shells would use their
current algorithm).
The operators -a and -o are considered binary operators for the purpose
of the 3 Arg case.
As you can see, the test becomes (not (x or x)), which is false.
22) Why does bash sometimes say `Broken pipe'?
If a sequence of commands appears in a pipeline, and one of the
reading commands finishes before the writer has finished, the
writer receives a SIGPIPE signal. Many other shells special-case
SIGPIPE as an exit status in the pipeline and do not report it.
For example, in:
ps -aux | head
`head' can finish before `ps' writes all of its output, and ps
will try to write on a pipe without a reader. In that case, bash
will print `Broken pipe' to stderr when ps is killed by a
SIGPIPE.
23) How can I get bash to read and display eight-bit characters?
This is a process requiring several steps.
First, you must ensure that the `physical' data path is a full eight
bits. For xterms, for example, the `vt100' resources `eightBitInput'
and `eightBitOutput' should be set to `true'.
Once you have set up an eight-bit path, you must tell the kernel and
tty driver to leave the eighth bit of characters alone when processing
keyboard input. Use `stty' to do this:
stty cs8 -istrip -parenb
For old BSD-style systems, you can use
stty pass8
You may also need
stty even odd
Finally, you need to tell readline that you will be inputting and
displaying eight-bit characters. You use readline variables to do
this. These variables can be set in your .inputrc or using the bash
`bind' builtin. Here's an example using `bind':
bash$ bind 'set convert-meta off'
bash$ bind 'set meta-flag on'
bash$ bind 'set output-meta on'
The `set' commands between the single quotes may also be placed
in ~/.inputrc.
24) How do I write a function `x' to replace builtin command `x', but
still invoke the command from within the function?
This is why the `command' and `builtin' builtins exist. The
`command' builtin executes the command supplied as its first
argument, skipping over any function defined with that name. The
`builtin' builtin executes the builtin command given as its first
argument directly.
For example, to write a function to replace `cd' that writes the
hostname and current directory to an xterm title bar, use
something like the following:
cd()
{
builtin cd "$@" && xtitle "$HOST: $PWD"
}
This could also be written using `command' instead of `builtin';
the version above is marginally more efficient.
25) When I have terminal escape sequences in my prompt, why does bash
wrap lines at the wrong column?
Readline, the line editing library that bash uses, does not know
that the terminal escape sequences do not take up space on the
screen. The redisplay code assumes, unless told otherwise, that
each character in the prompt is a `printable' character that
takes up one character position on the screen.
You can use the bash prompt expansion facility (see the PROMPTING
section in the manual page) to tell readline that sequences of
characters in the prompt strings take up no screen space.
Use the \[ escape to begin a sequence of non-printing characters,
and the \] escape to signal the end of such a sequence.
26) How can I find the value of a shell variable whose name is the value
of another shell variable?
Bash-2.0 supports this directly. You can use
${!var}
For example, the following sequence of commands will echo `z':
var1=var2
var2=z
echo ${!var1}
For sh compatibility, use the `eval' builtin. The important
thing to remember is that `eval' expands the arguments you give
it again, so you need to quote the parts of the arguments that
you want `eval' to act on.
For example, this expression prints the value of the last positional
parameter:
eval echo \"\$\{$#\}\"
The expansion of the quoted portions of this expression will be
deferred until `eval' runs, while the `$#' will be expanded
before `eval' is executed. In bash-2.0,
echo ${!#}
does the same thing.
27) If I pipe the output of a command into `read variable', why doesn't
the output show up in $variable when the read command finishes?
This has to do with the parent-child relationship between Unix
processes.
Each element of a pipeline runs in a separate process, a child of
the shell running the pipeline. A subprocess cannot affect its
parent's environment. When the `read' command sets the variable
to the input, that variable is set only in the subshell, not the
parent shell. When the subshell exits, the value of the variable
is lost.
Many pipelines that end with `read variable' can be converted
into command substitutions, which will capture the output of
a specified command. The output can then be assigned to a
variable:
grep ^gnu /usr/lib/news/active | wc -l | read ngroup
can be converted into
ngroup=$(grep ^gnu /usr/lib/news/active | wc -l)
This does not, unfortunately, work to split the text among
multiple variables, as read does when given multiple variable
arguments. If you need to do this, you can either use the
command substitution above to read the output into a variable
and chop up the variable using the bash pattern removal
expansion operators or use some variant of the following
approach.
Say /usr/local/bin/ipaddr is the following shell script:
#! /bin/sh
host `hostname` | awk '/address/ {print $NF}'
Instead of using
/usr/local/bin/ipaddr | read A B C D
to break the local machine's IP address into separate octets, use
OIFS="$IFS"
IFS=.
set -- $(/usr/local/bin/ipaddr)
IFS="$OIFS"
A="$1" B="$2" C="$3" D="$4"
Beware, however, that this will change the shell's positional
parameters. If you need them, you should save them before doing
this.
This is the general approach -- in most cases you will not need to
set $IFS to a different value.
28) I have a bunch of shell scripts that use backslash-escaped characters
in arguments to `echo'. Bash doesn't interpret these characters. Why
not, and how can I make it understand them?
This is the behavior of echo on most Unix System V machines.
The bash builtin `echo' is modelled after the 9th Edition
Research Unix version of `echo'. It does not interpret
backslash-escaped characters in its argument strings by default;
it requires the use of the -e option to enable the
interpretation. The System V echo provides no way to disable the
special characters; the bash echo has a -E option to disable
them.
There is a configuration option that will make bash behave like
the System V echo and interpret things like `\t' by default. Run
configure with the --enable-usg-echo-default option to turn this
on. Be aware that this will cause some of the tests run when you
type `make tests' to fail.
29) Why doesn't a while or for loop get suspended when I type ^Z?
This is a consequence of how job control works on Unix. The only
thing that can be suspended is the process group. This is a single
command or pipeline of commands that the shell forks and executes.
When you run a while or for loop, the only thing that the shell forks
and executes are any commands in the while loop test and commands in
the loop bodies. These, therefore, are the only things that can be
suspended when you type ^Z.
If you want to be able to stop the entire loop, you need to put it
within parentheses, which will force the loop into a subshell that
may be stopped (and subsequently restarted) as a single unit.
30) How can I make the bash `time' reserved word print timing output that
looks like the output from my system's /usr/bin/time?
The bash command timing code looks for a variable `TIMEFORMAT' and
uses its value as a format string to decide how to display the
timing statistics.
The value of TIMEFORMAT is a string with `%' escapes expanded in a
fashion similar in spirit to printf(3). The manual page explains
the meanings of the escape sequences in the format string.
If TIMEFORMAT is not set, bash acts as if the following assignment had
been performed:
TIMEFORMAT=$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'
The POSIX.2 default time format (used by `time -p command') is
TIMEFORMAT=$'real %2R\nuser %2U\nsys %2S'
The BSD /usr/bin/time format can be emulated with:
TIMEFORMAT=$'\t%1R real\t%1U user\t%1S sys'
The System V /usr/bin/time format can be emulated with:
TIMEFORMAT=$'\nreal\t%1R\nuser\t%1U\nsys\t%1S'
The ksh format can be emulated with:
TIMEFORMAT=$'\nreal\t%2lR\nuser\t%2lU\nsys\t%2lS'
Section F: Things to watch out for on certain Unix versions
31) Why can't I use command line editing in my `cmdtool'?
The problem is `cmdtool' and bash fighting over the input. When
scrolling is enabled in a cmdtool window, cmdtool puts the tty in
`raw mode' to permit command-line editing using the mouse for
applications that cannot do it themselves. As a result, bash and
cmdtool each try to read keyboard input immediately, with neither
getting enough of it to be useful.
This mode also causes cmdtool to not implement many of the
terminal functions and control sequences appearing in the
`sun-cmd' termcap entry. For a more complete explanation, see
that file examples/suncmd.termcap in the bash distribution.
`xterm' is a better choice, and gets along with bash much more
smoothly.
If you must use cmdtool, you can use the termcap description in
examples/suncmd.termcap. Set the TERMCAP variable to the terminal
description contained in that file, i.e.
TERMCAP='Mu|sun-cmd:am:bs:km:pt:li#34:co#80:cl=^L:ce=\E[K:cd=\E[J:rs=\E[s:'
Then export TERMCAP and start a new cmdtool window from that shell.
The bash command-line editing should behave better in the new
cmdtool. If this works, you can put the assignment to TERMCAP
in your bashrc file.
32) I built bash on Solaris 2. Why do globbing expansions and filename
completion chop off the first few characters of each filename?
This is the consequence of building bash on SunOS 5 and linking
with the libraries in /usr/ucblib, but using the definitions
and structures from files in /usr/include.
The actual conflict is between the dirent structure in
/usr/include/dirent.h and the struct returned by the version of
`readdir' in libucb.a (a 4.3-BSD style `struct direct').
Make sure you've got /usr/ccs/bin ahead of /usr/ucb in your $PATH
when configuring and building bash. This will ensure that you
use /usr/ccs/bin/cc or acc instead of /usr/ucb/cc and that you
link with libc before libucb.
If you have installed the Sun C compiler, you may also need to
put /usr/ccs/bin and /opt/SUNWspro/bin into your $PATH before
/usr/ucb.
33) Why does bash dump core after I interrupt username completion or
`~user' tilde expansion on a machine running NIS?
This is a famous and long-standing bug in the SunOS YP (sorry, NIS)
client library, which is part of libc.
The YP library code keeps static state -- a pointer into the data
returned from the server. When YP initializes itself (setpwent),
it looks at this pointer and calls free on it if it's non-null.
So far, so good.
If one of the YP functions is interrupted during getpwent (the
exact function is interpretwithsave()), and returns NULL, the
pointer is freed without being reset to NULL, and the function
returns. The next time getpwent is called, it sees that this
pointer is non-null, calls free, and the bash free() blows up
because it's being asked to free freed memory.
The traditional Unix mallocs allow memory to be freed multiple
times; that's probably why this has never been fixed. You can
run configure with the `--without-gnu-malloc' option to use
the C library malloc and avoid the problem.
34) I'm running SVR4.2. Why is the line erased every time I type `@'?
The `@' character is the default `line kill' character in most
versions of System V, including SVR4.2. You can change this
character to whatever you want using `stty'. For example, to
change the line kill character to control-u, type
stty kill ^U
where the `^' and `U' can be two separate characters.
35) Why does bash report syntax errors when my C News scripts use a
redirection before a subshell command?
The actual command in question is something like
< file ( command )
According to the grammar given in the POSIX.2 standard, this construct
is, in fact, a syntax error. Redirections may only precede `simple
commands'. A subshell construct such as the above is one of the shell's
`compound commands'. A redirection may only follow a compound command.
The file CWRU/sh-redir-hack in the bash-2.0 distribution is an
(unofficial) patch to parse.y that will modify the grammar to
support this construct. It will not apply with `patch'; you must
modify parse.y by hand. Note that if you apply this, you must
recompile with -DREDIRECTION_HACK. This introduces a large
number of reduce/reduce conflicts into the shell grammar.
Section G: Where do I go from here?
36) How do I report bugs in bash, and where should I look for fixes and
advice?
Use the `bashbug' script to report bugs. It is built and
installed at the same time as bash. It provides a standard
template for reporting a problem and automatically includes
information about your configuration and build environment.
`bashbug' sends its reports to bug-bash@prep.ai.mit.edu, which
is a large mailing list gatewayed to the usenet newsgroup gnu.bash.bug.
Bug fixes, answers to questions, and announcements of new releases
are all posted to gnu.bash.bug. Discussions concerning bash features
and problems also take place there.
To reach the bash maintainers directly, send mail to
bash-maintainers@prep.ai.mit.edu.
37) What kind of bash documentation is there?
First, look in the doc directory in the bash distribution. It should
contain at least the following files:
bash.1 an extensive, thorough Unix-style manual page
builtins.1 a manual page covering just bash builtin commands
bashref.texi a reference manual in GNU info format
bash.html an HTML version of the manual page
bashref.html an HTML version of the reference manual
FAQ this file
article.ms text of an article written for The Linux Journal
readline.3 a man page describing readline
Postscript files created from the above source are available in
the documentation distribution.
There is additional documentation available for anonymous FTP from host
slc2.ins.cwru.edu in the `pub/bash' directory.
Cameron Newham and Bill Rosenblatt have written a book on bash, published
by O'Reilly and Associates. The book is based on Bill Rosenblatt's Korn
Shell book. The title is ``Learning the Bash Shell''. The ISBN number is
1-56592-147-X. Look for it in fine bookstores near you. This book covers
bash-1.14, but has an appendix describing some of the new features in
bash-2.0.
38) What's coming in future versions?
These are features I plan to include in a future version of bash.
POSIX.2-style globbing character classes ([:alpha:], [:alnum:], etc.)
a bash debugger (an incomplete, untested version is included with bash-2.0)
39) What's on the bash `wish list' for future versions?
These are features that may or may not appear in a future version of bash.
Programmable completion a la zsh
menu completion a la tcsh
the ksh [[...]] extended test command
the ksh egrep-style extended pattern matching operators
associative arrays (not really all that hard)
breaking some of the shell functionality into embeddable libraries
better internationalization using GNU `gettext'
an option to use external files for the long `help' text
timeouts for the `read' builtin
the ksh-93 ${!prefix*} and ${!prefix@} operators
arithmetic ++ and -- prefix and postfix operators
40) When will the next release appear?
The next version will appear sometime in 1997. Never make predictions.
This document is Copyright 1995, 1996 by Chester Ramey.
Permission is hereby granted, without written agreement and
without license or royalty fees, to use, copy, and distribute
this document for any purpose, provided that the above copyright
notice appears in all copies of this document and that the
contents of this document remain unaltered.
|