diff options
author | Jim Meyering <jim@meyering.net> | 2001-06-16 11:06:48 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2001-06-16 11:06:48 +0000 |
commit | 8d4c961d53a57976d17c524e58a6f2cff0f0d983 (patch) | |
tree | 2e8d7bfade99dbd66e18d1f43b7d7ffc3dc3a25b /doc | |
parent | 23d0e1c18e9ab86de4d305eb47ed616e6ba68100 (diff) | |
download | coreutils-8d4c961d53a57976d17c524e58a6f2cff0f0d983.tar.xz |
renamed to coreutils.texi
Diffstat (limited to 'doc')
-rw-r--r-- | doc/omni-utils.texi | 11308 |
1 files changed, 0 insertions, 11308 deletions
diff --git a/doc/omni-utils.texi b/doc/omni-utils.texi deleted file mode 100644 index ec95f354d..000000000 --- a/doc/omni-utils.texi +++ /dev/null @@ -1,11308 +0,0 @@ -\input texinfo -@c %**start of header -@setfilename omni-utils.info -@settitle @sc{gnu} Omni-utils - -@c %**end of header - -@include version.texi -@include constants.texi - -@c Define new indices. -@defcodeindex op -@defcodeindex fl - -@c Put everything in one index (arbitrarily chosen to be the concept index). -@syncodeindex fl cp -@syncodeindex fn cp -@syncodeindex ky cp -@syncodeindex op cp -@syncodeindex pg cp -@syncodeindex vr cp - -@ifinfo -@format -START-INFO-DIR-ENTRY -* @sc{gnu} Utilities: (omni-utils). @sc{gnu} Utilities. -* Common options: Common options. -* File permissions: Access modes. -* Date input formats: Specifying date strings. -* Opening the software toolbox: The software tools philosophy. -* GNU Free Documentation License: The license for this documentation. - -* basename: (omni-utils)basename invocation. Strip directory and suffix. -* cat: (omni-utils)cat invocation. Concatenate and write files. -* chgrp: (omni-utils)chgrp invocation. Change file groups. -* chmod: (omni-utils)chmod invocation. Change file permissions. -* chown: (omni-utils)chown invocation. Change file owners/groups. -* chroot: (omni-utils)chroot invocation. Specify the root directory. -* cksum: (omni-utils)cksum invocation. Print @sc{posix} CRC checksum. -* comm: (omni-utils)comm invocation. Compare sorted files by line. -* cp: (omni-utils)cp invocation. Copy files. -* csplit: (omni-utils)csplit invocation. Split by context. -* cut: (omni-utils)cut invocation. Print selected parts of lines. -* date: (omni-utils)date invocation. Print/set system date and time. -* dd: (omni-utils)dd invocation. Copy and convert a file. -* df: (omni-utils)df invocation. Report filesystem disk usage. -* dir: (omni-utils)dir invocation. List directories briefly. -* dircolors: (omni-utils)dircolors invocation. Color setup for ls. -* dirname: (omni-utils)dirname invocation. Strip non-directory suffix. -* du: (omni-utils)du invocation. Report on disk usage. -* echo: (omni-utils)echo invocation. Print a line of text. -* env: (omni-utils)env invocation. Modify the environment. -* expand: (omni-utils)expand invocation. Convert tabs to spaces. -* expr: (omni-utils)expr invocation. Evaluate expressions. -* factor: (omni-utils)factor invocation. Print prime factors -* false: (omni-utils)false invocation. Do nothing, unsuccessfully. -* fmt: (omni-utils)fmt invocation. Reformat paragraph text. -* fold: (omni-utils)fold invocation. Wrap long input lines. -* groups: (omni-utils)groups invocation. Print group names a user is in. -* head: (omni-utils)head invocation. Output the first part of files. -* hostid: (omni-utils)hostid invocation. Print numeric host identifier. -* hostname: (omni-utils)hostname invocation. Print or set system name. -* id: (omni-utils)id invocation. Print real/effective uid/gid. -* install: (omni-utils)install invocation. Copy and change attributes. -* join: (omni-utils)join invocation. Join lines on a common field. -* ln: (omni-utils)ln invocation. Make links between files. -* logname: (omni-utils)logname invocation. Print current login name. -* ls: (omni-utils)ls invocation. List directory contents. -* md5sum: (omni-utils)md5sum invocation. Print or check message-digests. -* mkdir: (omni-utils)mkdir invocation. Create directories. -* mkfifo: (omni-utils)mkfifo invocation. Create FIFOs (named pipes). -* mknod: (omni-utils)mknod invocation. Create special files. -* mv: (omni-utils)mv invocation. Rename files. -* nice: (omni-utils)nice invocation. Modify scheduling priority. -* nl: (omni-utils)nl invocation. Number lines and write files. -* nohup: (omni-utils)nohup invocation. Immunize to hangups. -* od: (omni-utils)od invocation. Dump files in octal, etc. -* paste: (omni-utils)paste invocation. Merge lines of files. -* pathchk: (omni-utils)pathchk invocation. Check file name portability. -* pr: (omni-utils)pr invocation. Paginate or columnate files. -* printenv: (omni-utils)printenv invocation. Print environment variables. -* printf: (omni-utils)printf invocation. Format and print data. -* ptx: (omni-utils)ptx invocation. Produce permuted indexes. -* pwd: (omni-utils)pwd invocation. Print working directory. -* rm: (omni-utils)rm invocation. Remove files. -* rmdir: (omni-utils)rmdir invocation. Remove empty directories. -* seq: (omni-utils)seq invocation. Print numeric sequences -* shred: (omni-utils)shred invocation. Remove files more securely. -* sleep: (omni-utils)sleep invocation. Delay for a specified time. -* sort: (omni-utils)sort invocation. Sort text files. -* split: (omni-utils)split invocation. Split into fixed-size pieces. -* stty: (omni-utils)stty invocation. Print/change terminal settings. -* su: (omni-utils)su invocation. Modify user and group id. -* sum: (omni-utils)sum invocation. Print traditional checksum. -* sync: (omni-utils)sync invocation. Synchronize memory and disk. -* tac: (omni-utils)tac invocation. Reverse files. -* tail: (omni-utils)tail invocation. Output the last part of files. -* tee: (omni-utils)tee invocation. Redirect to multiple files. -* test: (omni-utils)test invocation. File/string tests. -* touch: (omni-utils)touch invocation. Change file timestamps. -* tr: (omni-utils)tr invocation. Translate characters. -* true: (omni-utils)true invocation. Do nothing, successfully. -* tsort: (omni-utils)tsort invocation. Topological sort. -* tty: (omni-utils)tty invocation. Print terminal name. -* uname: (omni-utils)uname invocation. Print system information. -* unexpand: (omni-utils)unexpand invocation. Convert spaces to tabs. -* uniq: (omni-utils)uniq invocation. Uniquify files. -* users: (omni-utils)users invocation. Print current user names. -* vdir: (omni-utils)vdir invocation. List directories verbosely. -* wc: (omni-utils)wc invocation. Byte, word, and line counts. -* who: (omni-utils)who invocation. Print who is logged in. -* whoami: (omni-utils)whoami invocation. Print effective user id. -* yes: (omni-utils)yes invocation. Print a string indefinitely. -END-INFO-DIR-ENTRY -@end format -@end ifinfo - -@ifinfo -This file documents the GNU command line utilities. - -Copyright (C) 1994, 95, 96, 2001 Free Software Foundation, Inc. - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with no Front-Cover Texts, and with no Back-Cover -Texts. A copy of the license is included in the section entitled ``GNU -Free Documentation License''. - -@end ifinfo - -@titlepage -@title @sc{gnu} @code{Omni-utils} -@subtitle A set of command line utilities -@subtitle for version @value{VERSION}, @value{UPDATED} -@author David MacKenzie et al. - -@page -@vskip 0pt plus 1filll -Copyright @copyright{} 1994, 95, 96, 2000 Free Software Foundation, Inc. - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with no Front-Cover Texts, and with no Back-Cover -Texts. A copy of the license is included in the section entitled ``GNU -Free Documentation License''. -@end titlepage - - -@c If your makeinfo doesn't grok this @ifnottex directive, then either -@c get a newer version of makeinfo or do s/ifnottex/ifinfo/ here and on -@c the matching @end directive below. -@ifnottex -@node Top -@top GNU Omni-utils - -@cindex text utilities -@cindex shell utilities -@cindex file utilities -This manual documents version @value{VERSION} of the @sc{gnu} command -line utilities. - -@menu -* Introduction:: Caveats, overview, and authors. -* Common options:: Common options. -* Output of entire files:: cat tac nl od -* Formatting file contents:: fmt pr fold -* Output of parts of files:: head tail split csplit -* Summarizing files:: wc sum cksum md5sum -* Operating on sorted files:: sort uniq comm ptx tsort -* Operating on fields within a line:: cut paste join -* Operating on characters:: tr expand unexpand -* Directory listing:: ls dir vdir d v dircolors -* Basic operations:: cp dd install mv rm shred -* Special file types:: ln mkdir rmdir mkfifo mknod -* Changing file attributes:: chgrp chmod chown touch -* Disk usage:: df du sync -* Printing text:: echo printf yes -* Conditions:: false true test expr -* Redirection:: tee -* File name manipulation:: dirname basename pathchk -* Working context:: pwd stty printenv tty -* User information:: id logname whoami groups users who -* System context:: date uname hostname -* Modified command invocation:: chroot env nice nohup su -* Delaying:: sleep -* Numeric operations:: factor seq -* File permissions:: Access modes. -* Date input formats:: Specifying date strings. -* Opening the software toolbox:: The software tools philosophy. -* GNU Free Documentation License:: The license for this documentation. -* Index:: General index. - -@detailmenu - --- The Detailed Node Listing --- - -Common Options - -* Backup options:: Backup options -* Block size:: Block size -* Target directory:: Target directory -* Trailing slashes:: Trailing slashes - -Output of entire files - -* cat invocation:: Concatenate and write files. -* tac invocation:: Concatenate and write files in reverse. -* nl invocation:: Number lines and write files. -* od invocation:: Write files in octal or other formats. - -Formatting file contents - -* fmt invocation:: Reformat paragraph text. -* pr invocation:: Paginate or columnate files for printing. -* fold invocation:: Wrap input lines to fit in specified width. - -Output of parts of files - -* head invocation:: Output the first part of files. -* tail invocation:: Output the last part of files. -* split invocation:: Split a file into fixed-size pieces. -* csplit invocation:: Split a file into context-determined pieces. - -Summarizing files - -* wc invocation:: Print byte, word, and line counts. -* sum invocation:: Print checksum and block counts. -* cksum invocation:: Print CRC checksum and byte counts. -* md5sum invocation:: Print or check message-digests. - -Operating on sorted files - -* sort invocation:: Sort text files. -* uniq invocation:: Uniquify files. -* comm invocation:: Compare two sorted files line by line. -* ptx invocation:: Produce a permuted index of file contents. -* tsort invocation:: Topological sort. - -@code{ptx}: Produce permuted indexes - -* General options in ptx:: Options which affect general program behavior. -* Charset selection in ptx:: Underlying character set considerations. -* Input processing in ptx:: Input fields, contexts, and keyword selection. -* Output formatting in ptx:: Types of output format, and sizing the fields. -* Compatibility in ptx:: The GNU extensions to @code{ptx} - -Operating on fields within a line - -* cut invocation:: Print selected parts of lines. -* paste invocation:: Merge lines of files. -* join invocation:: Join lines on a common field. - -Operating on characters - -* tr invocation:: Translate, squeeze, and/or delete characters. -* expand invocation:: Convert tabs to spaces. -* unexpand invocation:: Convert spaces to tabs. - -@code{tr}: Translate, squeeze, and/or delete characters - -* Character sets:: Specifying sets of characters. -* Translating:: Changing one characters to another. -* Squeezing:: Squeezing repeats and deleting. -* Warnings in tr:: Warning messages. - -Directory listing - -* ls invocation:: List directory contents -* dir invocation:: Briefly list directory contents -* vdir invocation:: Verbosely list directory contents -* dircolors invocation:: Color setup for @code{ls} - -@code{ls}: List directory contents - -* Which files are listed:: Which files are listed -* What information is listed:: What information is listed -* Sorting the output:: Sorting the output -* More details about version sort:: More details about version sort -* General output formatting:: General output formatting -* Formatting the file names:: Formatting the file names - -Basic operations - -* cp invocation:: Copy files and directories -* dd invocation:: Convert and copy a file -* install invocation:: Copy files and set attributes -* mv invocation:: Move (rename) files -* rm invocation:: Remove files or directories -* shred invocation:: Remove files more securely - -Special file types - -* ln invocation:: Make links between files -* mkdir invocation:: Make directories -* mkfifo invocation:: Make FIFOs (named pipes) -* mknod invocation:: Make block or character special files -* rmdir invocation:: Remove empty directories - -Changing file attributes - -* chown invocation:: Change file owner and group -* chgrp invocation:: Change group ownership -* chmod invocation:: Change access permissions -* touch invocation:: Change file timestamps - -Disk usage - -* df invocation:: Report filesystem disk space usage -* du invocation:: Estimate file space usage -* sync invocation:: Synchronize data on disk with memory - -Printing text - -* echo invocation:: Print a line of text -* printf invocation:: Format and print data -* yes invocation:: Print a string until interrupted - -Conditions - -* false invocation:: Do nothing, unsuccessfully -* true invocation:: Do nothing, successfully -* test invocation:: Check file types and compare values -* expr invocation:: Evaluate expressions - -@code{test}: Check file types and compare values - -* File type tests:: File type tests -* Access permission tests:: Access permission tests -* File characteristic tests:: File characteristic tests -* String tests:: String tests -* Numeric tests:: Numeric tests - -@code{expr}: Evaluate expression - -* String expressions:: <colon> match substr index length quote -* Numeric expressions:: + - * / % -* Relations for expr:: | & < <= = == != >= > -* Examples of expr:: Examples of using @code{expr} - -Redirection - -* tee invocation:: Redirect output to multiple files - -File name manipulation - -* basename invocation:: Strip directory and suffix from a file name -* dirname invocation:: Strip non-directory suffix from a file name -* pathchk invocation:: Check file name portability - -Working context - -* pwd invocation:: Print working directory -* stty invocation:: Print or change terminal characteristics -* printenv invocation:: Print all or some environment variables -* tty invocation:: Print file name of terminal on standard input - -@code{stty}: Print or change terminal characteristics - -* Control:: Control settings -* Input:: Input settings -* Output:: Output settings -* Local:: Local settings -* Combination:: Combination settings -* Characters:: Special characters -* Special:: Special settings - -User information - -* id invocation:: Print real and effective uid and gid -* logname invocation:: Print current login name -* whoami invocation:: Print effective user id -* groups invocation:: Print group names a user is in -* users invocation:: Print login names of users currently logged in -* who invocation:: Print who is currently logged in - -System context - -* date invocation:: Print or set system date and time -* uname invocation:: Print system information -* hostname invocation:: Print or set system name -* hostid invocation:: Print numeric host identifier. - -@code{date}: Print or set system date and time - -* Time directives:: Time directives -* Date directives:: Date directives -* Literal directives:: Literal directives -* Padding:: Padding -* Setting the time:: Setting the time -* Options for date:: Options for @code{date} -* Examples of date:: Examples of @code{date} - -Modified command invocation - -* chroot invocation:: Run a command with a different root directory -* env invocation:: Run a command in a modified environment -* nice invocation:: Run a command with modified scheduling priority -* nohup invocation:: Run a command immune to hangups -* su invocation:: Run a command with substitute user and group id - -Delaying - -* sleep invocation:: Delay for a specified time - -Numeric operations - -* factor invocation:: Print prime factors -* seq invocation:: Print numeric sequences - -File permissions - -* Mode Structure:: Structure of File Permissions -* Symbolic Modes:: Mnemonic permissions representation -* Numeric Modes:: Permissions as octal numbers - -Date input formats - -* General date syntax: General date syntax -* Calendar date items: Calendar date items -* Time of day items: Time of day items -* Time zone items: Time zone items -* Day of week items: Day of week items -* Relative items in date strings: Relative items in date strings -* Pure numbers in date strings: Pure numbers in date strings -* Authors of getdate: Authors of getdate - -Opening the software toolbox - -* Toolbox introduction:: Toolbox introduction -* I/O redirection:: I/O redirection -* The who command:: The @code{who} command -* The cut command:: The @code{cut} command -* The sort command:: The @code{sort} command -* The uniq command:: The @code{uniq} command -* Putting the tools together:: Putting the tools together - -GNU Free Documentation License - -* How to use this License for your documents:: - -@end detailmenu -@end menu - -@end ifnottex - - -@node Introduction -@chapter Introduction - -This manual is incomplete: No attempt is made to explain basic concepts -in a way suitable for novices. Thus, if you are interested, please get -involved in improving this manual. The entire @sc{gnu} community will -benefit. - -@cindex @sc{posix.2} -The @sc{gnu} utilities documented here are mostly compatible with the -@sc{posix.2} standard. -@cindex bugs, reporting -Please report bugs to @email{bug-omni-utils@@gnu.org}. Remember -to include the version number, machine architecture, input files, and -any other information needed to reproduce the bug: your input, what you -expected, what you got, and why it is wrong. Diffs are welcome, but -please include a description of the problem as well, since this is -sometimes difficult to infer. @xref{Bugs, , , gcc, Using and Porting GNU CC}. - -@cindex Berry, K. -@cindex Paterson, R. -@cindex Stallman, R. -@cindex Pinard, F. -@cindex MacKenzie, D. -@cindex Meyering, J. -@cindex Youmans, B. -This manual was originally derived from the Unix man pages in the -distributions, which were written by David MacKenzie and updated by Jim -Meyering. What you are reading now is the authoritative documentation -for these utilities; the man pages are no longer being maintained. The -original @code{fmt} man page was written by Ross Paterson. Fran@,{c}ois -Pinard did the initial conversion to Texinfo format. Karl Berry did the -indexing, some reorganization, and editing of the results. Brian -Youmans of the Free Software Foundation office staff combined the -manuals for textutils, fileutils, and sh-utils to produce the present -omnibus manual. Richard Stallman contributed his usual invaluable -insights to the overall process. - -@node Common options -@chapter Common options - -@cindex common options - -Certain options are available in all of these programs. Rather than -writing identical descriptions for each of the programs, they are -described here. (In fact, every @sc{gnu} program accepts (or should accept) -these options.) - -@vindex POSIXLY_CORRECT -Normally options and operands can appear in any order, and programs act -as if all the options appear before any operands. For example, -@samp{sort -r passwd -t :} acts like @samp{sort -r -t : passwd}, since -@samp{:} is an option-argument of @option{-t}. However, if the -@env{POSIXLY_CORRECT} environment variable is set, options must appear -before operands, unless otherwise specified for a particular command. - -Some of these programs recognize the @samp{--help} and @samp{--version} -options only when one of them is the sole command line argument. - -@table @samp - -@item --help -@opindex --help -@cindex help, online -Print a usage message listing all available options, then exit successfully. - -@item --version -@opindex --version -@cindex version number, finding -Print the version number, then exit successfully. - -@item -- -@opindex -- -@cindex option delimiter -Delimit the option list. Later arguments, if any, are treated as -operands even if they begin with @samp{-}. For example, @samp{sort -- --r} reads from the file named @file{-r}. - -@end table - -@cindex standard input -@cindex standard output -A single @samp{-} is not really an option, though it looks like one. It -stands for standard input, or for standard output if that is clear from -the context, and it can be used either as an operand or as an -option-argument. For example, @samp{sort -o - -} outputs to standard -output and reads from standard input, and is equivalent to plain -@samp{sort}. Unless otherwise specified, @samp{-} can appear in any -context that requires a file name. - -@menu -* Backup options:: -b -S -V, in some programs. -* Block size:: BLOCK_SIZE and --block-size, in some programs. -* Target directory:: --target-directory, in some programs. -* Trailing slashes:: --strip-trailing-slashes, in some programs. -@end menu - - -@node Backup options -@section Backup options - -@cindex backup options - -Some @sc{gnu} programs (at least @code{cp}, @code{install}, @code{ln}, and -@code{mv}) optionally make backups of files before writing new versions. -These options control the details of these backups. The options are also -briefly mentioned in the descriptions of the particular programs. - -@table @samp - -@item -b -@itemx @w{@kbd{--backup}[=@var{method}]} -@opindex -b -@opindex --backup -@vindex VERSION_CONTROL -@cindex backups, making -Make a backup of each file that would otherwise be overwritten or removed. -Without this option, the original versions are destroyed. -Use @var{method} to determine the type of backups to make. -When this option is used but @var{method} is not specified, -then the value of the @env{VERSION_CONTROL} -environment variable is used. And if @env{VERSION_CONTROL} is not set, -the default backup type is @samp{existing}. - -Note that the short form of this option, @samp{-b} does not accept any -argument. Using @samp{-b} is equivalent to using @samp{--backup=existing}. - -@vindex version-control @r{Emacs variable} -This option corresponds to the Emacs variable @samp{version-control}; -the values for @var{method} are the same as those used in Emacs. -This option also accepts more descriptive names. -The valid @var{method}s are (unique abbreviations are accepted): - -@table @samp -@item none -@itemx off -@opindex none @r{backup method} -Never make backups. - -@item numbered -@itemx t -@opindex numbered @r{backup method} -Always make numbered backups. - -@item existing -@itemx nil -@opindex existing @r{backup method} -Make numbered backups of files that already have them, simple backups -of the others. - -@item simple -@itemx never -@opindex simple @r{backup method} -Always make simple backups. Please note @samp{never} is not to be -confused with @samp{none}. - -@end table - -@item -S @var{suffix} -@itemx --suffix=@var{suffix} -@opindex -S -@opindex --suffix -@cindex backup suffix -@vindex SIMPLE_BACKUP_SUFFIX -Append @var{suffix} to each backup file made with @samp{-b}. If this -option is not specified, the value of the @env{SIMPLE_BACKUP_SUFFIX} -environment variable is used. And if @env{SIMPLE_BACKUP_SUFFIX} is not -set, the default is @samp{~}, just as in Emacs. - -@itemx --version-control=@var{method} -@opindex --version-control -@c FIXME: remove this block one or two releases after the actual -@c removal from the code. -This option is obsolete and will be removed in a future release. -It has been replaced with @w{@kbd{--backup}}. - -@end table - -@node Block size -@section Block size - -@cindex block size - -Some @sc{gnu} programs (at least @code{df}, @code{du}, and @code{ls}) display -file sizes in ``blocks''. You can adjust the block size to make file -sizes easier to read. The block size used for display is independent of -any filesystem block size. - -Normally, disk usage sizes are rounded up, disk free space sizes are -rounded down, and other sizes are rounded to the nearest value with ties -rounding to an even value. - -@opindex --block-size=@var{size} -@vindex BLOCK_SIZE -@vindex DF_BLOCK_SIZE -@vindex DU_BLOCK_SIZE -@vindex LS_BLOCK_SIZE -@vindex POSIXLY_CORRECT@r{, and block size} - -The default block size is chosen by examining the following environment -variables in turn; the first one that is set determines the block size. - -@table @code - -@item DF_BLOCK_SIZE -This specifies the default block size for the @code{df} command. -Similarly, @env{DU_BLOCK_SIZE} specifies the default for @code{du} and -@env{LS_BLOCK_SIZE} for @code{ls}. - -@item BLOCK_SIZE -This specifies the default block size for all three commands, if the -above command-specific environment variables are not set. - -@item POSIXLY_CORRECT -If neither the @env{@var{command}_BLOCK_SIZE} nor the @env{BLOCK_SIZE} -variables are set, but this variable is set, the block size defaults to 512. - -@end table - -If none of the above environment variables are set, the block size -currently defaults to 1024 bytes, but this number may change in the -future. - -@cindex human-readable output -@cindex SI output - -A block size specification can be a positive integer specifying the number -of bytes per block, or it can be @code{human-readable} or @code{si} to -select a human-readable format. - - -With human-readable formats, output sizes are followed by a size letter -such as @samp{M} for megabytes. @code{BLOCK_SIZE=human-readable} uses -powers of 1024; @samp{M} stands for 1,048,576 bytes. -@code{BLOCK_SIZE=si} is similar, but uses powers of 1000; @samp{M} stands -for 1,000,000 bytes. (SI, the International System of Units, defines -these power-of-1000 prefixes.) - -An integer block size can be followed by a size letter to specify a -multiple of that size. When this notation is used, the size letters -normally stand for powers of 1024, and can be followed by an optional -@samp{B} for ``byte''; but if followed by @samp{D} (for ``decimal -byte''), they stand for powers of 1000. For example, -@code{BLOCK_SIZE=4MB} is equivalent to @code{BLOCK_SIZE=4194304}, and -@code{BLOCK_SIZE=4MD} is equivalent to @code{BLOCK_SIZE=4000000}. - -The following size letters are defined. Large sizes like @code{1Y} -may be rejected by your computer due to limitations of its arithmetic. - -@table @samp -@item k -kilo: @math{2^10 = 1024} for @code{human-readable}, -or @math{10^3 = 1000} for @code{si}. -@item M -Mega: @math{2^20 = 1,048,576} -or @math{10^6 = 1,000,000}. -@item G -Giga: @math{2^30 = 1,073,741,824} -or @math{10^9 = 1,000,000,000}. -@item T -Tera: @math{2^40 = 1,099,511,627,776} -or @math{10^12 = 1,000,000,000,000}. -@item P -Peta: @math{2^50 = 1,125,899,906,842,624} -or @math{10^15 = 1,000,000,000,000,000}. -@item E -Exa: @math{2^60 = 1,152,921,504,606,846,976}@* -or @math{10^18 = 1,000,000,000,000,000,000}. -@item Z -Zetta: @math{2^70 = 1,180,591,620,717,411,303,424}@* -or @math{10^21 = 1,000,000,000,000,000,000,000}. -@item Y -Yotta: @math{2^80 = 1,208,925,819,614,629,174,706,176}@* -or @math{10^24 = 1,000,000,000,000,000,000,000,000}. -@end table - -@opindex -k -@opindex --kilobytes -@opindex -h -@opindex --human-readable -@opindex --si - -Block size defaults can be overridden by an explicit -@samp{--block-size=@var{size}} option. The @samp{-k} or -@samp{--kilobytes} option is equivalent to @samp{--block-size=1k}, which -is the default unless the @env{POSIXLY_CORRECT} environment variable is -set. The @samp{-h} or @samp{--human-readable} option is equivalent to -@samp{--block-size=human-readable}. The @samp{--si} option is -equivalent to @samp{--block-size=si}. - -@node Target directory -@section Target directory - -@cindex target directory - -Some @sc{gnu} programs (at least @code{cp}, @code{install}, @code{ln}, and -@code{mv}) allow you to specify the target directory via this option: - -@table @samp - -@itemx @w{@kbd{--target-directory}=@var{directory}} -@opindex --target-directory -@cindex target directory -@cindex destination directory -Specify the destination @var{directory}. - -The interface for most programs is that after processing options and a -finite (possibly zero) number of fixed-position arguments, the remaining -argument list is either expected to be empty, or is a list of items -(usually files) that will all be handled identically. The @code{xargs} -program is designed to work well with this convention. - -The commands in the @code{mv}-family are unusual in that they take -a variable number of arguments with a special case at the @emph{end} -(namely, the target directory). This makes it nontrivial to perform some -operations, e.g., ``move all files from here to ../d/'', because -@code{mv * ../d/} might exhaust the argument space, and @code{ls | xargs ...} -doesn't have a clean way to specify an extra final argument for each -invocation of the subject command. (It can be done by going through a -shell command, but that requires more human labor and brain power than -it should.) - -The @w{@kbd{--target-directory}} option allows the @code{cp}, -@code{install}, @code{ln}, and @code{mv} programs to be used conveniently -with @code{xargs}. For example, you can move the files from the -current directory to a sibling directory, @code{d} like this: -(However, this doesn't move files whose names begin with @samp{.}.) - -@smallexample -ls |xargs mv --target-directory=../d -@end smallexample - -If you use the @sc{gnu} @code{find} program, you can move @emph{all} -files with this command: -@example -find . -mindepth 1 -maxdepth 1 \ - | xargs mv --target-directory=../d -@end example - -But that will fail if there are no files in the current directory -or if any file has a name containing a newline character. -The following example removes those limitations and requires both -@sc{gnu} @code{find} and @sc{gnu} @code{xargs}: -@example -find . -mindepth 1 -maxdepth 1 -print0 \ - | xargs --null --no-run-if-empty \ - mv --target-directory=../d -@end example - -@end table - -@node Trailing slashes -@section Trailing slashes - -@cindex trailing slashes - -Some @sc{gnu} programs (at least @code{cp} and @code{mv}) allow you to -remove any trailing slashes from each @var{source} argument before -operating on it. The @w{@kbd{--strip-trailing-slashes}} option enables -this behavior. - -This is useful when a @var{source} argument may have a trailing slash and -specify a symbolic link to a directory. This scenario is in fact rather -common because some shells can automatically append a trailing slash when -performing file name completion on such symbolic links. Without this -option, @code{mv}, for example, (via the system's rename function) must -interpret a trailing slash as a request to dereference the symbolic link -and so must rename the indirectly referenced @emph{directory} and not -the symbolic link. Although it may seem surprising that such behavior -be the default, it is required by @sc{posix.2} and is consistent with -other parts of that standard. - -@node Output of entire files -@chapter Output of entire files - -@cindex output of entire files -@cindex entire files, output of - -These commands read and write entire files, possibly transforming them -in some way. - -@menu -* cat invocation:: Concatenate and write files. -* tac invocation:: Concatenate and write files in reverse. -* nl invocation:: Number lines and write files. -* od invocation:: Write files in octal or other formats. -@end menu - -@node cat invocation -@section @code{cat}: Concatenate and write files - -@pindex cat -@cindex concatenate and write files -@cindex copying files - -@code{cat} copies each @var{file} (@samp{-} means standard input), or -standard input if none are given, to standard output. Synopsis: - -@example -cat [@var{option}] [@var{file}]@dots{} -@end example - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -A -@itemx --show-all -@opindex -A -@opindex --show-all -Equivalent to @samp{-vET}. - -@item -B -@itemx --binary -@opindex -B -@opindex --binary -@cindex binary and text I/O in cat -On MS-DOS and MS-Windows only, read and write the files in binary mode. -By default, @code{cat} on MS-DOS/MS-Windows uses binary mode only when -standard output is redirected to a file or a pipe; this option overrides -that. Binary file I/O is used so that the files retain their format -(Unix text as opposed to DOS text and binary), because @code{cat} is -frequently used as a file-copying program. Some options (see below) -cause @code{cat} to read and write files in text mode because in those -cases the original file contents aren't important (e.g., when lines are -numbered by @code{cat}, or when line endings should be marked). This is -so these options work as DOS/Windows users would expect; for example, -DOS-style text files have their lines end with the CR-LF pair of -characters, which won't be processed as an empty line by @samp{-b} unless -the file is read in text mode. - -@item -b -@itemx --number-nonblank -@opindex -b -@opindex --number-nonblank -Number all nonblank output lines, starting with 1. On MS-DOS and -MS-Windows, this option causes @code{cat} to read and write files in -text mode. - -@item -e -@opindex -e -Equivalent to @samp{-vE}. - -@item -E -@itemx --show-ends -@opindex -E -@opindex --show-ends -Display a @samp{$} after the end of each line. On MS-DOS and -MS-Windows, this option causes @code{cat} to read and write files in -text mode. - -@item -n -@itemx --number -@opindex -n -@opindex --number -Number all output lines, starting with 1. On MS-DOS and MS-Windows, -this option causes @code{cat} to read and write files in text mode. - -@item -s -@itemx --squeeze-blank -@opindex -s -@opindex --squeeze-blank -@cindex squeezing blank lines -Replace multiple adjacent blank lines with a single blank line. On -MS-DOS and MS-Windows, this option causes @code{cat} to read and write -files in text mode. - -@item -t -@opindex -t -Equivalent to @samp{-vT}. - -@item -T -@itemx --show-tabs -@opindex -T -@opindex --show-tabs -Display TAB characters as @samp{^I}. - -@item -u -@opindex -u -Ignored; for Unix compatibility. - -@item -v -@itemx --show-nonprinting -@opindex -v -@opindex --show-nonprinting -Display control characters except for LFD and TAB using -@samp{^} notation and precede characters that have the high bit set with -@samp{M-}. On MS-DOS and MS-Windows, this option causes @code{cat} to -read files and standard input in DOS binary mode, so the CR -characters at the end of each line are also visible. - -@end table - - -@node tac invocation -@section @code{tac}: Concatenate and write files in reverse - -@pindex tac -@cindex reversing files - -@code{tac} copies each @var{file} (@samp{-} means standard input), or -standard input if none are given, to standard output, reversing the -records (lines by default) in each separately. Synopsis: - -@example -tac [@var{option}]@dots{} [@var{file}]@dots{} -@end example - -@dfn{Records} are separated by instances of a string (newline by -default). By default, this separator string is attached to the end of -the record that it follows in the file. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -b -@itemx --before -@opindex -b -@opindex --before -The separator is attached to the beginning of the record that it -precedes in the file. - -@item -r -@itemx --regex -@opindex -r -@opindex --regex -Treat the separator string as a regular expression. Users of @code{tac} -on MS-DOS/MS-Windows should note that, since @code{tac} reads files in -binary mode, each line of a text file might end with a CR/LF pair -instead of the Unix-style LF. - -@item -s @var{separator} -@itemx --separator=@var{separator} -@opindex -s -@opindex --separator -Use @var{separator} as the record separator, instead of newline. - -@end table - - -@node nl invocation -@section @code{nl}: Number lines and write files - -@pindex nl -@cindex numbering lines -@cindex line numbering - -@code{nl} writes each @var{file} (@samp{-} means standard input), or -standard input if none are given, to standard output, with line numbers -added to some or all of the lines. Synopsis: - -@example -nl [@var{option}]@dots{} [@var{file}]@dots{} -@end example - -@cindex logical pages, numbering on -@code{nl} decomposes its input into (logical) pages; by default, the -line number is reset to 1 at the top of each logical page. @code{nl} -treats all of the input files as a single document; it does not reset -line numbers or logical pages between files. - -@cindex headers, numbering -@cindex body, numbering -@cindex footers, numbering -A logical page consists of three sections: header, body, and footer. -Any of the sections can be empty. Each can be numbered in a different -style from the others. - -The beginnings of the sections of logical pages are indicated in the -input file by a line containing exactly one of these delimiter strings: - -@table @samp -@item \:\:\: -start of header; -@item \:\: -start of body; -@item \: -start of footer. -@end table - -The two characters from which these strings are made can be changed from -@samp{\} and @samp{:} via options (see below), but the pattern and -length of each string cannot be changed. - -A section delimiter is replaced by an empty line on output. Any text -that comes before the first section delimiter string in the input file -is considered to be part of a body section, so @code{nl} treats a -file that contains no section delimiters as a single body section. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -b @var{style} -@itemx --body-numbering=@var{style} -@opindex -b -@opindex --body-numbering -Select the numbering style for lines in the body section of each -logical page. When a line is not numbered, the current line number -is not incremented, but the line number separator character is still -prepended to the line. The styles are: - -@table @samp -@item a -number all lines, -@item t -number only nonempty lines (default for body), -@item n -do not number lines (default for header and footer), -@item p@var{regexp} -number only lines that contain a match for @var{regexp}. -@end table - -@item -d @var{cd} -@itemx --section-delimiter=@var{cd} -@opindex -d -@opindex --section-delimiter -@cindex section delimiters of pages -Set the section delimiter characters to @var{cd}; default is -@samp{\:}. If only @var{c} is given, the second remains @samp{:}. -(Remember to protect @samp{\} or other metacharacters from shell -expansion with quotes or extra backslashes.) - -@item -f @var{style} -@itemx --footer-numbering=@var{style} -@opindex -f -@opindex --footer-numbering -Analogous to @samp{--body-numbering}. - -@item -h @var{style} -@itemx --header-numbering=@var{style} -@opindex -h -@opindex --header-numbering -Analogous to @samp{--body-numbering}. - -@item -i @var{number} -@itemx --page-increment=@var{number} -@opindex -i -@opindex --page-increment -Increment line numbers by @var{number} (default 1). - -@item -l @var{number} -@itemx --join-blank-lines=@var{number} -@opindex -l -@opindex --join-blank-lines -@cindex empty lines, numbering -@cindex blank lines, numbering -Consider @var{number} (default 1) consecutive empty lines to be one -logical line for numbering, and only number the last one. Where fewer -than @var{number} consecutive empty lines occur, do not number them. -An empty line is one that contains no characters, not even spaces -or tabs. - -@item -n @var{format} -@itemx --number-format=@var{format} -@opindex -n -@opindex --number-format -Select the line numbering format (default is @code{rn}): - -@table @samp -@item ln -@opindex ln @r{format for @code{nl}} -left justified, no leading zeros; -@item rn -@opindex rn @r{format for @code{nl}} -right justified, no leading zeros; -@item rz -@opindex rz @r{format for @code{nl}} -right justified, leading zeros. -@end table - -@item -p -@itemx --no-renumber -@opindex -p -@opindex --no-renumber -Do not reset the line number at the start of a logical page. - -@item -s @var{string} -@itemx --number-separator=@var{string} -@opindex -s -@opindex --number-separator -Separate the line number from the text line in the output with -@var{string} (default is the TAB character). - -@item -v @var{number} -@itemx --starting-line-number=@var{number} -@opindex -v -@opindex --starting-line-number -Set the initial line number on each logical page to @var{number} (default 1). - -@item -w @var{number} -@itemx --number-width=@var{number} -@opindex -w -@opindex --number-width -Use @var{number} characters for line numbers (default 6). - -@end table - - -@node od invocation -@section @code{od}: Write files in octal or other formats - -@pindex od -@cindex octal dump of files -@cindex hex dump of files -@cindex ASCII dump of files -@cindex file contents, dumping unambiguously - -@code{od} writes an unambiguous representation of each @var{file} -(@samp{-} means standard input), or standard input if none are given. -Synopsis: - -@example -od [@var{option}]@dots{} [@var{file}]@dots{} -od -C [@var{file}] [[+]@var{offset} [[+]@var{label}]] -@end example - -Each line of output consists of the offset in the input, followed by -groups of data from the file. By default, @code{od} prints the offset in -octal, and each group of file data is two bytes of input printed as a -single octal number. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -A @var{radix} -@itemx --address-radix=@var{radix} -@opindex -A -@opindex --address-radix -@cindex radix for file offsets -@cindex file offset radix -Select the base in which file offsets are printed. @var{radix} can -be one of the following: - -@table @samp -@item d -decimal; -@item o -octal; -@item x -hexadecimal; -@item n -none (do not print offsets). -@end table - -The default is octal. - -@item -j @var{bytes} -@itemx --skip-bytes=@var{bytes} -@opindex -j -@opindex --skip-bytes -Skip @var{bytes} input bytes before formatting and writing. If -@var{bytes} begins with @samp{0x} or @samp{0X}, it is interpreted in -hexadecimal; otherwise, if it begins with @samp{0}, in octal; otherwise, -in decimal. Appending @samp{b} multiplies @var{bytes} by 512, @samp{k} -by 1024, and @samp{m} by 1048576. - -@item -N @var{bytes} -@itemx --read-bytes=@var{bytes} -@opindex -N -@opindex --read-bytes -Output at most @var{bytes} bytes of the input. Prefixes and suffixes on -@code{bytes} are interpreted as for the @samp{-j} option. - -@item -s [@var{n}] -@itemx --strings[=@var{n}] -@opindex -s -@opindex --strings -@cindex string constants, outputting -Instead of the normal output, output only @dfn{string constants}: at -least @var{n} (3 by default) consecutive @sc{ascii} graphic characters, -followed by a null (zero) byte. - -@item -t @var{type} -@itemx --format=@var{type} -@opindex -t -@opindex --format -Select the format in which to output the file data. @var{type} is a -string of one or more of the below type indicator characters. If you -include more than one type indicator character in a single @var{type} -string, or use this option more than once, @code{od} writes one copy -of each output line using each of the data types that you specified, -in the order that you specified. - -Adding a trailing ``z'' to any type specification appends a display -of the @sc{ascii} character representation of the printable characters -to the output line generated by the type specification. - -@table @samp -@item a -named character -@item c -@sc{ascii} character or backslash escape, -@item d -signed decimal -@item f -floating point -@item o -octal -@item u -unsigned decimal -@item x -hexadecimal -@end table - -The type @code{a} outputs things like @samp{sp} for space, @samp{nl} for -newline, and @samp{nul} for a null (zero) byte. Type @code{c} outputs -@samp{ }, @samp{\n}, and @code{\0}, respectively. - -@cindex type size -Except for types @samp{a} and @samp{c}, you can specify the number -of bytes to use in interpreting each number in the given data type -by following the type indicator character with a decimal integer. -Alternately, you can specify the size of one of the C compiler's -built-in data types by following the type indicator character with -one of the following characters. For integers (@samp{d}, @samp{o}, -@samp{u}, @samp{x}): - -@table @samp -@item C -char -@item S -short -@item I -int -@item L -long -@end table - -For floating point (@code{f}): - -@table @asis -@item F -float -@item D -double -@item L -long double -@end table - -@item -v -@itemx --output-duplicates -@opindex -v -@opindex --output-duplicates -Output consecutive lines that are identical. By default, when two or -more consecutive output lines would be identical, @code{od} outputs only -the first line, and puts just an asterisk on the following line to -indicate the elision. - -@item -w[@var{n}] -@itemx --width[=@var{n}] -@opindex -w -@opindex --width -Dump @code{n} input bytes per output line. This must be a multiple of -the least common multiple of the sizes associated with the specified -output types. If @var{n} is omitted, the default is 32. If this option -is not given at all, the default is 16. - -@end table - -The next several options map the old, pre-@sc{posix} format specification -options to the corresponding @sc{posix} format specs. -@sc{gnu} @code{od} accepts -any combination of old- and new-style options. Format specification -options accumulate. - -@table @samp - -@item -a -@opindex -a -Output as named characters. Equivalent to @samp{-ta}. - -@item -b -@opindex -b -Output as octal bytes. Equivalent to @samp{-toC}. - -@item -c -@opindex -c -Output as @sc{ascii} characters or backslash escapes. Equivalent to -@samp{-tc}. - -@item -d -@opindex -d -Output as unsigned decimal shorts. Equivalent to @samp{-tu2}. - -@item -f -@opindex -f -Output as floats. Equivalent to @samp{-tfF}. - -@item -h -@opindex -h -Output as hexadecimal shorts. Equivalent to @samp{-tx2}. - -@item -i -@opindex -i -Output as decimal shorts. Equivalent to @samp{-td2}. - -@item -l -@opindex -l -Output as decimal longs. Equivalent to @samp{-td4}. - -@item -o -@opindex -o -Output as octal shorts. Equivalent to @samp{-to2}. - -@item -x -@opindex -x -Output as hexadecimal shorts. Equivalent to @samp{-tx2}. - -@item -C -@itemx --traditional -@opindex --traditional -Recognize the pre-@sc{posix} non-option arguments that traditional @code{od} -accepted. The following syntax: - -@smallexample -od --traditional [@var{file}] [[+]@var{offset}[.][b] [[+]@var{label}[.][b]]] -@end smallexample - -@noindent -can be used to specify at most one file and optional arguments -specifying an offset and a pseudo-start address, @var{label}. By -default, @var{offset} is interpreted as an octal number specifying how -many input bytes to skip before formatting and writing. The optional -trailing decimal point forces the interpretation of @var{offset} as a -decimal number. If no decimal is specified and the offset begins with -@samp{0x} or @samp{0X} it is interpreted as a hexadecimal number. If -there is a trailing @samp{b}, the number of bytes skipped will be -@var{offset} multiplied by 512. The @var{label} argument is interpreted -just like @var{offset}, but it specifies an initial pseudo-address. The -pseudo-addresses are displayed in parentheses following any normal -address. - -@end table - - -@node Formatting file contents -@chapter Formatting file contents - -@cindex formatting file contents - -These commands reformat the contents of files. - -@menu -* fmt invocation:: Reformat paragraph text. -* pr invocation:: Paginate or columnate files for printing. -* fold invocation:: Wrap input lines to fit in specified width. -@end menu - - -@node fmt invocation -@section @code{fmt}: Reformat paragraph text - -@pindex fmt -@cindex reformatting paragraph text -@cindex paragraphs, reformatting -@cindex text, reformatting - -@code{fmt} fills and joins lines to produce output lines of (at most) -a given number of characters (75 by default). Synopsis: - -@example -fmt [@var{option}]@dots{} [@var{file}]@dots{} -@end example - -@code{fmt} reads from the specified @var{file} arguments (or standard -input if none are given), and writes to standard output. - -By default, blank lines, spaces between words, and indentation are -preserved in the output; successive input lines with different -indentation are not joined; tabs are expanded on input and introduced on -output. - -@cindex line-breaking -@cindex sentences and line-breaking -@cindex Knuth, Donald E. -@cindex Plass, Michael F. -@code{fmt} prefers breaking lines at the end of a sentence, and tries to -avoid line breaks after the first word of a sentence or before the last -word of a sentence. A @dfn{sentence break} is defined as either the end -of a paragraph or a word ending in any of @samp{.?!}, followed by two -spaces or end of line, ignoring any intervening parentheses or quotes. -Like @TeX{}, @code{fmt} reads entire ``paragraphs'' before choosing line -breaks; the algorithm is a variant of that in ``Breaking Paragraphs Into -Lines'' (Donald E. Knuth and Michael F. Plass, @cite{Software---Practice -and Experience}, 11 (1981), 1119--1184). - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -c -@itemx --crown-margin -@opindex -c -@opindex --crown-margin -@cindex crown margin -@dfn{Crown margin} mode: preserve the indentation of the first two -lines within a paragraph, and align the left margin of each subsequent -line with that of the second line. - -@item -t -@itemx --tagged-paragraph -@opindex -t -@opindex --tagged-paragraph -@cindex tagged paragraphs -@dfn{Tagged paragraph} mode: like crown margin mode, except that if -indentation of the first line of a paragraph is the same as the -indentation of the second, the first line is treated as a one-line -paragraph. - -@item -s -@itemx --split-only -@opindex -s -@opindex --split-only -Split lines only. Do not join short lines to form longer ones. This -prevents sample lines of code, and other such ``formatted'' text from -being unduly combined. - -@item -u -@itemx --uniform-spacing -@opindex -u -@opindex --uniform-spacing -Uniform spacing. Reduce spacing between words to one space, and spacing -between sentences to two spaces. - -@item -@var{width} -@itemx -w @var{width} -@itemx --width=@var{width} -@opindex -@var{width} -@opindex -w -@opindex --width -Fill output lines up to @var{width} characters (default 75). @code{fmt} -initially tries to make lines about 7% shorter than this, to give it -room to balance line lengths. - -@item -p @var{prefix} -@itemx --prefix=@var{prefix} -Only lines beginning with @var{prefix} (possibly preceded by whitespace) -are subject to formatting. The prefix and any preceding whitespace are -stripped for the formatting and then re-attached to each formatted output -line. One use is to format certain kinds of program comments, while -leaving the code unchanged. - -@end table - - -@node pr invocation -@section @code{pr}: Paginate or columnate files for printing - -@pindex pr -@cindex printing, preparing files for -@cindex multicolumn output, generating -@cindex merging files in parallel - -@code{pr} writes each @var{file} (@samp{-} means standard input), or -standard input if none are given, to standard output, paginating and -optionally outputting in multicolumn format; optionally merges all -@var{file}s, printing all in parallel, one per column. Synopsis: - -@example -pr [@var{option}]@dots{} [@var{file}]@dots{} -@end example - -@vindex LC_MESSAGES -By default, a 5-line header is printed at each page: two blank lines; -a line with the date, the filename, and the page count; and two more -blank lines. A footer of five blank lines is also printed. With the @samp{-F} -option, a 3-line header is printed: the leading two blank lines are -omitted; no footer is used. The default @var{page_length} in both cases is 66 -lines. The default number of text lines changes from 56 (without @samp{-F}) -to 63 (with @samp{-F}). The text line of the header takes the form -@samp{@var{date} @var{string} @var{page}}, with spaces inserted around -@var{string} so that the line takes up the full @var{page_width}. Here, -@var{date} is the date (see the @option{-D} or @option{--date-format} -option for details), @var{string} is the centered header string, and -@var{page} identifies the page number. The @env{LC_MESSAGES} locale -category affects the spelling of @var{page}; in the default C locale, it -is @samp{Page @var{number}} where @var{number} is the decimal page -number. - -Form feeds in the input cause page breaks in the output. Multiple form -feeds produce empty pages. - -Columns are of equal width, separated by an optional string (default -is @samp{space}). For multicolumn output, lines will always be truncated to -@var{page_width} (default 72), unless you use the @samp{-J} option. For single -column output no line truncation occurs by default. Use @samp{-W} option to -truncate lines in that case. - -The following changes were made in version 1.22i and apply to later -versions of @command{pr}: -@c FIXME: this whole section here sounds very awkward to me. I -@c made a few small changes, but really it all needs to be redone. - Brian -@c OK, I fixed another sentence or two, but some of it I just don't understand. -@ - Brian -@itemize @bullet - -@item -Some small @var{letter options} (@samp{-s}, @samp{-w}) have been -redefined for better @sc{posix} compliance. The output of some further -cases has been adapted to other Unix systems. These changes are not -compatible with earlier versions of the program. - -@item -Some @var{new capital letter} options (@samp{-J}, @samp{-S}, @samp{-W}) -have been introduced to turn off unexpected interferences of small letter -options. The @samp{-N} option and the second argument @var{last_page} -of @samp{+FIRST_PAGE} offer more flexibility. The detailed handling of -form feeds set in the input files requires the @samp{-T} option. - -@item -Capital letter options override small letter ones. - -@item -Some of the option-arguments (compare @samp{-s}, @samp{-S}, @samp{-e}, -@samp{-i}, @samp{-n}) cannot be specified as separate arguments from the -preceding option letter (already stated in the @sc{posix} specification). -@end itemize - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item +@var{first_page}[:@var{last_page}] -@itemx --pages=@var{first_page}[:@var{last_page}] -@opindex +@var{first_page}[:@var{last_page}] -@opindex --pages -Begin printing with page @var{first_page} and stop with @var{last_page}. -Missing @samp{:@var{last_page}} implies end of file. While estimating -the number of skipped pages each form feed in the input file results -in a new page. Page counting with and without @samp{+@var{first_page}} -is identical. By default, counting starts with the first page of input -file (not first page printed). Line numbering may be altered by @samp{-N} -option. - -@item -@var{column} -@itemx --columns=@var{column} -@opindex -@var{column} -@opindex --columns -@cindex down columns -With each single @var{file}, produce @var{column} columns of output -(default is 1) and print columns down, unless @samp{-a} is used. The -column width is automatically decreased as @var{column} increases; unless -you use the @samp{-W/-w} option to increase @var{page_width} as well. -This option might well cause some lines to be truncated. The number of -lines in the columns on each page are balanced. The options @samp{-e} -and @samp{-i} are on for multiple text-column output. Together with -@samp{-J} option column alignment and line truncation is turned off. -Lines of full length are joined in a free field format and @samp{-S} -option may set field separators. @samp{-@var{column}} may not be used -with @samp{-m} option. - -@item -a -@itemx --across -@opindex -a -@opindex --across -@cindex across columns -With each single @var{file}, print columns across rather than down. The -@samp{-@var{column}} option must be given with @var{column} greater than one. -If a line is too long to fit in a column, it is truncated. - -@item -c -@itemx --show-control-chars -@opindex -c -@opindex --show-control-chars -Print control characters using hat notation (e.g., @samp{^G}); print -other nonprinting characters in octal backslash notation. By default, -nonprinting characters are not changed. - -@item -d -@itemx --double-space -@opindex -d -@opindex --double-space -@cindex double spacing -Double space the output. - -@item -D @var{format} -@itemx --date-format=@var{format} -@cindex time formats -@cindex formatting times -Format header dates using @var{format}, using the same conventions as -for the the command @samp{date +@var{format}}; @xref{date invocation, , -,sh-utils,GNU shell utilities}. Except for directives, which start with -@samp{%}, characters in @var{format} are printed unchanged. You can use -this option to specify an arbitrary string in place of the header date, -e.g., @samp{--date-format="Monday morning"}. - -@vindex POSIXLY_CORRECT -@vindex LC_TIME -If the @env{POSIXLY_CORRECT} environment variable is not set, the date -format defaults to @samp{%Y-%m-%d %H:%M} (for example, @samp{2001-12-04 -23:59}); otherwise, the format depends on the @env{LC_TIME} locale -category, with the default being @samp{%b %e %H:%M %Y} (for example, -@samp{Dec@ @ 4 23:59 2001}. - -@item -e[@var{in-tabchar}[@var{in-tabwidth}]] -@itemx --expand-tabs[=@var{in-tabchar}[@var{in-tabwidth}]] -@opindex -e -@opindex --expand-tabs -@cindex input tabs -Expand @var{tab}s to spaces on input. Optional argument @var{in-tabchar} is -the input tab character (default is the TAB character). Second optional -argument @var{in-tabwidth} is the input tab character's width (default -is 8). - -@item -f -@itemx -F -@itemx --form-feed -@opindex -F -@opindex -f -@opindex --form-feed -Use a form feed instead of newlines to separate output pages. The default -page length of 66 lines is not altered. But the number of lines of text -per page changes from default 56 to 63 lines. - -@item -h @var{HEADER} -@itemx --header=@var{HEADER} -@opindex -h -@opindex --header -Replace the filename in the header with the centered string @var{header}. -When using the shell, @var{header} should be quoted and should be -separated from @option{-h} by a space. - -@item -i[@var{out-tabchar}[@var{out-tabwidth}]] -@itemx --output-tabs[=@var{out-tabchar}[@var{out-tabwidth}]] -@opindex -i -@opindex --output-tabs -@cindex output tabs -Replace spaces with @var{tab}s on output. Optional argument @var{out-tabchar} -is the output tab character (default is the TAB character). Second optional -argument @var{out-tabwidth} is the output tab character's width (default -is 8). - -@item -J -@itemx --join-lines -@opindex -J -@opindex --join-lines -Merge lines of full length. Used together with the column options -@samp{-@var{column}}, @samp{-a -@var{column}} or @samp{-m}. Turns off -@samp{-W/-w} line truncation; -no column alignment used; may be used with @samp{-S[@var{string}]}. -@samp{-J} has been introduced (together with @samp{-W} and @samp{-S}) -to disentangle the old (@sc{posix}-compliant) options @samp{-w} and -@samp{-s} along with the three column options. - - -@item -l @var{page_length} -@itemx --length=@var{page_length} -@opindex -l -@opindex --length -Set the page length to @var{page_length} (default 66) lines, including -the lines of the header [and the footer]. If @var{page_length} is less -than or equal to 10 (or <= 3 with @samp{-F}), the header and footer are -omitted, and all form feeds set in input files are eliminated, as if -the @samp{-T} option had been given. - -@item -m -@itemx --merge -@opindex -m -@opindex --merge -Merge and print all @var{file}s in parallel, one in each column. If a -line is too long to fit in a column, it is truncated, unless the @samp{-J} -option is used. @samp{-S[@var{string}]} may be used. Empty pages in -some @var{file}s (form feeds set) produce empty columns, still marked -by @var{string}. The result is a continuous line numbering and column -marking throughout the whole merged file. Completely empty merged pages -show no separators or line numbers. The default header becomes -@samp{@var{date} @var{page}} with spaces inserted in the middle; this -may be used with the @option{-h} or @option{--header} option to fill up -the middle blank part. - -@item -n[@var{number-separator}[@var{digits}]] -@itemx --number-lines[=@var{number-separator}[@var{digits}]] -@opindex -n -@opindex --number-lines -Provide @var{digits} digit line numbering (default for @var{digits} is -5). With multicolumn output the number occupies the first @var{digits} -column positions of each text column or only each line of @samp{-m} -output. With single column output the number precedes each line just as -@samp{-m} does. Default counting of the line numbers starts with the -first line of the input file (not the first line printed, compare the -@samp{--page} option and @samp{-N} option). -Optional argument @var{number-separator} is the character appended to -the line number to separate it from the text followed. The default -separator is the TAB character. In a strict sense a TAB is always -printed with single column output only. The @var{TAB}-width varies -with the @var{TAB}-position, e.g. with the left @var{margin} specified -by @samp{-o} option. With multicolumn output priority is given to -@samp{equal width of output columns} (a @sc{posix} specification). -The @var{TAB}-width is fixed to the value of the first column and does -not change with different values of left @var{margin}. That means a -fixed number of spaces is always printed in the place of the -@var{number-separator tab}. The tabification depends upon the output -position. - -@item -N @var{line_number} -@itemx --first-line-number=@var{line_number} -@opindex -N -@opindex --first-line-number -Start line counting with the number @var{line_number} at first line of -first page printed (in most cases not the first line of the input file). - -@item -o @var{margin} -@itemx --indent=@var{margin} -@opindex -o -@opindex --indent -@cindex indenting lines -@cindex left margin -Indent each line with a margin @var{margin} spaces wide (default is zero). -The total page width is the size of the margin plus the @var{page_width} -set with the @samp{-W/-w} option. A limited overflow may occur with -numbered single column output (compare @samp{-n} option). - -@item -r -@itemx --no-file-warnings -@opindex -r -@opindex --no-file-warnings -Do not print a warning message when an argument @var{file} cannot be -opened. (The exit status will still be nonzero, however.) - -@item -s[@var{char}] -@itemx --separator[=@var{char}] -@opindex -s -@opindex --separator -Separate columns by a single character @var{char}. The default for -@var{char} is the TAB character without @samp{-w} and @samp{no -character} with @samp{-w}. Without @samp{-s} the default separator -@samp{space} is set. @samp{-s[char]} turns off line truncation of all -three column options (@samp{-COLUMN}|@samp{-a -COLUMN}|@samp{-m}) unless -@samp{-w} is set. This is a @sc{posix}-compliant formulation. - - -@item -S[@var{string}] -@itemx --sep-string[=@var{string}] -@opindex -S -@opindex --sep-string -Use @var{string} to separate output columns. The @samp{-S} option doesn't -affect the @samp{-W/-w} option, unlike the @samp{-s} option which does. It -does not affect line truncation or column alignment. -Without @samp{-S}, and with @samp{-J}, @code{pr} uses the default output -separator, TAB. -Without @samp{-S} or @samp{-J}, @code{pr} uses a @samp{space} -(same as @samp{-S" "}). -Using @samp{-S} with no @var{string} is equivalent to @samp{-S""}. -Note that for some of @code{pr}'s options the single-letter option -character must be followed immediately by any corresponding argument; -there may not be any intervening white space. -@samp{-S/-s} is one of them. Don't use @samp{-S "STRING"}. -@sc{posix} requires this. - -@item -t -@itemx --omit-header -@opindex -t -@opindex --omit-header -Do not print the usual header [and footer] on each page, and do not fill -out the bottom of pages (with blank lines or a form feed). No page -structure is produced, but form feeds set in the input files are retained. -The predefined pagination is not changed. @samp{-t} or @samp{-T} may be -useful together with other options; e.g.: @samp{-t -e4}, expand TAB characters -in the input file to 4 spaces but don't make any other changes. Use of -@samp{-t} overrides @samp{-h}. - -@item -T -@itemx --omit-pagination -@opindex -T -@opindex --omit-pagination -Do not print header [and footer]. In addition eliminate all form feeds -set in the input files. - -@item -v -@itemx --show-nonprinting -@opindex -v -@opindex --show-nonprinting -Print nonprinting characters in octal backslash notation. - -@item -w @var{page_width} -@itemx --width=@var{page_width} -@opindex -w -@opindex --width -Set page width to @var{page_width} characters for multiple text-column -output only (default for @var{page_width} is 72). @samp{-s[CHAR]} turns -off the default page width and any line truncation and column alignment. -Lines of full length are merged, regardless of the column options -set. No @var{page_width} setting is possible with single column output. -A @sc{posix}-compliant formulation. - -@item -W @var{page_width} -@itemx --page_width=@var{page_width} -@opindex -W -@opindex --page_width -Set the page width to @var{page_width} characters. That's valid with and -without a column option. Text lines are truncated, unless @samp{-J} -is used. Together with one of the three column options -(@samp{-@var{column}}, @samp{-a -@var{column}} or @samp{-m}) column -alignment is always used. The separator options @samp{-S} or @samp{-s} -don't affect the @samp{-W} option. Default is 72 characters. Without -@samp{-W @var{page_width}} and without any of the column options NO line -truncation is used (defined to keep downward compatibility and to meet -most frequent tasks). That's equivalent to @samp{-W 72 -J}. The header -line is never truncated. - -@end table - - -@node fold invocation -@section @code{fold}: Wrap input lines to fit in specified width - -@pindex fold -@cindex wrapping long input lines -@cindex folding long input lines - -@code{fold} writes each @var{file} (@samp{-} means standard input), or -standard input if none are given, to standard output, breaking long -lines. Synopsis: - -@example -fold [@var{option}]@dots{} [@var{file}]@dots{} -@end example - -By default, @code{fold} breaks lines wider than 80 columns. The output -is split into as many lines as necessary. - -@cindex screen columns -@code{fold} counts screen columns by default; thus, a tab may count more -than one column, backspace decreases the column count, and carriage -return sets the column to zero. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -b -@itemx --bytes -@opindex -b -@opindex --bytes -Count bytes rather than columns, so that tabs, backspaces, and carriage -returns are each counted as taking up one column, just like other -characters. - -@item -s -@itemx --spaces -@opindex -s -@opindex --spaces -Break at word boundaries: the line is broken after the last blank before -the maximum line length. If the line contains no such blanks, the line -is broken at the maximum line length as usual. - -@item -w @var{width} -@itemx --width=@var{width} -@opindex -w -@opindex --width -Use a maximum line length of @var{width} columns instead of 80. - -@end table - - -@node Output of parts of files -@chapter Output of parts of files - -@cindex output of parts of files -@cindex parts of files, output of - -These commands output pieces of the input. - -@menu -* head invocation:: Output the first part of files. -* tail invocation:: Output the last part of files. -* split invocation:: Split a file into fixed-size pieces. -* csplit invocation:: Split a file into context-determined pieces. -@end menu - -@node head invocation -@section @code{head}: Output the first part of files - -@pindex head -@cindex initial part of files, outputting -@cindex first part of files, outputting - -@code{head} prints the first part (10 lines by default) of each -@var{file}; it reads from standard input if no files are given or -when given a @var{file} of @samp{-}. Synopses: - -@example -head [@var{option}]@dots{} [@var{file}]@dots{} -head -@var{number} [@var{option}]@dots{} [@var{file}]@dots{} -@end example - -If more than one @var{file} is specified, @code{head} prints a -one-line header consisting of -@example -==> @var{file name} <== -@end example -@noindent -before the output for each @var{file}. - -@code{head} accepts two option formats: the new one, in which numbers -are arguments to the options (@samp{-q -n 1}), and the old one, in which -the number precedes any option letters (@samp{-1q}). - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -@var{count}@var{options} -@opindex -@var{count} -This option is only recognized if it is specified first. @var{count} is -a decimal number optionally followed by a size letter (@samp{b}, -@samp{k}, @samp{m}) as in @code{-c}, or @samp{l} to mean count by lines, -or other option letters (@samp{cqv}). - -@item -c @var{bytes} -@itemx --bytes=@var{bytes} -@opindex -c -@opindex --bytes -Print the first @var{bytes} bytes, instead of initial lines. Appending -@samp{b} multiplies @var{bytes} by 512, @samp{k} by 1024, and @samp{m} -by 1048576. - -@itemx -n @var{n} -@itemx --lines=@var{n} -@opindex -n -@opindex --lines -Output the first @var{n} lines. - -@item -q -@itemx --quiet -@itemx --silent -@opindex -q -@opindex --quiet -@opindex --silent -Never print file name headers. - -@item -v -@itemx --verbose -@opindex -v -@opindex --verbose -Always print file name headers. - -@end table - - -@node tail invocation -@section @code{tail}: Output the last part of files - -@pindex tail -@cindex last part of files, outputting - -@code{tail} prints the last part (10 lines by default) of each -@var{file}; it reads from standard input if no files are given or -when given a @var{file} of @samp{-}. Synopses: - -@example -tail [@var{option}]@dots{} [@var{file}]@dots{} -tail -@var{number} [@var{option}]@dots{} [@var{file}]@dots{} -tail +@var{number} [@var{option}]@dots{} [@var{file}]@dots{} # obsolescent -@end example - -If more than one @var{file} is specified, @code{tail} prints a -one-line header consisting of -@example -==> @var{file name} <== -@end example -@noindent -before the output for each @var{file}. - -@cindex BSD @code{tail} -@sc{gnu} @code{tail} can output any amount of data (some other versions of -@code{tail} cannot). It also has no @samp{-r} option (print in -reverse), since reversing a file is really a different job from printing -the end of a file; BSD @code{tail} (which is the one with @code{-r}) can -only reverse files that are at most as large as its buffer, which is -typically 32k. A more reliable and versatile way to reverse files is -the @sc{gnu} @code{tac} command. - -@code{tail} accepts two option formats: the new one, in which numbers -are arguments to the options (@samp{-n 1}), and the obsolescent one, in -which the number precedes any option letters (@samp{-1} or @samp{+1}). -Warning: support for the @samp{+1} form will be withdrawn, as future -versions of @sc{posix} will not allow it. - -If any option-argument is a number @var{n} starting with a @samp{+}, -@code{tail} begins printing with the @var{n}th item from the start of -each file, instead of from the end. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -@var{count} -@itemx +@var{count} -@opindex -@var{count} -@opindex +@var{count} -This option is only recognized if it is specified first. @var{count} is -a decimal number optionally followed by a size letter (@samp{b}, -@samp{k}, @samp{m}) as in @code{-c}, or @samp{l} to mean count by lines, -or other option letters (@samp{cfqv}). - -Warning: the @samp{+@var{count}} usage is obsolescent. Future versions -of @sc{posix} will require that support for it be withdrawn. Use -@samp{-n +@var{count}} instead. - -@item -c @var{bytes} -@itemx --bytes=@var{bytes} -@opindex -c -@opindex --bytes -Output the last @var{bytes} bytes, instead of final lines. Appending -@samp{b} multiplies @var{bytes} by 512, @samp{k} by 1024, and @samp{m} -by 1048576. - -@item -f -@itemx --follow[=@var{how}] -@opindex -f -@opindex --follow -@cindex growing files -@vindex name @r{follow option} -@vindex descriptor @r{follow option} -Loop forever trying to read more characters at the end of the file, -presumably because the file is growing. This option is ignored when -reading from a pipe. -If more than one file is given, @code{tail} prints a header whenever it -gets output from a different file, to indicate which file that output is -from. - -There are two ways to specify how you'd like to track files with this option, -but that difference is noticeable only when a followed file is removed or -renamed. -If you'd like to continue to track the end of a growing file even after -it has been unlinked, use @samp{--follow=descriptor}. This is the default -behavior, but it is not useful if you're tracking a log file that may be -rotated (removed or renamed, then reopened). In that case, use -@samp{--follow=name} to track the named file by reopening it periodically -to see if it has been removed and recreated by some other program. - -No matter which method you use, if the tracked file is determined to have -shrunk, @code{tail} prints a message saying the file has been truncated -and resumes tracking the end of the file from the newly-determined endpoint. - -When a file is removed, @code{tail}'s behavior depends on whether it is -following the name or the descriptor. When following by name, tail can -detect that a file has been removed and gives a message to that effect, -and if @samp{--retry} has been specified it will continue checking -periodically to see if the file reappears. -When following a descriptor, tail does not detect that the file has -been unlinked or renamed and issues no message; even though the file -may no longer be accessible via its original name, it may still be -growing. - -The option values @samp{descriptor} and @samp{name} may be specified only -with the long form of the option, not with @samp{-f}. - -@itemx --retry -@opindex --retry -This option is meaningful only when following by name. -Without this option, when tail encounters a file that doesn't -exist or is otherwise inaccessible, it reports that fact and -never checks it again. - -@itemx --sleep-interval=@var{n} -@opindex --sleep-interval -Change the number of seconds to wait between iterations (the default is 1). -During one iteration, every specified file is checked to see if it has -changed size. - -@itemx --pid=@var{pid} -@opindex --pid -When following by name or by descriptor, you may specify the process ID, -@var{pid}, of the sole writer of all @var{file} arguments. Then, shortly -after that process terminates, tail will also terminate. This will -work properly only if the writer and the tailing process are running on -the same machine. For example, to save the output of a build in a file -and to watch the file grow, if you invoke @code{make} and @code{tail} -like this then the tail process will stop when your build completes. -Without this option, you would have had to kill the @code{tail -f} -process yourself. -@example -$ make >& makerr & tail --pid=$! -f makerr -@end example -If you specify a @var{pid} that is not in use or that does not correspond -to the process that is writing to the tailed files, then @code{tail} -may terminate long before any @var{file}s stop growing or it may not -terminate until long after the real writer has terminated. -Note that @samp{--pid} cannot be supported on some systems; @code{tail} -will print a warning if this is the case. - -@itemx --max-unchanged-stats=@var{n} -@opindex --max-unchanged-stats -When tailing a file by name, if there have been @var{n} (default -n=@value{DEFAULT_MAX_N_UNCHANGED_STATS_BETWEEN_OPENS}) consecutive -iterations for which the size has remained the same, then -@code{open}/@code{fstat} the file to determine if that file name is -still associated with the same device/inode-number pair as before. -When following a log file that is rotated, this is approximately the -number of seconds between when tail prints the last pre-rotation lines -and when it prints the lines that have accumulated in the new log file. -This option is meaningful only when following by name. - -@itemx -n @var{n} -@itemx --lines=@var{n} -@opindex -n -@opindex --lines -Output the last @var{n} lines. - -@item -q -@itemx -quiet -@itemx --silent -@opindex -q -@opindex --quiet -@opindex --silent -Never print file name headers. - -@item -v -@itemx --verbose -@opindex -v -@opindex --verbose -Always print file name headers. - -@end table - - -@node split invocation -@section @code{split}: Split a file into fixed-size pieces - -@pindex split -@cindex splitting a file into pieces -@cindex pieces, splitting a file into - -@code{split} creates output files containing consecutive sections of -@var{input} (standard input if none is given or @var{input} is -@samp{-}). Synopsis: - -@example -split [@var{option}] [@var{input} [@var{prefix}]] -@end example - -By default, @code{split} puts 1000 lines of @var{input} (or whatever is -left over for the last section), into each output file. - -@cindex output file name prefix -The output files' names consist of @var{prefix} (@samp{x} by default) -followed by a group of letters @samp{aa}, @samp{ab}, and so on, such -that concatenating the output files in sorted order by file name produces -the original input file. (If more than 676 output files are required, -@code{split} uses @samp{zaa}, @samp{zab}, etc.) - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -@var{lines} -@itemx -l @var{lines} -@itemx --lines=@var{lines} -@opindex -l -@opindex --lines -Put @var{lines} lines of @var{input} into each output file. - -@item -b @var{bytes} -@itemx --bytes=@var{bytes} -@opindex -b -@opindex --bytes -Put the first @var{bytes} bytes of @var{input} into each output file. -Appending @samp{b} multiplies @var{bytes} by 512, @samp{k} by 1024, and -@samp{m} by 1048576. - -@item -C @var{bytes} -@itemx --line-bytes=@var{bytes} -@opindex -C -@opindex --line-bytes -Put into each output file as many complete lines of @var{input} as -possible without exceeding @var{bytes} bytes. For lines longer than -@var{bytes} bytes, put @var{bytes} bytes into each output file until -less than @var{bytes} bytes of the line are left, then continue -normally. @var{bytes} has the same format as for the @samp{--bytes} -option. - -@itemx --verbose -@opindex --verbose -Write a diagnostic to standard error just before each output file is opened. - -@end table - - -@node csplit invocation -@section @code{csplit}: Split a file into context-determined pieces - -@pindex csplit -@cindex context splitting -@cindex splitting a file into pieces by context - -@code{csplit} creates zero or more output files containing sections of -@var{input} (standard input if @var{input} is @samp{-}). Synopsis: - -@example -csplit [@var{option}]@dots{} @var{input} @var{pattern}@dots{} -@end example - -The contents of the output files are determined by the @var{pattern} -arguments, as detailed below. An error occurs if a @var{pattern} -argument refers to a nonexistent line of the input file (e.g., if no -remaining line matches a given regular expression). After every -@var{pattern} has been matched, any remaining input is copied into one -last output file. - -By default, @code{csplit} prints the number of bytes written to each -output file after it has been created. - -The types of pattern arguments are: - -@table @samp - -@item @var{n} -Create an output file containing the input up to but not including line -@var{n} (a positive integer). If followed by a repeat count, also -create an output file containing the next @var{line} lines of the input -file once for each repeat. - -@item /@var{regexp}/[@var{offset}] -Create an output file containing the current line up to (but not -including) the next line of the input file that contains a match for -@var{regexp}. The optional @var{offset} is a @samp{+} or @samp{-} -followed by a positive integer. If it is given, the input up to the -matching line plus or minus @var{offset} is put into the output file, -and the line after that begins the next section of input. - -@item %@var{regexp}%[@var{offset}] -Like the previous type, except that it does not create an output -file, so that section of the input file is effectively ignored. - -@item @{@var{repeat-count}@} -Repeat the previous pattern @var{repeat-count} additional -times. @var{repeat-count} can either be a positive integer or an -asterisk, meaning repeat as many times as necessary until the input is -exhausted. - -@end table - -The output files' names consist of a prefix (@samp{xx} by default) -followed by a suffix. By default, the suffix is an ascending sequence -of two-digit decimal numbers from @samp{00} to @samp{99}. In any case, -concatenating the output files in sorted order by filename produces the -original input file. - -By default, if @code{csplit} encounters an error or receives a hangup, -interrupt, quit, or terminate signal, it removes any output files -that it has created so far before it exits. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -f @var{prefix} -@itemx --prefix=@var{prefix} -@opindex -f -@opindex --prefix -@cindex output file name prefix -Use @var{prefix} as the output file name prefix. - -@item -b @var{suffix} -@itemx --suffix=@var{suffix} -@opindex -b -@opindex --suffix -@cindex output file name suffix -Use @var{suffix} as the output file name suffix. When this option is -specified, the suffix string must include exactly one -@code{printf(3)}-style conversion specification, possibly including -format specification flags, a field width, a precision specifications, -or all of these kinds of modifiers. The format letter must convert a -binary integer argument to readable form; thus, only @samp{d}, @samp{i}, -@samp{u}, @samp{o}, @samp{x}, and @samp{X} conversions are allowed. The -entire @var{suffix} is given (with the current output file number) to -@code{sprintf(3)} to form the file name suffixes for each of the -individual output files in turn. If this option is used, the -@samp{--digits} option is ignored. - -@item -n @var{digits} -@itemx --digits=@var{digits} -@opindex -n -@opindex --digits -Use output file names containing numbers that are @var{digits} digits -long instead of the default 2. - -@item -k -@itemx --keep-files -@opindex -k -@opindex --keep-files -Do not remove output files when errors are encountered. - -@item -z -@itemx --elide-empty-files -@opindex -z -@opindex --elide-empty-files -Suppress the generation of zero-length output files. (In cases where -the section delimiters of the input file are supposed to mark the first -lines of each of the sections, the first output file will generally be a -zero-length file unless you use this option.) The output file sequence -numbers always run consecutively starting from 0, even when this option -is specified. - -@item -s -@itemx -q -@itemx --silent -@itemx --quiet -@opindex -s -@opindex -q -@opindex --silent -@opindex --quiet -Do not print counts of output file sizes. - -@end table - - -@node Summarizing files -@chapter Summarizing files - -@cindex summarizing files - -These commands generate just a few numbers representing entire -contents of files. - -@menu -* wc invocation:: Print byte, word, and line counts. -* sum invocation:: Print checksum and block counts. -* cksum invocation:: Print CRC checksum and byte counts. -* md5sum invocation:: Print or check message-digests. -@end menu - - -@node wc invocation -@section @code{wc}: Print byte, word, and line counts - -@pindex wc -@cindex byte count -@cindex character count -@cindex word count -@cindex line count - -@code{wc} counts the number of bytes, characters, whitespace-separated -words, and newlines in each given @var{file}, or standard input if none -are given or for a @var{file} of @samp{-}. Synopsis: - -@example -wc [@var{option}]@dots{} [@var{file}]@dots{} -@end example - -@cindex total counts -@vindex POSIXLY_CORRECT -@code{wc} prints one line of counts for each file, and if the file was -given as an argument, it prints the file name following the counts. If -more than one @var{file} is given, @code{wc} prints a final line -containing the cumulative counts, with the file name @file{total}. The -counts are printed in this order: newlines, words, characters, bytes. -By default, each count is output right-justified in a 7-byte field with -one space between fields so that the numbers and file names line up nicely -in columns. However, @sc{posix} requires that there be exactly one space -separating columns. You can make @code{wc} use the @sc{posix}-mandated -output format by setting the @env{POSIXLY_CORRECT} environment variable. - -By default, @code{wc} prints three counts: the newline, words, and byte -counts. Options can specify that only certain counts be printed. -Options do not undo others previously given, so - -@example -wc --bytes --words -@end example - -@noindent -prints both the byte counts and the word counts. - -With the @code{--max-line-length} option, @code{wc} prints the length -of the longest line per file, and if there is more than one file it -prints the maximum (not the sum) of those lengths. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -c -@itemx --bytes -@opindex -c -@opindex --bytes -Print only the byte counts. - -@item -m -@itemx --chars -@opindex -m -@opindex --chars -Print only the character counts. - -@item -w -@itemx --words -@opindex -w -@opindex --words -Print only the word counts. - -@item -l -@itemx --lines -@opindex -l -@opindex --lines -Print only the newline counts. - -@item -L -@itemx --max-line-length -@opindex -L -@opindex --max-line-length -Print only the maximum line lengths. - -@end table - - -@node sum invocation -@section @code{sum}: Print checksum and block counts - -@pindex sum -@cindex 16-bit checksum -@cindex checksum, 16-bit - -@code{sum} computes a 16-bit checksum for each given @var{file}, or -standard input if none are given or for a @var{file} of @samp{-}. Synopsis: - -@example -sum [@var{option}]@dots{} [@var{file}]@dots{} -@end example - -@code{sum} prints the checksum for each @var{file} followed by the -number of blocks in the file (rounded up). If more than one @var{file} -is given, file names are also printed (by default). (With the -@samp{--sysv} option, corresponding file names are printed when there is -at least one file argument.) - -By default, @sc{gnu} @code{sum} computes checksums using an algorithm -compatible with BSD @code{sum} and prints file sizes in units of -1024-byte blocks. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -r -@opindex -r -@cindex BSD @code{sum} -Use the default (BSD compatible) algorithm. This option is included for -compatibility with the System V @code{sum}. Unless @samp{-s} was also -given, it has no effect. - -@item -s -@itemx --sysv -@opindex -s -@opindex --sysv -@cindex System V @code{sum} -Compute checksums using an algorithm compatible with System V -@code{sum}'s default, and print file sizes in units of 512-byte blocks. - -@end table - -@code{sum} is provided for compatibility; the @code{cksum} program (see -next section) is preferable in new applications. - - -@node cksum invocation -@section @code{cksum}: Print CRC checksum and byte counts - -@pindex cksum -@cindex cyclic redundancy check -@cindex CRC checksum - -@code{cksum} computes a cyclic redundancy check (CRC) checksum for each -given @var{file}, or standard input if none are given or for a -@var{file} of @samp{-}. Synopsis: - -@example -cksum [@var{option}]@dots{} [@var{file}]@dots{} -@end example - -@code{cksum} prints the CRC checksum for each file along with the number -of bytes in the file, and the filename unless no arguments were given. - -@code{cksum} is typically used to ensure that files -transferred by unreliable means (e.g., netnews) have not been corrupted, -by comparing the @code{cksum} output for the received files with the -@code{cksum} output for the original files (typically given in the -distribution). - -The CRC algorithm is specified by the @sc{posix.2} standard. It is not -compatible with the BSD or System V @code{sum} algorithms (see the -previous section); it is more robust. - -The only options are @samp{--help} and @samp{--version}. @xref{Common -options}. - - -@node md5sum invocation -@section @code{md5sum}: Print or check message-digests - -@pindex md5sum -@cindex 128-bit checksum -@cindex checksum, 128-bit -@cindex fingerprint, 128-bit -@cindex message-digest, 128-bit - -@code{md5sum} computes a 128-bit checksum (or @dfn{fingerprint} or -@dfn{message-digest}) for each specified @var{file}. -If a @var{file} is specified as @samp{-} or if no files are given -@code{md5sum} computes the checksum for the standard input. -@code{md5sum} can also determine whether a file and checksum are -consistent. Synopses: - -@example -md5sum [@var{option}]@dots{} [@var{file}]@dots{} -md5sum [@var{option}]@dots{} --check [@var{file}] -@end example - -For each @var{file}, @samp{md5sum} outputs the MD5 checksum, a flag -indicating a binary or text input file, and the filename. -If @var{file} is omitted or specified as @samp{-}, standard input is read. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -b -@itemx --binary -@opindex -b -@opindex --binary -@cindex binary input files -Treat all input files as binary. This option has no effect on Unix -systems, since they don't distinguish between binary and text files. -This option is useful on systems that have different internal and -external character representations. On MS-DOS and MS-Windows, this is -the default. - -@item -c -@itemx --check -Read filenames and checksum information from the single @var{file} -(or from stdin if no @var{file} was specified) and report whether -each named file and the corresponding checksum data are consistent. -The input to this mode of @code{md5sum} is usually the output of -a prior, checksum-generating run of @samp{md5sum}. -Each valid line of input consists of an MD5 checksum, a binary/text -flag, and then a filename. -Binary files are marked with @samp{*}, text with @samp{ }. -For each such line, @code{md5sum} reads the named file and computes its -MD5 checksum. Then, if the computed message digest does not match the -one on the line with the filename, the file is noted as having -failed the test. Otherwise, the file passes the test. -By default, for each valid line, one line is written to standard -output indicating whether the named file passed the test. -After all checks have been performed, if there were any failures, -a warning is issued to standard error. -Use the @samp{--status} option to inhibit that output. -If any listed file cannot be opened or read, if any valid line has -an MD5 checksum inconsistent with the associated file, or if no valid -line is found, @code{md5sum} exits with nonzero status. Otherwise, -it exits successfully. - -@itemx --status -@opindex --status -@cindex verifying MD5 checksums -This option is useful only when verifying checksums. -When verifying checksums, don't generate the default one-line-per-file -diagnostic and don't output the warning summarizing any failures. -Failures to open or read a file still evoke individual diagnostics to -standard error. -If all listed files are readable and are consistent with the associated -MD5 checksums, exit successfully. Otherwise exit with a status code -indicating there was a failure. - -@item -t -@itemx --text -@opindex -t -@opindex --text -@cindex text input files -Treat all input files as text files. This is the reverse of -@samp{--binary}. - -@item -w -@itemx --warn -@opindex -w -@opindex --warn -@cindex verifying MD5 checksums -When verifying checksums, warn about improperly formatted MD5 checksum lines. -This option is useful only if all but a few lines in the checked input -are valid. - -@end table - - -@node Operating on sorted files -@chapter Operating on sorted files - -@cindex operating on sorted files -@cindex sorted files, operations on - -These commands work with (or produce) sorted files. - -@menu -* sort invocation:: Sort text files. -* uniq invocation:: Uniquify files. -* comm invocation:: Compare two sorted files line by line. -* ptx invocation:: Produce a permuted index of file contents. -* tsort invocation:: Topological sort. -@end menu - - -@node sort invocation -@section @code{sort}: Sort text files - -@pindex sort -@cindex sorting files - -@code{sort} sorts, merges, or compares all the lines from the given -files, or standard input if none are given or for a @var{file} of -@samp{-}. By default, @code{sort} writes the results to standard -output. Synopsis: - -@example -sort [@var{option}]@dots{} [@var{file}]@dots{} -@end example - -@code{sort} has three modes of operation: sort (the default), merge, -and check for sortedness. The following options change the operation -mode: - -@table @samp - -@item -c -@itemx --check -@opindex -c -@opindex --check -@cindex checking for sortedness -Check whether the given files are already sorted: if they are not all -sorted, print an error message and exit with a status of 1. -Otherwise, exit successfully. - -@item -m -@itemx --merge -@opindex -m -@opindex --merge -@cindex merging sorted files -Merge the given files by sorting them as a group. Each input file must -always be individually sorted. It always works to sort instead of -merge; merging is provided because it is faster, in the case where it -works. - -@end table - -@vindex LC_COLLATE -A pair of lines is compared as follows: if any key fields have been -specified, @code{sort} compares each pair of fields, in the order -specified on the command line, according to the associated ordering -options, until a difference is found or no fields are left. -Unless otherwise specified, all comparisons use the character -collating sequence specified by the @env{LC_COLLATE} locale. - -If any of the global options @samp{bdfgiMnr} are given but no key fields -are specified, @code{sort} compares the entire lines according to the -global options. - -Finally, as a last resort when all keys compare equal (or if no ordering -options were specified at all), @code{sort} compares the entire lines. -The last resort comparison honors the @option{--reverse} (@option{-r}) -global option. The @option{--stable} (@option{-s}) option disables this -last-resort comparison so that lines in which all fields compare equal -are left in their original relative order. If no fields or global -options are specified, @option{--stable} (@option{-s}) has no effect. - -@sc{gnu} @code{sort} (as specified for all @sc{gnu} utilities) has no limits on -input line length or restrictions on bytes allowed within lines. In -addition, if the final byte of an input file is not a newline, @sc{gnu} -@code{sort} silently supplies one. A line's trailing newline is not -part of the line for comparison purposes.@footnote{@sc{posix}.2-1992 -requires that the trailing newline be part of the comparison, and some -@code{sort} implementations obey this requirement, but it is widely -considered to be a bug in the standard and the next version of -@sc{posix}.2 will likely remove this requirement.} - -Upon any error, @code{sort} exits with a status of @samp{2}. - -@vindex TMPDIR -If the environment variable @env{TMPDIR} is set, @code{sort} uses its -value as the directory for temporary files instead of @file{/tmp}. The -@option{--temporary-directory} (@option{-T}) option in turn overrides -the environment variable. - - -The following options affect the ordering of output lines. They may be -specified globally or as part of a specific key field. If no key -fields are specified, global options apply to comparison of entire -lines; otherwise the global options are inherited by key fields that do -not specify any special options of their own. In pre-@sc{posix} -versions of @command{sort}, global options affect only later key fields, -so portable shell scripts should specify global options first. - -@table @samp - -@item -b -@itemx --ignore-leading-blanks -@opindex -b -@opindex --ignore-leading-blanks -@cindex blanks, ignoring leading -@vindex LC_CTYPE -Ignore leading blanks when finding sort keys in each line. -The @env{LC_CTYPE} locale determines character types. - -@item -d -@itemx --dictionary-order -@opindex -d -@opindex --dictionary-order -@cindex dictionary order -@cindex phone directory order -@cindex telephone directory order -@vindex LC_CTYPE -Sort in @dfn{phone directory} order: ignore all characters except -letters, digits and blanks when sorting. -The @env{LC_CTYPE} locale determines character types. - -@item -f -@itemx --ignore-case -@opindex -f -@opindex --ignore-case -@cindex ignoring case -@cindex case folding -@vindex LC_CTYPE -Fold lowercase characters into the equivalent uppercase characters when -comparing so that, for example, @samp{b} and @samp{B} sort as equal. -The @env{LC_CTYPE} locale determines character types. - -@item -g -@itemx --general-numeric-sort -@opindex -g -@opindex --general-numeric-sort -@cindex general numeric sort -@vindex LC_NUMERIC -Sort numerically, using the standard C function @code{strtod} to convert -a prefix of each line to a double-precision floating point number. -This allows floating point numbers to be specified in scientific notation, -like @code{1.0e-34} and @code{10e100}. -The @env{LC_NUMERIC} locale determines the decimal-point character. -Do not report overflow, underflow, or conversion errors. -Use the following collating sequence: - -@itemize @bullet -@item -Lines that do not start with numbers (all considered to be equal). -@item -NaNs (``Not a Number'' values, in IEEE floating point arithmetic) -in a consistent but machine-dependent order. -@item -Minus infinity. -@item -Finite numbers in ascending numeric order (with @math{-0} and @math{+0} equal). -@item -Plus infinity. -@end itemize - -Use this option only if there is no alternative; it is much slower than -@option{--numeric-sort} (@option{-n}) and it can lose information when -converting to floating point. - -@item -i -@itemx --ignore-nonprinting -@opindex -i -@opindex --ignore-nonprinting -@cindex nonprinting characters, ignoring -@cindex unprintable characters, ignoring -@vindex LC_CTYPE -Ignore nonprinting characters. -The @env{LC_CTYPE} locale determines character types. - -@item -M -@itemx --month-sort -@opindex -M -@opindex --month-sort -@cindex months, sorting by -@vindex LC_TIME -An initial string, consisting of any amount of whitespace, followed -by a month name abbreviation, is folded to UPPER case and -compared in the order @samp{JAN} < @samp{FEB} < @dots{} < @samp{DEC}. -Invalid names compare low to valid names. The @env{LC_TIME} locale -determines the month spellings. - -@item -n -@itemx --numeric-sort -@opindex -n -@opindex --numeric-sort -@cindex numeric sort -@vindex LC_NUMERIC -Sort numerically: the number begins each line; specifically, it consists -of optional whitespace, an optional @samp{-} sign, and zero or more -digits possibly separated by thousands separators, optionally followed -by a decimal-point character and zero or more digits. The @env{LC_NUMERIC} -locale specifies the decimal-point character and thousands separator. - -Numeric sort uses what might be considered an unconventional method to -compare strings representing floating point numbers. Rather than first -converting each string to the C @code{double} type and then comparing -those values, @command{sort} aligns the decimal-point characters in the -two strings and compares the strings a character at a time. One benefit -of using this approach is its speed. In practice this is much more -efficient than performing the two corresponding string-to-double (or -even string-to-integer) conversions and then comparing doubles. In -addition, there is no corresponding loss of precision. Converting each -string to @code{double} before comparison would limit precision to about -16 digits on most systems. - -Neither a leading @samp{+} nor exponential notation is recognized. -To compare such strings numerically, use the -@option{--general-numeric-sort} (@option{-g}) option. - -@item -r -@itemx --reverse -@opindex -r -@opindex --reverse -@cindex reverse sorting -Reverse the result of comparison, so that lines with greater key values -appear earlier in the output instead of later. - -@end table - -Other options are: - -@table @samp - -@item -o @var{output-file} -@itemx --output=@var{output-file} -@opindex -o -@opindex --output -@cindex overwriting of input, allowed -Write output to @var{output-file} instead of standard output. -If necessary, @command{sort} reads input before opening -@var{output-file}, so you can safely sort a file in place by using -commands like @code{sort -o F F} and @code{cat F | sort -o F}. - -@vindex POSIXLY_CORRECT -If @option{-c} is not also specified, @option{-o} may appear after an -input file even if @env{POSIXLY_CORRECT} is set, e.g., @samp{sort F -o -F}. Warning: this usage is obsolescent. Future versions of @sc{posix} -will require that support for it be withdrawn. Portable scripts should -specify @samp{-o @var{output-file}} before any input files. - -@item -S @var{size} -@itemx --buffer-size=@var{size} -@opindex -S -@opindex --buffer-size -@cindex size for main memory sorting -Use a main-memory sort buffer of the given @var{size}. By default, -@var{size} is in units of 1,024 bytes. Appending @samp{%} causes -@var{size} to be interpreted as a percentage of physical memory. -Appending @samp{k} multiplies @var{size} by 1,024 (the default), -@samp{M} by 1,048,576, @samp{G} by 1,073,741,824, and so on for -@samp{T}, @samp{P}, @samp{E}, @samp{Z}, and @samp{Y}. Appending -@samp{b} causes @var{size} to be interpreted as a byte count, with no -multiplication. - -This option can improve the performance of @command{sort} by causing it -to start with a larger or smaller sort buffer than the default. -However, this option affects only the initial buffer size. The buffer -grows beyond @var{size} if @command{sort} encounters input lines larger -than @var{size}. - -@item -t @var{separator} -@itemx --field-separator=@var{separator} -@opindex -t -@opindex --field-separator -@cindex field separator character -Use character @var{separator} as the field separator when finding the -sort keys in each line. By default, fields are separated by the empty -string between a non-whitespace character and a whitespace character. -That is, given the input line @w{@samp{ foo bar}}, @code{sort} breaks it -into fields @w{@samp{ foo}} and @w{@samp{ bar}}. The field separator is -not considered to be part of either the field preceding or the field -following. But note that sort fields that extend to the end of the line, -as @samp{-k 2}, or sort fields consisting of a range, as @samp{-k 2,3}, -retain the field separators present between the endpoints of the range. - -@item -T @var{tempdir} -@itemx --temporary-directory=@var{tempdir} -@opindex -T -@opindex --temporary-directory -@cindex temporary directory -@vindex TMPDIR -Use directory @var{tempdir} to store temporary files, overriding the -@env{TMPDIR} environment variable. If this option is given more than -once, temporary files are stored in all the directories given. If you -have a large sort or merge that is I/O-bound, you can often improve -performance by using this option to specify directories on different -disks and controllers. - -@item -u -@itemx --unique -@opindex -u -@opindex --unique -@cindex uniquifying output - -Normally, output only the first of a sequence of lines that compare -equal. For the @option{--check} (@option{-c}) option, -check that no pair of consecutive lines compares equal. - -@item -k @var{pos1}[,@var{pos2}] -@itemx --key=@var{pos1}[,@var{pos2}] -@opindex -k -@opindex --key -@cindex sort field -Specify a sort field that consists of the part of the line between -@var{pos1} and @var{pos2} (or the end of the line, if @var{pos2} is -omitted), @emph{inclusive}. Fields and character positions are numbered -starting with 1. So to sort on the second field, you'd use -@samp{--key=2,2} (@samp{-k 2,2}). See below for more examples. - -@item -z -@itemx --zero-terminated -@opindex -z -@opindex --zero-terminated -@cindex sort zero-terminated lines -Treat the input as a set of lines, each terminated by a zero byte (@sc{ascii} -@sc{nul} (Null) character) instead of an @sc{ascii} @sc{lf} (Line Feed). -This option can be useful in conjunction with @samp{perl -0} or -@samp{find -print0} and @samp{xargs -0} which do the same in order to -reliably handle arbitrary pathnames (even those which contain Line Feed -characters.) - -@item +@var{pos1} [-@var{pos2}] -The obsolescent, traditional option for specifying a sort field. The field -consists of the line between @var{pos1} and up to but @emph{not including} -@var{pos2} (or the end of the line if @var{pos2} is omitted). Fields -and character positions are numbered starting with 0. See below. - -Warning: the @samp{+@var{pos1}} usage is obsolescent. Future versions of -@sc{posix} will require that support for it be withdrawn. Use -@option{--key} (@option{-k}) instead. - -@end table - -Historical (BSD and System V) implementations of @code{sort} have -differed in their interpretation of some options, particularly -@samp{-b}, @samp{-f}, and @samp{-n}. @sc{gnu} sort follows the @sc{posix} -behavior, which is usually (but not always!) like the System V behavior. -According to @sc{posix}, @samp{-n} no longer implies @samp{-b}. For -consistency, @samp{-M} has been changed in the same way. This may -affect the meaning of character positions in field specifications in -obscure cases. The only fix is to add an explicit @samp{-b}. - -A position in a sort field specified with the @samp{-k} or @samp{+} -option has the form @samp{@var{f}.@var{c}}, where @var{f} is the number -of the field to use and @var{c} is the number of the first character -from the beginning of the field (for @samp{+@var{pos}}) or from the end -of the previous field (for @samp{-@var{pos}}). If the @samp{.@var{c}} -is omitted, it is taken to be the first character in the field. If the -@samp{-b} option was specified, the @samp{.@var{c}} part of a field -specification is counted from the first nonblank character of the field -(for @samp{+@var{pos}}) or from the first nonblank character following -the previous field (for @samp{-@var{pos}}). - -A sort key option may also have any of the option letters @samp{Mbdfinr} -appended to it, in which case the global ordering options are not used -for that particular field. The @samp{-b} option may be independently -attached to either or both of the @samp{+@var{pos}} and -@samp{-@var{pos}} parts of a field specification, and if it is inherited -from the global options it will be attached to both. -Keys may span multiple fields. - -Here are some examples to illustrate various combinations of options. -In them, the @sc{posix} @samp{-k} option is used to specify sort keys rather -than the obsolescent @samp{+@var{pos1}-@var{pos2}} syntax. - -@itemize @bullet - -@item -Sort in descending (reverse) numeric order. - -@example -sort -nr -@end example - -@item -Sort alphabetically, omitting the first and second fields. -This uses a single key composed of the characters beginning -at the start of field three and extending to the end of each line. - -@example -sort -k 3 -@end example - -@item -Sort numerically on the second field and resolve ties by sorting -alphabetically on the third and fourth characters of field five. -Use @samp{:} as the field delimiter. - -@example -sort -t : -k 2,2n -k 5.3,5.4 -@end example - -Note that if you had written @samp{-k 2} instead of @samp{-k 2,2} -@command{sort} would have used all characters beginning in the second field -and extending to the end of the line as the primary @emph{numeric} -key. For the large majority of applications, treating keys spanning -more than one field as numeric will not do what you expect. - -Also note that the @samp{n} modifier was applied to the field-end -specifier for the first key. It would have been equivalent to -specify @samp{-k 2n,2} or @samp{-k 2n,2n}. All modifiers except -@samp{b} apply to the associated @emph{field}, regardless of whether -the modifier character is attached to the field-start and/or the -field-end part of the key specifier. - -@item -Sort the password file on the fifth field and ignore any -leading white space. Sort lines with equal values in field five -on the numeric user ID in field three. - -@example -sort -t : -k 5b,5 -k 3,3n /etc/passwd -@end example - -An alternative is to use the global numeric modifier @samp{-n}. - -@example -sort -t : -n -k 5b,5 -k 3,3 /etc/passwd -@end example - -@item -Generate a tags file in case-insensitive sorted order. - -@smallexample -find src -type f -print0 | sort -t / -z -f | xargs -0 etags --append -@end smallexample - -The use of @samp{-print0}, @samp{-z}, and @samp{-0} in this case means -that pathnames that contain Line Feed characters will not get broken up -by the sort operation. - -Finally, to ignore both leading and trailing white space, you -could have applied the @samp{b} modifier to the field-end specifier -for the first key, - -@example -sort -t : -n -k 5b,5b -k 3,3 /etc/passwd -@end example - -or by using the global @samp{-b} modifier instead of @samp{-n} -and an explicit @samp{n} with the second key specifier. - -@example -sort -t : -b -k 5,5 -k 3,3n /etc/passwd -@end example - -@c This example is a bit contrived and needs more explanation. -@c @item -@c Sort records separated by an arbitrary string by using a pipe to convert -@c each record delimiter string to @samp{\0}, then using sort's -z option, -@c and converting each @samp{\0} back to the original record delimiter. -@c -@c @example -@c printf 'c\n\nb\n\na\n'|perl -0pe 's/\n\n/\n\0/g'|sort -z|perl -0pe 's/\0/\n/g' -@c @end example - -@end itemize - - -@node uniq invocation -@section @code{uniq}: Uniquify files - -@pindex uniq -@cindex uniquify files - -@code{uniq} writes the unique lines in the given @file{input}, or -standard input if nothing is given or for an @var{input} name of -@samp{-}. Synopsis: - -@example -uniq [@var{option}]@dots{} [@var{input} [@var{output}]] -@end example - -By default, @code{uniq} prints the unique lines in a sorted file, i.e., -discards all but one of identical successive lines. Optionally, it can -instead show only lines that appear exactly once, or lines that appear -more than once. - -The input must be sorted. If your input is not sorted, perhaps you want -to use @code{sort -u}. - -If no @var{output} file is specified, @code{uniq} writes to standard -output. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -@var{n} -@itemx -f @var{n} -@itemx --skip-fields=@var{n} -@opindex -@var{n} -@opindex -f -@opindex --skip-fields -Skip @var{n} fields on each line before checking for uniqueness. Fields -are sequences of non-space non-tab characters that are separated from -each other by at least one space or tab. - -@item +@var{n} -@itemx -s @var{n} -@itemx --skip-chars=@var{n} -@opindex +@var{n} -@opindex -s -@opindex --skip-chars -Skip @var{n} characters before checking for uniqueness. If you use both -the field and character skipping options, fields are skipped over first. - -Warning: the @samp{+@var{n}} usage is obsolescent. Future versions of -@sc{posix} will require that support for it be withdrawn. Use @samp{-s -@var{n}} instead. - -@item -c -@itemx --count -@opindex -c -@opindex --count -Print the number of times each line occurred along with the line. - -@item -i -@itemx --ignore-case -@opindex -i -@opindex --ignore-case -Ignore differences in case when comparing lines. - -@item -d -@itemx --repeated -@opindex -d -@opindex --repeated -@cindex duplicate lines, outputting -Print only duplicate lines. - -@item -D -@itemx --all-repeated[=@var{delimit-method}] -@opindex -D -@opindex --all-repeated -@cindex all duplicate lines, outputting -Print all duplicate lines and only duplicate lines. -This option is useful mainly in conjunction with other options e.g., -to ignore case or to compare only selected fields. -The optional @var{delimit-method} tells how to delimit -groups of duplicate lines, and must be one of the following: - -@table @samp - -@item none -Do not delimit groups of duplicate lines. -This is equivalent to @option{--all-repeated} (@option{-D}). - -@item prepend -Output a newline before each group of duplicate lines. - -@item separate -Separate groups of duplicate lines with a single newline. -This is the same as using @samp{prepend}, except that -there is no newline before the first group, and hence -may be better suited for output direct to users. -@end table - -Note that when groups are delimited and the input stream contains -two or more consecutive blank lines, then the output is ambiguous. -To avoid that, filter the input through @samp{tr -s '\n'} to replace -each sequence of consecutive newlines with a single newline. - -This is a @sc{gnu} extension. -@c FIXME: give an example showing *how* it's useful - -@item -u -@itemx --unique -@opindex -u -@opindex --unique -@cindex unique lines, outputting -Print only unique lines. - -@item -w @var{n} -@itemx --check-chars=@var{n} -@opindex -w -@opindex --check-chars -Compare @var{n} characters on each line (after skipping any specified -fields and characters). By default the entire rest of the lines are -compared. - -@end table - - -@node comm invocation -@section @code{comm}: Compare two sorted files line by line - -@pindex comm -@cindex line-by-line comparison -@cindex comparing sorted files - -@code{comm} writes to standard output lines that are common, and lines -that are unique, to two input files; a file name of @samp{-} means -standard input. Synopsis: - -@example -comm [@var{option}]@dots{} @var{file1} @var{file2} -@end example - -@vindex LC_COLLATE -Before @code{comm} can be used, the input files must be sorted using the -collating sequence specified by the @env{LC_COLLATE} locale. -If an input file ends in a non-newline -character, a newline is silently appended. The @code{sort} command with -no options always outputs a file that is suitable input to @code{comm}. - -@cindex differing lines -@cindex common lines -With no options, @code{comm} produces three column output. Column one -contains lines unique to @var{file1}, column two contains lines unique -to @var{file2}, and column three contains lines common to both files. -Columns are separated by a single TAB character. -@c FIXME: when there's an option to supply an alternative separator -@c string, append `by default' to the above sentence. - -@opindex -1 -@opindex -2 -@opindex -3 -The options @samp{-1}, @samp{-2}, and @samp{-3} suppress printing of -the corresponding columns. Also see @ref{Common options}. - -Unlike some other comparison utilities, @code{comm} has an exit -status that does not depend on the result of the comparison. -Upon normal completion @code{comm} produces an exit code of zero. -If there is an error it exits with nonzero status. - - -@node tsort invocation -@section @code{tsort}: Topological sort - -@pindex tsort -@cindex topological sort - -@code{tsort} performs a topological sort on the given @var{file}, or -standard input if no input file is given or for a @var{file} of -@samp{-}. Synopsis: - -@example -tsort [@var{option}] [@var{file}] -@end example - -@code{tsort} reads its input as pairs of strings, separated by blanks, -indicating a partial ordering. The output is a total ordering that -corresponds to the given partial ordering. - -For example - -@example -tsort <<EOF -a b c -d -e f -b c d e -EOF -@end example - -@noindent -will produce the output - -@example -a -b -c -d -e -f -@end example - -@code{tsort} will detect cycles in the input and writes the first cycle -encountered to standard error. - -Note that for a given partial ordering, generally there is no unique -total ordering. - -The only options are @samp{--help} and @samp{--version}. @xref{Common -options}. - - -@node ptx invocation -@section @code{ptx}: Produce permuted indexes - -@pindex ptx - -@code{ptx} reads a text file and essentially produces a permuted index, with -each keyword in its context. The calling sketch is either one of: - -@example -ptx [@var{option} @dots{}] [@var{file} @dots{}] -ptx -G [@var{option} @dots{}] [@var{input} [@var{output}]] -@end example - -The @samp{-G} (or its equivalent: @samp{--traditional}) option disables -all @sc{gnu} extensions and reverts to traditional mode, thus introducing some -limitations and changing several of the program's default option values. -When @samp{-G} is not specified, @sc{gnu} extensions are always enabled. -@sc{gnu} extensions to @code{ptx} are documented wherever appropriate in this -document. For the full list, see @xref{Compatibility in ptx}. - -Individual options are explained in the following sections. - -When @sc{gnu} extensions are enabled, there may be zero, one or several -@var{file}s after the options. If there is no @var{file}, the program -reads the standard input. If there is one or several @var{file}s, they -give the name of input files which are all read in turn, as if all the -input files were concatenated. However, there is a full contextual -break between each file and, when automatic referencing is requested, -file names and line numbers refer to individual text input files. In -all cases, the program outputs the permuted index to the standard -output. - -When @sc{gnu} extensions are @emph{not} enabled, that is, when the program -operates in traditional mode, there may be zero, one or two parameters -besides the options. If there are no parameters, the program reads the -standard input and outputs the permuted index to the standard output. -If there is only one parameter, it names the text @var{input} to be read -instead of the standard input. If two parameters are given, they give -respectively the name of the @var{input} file to read and the name of -the @var{output} file to produce. @emph{Be very careful} to note that, -in this case, the contents of file given by the second parameter is -destroyed. This behavior is dictated by System V @code{ptx} -compatibility; @sc{gnu} Standards normally discourage output parameters not -introduced by an option. - -Note that for @emph{any} file named as the value of an option or as an -input text file, a single dash @kbd{-} may be used, in which case -standard input is assumed. However, it would not make sense to use this -convention more than once per program invocation. - -@menu -* General options in ptx:: Options which affect general program behavior. -* Charset selection in ptx:: Underlying character set considerations. -* Input processing in ptx:: Input fields, contexts, and keyword selection. -* Output formatting in ptx:: Types of output format, and sizing the fields. -* Compatibility in ptx:: -@end menu - - -@node General options in ptx -@subsection General options - -@table @samp - -@item -C -@itemx --copyright -Print a short note about the copyright and copying conditions, then -exit without further processing. - -@item -G -@itemx --traditional -As already explained, this option disables all @sc{gnu} extensions to -@code{ptx} and switches to traditional mode. - -@item --help -Print a short help on standard output, then exit without further -processing. - -@item --version -Print the program version on standard output, then exit without further -processing. - -@end table - - -@node Charset selection in ptx -@subsection Charset selection - -@c FIXME: People don't necessarily know what an IBM-PC was these days. -As it is set up now, the program assumes that the input file is coded -using 8-bit ISO 8859-1 code, also known as Latin-1 character set, -@emph{unless} it is compiled for MS-DOS, in which case it uses the -character set of the IBM-PC. (@sc{gnu} @code{ptx} is not known to work on -smaller MS-DOS machines anymore.) Compared to 7-bit @sc{ascii}, the set -of characters which are letters is different; this alters the behavior -of regular expression matching. Thus, the default regular expression -for a keyword allows foreign or diacriticized letters. Keyword sorting, -however, is still crude; it obeys the underlying character set ordering -quite blindly. - -@table @samp - -@item -f -@itemx --ignore-case -Fold lower case letters to upper case for sorting. - -@end table - - -@node Input processing in ptx -@subsection Word selection and input processing - -@table @samp - -@item -b @var{file} -@item --break-file=@var{file} - -This option provides an alternative (to @samp{-W}) method of describing -which characters make up words. It introduces the name of a -file which contains a list of characters which can@emph{not} be part of -one word; this file is called the @dfn{Break file}. Any character which -is not part of the Break file is a word constituent. If both options -@samp{-b} and @samp{-W} are specified, then @samp{-W} has precedence and -@samp{-b} is ignored. - -When @sc{gnu} extensions are enabled, the only way to avoid newline as a -break character is to write all the break characters in the file with no -newline at all, not even at the end of the file. When @sc{gnu} extensions -are disabled, spaces, tabs and newlines are always considered as break -characters even if not included in the Break file. - -@item -i @var{file} -@itemx --ignore-file=@var{file} - -The file associated with this option contains a list of words which will -never be taken as keywords in concordance output. It is called the -@dfn{Ignore file}. The file contains exactly one word in each line; the -end of line separation of words is not subject to the value of the -@samp{-S} option. - -There is a default Ignore file used by @code{ptx} when this option is -not specified, usually found in @file{/usr/local/lib/eign} if this has -not been changed at installation time. If you want to deactivate the -default Ignore file, specify @code{/dev/null} instead. - -@item -o @var{file} -@itemx --only-file=@var{file} - -The file associated with this option contains a list of words which will -be retained in concordance output; any word not mentioned in this file -is ignored. The file is called the @dfn{Only file}. The file contains -exactly one word in each line; the end of line separation of words is -not subject to the value of the @samp{-S} option. - -There is no default for the Only file. When both an Only file and an -Ignore file are specified, a word is considered a keyword only -if it is listed in the Only file and not in the Ignore file. - -@item -r -@itemx --references - -On each input line, the leading sequence of non-white space characters will be -taken to be a reference that has the purpose of identifying this input -line in the resulting permuted index. For more information about reference -production, see @xref{Output formatting in ptx}. -Using this option changes the default value for option @samp{-S}. - -Using this option, the program does not try very hard to remove -references from contexts in output, but it succeeds in doing so -@emph{when} the context ends exactly at the newline. If option -@samp{-r} is used with @samp{-S} default value, or when @sc{gnu} extensions -are disabled, this condition is always met and references are completely -excluded from the output contexts. - -@item -S @var{regexp} -@itemx --sentence-regexp=@var{regexp} - -This option selects which regular expression will describe the end of a -line or the end of a sentence. In fact, this regular expression is not -the only distinction between end of lines or end of sentences, and input -line boundaries have no special significance outside this option. By -default, when @sc{gnu} extensions are enabled and if @samp{-r} option is not -used, end of sentences are used. In this case, this @var{regex} is -imported from @sc{gnu} Emacs: - -@example -[.?!][]\"')@}]*\\($\\|\t\\| \\)[ \t\n]* -@end example - -Whenever @sc{gnu} extensions are disabled or if @samp{-r} option is used, end -of lines are used; in this case, the default @var{regexp} is just: - -@example -\n -@end example - -Using an empty @var{regexp} is equivalent to completely disabling end of -line or end of sentence recognition. In this case, the whole file is -considered to be a single big line or sentence. The user might want to -disallow all truncation flag generation as well, through option @samp{-F -""}. @xref{Regexps, , Syntax of Regular Expressions, emacs, The GNU Emacs -Manual}. - -When the keywords happen to be near the beginning of the input line or -sentence, this often creates an unused area at the beginning of the -output context line; when the keywords happen to be near the end of the -input line or sentence, this often creates an unused area at the end of -the output context line. The program tries to fill those unused areas -by wrapping around context in them; the tail of the input line or -sentence is used to fill the unused area on the left of the output line; -the head of the input line or sentence is used to fill the unused area -on the right of the output line. - -As a matter of convenience to the user, many usual backslashed escape -sequences from the C language are recognized and converted to the -corresponding characters by @code{ptx} itself. - -@item -W @var{regexp} -@itemx --word-regexp=@var{regexp} - -This option selects which regular expression will describe each keyword. -By default, if @sc{gnu} extensions are enabled, a word is a sequence of -letters; the @var{regexp} used is @samp{\w+}. When @sc{gnu} extensions are -disabled, a word is by default anything which ends with a space, a tab -or a newline; the @var{regexp} used is @samp{[^ \t\n]+}. - -An empty @var{regexp} is equivalent to not using this option. -@xref{Regexps, , Syntax of Regular Expressions, emacs, The GNU Emacs -Manual}. - -As a matter of convenience to the user, many usual backslashed escape -sequences, as found in the C language, are recognized and converted to -the corresponding characters by @code{ptx} itself. - -@end table - - -@node Output formatting in ptx -@subsection Output formatting - -Output format is mainly controlled by the @samp{-O} and @samp{-T} options -described in the table below. When neither @samp{-O} nor @samp{-T} are -selected, and if @sc{gnu} extensions are enabled, the program chooses an -output format suitable for a dumb terminal. Each keyword occurrence is -output to the center of one line, surrounded by its left and right -contexts. Each field is properly justified, so the concordance output -can be readily observed. As a special feature, if automatic -references are selected by option @samp{-A} and are output before the -left context, that is, if option @samp{-R} is @emph{not} selected, then -a colon is added after the reference; this nicely interfaces with @sc{gnu} -Emacs @code{next-error} processing. In this default output format, each -white space character, like newline and tab, is merely changed to -exactly one space, with no special attempt to compress consecutive -spaces. This might change in the future. Except for those white space -characters, every other character of the underlying set of 256 -characters is transmitted verbatim. - -Output format is further controlled by the following options. - -@table @samp - -@item -g @var{number} -@itemx --gap-size=@var{number} - -Select the size of the minimum white space gap between the fields on the -output line. - -@item -w @var{number} -@itemx --width=@var{number} - -Select the maximum output width of each final line. If references are -used, they are included or excluded from the maximum output width -depending on the value of option @samp{-R}. If this option is not -selected, that is, when references are output before the left context, -the maximum output width takes into account the maximum length of all -references. If this option is selected, that is, when references are -output after the right context, the maximum output width does not take -into account the space taken by references, nor the gap that precedes -them. - -@item -A -@itemx --auto-reference - -Select automatic references. Each input line will have an automatic -reference made up of the file name and the line ordinal, with a single -colon between them. However, the file name will be empty when standard -input is being read. If both @samp{-A} and @samp{-r} are selected, then -the input reference is still read and skipped, but the automatic -reference is used at output time, overriding the input reference. - -@item -R -@itemx --right-side-refs - -In the default output format, when option @samp{-R} is not used, any -references produced by the effect of options @samp{-r} or @samp{-A} are -placed to the far right of output lines, after the right context. With -default output format, when the @samp{-R} option is specified, references -are rather placed at the beginning of each output line, before the left -context. For any other output format, option @samp{-R} is -ignored, with one exception: with @samp{-R} the width of references -is @emph{not} taken into account in total output width given by @samp{-w}. - -This option is automatically selected whenever @sc{gnu} extensions are -disabled. - -@item -F @var{string} -@itemx --flac-truncation=@var{string} - -This option will request that any truncation in the output be reported -using the string @var{string}. Most output fields theoretically extend -towards the beginning or the end of the current line, or current -sentence, as selected with option @samp{-S}. But there is a maximum -allowed output line width, changeable through option @samp{-w}, which is -further divided into space for various output fields. When a field has -to be truncated because it cannot extend beyond the beginning or the end of -the current line to fit in, then a truncation occurs. By default, -the string used is a single slash, as in @samp{-F /}. - -@var{string} may have more than one character, as in @samp{-F ...}. -Also, in the particular case when @var{string} is empty (@samp{-F ""}), -truncation flagging is disabled, and no truncation marks are appended in -this case. - -As a matter of convenience to the user, many usual backslashed escape -sequences, as found in the C language, are recognized and converted to -the corresponding characters by @code{ptx} itself. - -@item -M @var{string} -@itemx --macro-name=@var{string} - -Select another @var{string} to be used instead of @samp{xx}, while -generating output suitable for @code{nroff}, @code{troff} or @TeX{}. - -@item -O -@itemx --format=roff - -Choose an output format suitable for @code{nroff} or @code{troff} -processing. Each output line will look like: - -@smallexample -.xx "@var{tail}" "@var{before}" "@var{keyword_and_after}" "@var{head}" "@var{ref}" -@end smallexample - -so it will be possible to write a @samp{.xx} roff macro to take care of -the output typesetting. This is the default output format when @sc{gnu} -extensions are disabled. Option @samp{-M} can be used to change -@samp{xx} to another macro name. - -In this output format, each non-graphical character, like newline and -tab, is merely changed to exactly one space, with no special attempt to -compress consecutive spaces. Each quote character: @kbd{"} is doubled -so it will be correctly processed by @code{nroff} or @code{troff}. - -@item -T -@itemx --format=tex - -Choose an output format suitable for @TeX{} processing. Each output -line will look like: - -@smallexample -\xx @{@var{tail}@}@{@var{before}@}@{@var{keyword}@}@{@var{after}@}@{@var{head}@}@{@var{ref}@} -@end smallexample - -@noindent -so it will be possible to write a @code{\xx} definition to take care of -the output typesetting. Note that when references are not being -produced, that is, neither option @samp{-A} nor option @samp{-r} is -selected, the last parameter of each @code{\xx} call is inhibited. -Option @samp{-M} can be used to change @samp{xx} to another macro -name. - -In this output format, some special characters, like @kbd{$}, @kbd{%}, -@kbd{&}, @kbd{#} and @kbd{_} are automatically protected with a -backslash. Curly brackets @kbd{@{}, @kbd{@}} are protected with a -backslash and a pair of dollar signs (to force mathematical mode). The -backslash itself produces the sequence @code{\backslash@{@}}. -Circumflex and tilde diacritics produce the sequence @code{^\@{ @}} and -@code{~\@{ @}} respectively. Other diacriticized characters of the -underlying character set produce an appropriate @TeX{} sequence as far -as possible. The other non-graphical characters, like newline and tab, -and all other characters which are not part of @sc{ascii}, are merely -changed to exactly one space, with no special attempt to compress -consecutive spaces. Let me know how to improve this special character -processing for @TeX{}. - -@end table - - -@node Compatibility in ptx -@subsection The @sc{gnu} extensions to @code{ptx} - -This version of @code{ptx} contains a few features which do not exist in -System V @code{ptx}. These extra features are suppressed by using the -@samp{-G} command line option, unless overridden by other command line -options. Some @sc{gnu} extensions cannot be recovered by overriding, so the -simple rule is to avoid @samp{-G} if you care about @sc{gnu} extensions. -Here are the differences between this program and System V @code{ptx}. - -@itemize @bullet - -@item -This program can read many input files at once, it always writes the -resulting concordance on standard output. On the other hand, System V -@code{ptx} reads only one file and sends the result to standard output -or, if a second @var{file} parameter is given on the command, to that -@var{file}. - -Having output parameters not introduced by options is a dangerous -practice which @sc{gnu} avoids as far as possible. So, for using @code{ptx} -portably between @sc{gnu} and System V, you should always use it with a -single input file, and always expect the result on standard output. You -might also want to automatically configure in a @samp{-G} option to -@code{ptx} calls in products using @code{ptx}, if the configurator finds -that the installed @code{ptx} accepts @samp{-G}. - -@item -The only options available in System V @code{ptx} are options @samp{-b}, -@samp{-f}, @samp{-g}, @samp{-i}, @samp{-o}, @samp{-r}, @samp{-t} and -@samp{-w}. All other options are @sc{gnu} extensions and are not repeated in -this enumeration. Moreover, some options have a slightly different -meaning when @sc{gnu} extensions are enabled, as explained below. - -@item -By default, concordance output is not formatted for @code{troff} or -@code{nroff}. It is rather formatted for a dumb terminal. @code{troff} -or @code{nroff} output may still be selected through option @samp{-O}. - -@item -Unless @samp{-R} option is used, the maximum reference width is -subtracted from the total output line width. With @sc{gnu} extensions -disabled, width of references is not taken into account in the output -line width computations. - -@item -All 256 characters, even @kbd{NUL}s, are always read and processed from -input file with no adverse effect, even if @sc{gnu} extensions are disabled. -However, System V @code{ptx} does not accept 8-bit characters, a few -control characters are rejected, and the tilde @kbd{~} is also rejected. - -@item -Input line length is only limited by available memory, even if @sc{gnu} -extensions are disabled. However, System V @code{ptx} processes only -the first 200 characters in each line. - -@item -The break (non-word) characters default to be every character except all -letters of the underlying character set, diacriticized or not. When @sc{gnu} -extensions are disabled, the break characters default to space, tab and -newline only. - -@item -The program makes better use of output line width. If @sc{gnu} extensions -are disabled, the program rather tries to imitate System V @code{ptx}, -but still, there are some slight disposition glitches this program does -not completely reproduce. - -@item -The user can specify both an Ignore file and an Only file. This is not -allowed with System V @code{ptx}. - -@end itemize - - -@node Operating on fields within a line -@chapter Operating on fields within a line - -@menu -* cut invocation:: Print selected parts of lines. -* paste invocation:: Merge lines of files. -* join invocation:: Join lines on a common field. -@end menu - - -@node cut invocation -@section @code{cut}: Print selected parts of lines - -@pindex cut -@code{cut} writes to standard output selected parts of each line of each -input file, or standard input if no files are given or for a file name of -@samp{-}. Synopsis: - -@example -cut [@var{option}]@dots{} [@var{file}]@dots{} -@end example - -In the table which follows, the @var{byte-list}, @var{character-list}, -and @var{field-list} are one or more numbers or ranges (two numbers -separated by a dash) separated by commas. Bytes, characters, and -fields are numbered starting at 1. Incomplete ranges may be -given: @samp{-@var{m}} means @samp{1-@var{m}}; @samp{@var{n}-} means -@samp{@var{n}} through end of line or last field. - -The program accepts the following options. Also see @ref{Common -options}. - -@table @samp - -@item -b @var{byte-list} -@itemx --bytes=@var{byte-list} -@opindex -b -@opindex --bytes -Print only the bytes in positions listed in @var{byte-list}. Tabs and -backspaces are treated like any other character; they take up 1 byte. - -@item -c @var{character-list} -@itemx --characters=@var{character-list} -@opindex -c -@opindex --characters -Print only characters in positions listed in @var{character-list}. -The same as @samp{-b} for now, but internationalization will change -that. Tabs and backspaces are treated like any other character; they -take up 1 character. - -@item -f @var{field-list} -@itemx --fields=@var{field-list} -@opindex -f -@opindex --fields -Print only the fields listed in @var{field-list}. Fields are -separated by a TAB character by default. -Also print any line that contains no delimiter character, unless -the @samp{--only-delimited} (@samp{-s}) option is specified - -@item -d @var{input_delim_byte} -@itemx --delimiter=@var{input_delim_byte} -@opindex -d -@opindex --delimiter -For @samp{-f}, fields are separated in the input by the first character -in @var{input_delim_byte} (default is TAB). - -@item -n -@opindex -n -Do not split multi-byte characters (no-op for now). - -@item -s -@itemx --only-delimited -@opindex -s -@opindex --only-delimited -For @samp{-f}, do not print lines that do not contain the field separator -character. - -@itemx --output-delimiter=@var{output_delim_string} -@opindex --output-delimiter -For @samp{-f}, output fields are separated by @var{output_delim_string}. -The default is to use the input delimiter. - - -@end table - - -@node paste invocation -@section @code{paste}: Merge lines of files - -@pindex paste -@cindex merging files - -@code{paste} writes to standard output lines consisting of sequentially -corresponding lines of each given file, separated by a TAB character. -Standard input is used for a file name of @samp{-} or if no input files -are given. - -Synopsis: - -@example -paste [@var{option}]@dots{} [@var{file}]@dots{} -@end example - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -s -@itemx --serial -@opindex -s -@opindex --serial -Paste the lines of one file at a time rather than one line from each -file. - -@item -d @var{delim-list} -@itemx --delimiters=@var{delim-list} -@opindex -d -@opindex --delimiters -Consecutively use the characters in @var{delim-list} instead of -TAB to separate merged lines. When @var{delim-list} is -exhausted, start again at its beginning. - -@end table - - -@node join invocation -@section @code{join}: Join lines on a common field - -@pindex join -@cindex common field, joining on - -@code{join} writes to standard output a line for each pair of input -lines that have identical join fields. Synopsis: - -@example -join [@var{option}]@dots{} @var{file1} @var{file2} -@end example - -@vindex LC_COLLATE -Either @var{file1} or @var{file2} (but not both) can be @samp{-}, -meaning standard input. @var{file1} and @var{file2} should be already -sorted in increasing textual order on the join fields, using the -collating sequence specified by the @env{LC_COLLATE} locale. Unless -the @samp{-t} option is given, the input should be sorted ignoring blanks at -the start of the join field, as in @code{sort -b}. If the -@samp{--ignore-case} option is given, lines should be sorted without -regard to the case of characters in the join field, as in @code{sort -f}. - -The defaults are: the join field is the first field in each line; -fields in the input are separated by one or more blanks, with leading -blanks on the line ignored; fields in the output are separated by a -space; each output line consists of the join field, the remaining -fields from @var{file1}, then the remaining fields from @var{file2}. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -a @var{file-number} -@opindex -a -Print a line for each unpairable line in file @var{file-number} (either -@samp{1} or @samp{2}), in addition to the normal output. - -@item -e @var{string} -@opindex -e -Replace those output fields that are missing in the input with -@var{string}. - -@item -i -@itemx --ignore-case -@opindex -i -@opindex --ignore-case -Ignore differences in case when comparing keys. -With this option, the lines of the input files must be ordered in the same way. -Use @samp{sort -f} to produce this ordering. - -@item -1 @var{field} -@itemx -j1 @var{field} -@opindex -1 -@opindex -j1 -Join on field @var{field} (a positive integer) of file 1. - -@item -2 @var{field} -@itemx -j2 @var{field} -@opindex -2 -@opindex -j2 -Join on field @var{field} (a positive integer) of file 2. - -@item -j @var{field} -Equivalent to @samp{-1 @var{field} -2 @var{field}}. - -@item -o @var{field-list}@dots{} -Construct each output line according to the format in @var{field-list}. -Each element in @var{field-list} is either the single character @samp{0} or -has the form @var{m.n} where the file number, @var{m}, is @samp{1} or -@samp{2} and @var{n} is a positive field number. - -A field specification of @samp{0} denotes the join field. -In most cases, the functionality of the @samp{0} field spec -may be reproduced using the explicit @var{m.n} that corresponds -to the join field. However, when printing unpairable lines -(using either of the @samp{-a} or @samp{-v} options), there is no way -to specify the join field using @var{m.n} in @var{field-list} -if there are unpairable lines in both files. -To give @code{join} that functionality, @sc{posix} invented the @samp{0} -field specification notation. - -The elements in @var{field-list} -are separated by commas or blanks. Multiple @var{field-list} -arguments can be given after a single @samp{-o} option; the values -of all lists given with @samp{-o} are concatenated together. -All output lines -- including those printed because of any -a or -v -option -- are subject to the specified @var{field-list}. - -@item -t @var{char} -Use character @var{char} as the input and output field separator. - -@item -v @var{file-number} -Print a line for each unpairable line in file @var{file-number} -(either @samp{1} or @samp{2}), instead of the normal output. - -@end table - -In addition, when @sc{gnu} @code{join} is invoked with exactly one argument, -options @samp{--help} and @samp{--version} are recognized. @xref{Common -options}. - - -@node Operating on characters -@chapter Operating on characters - -@cindex operating on characters - -This commands operate on individual characters. - -@menu -* tr invocation:: Translate, squeeze, and/or delete characters. -* expand invocation:: Convert tabs to spaces. -* unexpand invocation:: Convert spaces to tabs. -@end menu - - -@node tr invocation -@section @code{tr}: Translate, squeeze, and/or delete characters - -@pindex tr - -Synopsis: - -@example -tr [@var{option}]@dots{} @var{set1} [@var{set2}] -@end example - -@code{tr} copies standard input to standard output, performing -one of the following operations: - -@itemize @bullet -@item -translate, and optionally squeeze repeated characters in the result, -@item -squeeze repeated characters, -@item -delete characters, -@item -delete characters, then squeeze repeated characters from the result. -@end itemize - -The @var{set1} and (if given) @var{set2} arguments define ordered -sets of characters, referred to below as @var{set1} and @var{set2}. These -sets are the characters of the input that @code{tr} operates on. -The @samp{--complement} (@samp{-c}) option replaces @var{set1} with its -complement (all of the characters that are not in @var{set1}). - -@menu -* Character sets:: Specifying sets of characters. -* Translating:: Changing one characters to another. -* Squeezing:: Squeezing repeats and deleting. -* Warnings in tr:: Warning messages. -@end menu - - -@node Character sets -@subsection Specifying sets of characters - -@cindex specifying sets of characters - -The format of the @var{set1} and @var{set2} arguments resembles -the format of regular expressions; however, they are not regular -expressions, only lists of characters. Most characters simply -represent themselves in these strings, but the strings can contain -the shorthands listed below, for convenience. Some of them can be -used only in @var{set1} or @var{set2}, as noted below. - -@table @asis - -@item Backslash escapes -@cindex backslash escapes - -A backslash followed by a character not listed below causes an error -message. - -@table @samp -@item \a -Control-G. -@item \b -Control-H. -@item \f -Control-L. -@item \n -Control-J. -@item \r -Control-M. -@item \t -Control-I. -@item \v -Control-K. -@item \@var{ooo} -The character with the value given by @var{ooo}, which is 1 to 3 -octal digits, -@item \\ -A backslash. -@end table - -@item Ranges -@cindex ranges - -The notation @samp{@var{m}-@var{n}} expands to all of the characters -from @var{m} through @var{n}, in ascending order. @var{m} should -collate before @var{n}; if it doesn't, an error results. As an example, -@samp{0-9} is the same as @samp{0123456789}. - -@sc{gnu} @code{tr} does not support the System V syntax that uses square -brackets to enclose ranges. Translations specified in that format -sometimes work as expected, since the brackets are often transliterated -to themselves. However, they should be avoided because they sometimes -behave unexpectedly. For example, @samp{tr -d '[0-9]'} deletes brackets -as well as digits. - -Many historically common and even accepted uses of ranges are not -portable. For example, on @sc{ebcdic} hosts using the @samp{A-Z} -range will not do what most would expect because @samp{A} through @samp{Z} -are not contiguous as they are in @sc{ascii}. -If you can rely on a @sc{posix} compliant version of @code{tr}, then -the best way to work around this is to use character classes (see below). -Otherwise, it is most portable (and most ugly) to enumerate the members -of the ranges. - -@item Repeated characters -@cindex repeated characters - -The notation @samp{[@var{c}*@var{n}]} in @var{set2} expands to @var{n} -copies of character @var{c}. Thus, @samp{[y*6]} is the same as -@samp{yyyyyy}. The notation @samp{[@var{c}*]} in @var{string2} expands -to as many copies of @var{c} as are needed to make @var{set2} as long as -@var{set1}. If @var{n} begins with @samp{0}, it is interpreted in -octal, otherwise in decimal. - -@item Character classes -@cindex character classes - -The notation @samp{[:@var{class}:]} expands to all of the characters in -the (predefined) class @var{class}. The characters expand in no -particular order, except for the @code{upper} and @code{lower} classes, -which expand in ascending order. When the @samp{--delete} (@samp{-d}) -and @samp{--squeeze-repeats} (@samp{-s}) options are both given, any -character class can be used in @var{set2}. Otherwise, only the -character classes @code{lower} and @code{upper} are accepted in -@var{set2}, and then only if the corresponding character class -(@code{upper} and @code{lower}, respectively) is specified in the same -relative position in @var{set1}. Doing this specifies case conversion. -The class names are given below; an error results when an invalid class -name is given. - -@table @code -@item alnum -@opindex alnum -Letters and digits. -@item alpha -@opindex alpha -Letters. -@item blank -@opindex blank -Horizontal whitespace. -@item cntrl -@opindex cntrl -Control characters. -@item digit -@opindex digit -Digits. -@item graph -@opindex graph -Printable characters, not including space. -@item lower -@opindex lower -Lowercase letters. -@item print -@opindex print -Printable characters, including space. -@item punct -@opindex punct -Punctuation characters. -@item space -@opindex space -Horizontal or vertical whitespace. -@item upper -@opindex upper -Uppercase letters. -@item xdigit -@opindex xdigit -Hexadecimal digits. -@end table - -@item Equivalence classes -@cindex equivalence classes - -The syntax @samp{[=@var{c}=]} expands to all of the characters that are -equivalent to @var{c}, in no particular order. Equivalence classes are -a relatively recent invention intended to support non-English alphabets. -But there seems to be no standard way to define them or determine their -contents. Therefore, they are not fully implemented in @sc{gnu} @code{tr}; -each character's equivalence class consists only of that character, -which is of no particular use. - -@end table - - -@node Translating -@subsection Translating - -@cindex translating characters - -@code{tr} performs translation when @var{set1} and @var{set2} are -both given and the @samp{--delete} (@samp{-d}) option is not given. -@code{tr} translates each character of its input that is in @var{set1} -to the corresponding character in @var{set2}. Characters not in -@var{set1} are passed through unchanged. When a character appears more -than once in @var{set1} and the corresponding characters in @var{set2} -are not all the same, only the final one is used. For example, these -two commands are equivalent: - -@example -tr aaa xyz -tr a z -@end example - -A common use of @code{tr} is to convert lowercase characters to -uppercase. This can be done in many ways. Here are three of them: - -@example -tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ -tr a-z A-Z -tr '[:lower:]' '[:upper:]' -@end example - -@noindent -But note that using ranges like @code{a-z} above is not portable. - -When @code{tr} is performing translation, @var{set1} and @var{set2} -typically have the same length. If @var{set1} is shorter than -@var{set2}, the extra characters at the end of @var{set2} are ignored. - -On the other hand, making @var{set1} longer than @var{set2} is not -portable; @sc{posix.2} says that the result is undefined. In this situation, -BSD @code{tr} pads @var{set2} to the length of @var{set1} by repeating -the last character of @var{set2} as many times as necessary. System V -@code{tr} truncates @var{set1} to the length of @var{set2}. - -By default, @sc{gnu} @code{tr} handles this case like BSD @code{tr}. When -the @samp{--truncate-set1} (@samp{-t}) option is given, @sc{gnu} @code{tr} -handles this case like the System V @code{tr} instead. This option is -ignored for operations other than translation. - -Acting like System V @code{tr} in this case breaks the relatively common -BSD idiom: - -@example -tr -cs A-Za-z0-9 '\012' -@end example - -@noindent -because it converts only zero bytes (the first element in the -complement of @var{set1}), rather than all non-alphanumerics, to -newlines. - -@noindent -By the way, the above idiom is not portable because it uses ranges. -Assuming a @sc{posix} compliant @code{tr}, here is a better way to write it: - -@example -tr -cs '[:alnum:]' '[\n*]' -@end example - - -@node Squeezing -@subsection Squeezing repeats and deleting - -@cindex squeezing repeat characters -@cindex deleting characters - -When given just the @samp{--delete} (@samp{-d}) option, @code{tr} -removes any input characters that are in @var{set1}. - -When given just the @samp{--squeeze-repeats} (@samp{-s}) option, -@code{tr} replaces each input sequence of a repeated character that -is in @var{set1} with a single occurrence of that character. - -When given both @samp{--delete} and @samp{--squeeze-repeats}, @code{tr} -first performs any deletions using @var{set1}, then squeezes repeats -from any remaining characters using @var{set2}. - -The @samp{--squeeze-repeats} option may also be used when translating, -in which case @code{tr} first performs translation, then squeezes -repeats from any remaining characters using @var{set2}. - -Here are some examples to illustrate various combinations of options: - -@itemize @bullet - -@item -Remove all zero bytes: - -@example -tr -d '\000' -@end example - -@item -Put all words on lines by themselves. This converts all -non-alphanumeric characters to newlines, then squeezes each string -of repeated newlines into a single newline: - -@example -tr -cs '[:alnum:]' '[\n*]' -@end example - -@item -Convert each sequence of repeated newlines to a single newline: - -@example -tr -s '\n' -@end example - -@item -Find doubled occurrences of words in a document. -For example, people often write ``the the'' with the duplicated words -separated by a newline. The bourne shell script below works first -by converting each sequence of punctuation and blank characters to a -single newline. That puts each ``word'' on a line by itself. -Next it maps all uppercase characters to lower case, and finally it -runs @code{uniq} with the @samp{-d} option to print out only the words -that were adjacent duplicates. - -@example -#!/bin/sh -cat "$@@" \ - | tr -s '[:punct:][:blank:]' '\n' \ - | tr '[:upper:]' '[:lower:]' \ - | uniq -d -@end example - -@item -Deleting a small set of characters is usually straightforward. For example, -to remove all @samp{a}s, @samp{x}s, and @samp{M}s you would do this: - -@example -tr -d axM -@end example - -However, when @samp{-} is one of those characters, it can be tricky because -@samp{-} has special meanings. Performing the same task as above but also -removing all @samp{-} characters, we might try @code{tr -d -axM}, but -that would fail because @code{tr} would try to interpret @samp{-a} as -a command-line option. Alternatively, we could try putting the hyphen -inside the string, @code{tr -d a-xM}, but that wouldn't work either because -it would make @code{tr} interpret @code{a-x} as the range of characters -@samp{a}@dots{}@samp{x} rather than the three. -One way to solve the problem is to put the hyphen at the end of the list -of characters: - -@example -tr -d axM- -@end example - -More generally, use the character class notation @code{[=c=]} -with @samp{-} (or any other character) in place of the @samp{c}: - -@example -tr -d '[=-=]axM' -@end example - -Note how single quotes are used in the above example to protect the -square brackets from interpretation by a shell. - -@end itemize - - -@node Warnings in tr -@subsection Warning messages - -@vindex POSIXLY_CORRECT -Setting the environment variable @env{POSIXLY_CORRECT} turns off the -following warning and error messages, for strict compliance with -@sc{posix.2}. Otherwise, the following diagnostics are issued: - -@enumerate - -@item -When the @samp{--delete} option is given but @samp{--squeeze-repeats} -is not, and @var{set2} is given, @sc{gnu} @code{tr} by default prints -a usage message and exits, because @var{set2} would not be used. -The @sc{posix} specification says that @var{set2} must be ignored in -this case. Silently ignoring arguments is a bad idea. - -@item -When an ambiguous octal escape is given. For example, @samp{\400} -is actually @samp{\40} followed by the digit @samp{0}, because the -value 400 octal does not fit into a single byte. - -@end enumerate - -@sc{gnu} @code{tr} does not provide complete BSD or System V compatibility. -For example, it is impossible to disable interpretation of the @sc{posix} -constructs @samp{[:alpha:]}, @samp{[=c=]}, and @samp{[c*10]}. Also, @sc{gnu} -@code{tr} does not delete zero bytes automatically, unlike traditional -Unix versions, which provide no way to preserve zero bytes. - - -@node expand invocation -@section @code{expand}: Convert tabs to spaces - -@pindex expand -@cindex tabs to spaces, converting -@cindex converting tabs to spaces - -@code{expand} writes the contents of each given @var{file}, or standard -input if none are given or for a @var{file} of @samp{-}, to standard -output, with tab characters converted to the appropriate number of -spaces. Synopsis: - -@example -expand [@var{option}]@dots{} [@var{file}]@dots{} -@end example - -By default, @code{expand} converts all tabs to spaces. It preserves -backspace characters in the output; they decrement the column count for -tab calculations. The default action is equivalent to @samp{-8} (set -tabs every 8 columns). - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -@var{tab1}[,@var{tab2}]@dots{} -@itemx -t @var{tab1}[,@var{tab2}]@dots{} -@itemx --tabs=@var{tab1}[,@var{tab2}]@dots{} -@opindex -@var{tab} -@opindex -t -@opindex --tabs -@cindex tabstops, setting -If only one tab stop is given, set the tabs @var{tab1} spaces apart -(default is 8). Otherwise, set the tabs at columns @var{tab1}, -@var{tab2}, @dots{} (numbered from 0), and replace any tabs beyond the -last tabstop given with single spaces. If the tabstops are specified -with the @samp{-t} or @samp{--tabs} option, they can be separated by -blanks as well as by commas. - -@item -i -@itemx --initial -@opindex -i -@opindex --initial -@cindex initial tabs, converting -Only convert initial tabs (those that precede all non-space or non-tab -characters) on each line to spaces. - -@end table - - -@node unexpand invocation -@section @code{unexpand}: Convert spaces to tabs - -@pindex unexpand - -@code{unexpand} writes the contents of each given @var{file}, or -standard input if none are given or for a @var{file} of @samp{-}, to -standard output, with strings of two or more space or tab characters -converted to as many tabs as possible followed by as many spaces as are -needed. Synopsis: - -@example -unexpand [@var{option}]@dots{} [@var{file}]@dots{} -@end example - -By default, @code{unexpand} converts only initial spaces and tabs (those -that precede all non space or tab characters) on each line. It -preserves backspace characters in the output; they decrement the column -count for tab calculations. By default, tabs are set at every 8th -column. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -@var{tab1}[,@var{tab2}]@dots{} -@itemx -t @var{tab1}[,@var{tab2}]@dots{} -@itemx --tabs=@var{tab1}[,@var{tab2}]@dots{} -@opindex -@var{tab} -@opindex -t -@opindex --tabs -If only one tab stop is given, set the tabs @var{tab1} spaces apart -instead of the default 8. Otherwise, set the tabs at columns -@var{tab1}, @var{tab2}, @dots{} (numbered from 0), and leave spaces and -tabs beyond the tabstops given unchanged. If the tabstops are specified -with the @samp{-t} or @samp{--tabs} option, they can be separated by -blanks as well as by commas. This option implies the @samp{-a} option. - -@item -a -@itemx --all -@opindex -a -@opindex --all -Convert all strings of two or more spaces or tabs, not just initial -ones, to tabs. - -@end table - - -@node Directory listing -@chapter Directory listing - -This chapter describes the @code{ls} command and its variants @code{dir} -and @code{vdir}, which list information about files. - -@menu -* ls invocation:: List directory contents. -* dir invocation:: Briefly ls. -* vdir invocation:: Verbosely ls. -* dircolors invocation:: Color setup for ls, etc. -@end menu - - -@node ls invocation -@section @code{ls}: List directory contents - -@pindex ls -@cindex directory listing - -The @code{ls} program lists information about files (of any type, -including directories). Options and file arguments can be intermixed -arbitrarily, as usual. - -For non-option command-line arguments that are directories, by default -@code{ls} lists the contents of directories, not recursively, and -omitting files with names beginning with @samp{.}. For other non-option -arguments, by default @code{ls} lists just the file name. If no -non-option argument is specified, @code{ls} operates on the current -directory, acting as if it had been invoked with a single argument of @samp{.}. - -@vindex LC_COLLATE -By default, the output is sorted alphabetically, according to the locale -settings in effect. @footnote{If you have arranged to use a non-@sc{posix} -locale (e.g., by setting @env{LC_ALL} to @samp{en_US}), then @code{ls} may -produce output that is sorted differently than you're accustomed to. -In that case, set the @env{LC_COLLATE} environment variable to @samp{C}.} -If standard output is -a terminal, the output is in columns (sorted vertically) and control -characters are output as question marks; otherwise, the output is listed -one per line and control characters are output as-is. - -Because @code{ls} is such a fundamental program, it has accumulated many -options over the years. They are described in the subsections below; -within each section, options are listed alphabetically (ignoring case). -The division of options into the subsections is not absolute, since some -options affect more than one aspect of @code{ls}'s operation. - -Also see @ref{Common options}. - -@menu -* Which files are listed:: -* What information is listed:: -* Sorting the output:: -* More details about version sort:: -* General output formatting:: -* Formatting file timestamps:: -* Formatting the file names:: -@end menu - - -@node Which files are listed -@subsection Which files are listed - -These options determine which files @code{ls} lists information for. -By default, any files and the contents of any directories on the command -line are shown. - -@table @samp - -@item -a -@itemx --all -@opindex -a -@opindex --all -List all files in directories, including files that start with @samp{.}. - -@item -A -@itemx --almost-all -@opindex -A -@opindex --almost-all -List all files in directories except for @file{.} and @file{..}. - -@item -B -@itemx --ignore-backups -@opindex -B -@opindex --ignore-backups -@cindex backup files, ignoring -Do not list files that end with @samp{~}, unless they are given on the -command line. - -@item -d -@itemx --directory -@opindex -d -@opindex --directory -List just the names of directories, as with other types of files, rather -than listing their contents. - -@item -H -@itemx --dereference-command-line -@opindex -H -@opindex --dereference-command-line -@cindex symbolic links, dereferencing -If a command line argument specifies a symbolic link, show information -for the file the link references rather than for the link itself. - -@item -I PATTERN -@itemx --ignore=PATTERN -@opindex -I -@opindex --ignore=@var{pattern} -Do not list files whose names match the shell pattern (not regular -expression) @var{pattern} unless they are given on the command line. As -in the shell, an initial @samp{.} in a file name does not match a -wildcard at the start of @var{pattern}. Sometimes it is useful -to give this option several times. For example, - -@smallexample -$ ls --ignore='.??*' --ignore='.[^.]' --ignore='#*' -@end smallexample - -The first option ignores names of length 3 or more that start with @samp{.}, -the second ignores all two-character names that start with @samp{.} -except @samp{..}, and the third ignores names that start with @samp{#}. - -@item -L -@itemx --dereference -@opindex -L -@opindex --dereference -@cindex symbolic links, dereferencing -When showing file information for a symbolic link, show information -for the file the link references rather than the link itself. - -@item -R -@itemx --recursive -@opindex -R -@opindex --recursive -@cindex recursive directory listing -@cindex directory listing, recursive -List the contents of all directories recursively. - -@end table - - -@node What information is listed -@subsection What information is listed - -These options affect the information that @code{ls} displays. By -default, only file names are shown. - -@table @samp - -@item -D -@itemx --dired -@opindex -D -@opindex --dired -@cindex dired Emacs mode support -With the long listing (@samp{-l}) format, print an additional line after -the main output: - -@example -//DIRED// @var{beg1 end1 beg2 end2 @dots{}} -@end example - -@noindent -The @var{begN} and @var{endN} are unsigned integers that record the -byte position of the beginning and end of each file name in the output. -This makes it easy for Emacs to find the names, even when they contain -unusual characters such as space or newline, without fancy searching. - -If directories are being listed recursively (@code{-R}), output a similar -line after each subdirectory: -@example -//SUBDIRED// @var{format} @var{beg1 end1 @dots{}} -@end example - -Finally, output a line of the form: -@example -//DIRED-OPTIONS// --quoting-style=@var{word} -@end example -where @var{word} is the quoting style (@pxref{Formatting the file names}). - -@item --full-time -@opindex --full-time -Produce long format directory listings, and list times in full. It is -equivalent to using @option{--format=long} with -@option{--time-style=full-iso} (@pxref{Formatting file timestamps}). - -@item -g -@opindex -g -Produce long format directory listings, but don't display owner information. - -@item -G -@itemx --no-group -@opindex -G -@opindex --no-group -Inhibit display of group information in a long format directory listing. -(This is the default in some non-@sc{gnu} versions of @code{ls}, so we -provide this option for compatibility.) - -@item -h -@itemx --human-readable -@opindex -h -@opindex --human-readable -@cindex human-readable output -Append a size letter such as @samp{M} for megabytes to each size. -Powers of 1024 are used, not 1000; @samp{M} stands for 1,048,576 bytes. -Use the @samp{--si} option if you prefer powers of 1000. - -@item -i -@itemx --inode -@opindex -i -@opindex --inode -@cindex inode number, printing -Print the inode number (also called the file serial number and index -number) of each file to the left of the file name. (This number -uniquely identifies each file within a particular filesystem.) - -@item -l -@itemx --format=long -@itemx --format=verbose -@opindex -l -@opindex --format -@opindex long ls @r{format} -@opindex verbose ls @r{format} -In addition to the name of each file, print the file type, permissions, -number of hard links, owner name, group name, size in bytes, and -timestamp (@pxref{Formatting file timestamps}), normally -the modification time. - -For each directory that is listed, preface the files with a line -@samp{total @var{blocks}}, where @var{blocks} is the total disk allocation -for all files in that directory. The block size currently defaults to 1024 -bytes, but this can be overridden (@pxref{Block size}). -The @var{blocks} computed counts each hard link separately; -this is arguably a deficiency. - -@cindex permissions, output by @code{ls} -The permissions listed are similar to symbolic mode specifications -(@pxref{Symbolic Modes}). But @code{ls} combines multiple bits into the -third character of each set of permissions as follows: -@table @samp -@item s -If the setuid or setgid bit and the corresponding executable bit -are both set. - -@item S -If the setuid or setgid bit is set but the corresponding executable bit -is not set. - -@item t -If the sticky bit and the other-executable bit are both set. - -@item T -If the sticky bit is set but the other-executable bit is not set. - -@item x -If the executable bit is set and none of the above apply. - -@item - -Otherwise. -@end table - -Following the permission bits is a single character that specifies -whether an alternate access method applies to the file. When that -character is a space, there is no alternate access method. When it -is a printing character (e.g., @samp{+}), then there is such a method. - -@item -n -@itemx --numeric-uid-gid -@opindex -n -@opindex --numeric-uid-gid -@cindex numeric uid and gid -Produce long format directory listings, but -display numeric UIDs and GIDs instead of the owner and group names. - -@item -o -@opindex -o -Produce long format directory listings, but don't display group information. -It is equivalent to using @samp{--format=long} with @samp{--no-group} . - -@item -s -@itemx --size -@opindex -s -@opindex --size -@cindex disk allocation -@cindex size of files, reporting -Print the disk allocation of each file to the left of the file name. -This is the amount of disk space used by the file, which is usually a -bit more than the file's size, but it can be less if the file has holes. - -Normally the disk allocation is printed in units of -1024 bytes, but this can be overridden (@pxref{Block size}). - -@cindex NFS mounts from BSD to HP-UX -For files that are NFS-mounted from an HP-UX system to a BSD system, -this option reports sizes that are half the correct values. On HP-UX -systems, it reports sizes that are twice the correct values for files -that are NFS-mounted from BSD systems. This is due to a flaw in HP-UX; -it also affects the HP-UX @code{ls} program. - -@itemx --si -@opindex --si -@cindex SI output -Append a size letter such as @samp{M} for megabytes to each size. (SI -is the International System of Units, which defines these letters as -prefixes.) Powers of 1000 are used, not 1024; @samp{M} stands for -1,000,000 bytes. Use the @samp{-h} or @samp{--human-readable} option if -you prefer powers of 1024. - -@end table - - -@node Sorting the output -@subsection Sorting the output - -@cindex sorting @code{ls} output -These options change the order in which @code{ls} sorts the information -it outputs. By default, sorting is done by character code (e.g., ASCII -order). - -@table @samp - -@item -c -@itemx --time=ctime -@itemx --time=status -@itemx --time=use -@opindex -c -@opindex --time -@opindex ctime@r{, printing or sorting by} -@opindex status time@r{, printing or sorting by} -@opindex use time@r{, printing or sorting files by} -If the long listing format (e.g., @samp{-l}, @samp{-o}) is being used, -print the status change time (the @samp{ctime} in the inode) instead of -the modification time. -When explicitly sorting by time (@samp{--sort=time} or @samp{-t}) -or when not using a long listing format, -sort according to the status change time. - -@item -f -@opindex -f -@cindex unsorted directory listing -@cindex directory order, listing by -Primarily, like @samp{-U}---do not sort; list the files in whatever -order they are stored in the directory. But also enable @samp{-a} (list -all files) and disable @samp{-l}, @samp{--color}, and @samp{-s} (if they -were specified before the @samp{-f}). - -@item -r -@itemx --reverse -@opindex -r -@opindex --reverse -@cindex reverse sorting -Reverse whatever the sorting method is---e.g., list files in reverse -alphabetical order, youngest first, smallest first, or whatever. - -@item -S -@itemx --sort=size -@opindex -S -@opindex --sort -@opindex size of files@r{, sorting files by} -Sort by file size, largest first. - -@item -t -@itemx --sort=time -@opindex -t -@opindex --sort -@opindex modification time@r{, sorting files by} -Sort by modification time (the @samp{mtime} in the inode), newest first. - -@item -u -@itemx --time=atime -@itemx --time=access -@opindex -u -@opindex --time -@opindex use time@r{, printing or sorting files by} -@opindex atime@r{, printing or sorting files by} -@opindex access time@r{, printing or sorting files by} -If the long listing format (e.g., @samp{--format=long}) is being used, -print the last access time (the @samp{atime} in the inode). -When explicitly sorting by time (@samp{--sort=time} or @samp{-t}) -or when not using a long listing format, sort according to the access time. - -@item -U -@itemx --sort=none -@opindex -U -@opindex --sort -@opindex none@r{, sorting option for @code{ls}} -Do not sort; list the files in whatever order they are -stored in the directory. (Do not do any of the other unrelated things -that @samp{-f} does.) This is especially useful when listing very large -directories, since not doing any sorting can be noticeably faster. - -@item -v -@itemx --sort=version -@opindex -v -@opindex --sort -@opindex version@r{, sorting option for @code{ls}} -Sort by version name and number, lowest first. It behaves like a default -sort, except that each sequence of decimal digits is treated numerically -as an index/version number. (@xref{More details about version sort}.) - -@item -X -@itemx --sort=extension -@opindex -X -@opindex --sort -@opindex extension@r{, sorting files by} -Sort directory contents alphabetically by file extension (characters -after the last @samp{.}); files with no extension are sorted first. - -@end table - - -@node More details about version sort -@subsection More details about version sort - -The version sort takes into account the fact that file names frequently include -indices or version numbers. Standard sorting functions usually do not produce -the ordering that people expect because comparisons are made on a -character-by-character basis. The version -sort addresses this problem, and is especially useful when browsing -directories that contain many files with indices/version numbers in their -names: - -@example - > ls -1 > ls -1v - foo.zml-1.gz foo.zml-1.gz - foo.zml-100.gz foo.zml-2.gz - foo.zml-12.gz foo.zml-6.gz - foo.zml-13.gz foo.zml-12.gz - foo.zml-2.gz foo.zml-13.gz - foo.zml-25.gz foo.zml-25.gz - foo.zml-6.gz foo.zml-100.gz -@end example - -Note also that numeric parts with leading zeroes are considered as -fractional one: - -@example - > ls -1 > ls -1v - abc-1.007.tgz abc-1.007.tgz - abc-1.012b.tgz abc-1.01a.tgz - abc-1.01a.tgz abc-1.012b.tgz -@end example - -@node General output formatting -@subsection General output formatting - -These options affect the appearance of the overall output. - -@table @samp - -@item -1 -@itemx --format=single-column -@opindex -1 -@opindex --format -@opindex single-column @r{output of files} -List one file per line. This is the default for @code{ls} when standard -output is not a terminal. - -@item -C -@itemx --format=vertical -@opindex -C -@opindex --format -@opindex vertical @r{sorted files in columns} -List files in columns, sorted vertically. This is the default for -@code{ls} if standard output is a terminal. It is always the default -for the @code{dir} and @code{d} programs. -@sc{gnu} @code{ls} uses variable width columns to display as many files as -possible in the fewest lines. - -@item --color [=@var{when}] -@opindex --color -@cindex color, distinguishing file types with -Specify whether to use color for distinguishing file types. @var{when} -may be omitted, or one of: -@itemize @bullet -@item none -@vindex none @r{color option} -- Do not use color at all. This is the default. -@item auto -@vindex auto @r{color option} -@cindex terminal, using color iff -- Only use color if standard output is a terminal. -@item always -@vindex always @r{color option} -- Always use color. -@end itemize -Specifying @samp{--color} and no @var{when} is equivalent to -@samp{--color=always}. -Piping a colorized listing through a pager like @code{more} or -@code{less} usually produces unreadable results. However, using -@code{more -f} does seem to work. - -@item -F -@itemx --classify -@itemx --indicator-style=classify -@opindex -F -@opindex --classify -@opindex --indicator-style -@cindex file type and executables, marking -@cindex executables and file type, marking -Append a character to each file name indicating the file type. Also, -for regular files that are executable, append @samp{*}. The file type -indicators are @samp{/} for directories, @samp{@@} for symbolic links, -@samp{|} for FIFOs, @samp{=} for sockets, and nothing for regular files. - -@item --indicator-style=@var{word} -@opindex --indicator-style -Append a character indicator with style @var{word} to entry names, -as follows: -@table @samp -@item none -Do not append any character indicator; this is the default. -@item file-type -Append @samp{/} for directories, @samp{@@} for symbolic links, @samp{|} -for FIFOs, @samp{=} for sockets, and nothing for regular files. This is -the same as the @samp{-p} or @samp{--file-type} option. -@item classify -Append @samp{*} for executable regular files, otherwise behave as for -@samp{file-type}. This is the same as the @samp{-F} or -@samp{--classify} option. -@end table - -@item -k -@itemx --kilobytes -@opindex -k -@opindex --kilobytes -Print file sizes in 1024-byte blocks, overriding the default block -size (@pxref{Block size}). - -@item -m -@itemx --format=commas -@opindex -m -@opindex --format -@opindex commas@r{, outputting between files} -List files horizontally, with as many as will fit on each line, -separated by @samp{, } (a comma and a space). - -@item -p -@itemx --file-type -@itemx --indicator-style=file-type -@opindex --file-type -@opindex --indicator-style -@cindex file type, marking -Append a character to each file name indicating the file type. This is -like @samp{-F}, except that executables are not marked. - -@item -x @var{format} -@itemx --format=across -@itemx --format=horizontal -@opindex -x -@opindex --format -@opindex across@r{, listing files} -@opindex horizontal@r{, listing files} -List the files in columns, sorted horizontally. - -@item -T @var{cols} -@itemx --tabsize=@var{cols} -@opindex -T -@opindex --tabsize -Assume that each tabstop is @var{cols} columns wide. The default is 8. -@code{ls} uses tabs where possible in the output, for efficiency. If -@var{cols} is zero, do not use tabs at all. - -@item -w -@itemx --width=@var{cols} -@opindex -w -@opindex --width -@vindex COLUMNS -Assume the screen is @var{cols} columns wide. The default is taken -from the terminal settings if possible; otherwise the environment -variable @env{COLUMNS} is used if it is set; otherwise the default -is 80. - -@end table - - -@node Formatting file timestamps -@subsection Formatting file timestamps - -By default, file timestamps are output in abbreviated form. For files -with a time more than six months old or in the future, the timestamp -contains the year instead of the time of day. If the timestamp contains -today's date with the year rather than a time of day, the file's time is -in the future, which means you probably have clock skew problems which -may break programs like @command{make} that rely on file times. - -The following option changes how file timestamps are printed. - -@table @samp -@item --time-style=@var{word} -@opindex --time-style -@cindex time style -Use style @var{word} to output file timestamps. The @var{word} should -be one of the following: - -@table @samp -@item full-iso -List timestamps in full, rather than using the standard abbreviation -heuristics. The format is @sc{iso} 8601 date, time, and time zone -format with nanosecond precision, e.g., @samp{2001-05-14 -23:45:56.477817180 -0700}. It's not possible to change the format, but -you can extract out the date string with @code{cut} and then pass the -result to @code{date -d}. @xref{date invocation, @code{date} -invocation, , sh-utils, Shell utilities}. - -This is useful because the time output includes all the information that -is available from the operating system. For example, this can help -when you have a Makefile that is not regenerating files properly. - -@item iso -Use @sc{iso}-style time stamps like @samp{2001-05-14@ } and @samp{05-14 -23:45}. - -@item locale -@vindex LC_ALL -@vindex LC_TIME -@vindex LANG -Use locale-dependent dates like @samp{touko@ @ 14 2001} and @samp{touko@ -@ 14 23:45}, time stamps that might occur in a Finnish locale. The -locale for formatting timestamps is specified by the first of three -environment variables @env{LC_ALL}, @env{LC_TIME}, @env{LANG} that is -set. - -@item posix-iso -Use traditional @sc{posix}-locale dates like @samp{May 14@ @ 2001} and -@samp{May 14 23:45} unless the user specifies a non-@sc{posix} locale, -in which case use @sc{iso}-style dates. This is the default. -@end table -@end table - -@vindex TIME_STYLE -You can specify the default value of the @option{--time-style} option -with the environment variable @env{TIME_STYLE}. @sc{gnu} Emacs 21 and -later can parse @sc{iso} dates, but older Emacs versions do not, so if -you are using an older version of Emacs and specify a non-@sc{posix} -locale, you may need to set @samp{TIME_STYLE="locale"}. - - -@node Formatting the file names -@subsection Formatting the file names - -These options change how file names themselves are printed. - -@table @samp - -@item -b -@itemx --escape -@itemx --quoting-style=escape -@opindex -b -@opindex --escape -@opindex --quoting-style -@cindex backslash sequences for file names -Quote nongraphic characters in file names using alphabetic and octal -backslash sequences like those used in C. - -@item -N -@itemx --literal -@opindex -N -@opindex --literal -Do not quote file names. - -@item -q -@itemx --hide-control-chars -@opindex -q -@opindex --hide-control-chars -Print question marks instead of nongraphic characters in file names. -This is the default if the output is a terminal and the program is -@code{ls}. - -@item -Q -@itemx --quote-name -@itemx --quoting-style=c -@opindex -Q -@opindex --quote-name -@opindex --quoting-style -Enclose file names in double quotes and quote nongraphic characters as -in C. - -@item --quoting-style=@var{word} -@opindex --quoting-style -@cindex quoting style -Use style @var{word} to quote output names. The @var{word} should -be one of the following: -@table @samp -@item literal -Output names as-is. -@item shell -Quote names for the shell if they contain shell metacharacters or would -cause ambiguous output. -@item shell-always -Quote names for the shell, even if they would normally not require quoting. -@item c -Quote names as for a C language string; this is the same as the -@samp{-Q} or @samp{--quote-name} option. -@item escape -Quote as with @samp{c} except omit the surrounding double-quote -characters; this is the same as the @samp{-b} or @samp{--escape} option. -@item clocale -Quote as with @samp{c} except use quotation marks appropriate for the -locale. -@item locale -@c Use @t instead of @samp to avoid duplicate quoting in some output styles. -Like @samp{clocale}, but quote @t{`like this'} instead of @t{"like -this"} in the default C locale. This looks nicer on many displays. -@end table - -You can specify the default value of the @samp{--quoting-style} option -with the environment variable @env{QUOTING_STYLE}. If that environment -variable is not set, the default value is @samp{literal}, but this -default may change to @samp{shell} in a future version of this package. - -@item --show-control-chars -@opindex --show-control-chars -Print nongraphic characters as-is in file names. -This is the default unless the output is a terminal and the program is -@code{ls}. - -@end table - - -@node dir invocation -@section @code{dir}: Briefly list directory contents - -@pindex dir -@cindex directory listing, brief - -@code{dir} (also installed as @code{d}) is equivalent to @code{ls -C --b}; that is, by default files are listed in columns, sorted vertically, -and special characters are represented by backslash escape sequences. - -@xref{ls invocation, @code{ls}}. - - -@node vdir invocation -@section @code{vdir}: Verbosely list directory contents - -@pindex vdir -@cindex directory listing, verbose - -@code{vdir} (also installed as @code{v}) is equivalent to @code{ls -l --b}; that is, by default files are listed in long format and special -characters are represented by backslash escape sequences. - -@node dircolors invocation -@section @code{dircolors}: Color setup for @code{ls} - -@pindex dircolors -@cindex color setup -@cindex setup for color - -@code{dircolors} outputs a sequence of shell commands to set up the -terminal for color output from @code{ls} (and @code{dir}, etc.). -Typical usage: - -@example -eval `dircolors [@var{option}]@dots{} [@var{file}]` -@end example - -If @var{file} is specified, @code{dircolors} reads it to determine which -colors to use for which file types and extensions. Otherwise, a -precompiled database is used. For details on the format of these files, -run @samp{dircolors --print-database}. - -@vindex LS_COLORS -@vindex SHELL @r{environment variable, and color} -The output is a shell command to set the @env{LS_COLORS} environment -variable. You can specify the shell syntax to use on the command line, -or @code{dircolors} will guess it from the value of the @env{SHELL} -environment variable. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp -@item -b -@itemx --sh -@itemx --bourne-shell -@opindex -b -@opindex --sh -@opindex --bourne-shell -@cindex Bourne shell syntax for color setup -@cindex @code{sh} syntax for color setup -Output Bourne shell commands. This is the default if the @env{SHELL} -environment variable is set and does not end with @samp{csh} or -@samp{tcsh}. - -@item -c -@itemx --csh -@itemx --c-shell -@opindex -c -@opindex --csh -@opindex --c-shell -@cindex C shell syntax for color setup -@cindex @code{csh} syntax for color setup -Output C shell commands. This is the default if @code{SHELL} ends with -@code{csh} or @code{tcsh}. - -@item -p -@itemx --print-database -@opindex -p -@opindex --print-database -@cindex color database, printing -@cindex database for color setup, printing -@cindex printing color database -Print the (compiled-in) default color configuration database. This -output is itself a valid configuration file, and is fairly descriptive -of the possibilities. - -@end table - - -@node Basic operations -@chapter Basic operations - -@cindex manipulating files - -This chapter describes the commands for basic file manipulation: -copying, moving (renaming), and deleting (removing). - -@menu -* cp invocation:: Copy files. -* dd invocation:: Convert and copy a file. -* install invocation:: Copy files and set attributes. -* mv invocation:: Move (rename) files. -* rm invocation:: Remove files or directories. -* shred invocation:: Remove files more securely. -@end menu - - -@node cp invocation -@section @code{cp}: Copy files and directories - -@pindex cp -@cindex copying files and directories -@cindex files, copying -@cindex directories, copying - -@code{cp} copies files (or, optionally, directories). The copy is -completely independent of the original. You can either copy one file to -another, or copy arbitrarily many files to a destination directory. -Synopsis: - -@example -cp [@var{option}]@dots{} @var{source} @var{dest} -cp [@var{option}]@dots{} @var{source}@dots{} @var{directory} -@end example - -If the last argument names an existing directory, @code{cp} copies each -@var{source} file into that directory (retaining the same name). -Otherwise, if only two files are given, it copies the first onto the -second. It is an error if the last argument is not a directory and more -than two non-option arguments are given. - -Generally, files are written just as they are read. For exceptions, -see the @samp{--sparse} option below. - -By default, @command{cp} does not copy directories. However, the -@option{-R}, @option{-a}, and @option{-r} options cause @command{cp} to -copy recursively by descending into source directories and copying files -to corresponding destination directories. - -By default, @command{cp} follows symbolic links only when not copying -recursively. This default can be overridden with the -@option{--no-dereference} (@option{-d}), @option{--dereference} -(@option{-L}), and @option{-H} options. If more than one of these -options is specified, the last one silently overrides the others. - -@cindex self-backups -@cindex backups, making only -@code{cp} generally refuses to copy a file onto itself, with the -following exception: if @samp{--force --backup} is specified with -@var{source} and @var{dest} identical, and referring to a regular file, -@code{cp} will make a backup file, either regular or numbered, as -specified in the usual ways (@pxref{Backup options}). This is useful when -you simply want to make a backup of an existing file before changing it. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp -@item -a -@itemx --archive -@opindex -a -@opindex --archive -Preserve as much as possible of the structure and attributes of the -original files in the copy (but do not attempt to preserve internal -directory structure; i.e., @samp{ls -U} may list the entries in a copied -directory in a different order). -Equivalent to @samp{-dpR}. - -@item -b -@itemx @w{@kbd{--backup}[=@var{method}]} -@opindex -b -@opindex --backup -@vindex VERSION_CONTROL -@cindex backups, making -@xref{Backup options}. -Make a backup of each file that would otherwise be overwritten or removed. -As a special case, @code{cp} makes a backup of @var{source} when the force -and backup options are given and @var{source} and @var{dest} are the same -name for an existing, regular file. One useful application of this -combination of options is this tiny Bourne shell script: - -@example -#!/bin/sh -# Usage: backup FILE... -# Create a @sc{gnu}-style backup of each listed FILE. -for i in "$@"; do - cp --backup --force "$i" "$i" -done -@end example - -@item -d -@itemx --no-dereference -@opindex -d -@opindex --no-dereference -@cindex symbolic links, copying -@cindex hard links, preserving -Copy symbolic links as symbolic links rather than copying the files that -they point to, and preserve hard links between source files in the -copies. - -@item -f -@itemx --force -@opindex -f -@opindex --force -When copying without this option and an existing destination file cannot -be opened for writing, the copy fails. However, with @samp{--force}), -when a destination file cannot be opened, @code{cp} then unlinks it and -tries to open it again. Contrast this behavior with that enabled by -@samp{--link} and @samp{--symbolic-link}, whereby the destination file -is never opened but rather is unlinked unconditionally. Also see the -description of @samp{--remove-destination}. - -@item -H -@opindex -H -If a command line argument specifies a symbolic link, then copy the -file it points to rather than the symbolic link itself. However, -copy (preserving its nature) any symbolic link that is encountered -via recursive traversal. - -@item -i -@itemx --interactive -@opindex -i -@opindex --interactive -Prompt whether to overwrite existing regular destination files. - -@item -l -@itemx --link -@opindex -l -@opindex --link -Make hard links instead of copies of non-directories. - -@item -L -@itemx --dereference -@opindex -L -@opindex --dereference -Always follow symbolic links. - -@item -p -@itemx --preserve -@opindex -p -@opindex --preserve -@cindex file information, preserving -Preserve the original files' owner, group, permissions, and timestamps. -In the absence of this option, each destination file is created with the -permissions of the corresponding source file, minus the bits set in the -umask. @xref{File permissions}. - -@item -P -@itemx --parents -@opindex -P -@opindex --parents -@cindex parent directories and @code{cp} -Form the name of each destination file by appending to the target -directory a slash and the specified name of the source file. The last -argument given to @code{cp} must be the name of an existing directory. -For example, the command: - -@example -cp --parents a/b/c existing_dir -@end example - -@noindent -copies the file @file{a/b/c} to @file{existing_dir/a/b/c}, creating -any missing intermediate directories. - -Warning: the meaning of @option{-P} will change in the future to conform -to @sc{posix}. Use @option{--parents} for the old meaning, and -@option{--no-dereference} for the new. - -@item -r -@cindex directories, copying recursively -@cindex copying directories recursively -@cindex recursively copying directories -@cindex non-directories, copying as special files -Copy directories recursively, copying any non-directories and special -files (e.g., symbolic links, FIFOs and device files) as if they were -regular files. This means trying to read the data in each source -file and writing it to the destination. It is usually a mistake to -apply @code{cp -r} to special files like FIFOs and the ones typically -found in the @file{/dev} directory. In most cases, @code{cp -r} -will hang indefinitely trying to read from FIFOs and special files -like @file{/dev/console}, and it will fill up your destination disk -if you use it to copy @file{/dev/zero}. -Use the @samp{--recursive} (@samp{-R}) option instead if you want -to copy special files, preserving their special nature -rather than reading from them to copy their contents. - -@item -R -@itemx --recursive -@opindex -R -@opindex --recursive -Copy directories recursively, preserving non-directories (contrast with -@samp{-r} just above). - -@item --remove-destination -@opindex --remove-destination -Remove each existing destination file before attempting to open it -(contrast with @option{-f} above). - -@item --sparse=@var{when} -@opindex --sparse=@var{when} -@cindex sparse files, copying -@cindex holes, copying files with -@findex read @r{system call, and holes} -A @dfn{sparse file} contains @dfn{holes}---a sequence of zero bytes that -does not occupy any physical disk blocks; the @samp{read} system call -reads these as zeroes. This can both save considerable disk space and -increase speed, since many binary files contain lots of consecutive zero -bytes. By default, @code{cp} detects holes in input source files via a crude -heuristic and makes the corresponding output file sparse as well. - -The @var{when} value can be one of the following: -@table @samp -@item auto -The default behavior: the output file is sparse if the input file is sparse. - -@item always -Always make the output file sparse. This is useful when the input -file resides on a filesystem that does not support sparse files (the -most notable example is @samp{efs} filesystems in SGI IRIX 5.3 and -earlier), but the output file is on another type of filesystem. - -@item never -Never make the output file sparse. -This is useful in creating a file for use with the @code{mkswap} command, -since such a file must not have any holes. -@end table - -@itemx @w{@kbd{--strip-trailing-slashes}} -@opindex --strip-trailing-slashes -@cindex stripping trailing slashes -Remove any trailing slashes from each @var{source} argument. -@xref{Trailing slashes}. - -@item -s -@itemx --symbolic-link -@opindex -s -@opindex --symbolic-link -@cindex symbolic links, copying with -Make symbolic links instead of copies of non-directories. All source -file names must be absolute (starting with @samp{/}) unless the -destination files are in the current directory. This option merely -results in an error message on systems that do not support symbolic links. - -@item -S @var{suffix} -@itemx --suffix=@var{suffix} -@opindex -S -@opindex --suffix -Append @var{suffix} to each backup file made with @samp{-b}. -@xref{Backup options}. - -@itemx @w{@kbd{--target-directory}=@var{directory}} -@opindex --target-directory -@cindex target directory -@cindex destination directory -Specify the destination @var{directory}. -@xref{Target directory}. - -@item -v -@itemx --verbose -@opindex -v -@opindex --verbose -Print the name of each file before copying it. - -@item -V @var{method} -@itemx --version-control=@var{method} -@opindex -V -@opindex --version-control -Change the type of backups made with @samp{-b}. The @var{method} -argument can be @samp{none} (or @samp{off}), @samp{numbered} (or -@samp{t}), @samp{existing} (or @samp{nil}), or @samp{never} (or -@samp{simple}). @xref{Backup options}. - -@item -x -@itemx --one-file-system -@opindex -x -@opindex --one-file-system -@cindex filesystems, omitting copying to different -Skip subdirectories that are on different filesystems from the one that -the copy started on. -However, mount point directories @emph{are} copied. - -@end table - - -@node dd invocation -@section @code{dd}: Convert and copy a file - -@pindex dd -@cindex converting while copying a file - -@code{dd} copies a file (from standard input to standard output, by -default) with a changeable I/O block size, while optionally performing -conversions on it. Synopsis: - -@example -dd [@var{option}]@dots{} -@end example - -The program accepts the following options. Also see @ref{Common options}. - -@cindex multipliers after numbers -The numeric-valued options below (@var{bytes} and @var{blocks}) can be -followed by a multiplier: @samp{b}=512, @samp{c}=1, -@samp{w}=2, @samp{x@var{m}}=@var{m}, or any of the -standard block size suffixes like @samp{k}=1024 (@pxref{Block size}). - -Use different @command{dd} invocations to use different block sizes for -skipping and I/O. For example, the following shell commands copy data -in 512 kB blocks between a disk and a tape, but do not save or restore a -4 kB label at the start of the disk: - -@example -disk=/dev/rdsk/c0t1d0s2 -tape=/dev/rmt/0 - -# Copy all but the label from disk to tape. -(dd bs=4k skip=1 count=0 && dd bs=512k) <$disk >$tape - -# Copy from tape back to disk, but leave the disk label alone. -(dd bs=4k seek=1 count=0 && dd bs=512k) <$tape >$disk -@end example - -@table @samp - -@item if=@var{file} -@opindex if -Read from @var{file} instead of standard input. - -@item of=@var{file} -@opindex of -Write to @var{file} instead of standard output. Unless -@samp{conv=notrunc} is given, @code{dd} truncates @var{file} to zero -bytes (or the size specified with @samp{seek=}). - -@item ibs=@var{bytes} -@opindex ibs -@cindex block size of input -@cindex input block size -Read @var{bytes} bytes at a time. - -@item obs=@var{bytes} -@opindex obs -@cindex block size of output -@cindex output block size -Write @var{bytes} bytes at a time. - -@item bs=@var{bytes} -@opindex bs -@cindex block size -Both read and write @var{bytes} bytes at a time. This overrides -@samp{ibs} and @samp{obs}. - -@item cbs=@var{bytes} -@opindex cbs -@cindex block size of conversion -@cindex conversion block size -Convert @var{bytes} bytes at a time. - -@item skip=@var{blocks} -@opindex skip -Skip @var{blocks} @samp{ibs}-byte blocks in the input file before copying. - -@item seek=@var{blocks} -@opindex seek -Skip @var{blocks} @samp{obs}-byte blocks in the output file before copying. - -@item count=@var{blocks} -@opindex count -Copy @var{blocks} @samp{ibs}-byte blocks from the input file, instead -of everything until the end of the file. - -@item conv=@var{conversion}[,@var{conversion}]@dots{} -@opindex conv -Convert the file as specified by the @var{conversion} argument(s). -(No spaces around any comma(s).) - -Conversions: - -@table @samp - -@item ascii -@opindex ascii@r{, converting to} -Convert EBCDIC to ASCII. - -@item ebcdic -@opindex ebcdic@r{, converting to} -Convert ASCII to EBCDIC. - -@item ibm -@opindex alternate ebcdic@r{, converting to} -Convert ASCII to alternate EBCDIC. - -@item block -@opindex block @r{(space-padding)} -For each line in the input, output @samp{cbs} bytes, replacing the -input newline with a space and padding with spaces as necessary. - -@item unblock -@opindex unblock -Replace trailing spaces in each @samp{cbs}-sized input block with a -newline. - -@item lcase -@opindex lcase@r{, converting to} -Change uppercase letters to lowercase. - -@item ucase -@opindex ucase@r{, converting to} -Change lowercase letters to uppercase. - -@item swab -@opindex swab @r{(byte-swapping)} -@cindex byte-swapping -Swap every pair of input bytes. @sc{gnu} @code{dd}, unlike others, works -when an odd number of bytes are read---the last byte is simply copied -(since there is nothing to swap it with). - -@item noerror -@opindex noerror -@cindex read errors, ignoring -Continue after read errors. - -@item notrunc -@opindex notrunc -@cindex truncating output file, avoiding -Do not truncate the output file. - -@item sync -@opindex sync @r{(padding with nulls)} -Pad every input block to size of @samp{ibs} with trailing zero bytes. -When used with @samp{block} or @samp{unblock}, pad with spaces instead of -zero bytes. -@end table - -@end table - - -@node install invocation -@section @code{install}: Copy files and set attributes - -@pindex install -@cindex copying files and setting attributes - -@code{install} copies files while setting their permission modes and, if -possible, their owner and group. Synopses: - -@example -install [@var{option}]@dots{} @var{source} @var{dest} -install [@var{option}]@dots{} @var{source}@dots{} @var{directory} -install -d [@var{option}]@dots{} @var{directory}@dots{} -@end example - -In the first of these, the @var{source} file is copied to the @var{dest} -target file. In the second, each of the @var{source} files are copied -to the destination @var{directory}. In the last, each @var{directory} -(and any missing parent directories) is created. - -@cindex Makefiles, installing programs in -@code{install} is similar to @code{cp}, but allows you to control the -attributes of destination files. It is typically used in Makefiles to -copy programs into their destination directories. It refuses to copy -files onto themselves. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -b -@itemx @w{@kbd{--backup}[=@var{method}]} -@opindex -b -@opindex --backup -@vindex VERSION_CONTROL -@cindex backups, making -@xref{Backup options}. -Make a backup of each file that would otherwise be overwritten or removed. - -@item -c -@opindex -c -Ignored; for compatibility with old Unix versions of @code{install}. - -@item -d -@itemx --directory -@opindex -d -@opindex --directory -@cindex directories, creating with given attributes -@cindex parent directories, creating missing -@cindex leading directories, creating missing -Create each given directory and any missing parent directories, setting -the owner, group and mode as given on the command line or to the -defaults. It also gives any parent directories it creates those -attributes. (This is different from the SunOS 4.x @code{install}, which -gives directories that it creates the default attributes.) - -@item -g @var{group} -@itemx --group=@var{group} -@opindex -g -@opindex --group -@cindex group ownership of installed files, setting -Set the group ownership of installed files or directories to -@var{group}. The default is the process' current group. @var{group} -may be either a group name or a numeric group id. - -@item -m @var{mode} -@itemx --mode=@var{mode} -@opindex -m -@opindex --mode -@cindex permissions of installed files, setting -Set the permissions for the installed file or directory to @var{mode}, -which can be either an octal number, or a symbolic mode as in -@code{chmod}, with 0 as the point of departure (@pxref{File -permissions}). The default mode is @samp{u=rwx,go=rx}---read, write, -and execute for the owner, and read and execute for group and other. - -@item -o @var{owner} -@itemx --owner=@var{owner} -@opindex -o -@opindex --owner -@cindex ownership of installed files, setting -@cindex appropriate privileges -@vindex root @r{as default owner} -If @code{install} has appropriate privileges (is run as root), set the -ownership of installed files or directories to @var{owner}. The default -is @code{root}. @var{owner} may be either a user name or a numeric user -ID. - -@item -p -@itemx --preserve-timestamps -@opindex -p -@opindex --preserve-timestamps -@cindex timestamps of installed files, preserving -Set the time of last access and the time of last modification of each -installed file to match those of each corresponding original file. -When a file is installed without this option, its last access and -last modification times are both set to the time of installation. -This option is useful if you want to use the last modification times -of installed files to keep track of when they were last built as opposed -to when they were last installed. - -@item -s -@itemx --strip -@opindex -s -@opindex --strip -@cindex symbol table information, stripping -@cindex stripping symbol table information -Strip the symbol tables from installed binary executables. - -@item -S @var{suffix} -@itemx --suffix=@var{suffix} -@opindex -S -@opindex --suffix -Append @var{suffix} to each backup file made with @samp{-b}. -@xref{Backup options}. - -@itemx @w{@kbd{--target-directory}=@var{directory}} -@opindex --target-directory -@cindex target directory -@cindex destination directory -Specify the destination @var{directory}. -@xref{Target directory}. - -@item -v -@itemx --verbose -@opindex -v -@opindex --verbose -Print the name of each file before copying it. - -@item -V @var{method} -@itemx --version-control=@var{method} -@opindex -V -@opindex --version-control -Change the type of backups made with @samp{-b}. The @var{method} -argument can be @samp{none} (or @samp{off}), @samp{numbered} (or -@samp{t}), @samp{existing} (or @samp{nil}), or @samp{never} (or -@samp{simple}). @xref{Backup options}. - -@end table - - -@node mv invocation -@section @code{mv}: Move (rename) files - -@pindex mv - -@code{mv} moves or renames files (or directories). Synopsis: - -@example -mv [@var{option}]@dots{} @var{source} @var{dest} -mv [@var{option}]@dots{} @var{source}@dots{} @var{directory} -@end example - -If the last argument names an existing directory, @code{mv} moves each -other given file into a file with the same name in that directory. -Otherwise, if only two files are given, it renames the first as -the second. It is an error if the last argument is not a directory -and more than two files are given. - -@code{mv} can move any type of file from one filesystem to another. -Prior to version @code{4.0} of the fileutils, -@code{mv} could move only regular files between filesystems. -For example, now @code{mv} can move an entire directory hierarchy -including special device files from one partition to another. It first -uses some of the same code that's used by @code{cp -a} to copy the -requested directories and files, then (assuming the copy succeeded) -it removes the originals. If the copy fails, then the part that was -copied to the destination partition is removed. If you were to copy -three directories from one partition to another and the copy of the first -directory succeeded, but the second didn't, the first would be left on -the destination partion and the second and third would be left on the -original partition. - -@cindex prompting, and @code{mv} -If a destination file exists but is normally unwritable, standard input -is a terminal, and the @samp{-f} or @samp{--force} option is not given, -@code{mv} prompts the user for whether to replace the file. (You might -own the file, or have write permission on its directory.) If the -response does not begin with @samp{y} or @samp{Y}, the file is skipped. - -@emph{Warning}: If you try to move a symlink that points to a directory, -and you specify the symlink with a trailing slash, then @code{mv} -doesn't move the symlink but instead moves the directory referenced -by the symlink. @xref{Trailing slashes}. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -b -@itemx @w{@kbd{--backup}[=@var{method}]} -@opindex -b -@opindex --backup -@vindex VERSION_CONTROL -@cindex backups, making -@xref{Backup options}. -Make a backup of each file that would otherwise be overwritten or removed. - -@item -f -@itemx --force -@opindex -f -@opindex --force -@cindex prompts, omitting -Do not prompt the user before removing an unwritable destination file. - -@item -i -@itemx --interactive -@opindex -i -@opindex --interactive -@cindex prompts, forcing -Prompt whether to overwrite each existing destination file, regardless -of its permissions. If the response does not begin with @samp{y} or -@samp{Y}, the file is skipped. - -@item -u -@itemx --update -@opindex -u -@opindex --update -@cindex newer files, moving only -Do not move a nondirectory that has an existing destination with the -same or newer modification time. - -@item -v -@itemx --verbose -@opindex -v -@opindex --verbose -Print the name of each file before moving it. - -@itemx @w{@kbd{--strip-trailing-slashes}} -@opindex --strip-trailing-slashes -@cindex stripping trailing slashes -Remove any trailing slashes from each @var{source} argument. -@xref{Trailing slashes}. - -@item -S @var{suffix} -@itemx --suffix=@var{suffix} -@opindex -S -@opindex --suffix -Append @var{suffix} to each backup file made with @samp{-b}. -@xref{Backup options}. - -@itemx @w{@kbd{--target-directory}=@var{directory}} -@opindex --target-directory -@cindex target directory -@cindex destination directory -Specify the destination @var{directory}. -@xref{Target directory}. - -@item -V @var{method} -@itemx --version-control=@var{method} -@opindex -V -@opindex --version-control -Change the type of backups made with @samp{-b}. The @var{method} -argument can be @samp{none} (or @samp{off}), @samp{numbered} (or -@samp{t}), @samp{existing} (or @samp{nil}), or @samp{never} (or -@samp{simple}). @xref{Backup options}. - -@end table - - -@node rm invocation -@section @code{rm}: Remove files or directories - -@pindex rm -@cindex removing files or directories - -@code{rm} removes each given @var{file}. By default, it does not remove -directories. Synopsis: - -@example -rm [@var{option}]@dots{} [@var{file}]@dots{} -@end example - -@cindex prompting, and @code{rm} -If a file is unwritable, standard input is a terminal, and the @samp{-f} -or @samp{--force} option is not given, or the @samp{-i} or -@samp{--interactive} option @emph{is} given, @code{rm} prompts the user -for whether to remove the file. If the response does not begin with -@samp{y} or @samp{Y}, the file is skipped. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -d -@itemx --directory -@opindex -d -@opindex --directory -@cindex directories, removing with @code{unlink} -@findex unlink -@pindex fsck -Attempt to remove directories with @code{unlink} instead of @code{rmdir}, and -don't require a directory to be empty before trying to unlink it. This works -only if you have appropriate privileges and if your operating system supports -@code{unlink} for directories. Because unlinking a directory causes any files -in the deleted directory to become unreferenced, it is wise to @code{fsck} the -filesystem after doing this. - -@item -f -@itemx --force -@opindex -f -@opindex --force -Ignore nonexistent files and never prompt the user. -Ignore any previous @samp{--interactive} (@samp{-i}) option. - -@item -i -@itemx --interactive -@opindex -i -@opindex --interactive -Prompt whether to remove each file. If the response does not begin -with @samp{y} or @samp{Y}, the file is skipped. -Ignore any previous @samp{--force} (@samp{-f}) option. - -@item -r -@itemx -R -@itemx --recursive -@opindex -r -@opindex -R -@opindex --recursive -@cindex directories, removing (recursively) -Remove the contents of directories recursively. - -@item -v -@itemx --verbose -@opindex -v -@opindex --verbose -Print the name of each file before removing it. - -@end table - -@cindex files beginning with @samp{-}, removing -@cindex @samp{-}, removing files beginning with -One common question is how to remove files whose names begin with a -@samp{-}. @sc{gnu} @code{rm}, like every program that uses the @code{getopt} -function to parse its arguments, lets you use the @samp{--} option to -indicate that all following arguments are non-options. To remove a file -called @file{-f} in the current directory, you could type either: - -@example -rm -- -f -@end example - -@noindent -or: - -@example -rm ./-f -@end example - -@opindex - @r{and Unix @code{rm}} -The Unix @code{rm} program's use of a single @samp{-} for this purpose -predates the development of the getopt standard syntax. - - -@node shred invocation -@section @code{shred}: Remove files more securely - -@pindex shred -@cindex data, erasing -@cindex erasing data - -@code{shred} overwrites devices or files, to help prevent even -very expensive hardware from recovering the data. - -Ordinarily when you remove a file (@pxref{rm invocation}), the data is -not actually destroyed. Only the index listing where the file is -stored is destroyed, and the storage is made available for reuse. -There are undelete utilities that will attempt to reconstruct the index -and can bring the file back if the parts were not reused. - -On a busy system with a nearly-full drive, space can get reused in a few -seconds. But there is no way to know for sure. If you have sensitive -data, you may want to be sure that recovery is not possible by actually -overwriting the file with non-sensitive data. - -However, even after doing that, it is possible to take the disk back -to a laboratory and use a lot of sensitive (and expensive) equipment -to look for the faint ``echoes'' of the original data underneath the -overwritten data. If the data has only been overwritten once, it's not -even that hard. - -The best way to remove something irretrievably is to destroy the media -it's on with acid, melt it down, or the like. For cheap removable media -like floppy disks, this is the preferred method. However, hard drives -are expensive and hard to melt, so the @code{shred} utility tries -to achieve a similar effect non-destructively. - -This uses many overwrite passes, with the data patterns chosen to -maximize the damage they do to the old data. While this will work on -floppies, the patterns are designed for best effect on hard drives. -For more details, see the source code and Peter Gutmann's paper -@cite{Secure Deletion of Data from Magnetic and Solid-State Memory}, -from the proceedings of the Sixth USENIX Security Symposium (San Jose, -California, 22--25 July, 1996). The paper is also available online -@url{http://www.cs.auckland.ac.nz/~pgut001/pubs/secure_del.html}. - -@strong{Please note} that @code{shred} relies on a very important assumption: -that the filesystem overwrites data in place. This is the traditional -way to do things, but many modern filesystem designs do not satisfy this -assumption. Exceptions include: - -@itemize @bullet - -@item -Log-structured or journaled filesystems, such as those supplied with -AIX and Solaris. - -@item -Filesystems that write redundant data and carry on even if some writes -fail, such as RAID-based filesystems. - -@item -Filesystems that make snapshots, such as Network Appliance's NFS server. - -@item -Filesystems that cache in temporary locations, such as NFS version 3 -clients. - -@item -Compressed filesystems. -@end itemize - -If you are not sure how your filesystem operates, then you should assume -that it does not overwrite data in place, which means that shred cannot -reliably operate on regular files in your filesystem. - -Generally speaking, it is more reliable to shred a device than a file, -since this bypasses the problem of filesystem design mentioned above. -However, even shredding devices is not always completely reliable. For -example, most disks map out bad sectors invisibly to the application; if -the bad sectors contain sensitive data, @code{shred} won't be able to -destroy it. - -@code{shred} makes no attempt to detect or report this problem, just as -it makes no attempt to do anything about backups. However, since it is -more reliable to shred devices than files, @code{shred} by default does -not truncate or remove the output file. This default is more suitable -for devices, which typically cannot be truncated and should not be -removed. - -Finally, consider the risk of backups and mirrors. -File system backups and remote mirrors may contain copies of the -file that cannot be removed, and that will allow a shredded file -to be recovered later. So if you keep any data you may later want -to destroy using @code{shred}, be sure that it is not backed up or mirrored. - -@example -shred [@var{option}]@dots{} @var{file}[@dots{}] -@end example - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -f -@itemx --force -@opindex -f -@opindex --force -@cindex force deletion -Override file permissions if necessary to allow overwriting. - -@item -@var{NUMBER} -@itemx -n @var{NUMBER} -@itemx --iterations=@var{NUMBER} -@opindex -n @var{NUMBER} -@opindex --iterations=@var{NUMBER} -@cindex iterations, selecting the number of -By default, @code{shred} uses 25 passes of overwrite. This is enough -for all of the useful overwrite patterns to be used at least once. -You can reduce this to save time, or increase it if you have a lot of -time to waste. - -@item -s @var{BYTES} -@itemx --size=@var{BYTES} -@opindex -s @var{BYTES} -@opindex --size=@var{BYTES} -@cindex size of file to shred -Shred the first @var{BYTES} bytes of the file. The default is to shred -the whole file. @var{BYTES} can be followed by a size specification like -@samp{k}, @samp{M}, or @samp{G} to specify a multiple. @xref{Block size}. - -@item -u -@itemx --remove -@opindex -u -@opindex --remove -@cindex removing files after shredding -After shredding a file, truncate it (if possible) and then remove it. -If a file has multiple links, only the named links will be removed. - -@item -v -@itemx --verbose -@opindex -v -@opindex --verbose -Display status updates as sterilization proceeds. - -@item -x -@itemx --exact -@opindex -x -@opindex --exact -Normally, shred rounds the file size up to the next multiple of -the filesystem block size to fully erase the last block of the file. -This option suppresses that behavior. -Thus, by default if you shred a 10-byte file on a system with 512-byte -blocks, the resulting file will be 512 bytes long. With this option, -shred does not increase the size of the file. - -@item -z -@itemx --zero -@opindex -z -@opindex --zero -Normally, the last pass that @code{shred} writes is made up of -random data. If this would be conspicuous on your hard drive (for -example, because it looks like encrypted data), or you just think -it's tidier, the @samp{--zero} option adds an additional overwrite pass with -all zero bits. This is in addition to the number of passes specified -by the @samp{--iterations} option. - -@item - -@opindex - -Shred standard output. - -This argument is considered an option. If the common @samp{--} option has -been used to indicate the end of options on the command line, then @samp{-} -will be interpreted as an ordinary file name. - -The intended use of this is to shred a removed temporary file. -For example - -@example -i=`tempfile -m 0600` -exec 3<>"$i" -rm -- "$i" -echo "Hello, world" >&3 -shred - >&3 -exec 3>- -@end example - -Note that the shell command @samp{shred - >file} does not shred the -contents of @var{file}, since it truncates @var{file} before invoking -@code{shred}. Use the command @samp{shred file} or (if using a -Bourne-compatible shell) the command @samp{shred - 1<>file} instead. - -@end table - -You might use the following command to erase all trace of the -file system you'd created on the floppy disk in your first drive. -That command takes about 20 minutes to erase a 1.44MB floppy. - -@example -shred --verbose /dev/fd0 -@end example - -Similarly, to erase all data on a selected partition of -your hard disk, you could give a command like this: - -@example -shred --verbose /dev/sda5 -@end example - -@node Special file types -@chapter Special file types - -@cindex special file types -@cindex file types, special - -This chapter describes commands which create special types of files (and -@code{rmdir}, which removes directories, one special file type). - -@cindex special file types -@cindex file types -Although Unix-like operating systems have markedly fewer special file -types than others, not @emph{everything} can be treated only as the -undifferentiated byte stream of @dfn{normal files}. For example, when a -file is created or removed, the system must record this information, -which it does in a @dfn{directory}---a special type of file. Although -you can read directories as normal files, if you're curious, in order -for the system to do its job it must impose a structure, a certain -order, on the bytes of the file. Thus it is a ``special'' type of file. - -Besides directories, other special file types include named pipes -(FIFOs), symbolic links, sockets, and so-called @dfn{special files}. - -@menu -* ln invocation:: Make links between files. -* mkdir invocation:: Make directories. -* mkfifo invocation:: Make FIFOs (named pipes). -* mknod invocation:: Make block or character special files. -* rmdir invocation:: Remove empty directories. -@end menu - - -@node ln invocation -@section @code{ln}: Make links between files - -@pindex ln -@cindex links, creating -@cindex hard links, creating -@cindex symbolic (soft) links, creating -@cindex creating links (hard or soft) - -@cindex filesystems and hard links -@code{ln} makes links between files. By default, it makes hard links; -with the @samp{-s} option, it makes symbolic (or @dfn{soft}) links. -Synopses: - -@example -ln [@var{option}]@dots{} @var{target} [@var{linkname}] -ln [@var{option}]@dots{} @var{target}@dots{} @var{directory} -@end example - -@itemize @bullet - -@item If the last argument names an existing directory, @code{ln} creates a -link to each @var{target} file in that directory, using the -@var{target}s' names. (But see the description of the -@samp{--no-dereference} option below.) - -@item If two filenames are given, @code{ln} creates a link from the -second to the first. - -@item If one @var{target} is given, @code{ln} creates a link to that -file in the current directory. - -@item It is an error if the last argument is not a directory and more -than two files are given. Without @samp{-f} or @samp{-i} (see below), -@code{ln} will not remove an existing file. Use the @samp{--backup} -option to make @code{ln} rename existing files. - -@end itemize - -@cindex hard link, defined -@cindex inode, and hard links -A @dfn{hard link} is another name for an existing file; the link and the -original are indistinguishable. Technically speaking, they share the -same inode, and the inode contains all the information about a -file---indeed, it is not incorrect to say that the inode @emph{is} the -file. On all existing implementations, you cannot make a hard link to -a directory, and hard links cannot cross filesystem boundaries. (These -restrictions are not mandated by @sc{posix}, however.) - -@cindex dereferencing symbolic links -@cindex symbolic link, defined -@dfn{Symbolic links} (@dfn{symlinks} for short), on the other hand, are -a special file type (which not all kernels support: System V release 3 -(and older) systems lack symlinks) in which the link file actually -refers to a different file, by name. When most operations (opening, -reading, writing, and so on) are passed the symbolic link file, the -kernel automatically @dfn{dereferences} the link and operates on the -target of the link. But some operations (e.g., removing) work on the -link file itself, rather than on its target. @xref{Symbolic Links,,, -library, The GNU C Library Reference Manual}. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -b -@itemx @w{@kbd{--backup}[=@var{method}]} -@opindex -b -@opindex --backup -@vindex VERSION_CONTROL -@cindex backups, making -@xref{Backup options}. -Make a backup of each file that would otherwise be overwritten or removed. - -@item -d -@itemx -F -@itemx --directory -@opindex -d -@opindex -F -@opindex --directory -@cindex hard links to directories -Allow the super-user to make hard links to directories. - -@item -f -@itemx --force -@opindex -f -@opindex --force -Remove existing destination files. - -@item -i -@itemx --interactive -@opindex -i -@opindex --interactive -@cindex prompting, and @code{ln} -Prompt whether to remove existing destination files. - -@item -n -@itemx --no-dereference -@opindex -n -@opindex --no-dereference -When given an explicit destination that is a symlink to a directory, -treat that destination as if it were a normal file. - -When the destination is an actual directory (not a symlink to one), -there is no ambiguity. The link is created in that directory. -But when the specified destination is a symlink to a directory, -there are two ways to treat the user's request. @code{ln} can -treat the destination just as it would a normal directory and create -the link in it. On the other hand, the destination can be viewed as a -non-directory---as the symlink itself. In that case, @code{ln} -must delete or backup that symlink before creating the new link. -The default is to treat a destination that is a symlink to a directory -just like a directory. - -@item -s -@itemx --symbolic -@opindex -s -@opindex --symbolic -Make symbolic links instead of hard links. This option merely produces -an error message on systems that do not support symbolic links. - -@item -S @var{suffix} -@itemx --suffix=@var{suffix} -@opindex -S -@opindex --suffix -Append @var{suffix} to each backup file made with @samp{-b}. -@xref{Backup options}. - -@itemx @w{@kbd{--target-directory}=@var{directory}} -@opindex --target-directory -@cindex target directory -@cindex destination directory -Specify the destination @var{directory}. -@xref{Target directory}. - -@item -v -@itemx --verbose -@opindex -v -@opindex --verbose -Print the name of each file before linking it. - -@item -V @var{method} -@itemx --version-control=@var{method} -@opindex -V -@opindex --version-control -Change the type of backups made with @samp{-b}. The @var{method} -argument can be @samp{none} (or @samp{off}), @samp{numbered} (or -@samp{t}), @samp{existing} (or @samp{nil}), or @samp{never} (or -@samp{simple}). @xref{Backup options}. - -@end table - -Examples: - -@smallexample -ln -s /some/name # creates link ./name pointing to /some/name -ln -s /some/name myname # creates link ./myname pointing to /some/name -ln -s a b .. # creates links ../a and ../b pointing to ./a and ./b -@end smallexample - - -@node mkdir invocation -@section @code{mkdir}: Make directories - -@pindex mkdir -@cindex directories, creating -@cindex creating directories - -@code{mkdir} creates directories with the specified names. Synopsis: - -@example -mkdir [@var{option}]@dots{} @var{name}@dots{} -@end example - -If a @var{name} is an existing file but not a directory, @code{mkdir} prints a -warning message on stderr and will exit with a status of 1 after -processing any remaining @var{name}s. The same is done when a @var{name} is an -existing directory and the -p option is not given. If a @var{name} is an -existing directory and the -p option is given, @code{mkdir} will ignore it. -That is, @code{mkdir} will not print a warning, raise an error, or change -the mode of the directory (even if the -m option is given), and will -move on to processing any remaining @var{name}s. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -m @var{mode} -@itemx --mode=@var{mode} -@opindex -m -@opindex --mode -@cindex modes of created directories, setting -Set the mode of created directories to @var{mode}, which is symbolic as -in @code{chmod} and uses @samp{a=rwx} (read, write and execute allowed for -everyone) minus the bits set in the umask for the point of the -departure. @xref{File permissions}. - -@item -p -@itemx --parents -@opindex -p -@opindex --parents -@cindex parent directories, creating -Make any missing parent directories for each argument. The mode for parent -directories is set to the umask modified by @samp{u+wx}. -Ignore arguments corresponding to existing directories. - -@item -v -@item --verbose -@opindex -v -@opindex --verbose -Print a message for each created directory. This is most useful with -@samp{--parents}. -@end table - - -@node mkfifo invocation -@section @code{mkfifo}: Make FIFOs (named pipes) - -@pindex mkfifo -@cindex FIFOs, creating -@cindex named pipes, creating -@cindex creating FIFOs (named pipes) - -@code{mkfifo} creates FIFOs (also called @dfn{named pipes}) with the -specified names. Synopsis: - -@example -mkfifo [@var{option}] @var{name}@dots{} -@end example - -A @dfn{FIFO} is a special file type that permits independent processes -to communicate. One process opens the FIFO file for writing, and -another for reading, after which data can flow as with the usual -anonymous pipe in shells or elsewhere. - -The program accepts the following option. Also see @ref{Common options}. - -@table @samp - -@item -m @var{mode} -@itemx --mode=@var{mode} -@opindex -m -@opindex --mode -@cindex modes of created FIFOs, setting -Set the mode of created FIFOs to @var{mode}, which is symbolic as in -@code{chmod} and uses @samp{a=rw} (read and write allowed for everyone) minus -the bits set in the umask for the point of departure. @xref{File permissions}. - -@end table - - -@node mknod invocation -@section @code{mknod}: Make block or character special files - -@pindex mknod -@cindex block special files, creating -@cindex character special files, creating - -@code{mknod} creates a FIFO, character special file, or block special -file with the specified name. Synopsis: - -@example -mknod [@var{option}]@dots{} @var{name} @var{type} [@var{major} @var{minor}] -@end example - -@cindex special files -@cindex block special files -@cindex character special files -Unlike the phrase ``special file type'' above, the term @dfn{special -file} has a technical meaning on Unix: something that can generate or -receive data. Usually this corresponds to a physical piece of hardware, -e.g., a printer or a disk. (These files are typically created at -system-configuration time.) The @code{mknod} command is what creates -files of this type. Such devices can be read either a character at a -time or a ``block'' (many characters) at a time, hence we say there are -@dfn{block special} files and @dfn{character special} files. - -The arguments after @var{name} specify the type of file to make: - -@table @samp - -@item p -@opindex p @r{for FIFO file} -for a FIFO - -@item b -@opindex b @r{for block special file} -for a block special file - -@item c -@c Don't document the `u' option -- it's just a synonym for `c'. -@c Do *any* versions of mknod still use it? -@c @itemx u -@opindex c @r{for character special file} -@c @opindex u @r{for character special file} -for a character special file - -@end table - -When making a block or character special file, the major and minor -device numbers must be given after the file type. - -The program accepts the following option. Also see @ref{Common options}. - -@table @samp - -@item -m @var{mode} -@itemx --mode=@var{mode} -@opindex -m -@opindex --mode -Set the mode of created files to @var{mode}, which is symbolic as in -@code{chmod} and uses @samp{a=rw} minus the bits set in the umask as the point -of departure. @xref{File permissions}. - -@end table - - -@node rmdir invocation -@section @code{rmdir}: Remove empty directories - -@pindex rmdir -@cindex removing empty directories -@cindex directories, removing empty - -@code{rmdir} removes empty directories. Synopsis: - -@example -rmdir [@var{option}]@dots{} @var{directory}@dots{} -@end example - -If any @var{directory} argument does not refer to an existing empty -directory, it is an error. - -The program accepts the following option. Also see @ref{Common options}. - -@table @samp - -@item --ignore-fail-on-non-empty -@opindex --ignore-fail-on-non-empty -@cindex directory deletion, ignoring failures -Ignore each failure to remove a directory that is solely because -the directory is non-empty. - -@item -p -@itemx --parents -@opindex -p -@opindex --parents -@cindex parent directories, removing -Remove @var{directory}, then try to remove each component of @var{directory}. -So, for example, @samp{rmdir -p a/b/c} is similar to @samp{rmdir a/b/c a/b a}. -As such, it fails if any of those directories turns out not to be empty. -Use the @samp{--ignore-fail-on-non-empty} option to make it so such -a failure does not evoke a diagnostic and does not cause @code{rmdir} to -exit unsuccessfully. - -@item -v -@item --verbose -@opindex -v -@opindex --verbose -@cindex directory deletion, reporting -Give a diagnostic for each successful removal. -@var{directory} is removed. - -@end table - -@xref{rm invocation}, for how to remove non-empty directories (recursively). - - -@node Changing file attributes -@chapter Changing file attributes - -@cindex changing file attributes -@cindex file attributes, changing -@cindex attributes, file - -A file is not merely its contents, a name, and a file type -(@pxref{Special file types}). A file also has an owner (a userid), a -group (a group id), permissions (what the owner can do with the file, -what people in the group can do, and what everyone else can do), various -timestamps, and other information. Collectively, we call these a file's -@dfn{attributes}. - -These commands change file attributes. - -@menu -* chown invocation:: Change file owners and groups. -* chgrp invocation:: Change file groups. -* chmod invocation:: Change access permissions. -* touch invocation:: Change file timestamps. -@end menu - - -@node chown invocation -@section @code{chown}: Change file owner and group - -@pindex chown -@cindex file ownership, changing -@cindex group ownership, changing -@cindex changing file ownership -@cindex changing group ownership - -@code{chown} changes the user and/or group ownership of each given @var{file} -to @var{new-owner} or to the user and group of an existing reference file. -Synopsis: - -@example -chown [@var{option}]@dots{} @{@var{new-owner} | --reference=@var{ref_file}@} @var{file}@dots{} -@end example - -If used, @var{new-owner} specifies the new owner and/or group as follows -(with no embedded white space): - -@example -[@var{owner}] [ [:] [@var{group}] ] -@end example - -Specifically: - -@table @var -@item owner -If only an @var{owner} (a user name or numeric user id) is given, that -user is made the owner of each given file, and the files' group is not -changed. - -@itemx owner@samp{:}group -If the @var{owner} is followed by a colon and a @var{group} (a -group name or numeric group id), with no spaces between them, the group -ownership of the files is changed as well (to @var{group}). - -@itemx owner@samp{:} -If a colon but no group name follows @var{owner}, that user is -made the owner of the files and the group of the files is changed to -@var{owner}'s login group. - -@itemx @samp{:}group -If the colon and following @var{group} are given, but the owner -is omitted, only the group of the files is changed; in this case, -@code{chown} performs the same function as @code{chgrp}. - -@end table - -You may use @samp{.} in place of the @samp{:} separator. This is a -@sc{gnu} extension for compatibility with older scripts. -New scripts should avoid the use of @samp{.} because @sc{gnu} @code{chown} -may fail if @var{owner} contains @samp{.} characters. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -c -@itemx --changes -@opindex -c -@opindex --changes -@cindex changed owners, verbosely describing -Verbosely describe the action for each @var{file} whose ownership -actually changes. - -@item -f -@itemx --silent -@itemx --quiet -@opindex -f -@opindex --silent -@opindex --quiet -@cindex error messages, omitting -Do not print error messages about files whose ownership cannot be -changed. - -@itemx @w{@kbd{--from}=@var{old-owner}} -@opindex --from -@cindex symbolic links, changing owner -Change a @var{file}'s ownership only if it has current attributes specified -by @var{old-owner}. @var{old-owner} has the same form as @var{new-owner} -described above. -This option is useful primarily from a security standpoint in that -it narrows considerably the window of potential abuse. -For example, to reflect a UID numbering change for one user's files -without an option like this, @code{root} might run - -@smallexample -find / -owner OLDUSER -print0 | xargs -0 chown NEWUSER -@end smallexample - -But that is dangerous because the interval between when the @code{find} -tests the existing file's owner and when the @code{chown} is actually run -may be quite large. -One way to narrow the gap would be to invoke chown for each file -as it is found: - -@example -find / -owner OLDUSER -exec chown NEWUSER @{@} \; -@end example - -But that is very slow if there are many affected files. -With this option, it is safer (the gap is narrower still) -though still not perfect: - -@example -chown -R --from=OLDUSER NEWUSER / -@end example - -@item --dereference -@opindex --dereference -@cindex symbolic links, changing owner -@findex lchown -Do not act on symbolic links themselves but rather on what they point to. - -@item -h -@itemx --no-dereference -@opindex -h -@opindex --no-dereference -@cindex symbolic links, changing owner -@findex lchown -Act on symbolic links themselves instead of what they point to. -This is the default. -This mode relies on the @code{lchown} system call. -On systems that do not provide the @code{lchown} system call, -@code{chown} fails when a file specified on the command line -is a symbolic link. -By default, no diagnostic is issued for symbolic links encountered -during a recursive traversal, but see @samp{--verbose}. - -@item --reference=@var{ref_file} -@opindex --reference -Change the user and group of each @var{file} to be the same as those of -@var{ref_file}. If @var{ref_file} is a symbolic link, do not use the -user and group of the symbolic link, but rather those of the file it -refers to. - -@item -v -@itemx --verbose -@opindex -v -@opindex --verbose -Output a diagnostic for every file processed. -If a symbolic link is encountered during a recursive traversal -on a system without the @code{lchown} system call, and @samp{--no-dereference} -is in effect, then issue a diagnostic saying neither the symbolic link nor -its referent is being changed. - -@item -R -@itemx --recursive -@opindex -R -@opindex --recursive -@cindex recursively changing file ownership -Recursively change ownership of directories and their contents. - -@end table - - -@node chgrp invocation -@section @code{chgrp}: Change group ownership - -@pindex chgrp -@cindex group ownership, changing -@cindex changing group ownership - -@code{chgrp} changes the group ownership of each given @var{file} -to @var{group} (which can be either a group name or a numeric group id) -or to the group of an existing reference file. Synopsis: - -@example -chgrp [@var{option}]@dots{} @{@var{group} | --reference=@var{ref_file}@} @var{file}@dots{} -@end example - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -c -@itemx --changes -@opindex -c -@opindex --changes -@cindex changed files, verbosely describing -Verbosely describe the action for each @var{file} whose group actually -changes. - -@item -f -@itemx --silent -@itemx --quiet -@opindex -f -@opindex --silent -@opindex --quiet -@cindex error messages, omitting -Do not print error messages about files whose group cannot be -changed. - -@item --dereference -@opindex --dereference -@cindex symbolic links, changing owner -@findex lchown -Do not act on symbolic links themselves but rather on what they point to. - -@item -h -@itemx --no-dereference -@opindex -h -@opindex --no-dereference -@cindex symbolic links, changing group -@findex lchown -Act on symbolic links themselves instead of what they point to. -This is the default. -This mode relies on the @code{lchown} system call. -On systems that do not provide the @code{lchown} system call, -@code{chgrp} fails when a file specified on the command line -is a symbolic link. -By default, no diagnostic is issued for symbolic links encountered -during a recursive traversal, but see @samp{--verbose}. - -@item --reference=@var{ref_file} -@opindex --reference -Change the group of each @var{file} to be the same as that of -@var{ref_file}. If @var{ref_file} is a symbolic link, do not use the -group of the symbolic link, but rather that of the file it refers to. - -@item -v -@itemx --verbose -@opindex -v -@opindex --verbose -Output a diagnostic for every file processed. -If a symbolic link is encountered during a recursive traversal -on a system without the @code{lchown} system call, and @samp{--no-dereference} -is in effect, then issue a diagnostic saying neither the symbolic link nor -its referent is being changed. - -@item -R -@itemx --recursive -@opindex -R -@opindex --recursive -@cindex recursively changing group ownership -Recursively change the group ownership of directories and their contents. - -@end table - - -@node chmod invocation -@section @code{chmod}: Change access permissions - -@pindex chmod -@cindex changing access permissions -@cindex access permissions, changing -@cindex permissions, changing access - -@code{chmod} changes the access permissions of the named files. Synopsis: - -@example -chmod [@var{option}]@dots{} @{@var{mode} | --reference=@var{ref_file}@} @var{file}@dots{} -@end example - -@cindex symbolic links, permissions of -@code{chmod} never changes the permissions of symbolic links, since -the @code{chmod} system call cannot change their permissions. -This is not a problem since the permissions of symbolic links are -never used. However, for each symbolic link listed on the command -line, @code{chmod} changes the permissions of the pointed-to file. -In contrast, @code{chmod} ignores symbolic links encountered during -recursive directory traversals. - -If used, @var{mode} specifies the new permissions. -For details, see the section on @ref{File permissions}. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -c -@itemx --changes -@opindex -c -@opindex --changes -Verbosely describe the action for each @var{file} whose permissions -actually changes. - -@item -f -@itemx --silent -@itemx --quiet -@opindex -f -@opindex --silent -@opindex --quiet -@cindex error messages, omitting -Do not print error messages about files whose permissions cannot be -changed. - -@item -v -@itemx --verbose -@opindex -v -@opindex --verbose -Verbosely describe the action or non-action taken for every @var{file}. - -@item --reference=@var{ref_file} -@opindex --reference -Change the mode of each @var{file} to be the same as that of @var{ref_file}. -@xref{File permissions}. -If @var{ref_file} is a symbolic link, do not use the mode -of the symbolic link, but rather that of the file it refers to. - -@item -R -@itemx --recursive -@opindex -R -@opindex --recursive -@cindex recursively changing access permissions -Recursively change permissions of directories and their contents. - -@end table - - -@node touch invocation -@section @code{touch}: Change file timestamps - -@pindex touch -@cindex changing file timestamps -@cindex file timestamps, changing -@cindex timestamps, changing file - -@code{touch} changes the access and/or modification times of the -specified files. Synopsis: - -@example -touch [@var{option}]@dots{} @var{file}@dots{} -@end example - -If the first @var{file} would be a valid argument to the @samp{-t} -option and no timestamp is given with any of the @samp{-d}, @samp{-r}, -or @samp{-t} options and the @samp{--} argument is not given, that -argument is interpreted as the time for the other files instead of -as a file name. Warning: this usage is obsolescent, and future versions -of @sc{posix} will require that support for it be withdrawn. Use -@option{-t} instead. - -@cindex empty files, creating -Any @var{file} that does not exist is created empty. - -@cindex permissions, for changing file timestamps -If changing both the access and modification times to the current -time, @code{touch} can change the timestamps for files that the user -running it does not own but has write permission for. Otherwise, the -user must own the files. - -Although @code{touch} provides options for changing two of the times -- -the times of last access and modification -- of a file, there is actually -a third one as well: the inode change time. This is often referred to -as a file's @code{ctime}. -The inode change time represents the time when the file's meta-information -last changed. One common example of this is when the permissions of a -file change. Changing the permissions doesn't access the file, so -the atime doesn't change, nor does it modify the file, so the mtime -doesn't change. Yet, something about the file itself has changed, -and this must be noted somewhere. This is the job of the ctime field. -This is necessary, so that, for example, a backup program can make a -fresh copy of the file, including the new permissions value. -Another operation that modifies a file's ctime without affecting -the others is renaming. In any case, it is not possible, in normal -operations, for a user to change the ctime field to a user-specified value. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -a -@itemx --time=atime -@itemx --time=access -@itemx --time=use -@opindex -a -@opindex --time -@opindex atime@r{, changing} -@opindex access @r{time, changing} -@opindex use @r{time, changing} -Change the access time only. - -@item -c -@itemx --no-create -@opindex -c -@opindex --no-create -Do not create files that do not exist. - -@item -d -@itemx --date=time -@opindex -d -@opindex --date -@opindex time -Use @var{time} instead of the current time. It can contain month names, -time zones, @samp{am} and @samp{pm}, etc. @xref{Date input formats}. - -@item -f -@opindex -f -@cindex BSD @code{touch} compatibility -Ignored; for compatibility with BSD versions of @code{touch}. - -@item -m -@itemx --time=mtime -@itemx --time=modify -@opindex -m -@opindex --time -@opindex mtime@r{, changing} -@opindex modify @r{time, changing} -Change the modification time only. - -@item -r @var{file} -@itemx --reference=@var{file} -@opindex -r -@opindex --reference -Use the times of the reference @var{file} instead of the current time. - -@item -t [[CC]YY]MMDDhhmm[.ss] -Use the argument (optional four-digit or two-digit years, months, -days, hours, minutes, optional seconds) instead of the current time. -If the year is specified with only two digits, then @var{CC} -is 20 for years in the range 0 @dots{} 68, and 19 for years in -69 @dots{} 99. If no digits of the year are specified, -the argument is interpreted as a date in the current year. - -@end table - - -@node Disk usage -@chapter Disk usage - -@cindex disk usage - -No disk can hold an infinite amount of data. These commands report on -how much disk storage is in use or available. (This has nothing much to -do with how much @emph{main memory}, i.e., RAM, a program is using when -it runs; for that, you want @code{ps} or @code{pstat} or @code{swap} -or some such command.) - -@menu -* df invocation:: Report filesystem disk space usage. -* du invocation:: Estimate file space usage. -* sync invocation:: Synchronize memory and disk. -@end menu - - -@node df invocation -@section @code{df}: Report filesystem disk space usage - -@pindex df -@cindex filesystem disk usage -@cindex disk usage by filesystem - -@code{df} reports the amount of disk space used and available on -filesystems. Synopsis: - -@example -df [@var{option}]@dots{} [@var{file}]@dots{} -@end example - -With no arguments, @code{df} reports the space used and available on all -currently mounted filesystems (of all types). Otherwise, @code{df} -reports on the filesystem containing each argument @var{file}. - -Normally the disk space is printed in units of -1024 bytes, but this can be overridden (@pxref{Block size}). - -@cindex disk device file -@cindex device file, disk -If an argument @var{file} is a disk device file containing a mounted -filesystem, @code{df} shows the space available on that filesystem -rather than on the filesystem containing the device node (i.e., the root -filesystem). @sc{gnu} @code{df} does not attempt to determine the disk usage -on unmounted filesystems, because on most kinds of systems doing so -requires extremely nonportable intimate knowledge of filesystem -structures. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -a -@itemx --all -@opindex -a -@opindex --all -@cindex automounter filesystems -@cindex ignore filesystems -Include in the listing filesystems that have a size of 0 blocks, which -are omitted by default. Such filesystems are typically special-purpose -pseudo-filesystems, such as automounter entries. Also, filesystems of -type ``ignore'' or ``auto'', supported by some operating systems, are -only included if this option is specified. - -@item -h -@itemx --human-readable -@opindex -h -@opindex --human-readable -@cindex human-readable output -Append a size letter such as @samp{M} for megabytes to each size. -Powers of 1024 are used, not 1000; @samp{M} stands for 1,048,576 bytes. -Use the @samp{-H} or @samp{--si} option if you prefer powers of 1000. - -@item -H -@itemx --si -@opindex -H -@opindex --si -@cindex SI output -Append a size letter such as @samp{M} for megabytes to each size. (SI -is the International System of Units, which defines these letters as -prefixes.) Powers of 1000 are used, not 1024; @samp{M} stands for -1,000,000 bytes. Use the @samp{-h} or @samp{--human-readable} option if -you prefer powers of 1024. - -@item -i -@itemx --inodes -@opindex -i -@opindex --inodes -@cindex inode usage -List inode usage information instead of block usage. An inode (short -for index node) contains information about a file such as its owner, -permissions, timestamps, and location on the disk. - -@item -k -@itemx --kilobytes -@opindex -k -@opindex --kilobytes -@cindex kilobytes for filesystem sizes -Print sizes in 1024-byte blocks, overriding the default block size -(@pxref{Block size}). - -@item -l -@itemx --local -@opindex -l -@opindex --local -@cindex filesystem types, limiting output to certain -Limit the listing to local filesystems. By default, remote filesystems -are also listed. - -@item -m -@itemx --megabytes -@opindex -m -@opindex --megabytes -@cindex megabytes for filesystem sizes -Print sizes in megabyte (that is, 1,048,576-byte) blocks. - -@item --no-sync -@opindex --no-sync -@cindex filesystem space, retrieving old data more quickly -Do not invoke the @code{sync} system call before getting any usage data. -This may make @code{df} run significantly faster on systems with many -disks, but on some systems (notably SunOS) the results may be slightly -out of date. This is the default. - -@item -P -@itemx --portability -@opindex -P -@opindex --portability -@cindex one-line output format -@cindex @sc{posix} output format -@cindex portable output format -@cindex output format, portable -Use the @sc{posix} output format. This is like the default format except -for the following: - -@enumerate -@item -The information about each filesystem is always printed on exactly -one line; a mount device is never put on a line by itself. This means -that if the mount device name is more than 20 characters long (e.g., for -some network mounts), the columns are misaligned. - -@item -Non-integer values are rounded up, instead of being rounded down or -rounded to the nearest integer. - -@item -The labels in the header output line are changed to conform to @sc{posix}. -@end enumerate - -@item --sync -@opindex --sync -@cindex filesystem space, retrieving current data more slowly -Invoke the @code{sync} system call before getting any usage data. On -some systems (notably SunOS), doing this yields more up to date results, -but in general this option makes @code{df} much slower, especially when -there are many or very busy filesystems. - -@item -t @var{fstype} -@itemx --type=@var{fstype} -@opindex -t -@opindex --type -@cindex filesystem types, limiting output to certain -Limit the listing to filesystems of type @var{fstype}. Multiple -filesystem types can be specified by giving multiple @samp{-t} options. -By default, nothing is omitted. - -@item -T -@itemx --print-type -@opindex -T -@opindex --print-type -@cindex filesystem types, printing -Print each filesystem's type. The types printed here are the same ones -you can include or exclude with @samp{-t} and @samp{-x}. The particular -types printed are whatever is supported by the system. Here are some of -the common names (this list is certainly not exhaustive): - -@table @samp - -@item nfs -@cindex NFS filesystem type -An NFS filesystem, i.e., one mounted over a network from another -machine. This is the one type name which seems to be used uniformly by -all systems. - -@item 4.2@r{, }ufs@r{, }efs@dots{} -@cindex Linux filesystem types -@cindex local filesystem types -@opindex 4.2 @r{filesystem type} -@opindex ufs @r{filesystem type} -@opindex efs @r{filesystem type} -A filesystem on a locally-mounted hard disk. (The system might even -support more than one type here; Linux does.) - -@item hsfs@r{, }cdfs -@cindex CD-ROM filesystem type -@cindex High Sierra filesystem -@opindex hsfs @r{filesystem type} -@opindex cdfs @r{filesystem type} -A filesystem on a CD-ROM drive. HP-UX uses @samp{cdfs}, most other -systems use @samp{hsfs} (@samp{hs} for ``High Sierra''). - -@item pcfs -@cindex PC filesystem -@cindex DOS filesystem -@cindex MS-DOS filesystem -@cindex diskette filesystem -@opindex pcfs -An MS-DOS filesystem, usually on a diskette. - -@end table - -@item -x @var{fstype} -@itemx --exclude-type=@var{fstype} -@opindex -x -@opindex --exclude-type -Limit the listing to filesystems not of type @var{fstype}. -Multiple filesystem types can be eliminated by giving multiple -@samp{-x} options. By default, no filesystem types are omitted. - -@item -v -Ignored; for compatibility with System V versions of @code{df}. - -@end table - - -@node du invocation -@section @code{du}: Estimate file space usage - -@pindex du -@cindex file space usage -@cindex disk usage for files - -@code{du} reports the amount of disk space used by the specified files -and for each subdirectory (of directory arguments). Synopsis: - -@example -du [@var{option}]@dots{} [@var{file}]@dots{} -@end example - -With no arguments, @code{du} reports the disk space for the current -directory. Normally the disk space is printed in units of -1024 bytes, but this can be overridden (@pxref{Block size}). - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -a -@itemx --all -@opindex -a -@opindex --all -Show counts for all files, not just directories. - -@item -b -@itemx --bytes -@opindex -b -@opindex --bytes -Print sizes in bytes, overriding the default block size (@pxref{Block size}). - -@item -c -@itemx --total -@opindex -c -@opindex --total -@cindex grand total of disk space -Print a grand total of all arguments after all arguments have -been processed. This can be used to find out the total disk usage of -a given set of files or directories. - -@item -D -@itemx --dereference-args -@opindex -D -@opindex --dereference-args -Dereference symbolic links that are command line arguments. -Does not affect other symbolic links. This is helpful for finding -out the disk usage of directories, such as @file{/usr/tmp}, which -are often symbolic links. - -@item -h -@itemx --human-readable -@opindex -h -@opindex --human-readable -@cindex human-readable output -Append a size letter such as @samp{M} for megabytes to each size. -Powers of 1024 are used, not 1000; @samp{M} stands for 1,048,576 bytes. -Use the @samp{-H} or @samp{--si} option if you prefer powers of 1000. - -@item -H -@itemx --si -@opindex -H -@opindex --si -@cindex SI output -Append a size letter such as @samp{M} for megabytes to each size. (SI -is the International System of Units, which defines these letters as -prefixes.) Powers of 1000 are used, not 1024; @samp{M} stands for -1,000,000 bytes. Use the @samp{-h} or @samp{--human-readable} option if -you prefer powers of 1024. - -@item -k -@itemx --kilobytes -@opindex -k -@opindex --kilobytes -Print sizes in 1024-byte blocks, overriding the default block size -(@pxref{Block size}). - -@item -l -@itemx --count-links -@opindex -l -@opindex --count-links -@cindex hard links, counting in @code{du} -Count the size of all files, even if they have appeared already (as a -hard link). - -@item -L -@itemx --dereference -@opindex -L -@opindex --dereference -@cindex symbolic links, dereferencing in @code{du} -Dereference symbolic links (show the disk space used by the file -or directory that the link points to instead of the space used by -the link). - -@item --max-depth=@var{DEPTH} -@opindex --max-depth=@var{DEPTH} -@cindex limiting output of @code{du} -Show the total for each directory (and file if --all) that is at -most MAX_DEPTH levels down from the root of the hierarchy. The root -is at level 0, so @code{du --max-depth=0} is equivalent to @code{du -s}. - -@item -m -@itemx --megabytes -@opindex -m -@opindex --megabytes -@cindex megabytes for filesystem sizes -Print sizes in megabyte (that is, 1,048,576-byte) blocks. - -@item -s -@itemx --summarize -@opindex -s -@opindex --summarize -Display only a total for each argument. - -@item -S -@itemx --separate-dirs -@opindex -S -@opindex --separate-dirs -Report the size of each directory separately, not including the sizes -of subdirectories. - -@item -x -@itemx --one-file-system -@opindex -x -@opindex --one-file-system -@cindex one filesystem, restricting @code{du} to -Skip directories that are on different filesystems from the one that -the argument being processed is on. - -@item --exclude=@var{PAT} -@opindex --exclude=@var{PAT} -@cindex excluding files from @code{du} -When recursing, skip subdirectories or files matching @var{PAT}. -For example, @code{du --exclude='*.o'} excludes files whose names -end in @samp{.o}. - -@item -X @var{FILE} -@itemx --exclude-from=@var{FILE} -@opindex -X @var{FILE} -@opindex --exclude-from=@var{FILE} -@cindex excluding files from @code{du} -Like @samp{--exclude}, except take the patterns to exclude from @var{FILE}, -one per line. If @var{FILE} is @samp{-}, take the patterns from standard -input. - -@end table - -@cindex NFS mounts from BSD to HP-UX -On BSD systems, @code{du} reports sizes that are half the correct -values for files that are NFS-mounted from HP-UX systems. On HP-UX -systems, it reports sizes that are twice the correct values for -files that are NFS-mounted from BSD systems. This is due to a flaw -in HP-UX; it also affects the HP-UX @code{du} program. - - -@node sync invocation -@section @code{sync}: Synchronize data on disk with memory - -@pindex sync -@cindex synchronize disk and memory - -@cindex superblock, writing -@cindex inodes, written buffered -@code{sync} writes any data buffered in memory out to disk. This can -include (but is not limited to) modified superblocks, modified inodes, -and delayed reads and writes. This must be implemented by the kernel; -The @code{sync} program does nothing but exercise the @code{sync} system -call. - -@cindex crashes and corruption -The kernel keeps data in memory to avoid doing (relatively slow) disk -reads and writes. This improves performance, but if the computer -crashes, data may be lost or the filesystem corrupted as a -result. @code{sync} ensures everything in memory is written to disk. - -Any arguments are ignored, except for a lone @samp{--help} or -@samp{--version} (@pxref{Common options}). - -@node Printing text -@chapter Printing text - -@cindex printing text, commands for -@cindex commands for printing text - -This section describes commands that display text strings. - -@menu -* echo invocation:: Print a line of text. -* printf invocation:: Format and print data. -* yes invocation:: Print a string until interrupted. -@end menu - - -@node echo invocation -@section @code{echo}: Print a line of text - -@pindex echo -@cindex displaying text -@cindex printing text -@cindex text, displaying -@cindex arbitrary text, displaying - -@code{echo} writes each given @var{string} to standard output, with a -space between each and a newline after the last one. Synopsis: - -@example -echo [@var{option}]@dots{} [@var{string}]@dots{} -@end example - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp -@item -n -@opindex -n -Do not output the trailing newline. - -@item -e -@opindex -e -@cindex backslash escapes -Enable interpretation of the following backslash-escaped characters in -each @var{string}: - -@table @samp -@item \a -alert (bell) -@item \b -backspace -@item \c -suppress trailing newline -@item \f -form feed -@item \n -new line -@item \r -carriage return -@item \t -horizontal tab -@item \v -vertical tab -@item \\ -backslash -@item \@var{nnn} -the character whose ASCII code is @var{nnn} (octal); if @var{nnn} is not -a valid octal number, it is printed literally. -@end table - -@end table - - -@node printf invocation -@section @code{printf}: Format and print data - -@pindex printf -@code{printf} does formatted printing of text. Synopsis: - -@example -printf @var{format} [@var{argument}]@dots{} -@end example - -@code{printf} prints the @var{format} string, interpreting @samp{%} -directives and @samp{\} escapes in the same way as the C @code{printf} -function. The @var{format} argument is re-used as necessary to convert -all of the given @var{argument}s. - -@code{printf} has one additional directive, @samp{%b}, which prints its -argument string with @samp{\} escapes interpreted in the same way as in -the @var{format} string. - -@kindex \0ooo -@kindex \0xhhh -@code{printf} interprets @samp{\0ooo} in @var{format} as an octal number -(if @var{ooo} is 0 to 3 octal digits) specifying a character to print, -and @samp{\xhhh} as a hexadecimal number (if @var{hhh} is 1 to 3 hex -digits) specifying a character to print. - -@kindex \uhhhh -@kindex \Uhhhhhhhh -@code{printf} interprets two character syntaxes introduced in ISO C 99: -@samp{\u} for 16-bit Unicode characters, specified as 4 hex digits -@var{hhhh}, and @samp{\U} for 32-bit Unicode characters, specified as 8 hex -digits @var{hhhhhhhh}. @code{printf} outputs the Unicode characters -according to the LC_CTYPE part of the current locale, i.e. depending -on the values of the environment variables @code{LC_ALL}, @code{LC_CTYPE}, -@code{LANG}. - -The processing of @samp{\u} and @samp{\U} requires a full-featured -@code{iconv} facility. It is activated on systems with glibc 2.2 (or newer), -or when @code{libiconv} is installed prior to the sh-utils. Otherwise the -use of @samp{\u} and @samp{\U} will give an error message. - -@kindex \c -An additional escape, @samp{\c}, causes @code{printf} to produce no -further output. - -The only options are a lone @samp{--help} or -@samp{--version}. @xref{Common options}. - -The Unicode character syntaxes are useful for writing strings in a locale -independent way. For example, a string containing the Euro currency symbol - -@example -$ /usr/local/bin/printf '\u20AC 14.95' -@end example - -@noindent -will be output correctly in all locales supporting the Euro symbol -(ISO-8859-15, UTF-8, and others). Similarly, a Chinese string - -@example -$ /usr/local/bin/printf '\u4e2d\u6587' -@end example - -@noindent -will be output correctly in all Chinese locales (GB2312, BIG5, UTF-8, etc). - -Note that in these examples, the full pathname of @code{printf} has been -given, to distinguish it from the GNU @code{bash} builtin function -@code{printf}. - -For larger strings, you don't need to look up the hexadecimal code -values of each character one by one. ASCII characters mixed with \u -escape sequences is also known as the JAVA source file encoding. You can -use GNU recode 3.5c (or newer) to convert strings to this encoding. Here -is how to convert a piece of text into a shell script which will output -this text in a locale-independent way: - -@smallexample -$ LC_CTYPE=zh_CN.big5 /usr/local/bin/printf \ - '\u4e2d\u6587\n' > sample.txt -$ recode BIG5..JAVA < sample.txt \ - | sed -e "s|^|/usr/local/bin/printf '|" -e "s|$|\\\\n'|" \ - > sample.sh -@end smallexample - - -@node yes invocation -@section @code{yes}: Print a string until interrupted - -@pindex yes -@cindex repeated output of a string - -@code{yes} prints the command line arguments, separated by spaces and -followed by a newline, forever until it is killed. If no arguments are -given, it prints @samp{y} followed by a newline forever until killed. - -The only options are a lone @samp{--help} or @samp{--version}. -@xref{Common options}. - - -@node Conditions -@chapter Conditions - -@cindex conditions -@cindex commands for exit status -@cindex exit status commands - -This section describes commands that are primarily useful for their exit -status, rather than their output. Thus, they are often used as the -condition of shell @code{if} statements, or as the last command in a -pipeline. - -@menu -* false invocation:: Do nothing, unsuccessfully. -* true invocation:: Do nothing, successfully. -* test invocation:: Check file types and compare values. -* expr invocation:: Evaluate expressions. -@end menu - - -@node false invocation -@section @code{false}: Do nothing, unsuccessfully - -@pindex false -@cindex do nothing, unsuccessfully -@cindex failure exit status -@cindex exit status of @code{false} - -@code{false} does nothing except return an exit status of 1, meaning -@dfn{failure}. It can be used as a place holder in shell scripts -where an unsuccessful command is needed. - -By default, @code{false} honors the @samp{--help} and @samp{--version} -options. However, that is contrary to @sc{posix}, so when the environment -variable @env{POSIXLY_CORRECT} is set, @code{false} ignores @emph{all} -command line arguments, including @samp{--help} and @samp{--version}. - -This version of @code{false} is implemented as a C program, and is thus -more secure and faster than a shell script implementation, and may safely -be used as a dummy shell for the purpose of disabling accounts. - - -@node true invocation -@section @code{true}: Do nothing, successfully - -@pindex true -@cindex do nothing, successfully -@cindex no-op -@cindex successful exit -@cindex exit status of @code{true} - -@code{true} does nothing except return an exit status of 0, meaning -@dfn{success}. It can be used as a place holder in shell scripts -where a successful command is needed, although the shell built-in -command @code{:} (colon) may do the same thing faster. -In most modern shells, @code{true} is a built-in command, so when -you use @samp{true} in a script, you're probably using the built-in -command, not the one documented here. - -By default, @code{true} honors the @samp{--help} and @samp{--version} -options. However, that is contrary to @sc{posix}, so when the environment -variable @env{POSIXLY_CORRECT} is set, @code{true} ignores @emph{all} -command line arguments, including @samp{--help} and @samp{--version}. - -This version of @code{true} is implemented as a C program, and is thus -more secure and faster than a shell script implementation, and may safely -be used as a dummy shell for the purpose of disabling accounts. - -@node test invocation -@section @code{test}: Check file types and compare values - -@pindex test -@cindex check file types -@cindex compare values -@cindex expression evaluation - -@code{test} returns a status of 0 (true) or 1 (false) depending on the -evaluation of the conditional expression @var{expr}. Each part of the -expression must be a separate argument. - -@code{test} has file status checks, string operators, and numeric -comparison operators. - -@cindex conflicts with shell built-ins -@cindex built-in shell commands, conflicts with -Because most shells have a built-in command by the same name, using the -unadorned command name in a script or interactively may get you -different functionality than that described here. - -Besides the options below, @code{test} accepts a lone @samp{--help} or -@samp{--version}. @xref{Common options}. A single non-option argument -is also allowed: @code{test} returns true if the argument is not null. - -@menu -* File type tests:: -[bcdfhLpSt] -* Access permission tests:: -[gkruwxOG] -* File characteristic tests:: -e -s -nt -ot -ef -* String tests:: -z -n = != -* Numeric tests:: -eq -ne -lt -le -gt -ge -* Connectives for test:: ! -a -o -@end menu - - -@node File type tests -@subsection File type tests - -@cindex file type tests - -These options test for particular types of files. (Everything's a file, -but not all files are the same!) - -@table @samp - -@item -b @var{file} -@opindex -b -@cindex block special check -True if @var{file} exists and is a block special device. - -@item -c @var{file} -@opindex -c -@cindex character special check -True if @var{file} exists and is a character special device. - -@item -d @var{file} -@opindex -d -@cindex directory check -True if @var{file} exists and is a directory. - -@item -f @var{file} -@opindex -f -@cindex regular file check -True if @var{file} exists and is a regular file. - -@item -h @var{file} -@itemx -L @var{file} -@opindex -L -@opindex -h -@cindex symbolic link check -True if @var{file} exists and is a symbolic link. - -@item -p @var{file} -@opindex -p -@cindex named pipe check -True if @var{file} exists and is a named pipe. - -@item -S @var{file} -@opindex -S -@cindex socket check -True if @var{file} exists and is a socket. - -@item -t [@var{fd}] -@opindex -t -@cindex terminal check -True if @var{fd} is opened on a terminal. If @var{fd} is omitted, it -defaults to 1 (standard output). - -@end table - - -@node Access permission tests -@subsection Access permission tests - -@cindex access permission tests -@cindex permission tests - -These options test for particular access permissions. - -@table @samp - -@item -g @var{file} -@opindex -g -@cindex set-group-id check -True if @var{file} exists and has its set-group-id bit set. - -@item -k @var{file} -@opindex -k -@cindex sticky bit check -True if @var{file} has its @dfn{sticky} bit set. - -@item -r @var{file} -@opindex -r -@cindex readable file check -True if @var{file} exists and is readable. - -@item -u @var{file} -@opindex -u -@cindex set-user-id check -True if @var{file} exists and has its set-user-id bit set. - -@item -w @var{file} -@opindex -w -@cindex writable file check -True if @var{file} exists and is writable. - -@item -x @var{file} -@opindex -x -@cindex executable file check -True if @var{file} exists and is executable. - -@item -O @var{file} -@opindex -O -@cindex owned by effective uid check -True if @var{file} exists and is owned by the current effective user id. - -@item -G @var{file} -@opindex -G -@cindex owned by effective gid check -True if @var{file} exists and is owned by the current effective group id. - -@end table - -@node File characteristic tests -@subsection File characteristic tests - -@cindex file characteristic tests - -These options test other file characteristics. - -@table @samp - -@item -e @var{file} -@opindex -e -@cindex existence-of-file check -True if @var{file} exists. - -@item -s @var{file} -@opindex -s -@cindex nonempty file check -True if @var{file} exists and has a size greater than zero. - -@item @var{file1} -nt @var{file2} -@opindex -nt -@cindex newer-than file check -True if @var{file1} is newer (according to modification date) than -@var{file2}. - -@item @var{file1} -ot @var{file2} -@opindex -ot -@cindex older-than file check -True if @var{file1} is older (according to modification date) than -@var{file2}. - -@item @var{file1} -ef @var{file2} -@opindex -ef -@cindex same file check -@cindex hard link check -True if @var{file1} and @var{file2} have the same device and inode -numbers, i.e., if they are hard links to each other. - -@end table - - -@node String tests -@subsection String tests - -@cindex string tests - -These options test string characteristics. Strings are not quoted for -@code{test}, though you may need to quote them to protect characters -with special meaning to the shell, e.g., spaces. - -@table @samp - -@item -z @var{string} -@opindex -z -@cindex zero-length string check -True if the length of @var{string} is zero. - -@item -n @var{string} -@itemx @var{string} -@opindex -n -@cindex nonzero-length string check -True if the length of @var{string} is nonzero. - -@item @var{string1} = @var{string2} -@opindex = -@cindex equal string check -True if the strings are equal. - -@item @var{string1} != @var{string2} -@opindex != -@cindex not-equal string check -True if the strings are not equal. - -@end table - - -@node Numeric tests -@subsection Numeric tests - -@cindex numeric tests -@cindex arithmetic tests - -Numeric relationals. The arguments must be entirely numeric (possibly -negative), or the special expression @w{@code{-l @var{string}}}, which -evaluates to the length of @var{string}. - -@table @samp - -@item @var{arg1} -eq @var{arg2} -@itemx @var{arg1} -ne @var{arg2} -@itemx @var{arg1} -lt @var{arg2} -@itemx @var{arg1} -le @var{arg2} -@itemx @var{arg1} -gt @var{arg2} -@itemx @var{arg1} -ge @var{arg2} -@opindex -eq -@opindex -ne -@opindex -lt -@opindex -le -@opindex -gt -@opindex -ge -These arithmetic binary operators return true if @var{arg1} is equal, -not-equal, less-than, less-than-or-equal, greater-than, or -greater-than-or-equal than @var{arg2}, respectively. - -@end table - -For example: - -@example -test -1 -gt -2 && echo yes -@result{} yes -test -l abc -gt 1 && echo yes -@result{} yes -test 0x100 -eq 1 -@error{} test: integer expression expected before -eq -@end example - - -@node Connectives for test -@subsection Connectives for @code{test} - -@cindex logical connectives -@cindex connectives, logical - -The usual logical connectives. - -@table @samp - -@item ! @var{expr} -@opindex ! -True if @var{expr} is false. - -@item @var{expr1} -a @var{expr2} -@opindex -a -@cindex logical and operator -@cindex and operator -True if both @var{expr1} and @var{expr2} are true. - -@item @var{expr1} -o @var{expr2} -@opindex -o -@cindex logical or operator -@cindex or operator -True if either @var{expr1} or @var{expr2} is true. - -@end table - - -@node expr invocation -@section @code{expr}: Evaluate expressions - -@pindex expr -@cindex expression evaluation -@cindex evaluation of expressions - -@code{expr} evaluates an expression and writes the result on standard -output. Each token of the expression must be a separate argument. - -Operands are either numbers or strings. @code{expr} converts -anything appearing in an operand position to an integer or a string -depending on the operation being applied to it. - -Strings are not quoted for @code{expr} itself, though you may need to -quote them to protect characters with special meaning to the shell, -e.g., spaces. - -@cindex parentheses for grouping -Operators may given as infix symbols or prefix keywords. Parentheses -may be used for grouping in the usual manner (you must quote parentheses -to avoid the shell evaluating them, however). - -@cindex exit status of @code{expr} -Exit status: - -@display -0 if the expression is neither null nor 0, -1 if the expression is null or 0, -2 for invalid expressions. -@end display - -@menu -* String expressions:: <colon> match substr index length quote -* Numeric expressions:: + - * / % -* Relations for expr:: | & < <= = == != >= > -* Examples of expr:: Examples. -@end menu - - -@node String expressions -@subsection String expressions - -@cindex string expressions -@cindex expressions, string - -@code{expr} supports pattern matching and other string operators. These -have lower precedence than both the numeric and relational operators (in -the next sections). - -@table @samp - -@item @var{string} : @var{regex} -@cindex pattern matching -@cindex regular expression matching -@cindex matching patterns -Perform pattern matching. The arguments are converted to strings and the -second is considered to be a (basic, a la GNU @code{grep}) regular -expression, with a @code{^} implicitly prepended. The first argument is -then matched against this regular expression. - -If the match succeeds and @var{regex} uses @samp{\(} and @samp{\)}, the -@code{:} expression returns the part of @var{string} that matched the -subexpression; otherwise, it returns the number of characters matched. - -If the match fails, the @code{:} operator returns the null string if -@samp{\(} and @samp{\)} are used in @var{regex}, otherwise 0. - -@kindex \( @r{regexp operator} -Only the first @samp{\( @dots{} \)} pair is relevant to the return -value; additional pairs are meaningful only for grouping the regular -expression operators. - -@kindex \+ @r{regexp operator} -@kindex \? @r{regexp operator} -@kindex \| @r{regexp operator} -In the regular expression, @code{\+}, @code{\?}, and @code{\|} are -operators which respectively match one or more, zero or one, or separate -alternatives. SunOS and other @code{expr}'s treat these as regular -characters. (@sc{posix} allows either behavior.) -@xref{Top, , Regular Expression Library, regex, Regex}, for details of -regular expression syntax. Some examples are in @ref{Examples of expr}. - -@item match @var{string} @var{regex} -@findex match -An alternative way to do pattern matching. This is the same as -@w{@samp{@var{string} : @var{regex}}}. - -@item substr @var{string} @var{position} @var{length} -@findex substr -Returns the substring of @var{string} beginning at @var{position} -with length at most @var{length}. If either @var{position} or -@var{length} is negative, zero, or non-numeric, returns the null string. - -@item index @var{string} @var{charset} -@findex index -Returns the first position in @var{string} where the first character in -@var{charset} was found. If no character in @var{charset} is found in -@var{string}, return 0. - -@item length @var{string} -@findex length -Returns the length of @var{string}. - -@item quote @var{token} -@findex quote -Interpret @var{token} as a string, even if it is a keyword like @var{match} -or an operator like @code{/}. -This makes it possible to test @code{expr length quote "$x"} or -@code{expr quote "$x" : '.*/\(.\)'} and have it do the right thing even if -the value of @var{$x} happens to be (for example) @code{/} or @code{index}. -This operator is a GNU extension. It is disabled when -the environment variable @env{POSIXLY_CORRECT} is set. - -@end table - -To make @code{expr} interpret keywords as strings, you must use the -@code{quote} operator. - - -@node Numeric expressions -@subsection Numeric expressions - -@cindex numeric expressions -@cindex expressions, numeric - -@code{expr} supports the usual numeric operators, in order of increasing -precedence. The string operators (previous section) have lower precedence, -the connectives (next section) have higher. - -@table @samp - -@item + - -@kindex + -@kindex - -@cindex addition -@cindex subtraction -Addition and subtraction. Both arguments are converted to numbers; -an error occurs if this cannot be done. - -@item * / % -@kindex * -@kindex / -@kindex % -@cindex multiplication -@cindex division -@cindex remainder -Multiplication, division, remainder. Both arguments are converted to -numbers; an error occurs if this cannot be done. - -@end table - - -@node Relations for expr -@subsection Relations for @code{expr} - -@cindex connectives, logical -@cindex logical connectives -@cindex relations, numeric or string - -@code{expr} supports the usual logical connectives and relations. These -are higher precedence than either the string or numeric operators -(previous sections). Here is the list, lowest-precedence operator first. - -@table @samp - -@item | -@kindex | -@cindex logical or operator -@cindex or operator -Returns its first argument if that is neither null nor 0, otherwise its -second argument. - -@item & -@kindex & -@cindex logical and operator -@cindex and operator -Return its first argument if neither argument is null or 0, otherwise -0. - -@item < <= = == != >= > -@kindex < -@kindex <= -@kindex = -@kindex == -@kindex > -@kindex >= -@cindex comparison operators -Compare the arguments and return 1 if the relation is true, 0 otherwise. -@code{==} is a synonym for @code{=}. @code{expr} first tries to convert -both arguments to numbers and do a numeric comparison; if either -conversion fails, it does a lexicographic comparison. - -@end table - - -@node Examples of expr -@subsection Examples of using @code{expr} - -@cindex examples of @code{expr} -Here are a few examples, including quoting for shell metacharacters. - -To add 1 to the shell variable @code{foo}, in Bourne-compatible shells: -@example -foo=`expr $foo + 1` -@end example - -To print the non-directory part of the file name stored in -@code{$fname}, which need not contain a @code{/}. -@example -expr $fname : '.*/\(^.*\)' '^|' $fname -@end example - -An example showing that @code{\+} is an operator: -@example -expr aaa : 'a\+' -@result{} 3 -@end example - -@example -expr abc : 'a\(.\)c' -@result{} b -expr index abcdef cz -@result{} 3 -expr index index a -@error{} expr: syntax error -expr index quote index a -@result{} 0 -@end example - - -@node Redirection -@chapter Redirection - -@cindex redirection -@cindex commands for redirection - -Unix shells commonly provide several forms of @dfn{redirection}---ways -to change the input source or output destination of a command. But one -useful redirection is performed by a separate command, not by the shell; -it's described here. - -@menu -* tee invocation:: Redirect output to multiple files. -@end menu - - -@node tee invocation -@section @code{tee}: Redirect output to multiple files - -@pindex tee -@cindex pipe fitting -@cindex destinations, multiple output -@cindex read from stdin and write to stdout and files - -The @code{tee} command copies standard input to standard output and also -to any files given as arguments. This is useful when you want not only -to send some data down a pipe, but also to save a copy. Synopsis: - -@example -tee [@var{option}]@dots{} [@var{file}]@dots{} -@end example - -If a file being written to does not already exist, it is created. If a -file being written to already exists, the data it previously contained -is overwritten unless the @code{-a} option is used. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp -@item -a -@itemx --append -@opindex -a -@opindex --append -Append standard input to the given files rather than overwriting -them. - -@item -i -@itemx --ignore-interrupts -@opindex -i -@opindex --ignore-interrupts -Ignore interrupt signals. - -@end table - - -@node File name manipulation -@chapter File name manipulation - -@cindex file name manipulation -@cindex manipulation of file names -@cindex commands for file name manipulation - -This section describes commands that manipulate file names. - -@menu -* basename invocation:: Strip directory and suffix from a file name. -* dirname invocation:: Strip non-directory suffix from a file name. -* pathchk invocation:: Check file name portability. -@end menu - - -@node basename invocation -@section @code{basename}: Strip directory and suffix from a file name - -@pindex basename -@cindex strip directory and suffix from file names -@cindex directory, stripping from file names -@cindex suffix, stripping from file names -@cindex file names, stripping directory and suffix -@cindex leading directory components, stripping - -@code{basename} removes any leading directory components from -@var{name}. Synopsis: - -@example -basename @var{name} [@var{suffix}] -@end example - -If @var{suffix} is specified and is identical to the end of @var{name}, -it is removed from @var{name} as well. @code{basename} prints the -result on standard output. - -The only options are @samp{--help} and @samp{--version}. @xref{Common -options}. - - -@node dirname invocation -@section @code{dirname}: Strip non-directory suffix from a file name - -@pindex dirname -@cindex directory components, printing -@cindex stripping non-directory suffix -@cindex non-directory suffix, stripping - -@code{dirname} prints all but the final slash-delimited component of -a string (presumably a filename). Synopsis: - -@example -dirname @var{name} -@end example - -If @var{name} is a single component, @code{dirname} prints @samp{.} -(meaning the current directory). - -The only options are @samp{--help} and @samp{--version}. @xref{Common -options}. - - -@node pathchk invocation -@section @code{pathchk}: Check file name portability - -@pindex pathchk -@cindex file names, checking validity and portability -@cindex valid file names, checking for -@cindex portable file names, checking for - -@code{pathchk} checks portability of filenames. Synopsis: - -@example -pathchk [@var{option}]@dots{} @var{name}@dots{} -@end example - -For each @var{name}, @code{pathchk} prints a message if any of -these conditions is true: -@enumerate -@item -one of the existing directories in @var{name} does not have search -(execute) permission, -@item -the length of @var{name} is larger than its filesystem's maximum -file name length, -@item -the length of one component of @var{name}, corresponding to an -existing directory name, is larger than its filesystem's maximum -length for a file name component. -@end enumerate - -The program accepts the following option. Also see @ref{Common options}. - -@table @samp - -@item -p -@itemx --portability -@opindex -p -@opindex --portability -Instead of performing length checks on the underlying filesystem, -test the length of each file name and its components against the -@sc{posix.1} minimum limits for portability. Also check that the file -name contains no characters not in the portable file name character set. - -@end table - -@cindex exit status of @code{pathchk} -Exit status: - -@display -0 if all specified file names passed all of the tests, -1 otherwise. -@end display - - -@node Working context -@chapter Working context - -@cindex working context -@cindex commands for printing the working context - -This section describes commands that display or alter the context in -which you are working: the current directory, the terminal settings, and -so forth. See also the user-related commands in the next section. - -@menu -* pwd invocation:: Print working directory. -* stty invocation:: Print or change terminal characteristics. -* printenv invocation:: Print environment variables. -* tty invocation:: Print file name of terminal on standard input. -@end menu - - -@node pwd invocation -@section @code{pwd}: Print working directory - -@pindex pwd -@cindex print name of current directory -@cindex current working directory, printing -@cindex working directory, printing - -@cindex symbolic links and @code{pwd} -@code{pwd} prints the fully resolved name of the current directory. -That is, all components of the printed name will be actual directory -names---none will be symbolic links. - -@cindex conflicts with shell built-ins -@cindex built-in shell commands, conflicts with -Because most shells have a built-in command by the same name, using the -unadorned command name in a script or interactively may get you -different functionality than that described here. - -The only options are a lone @samp{--help} or -@samp{--version}. @xref{Common options}. - - -@node stty invocation -@section @code{stty}: Print or change terminal characteristics - -@pindex stty -@cindex change or print terminal settings -@cindex terminal settings -@cindex line settings of terminal - -@code{stty} prints or changes terminal characteristics, such as baud rate. -Synopses: - -@example -stty [@var{option}] [@var{setting}]@dots{} -stty [@var{option}] -@end example - -If given no line settings, @code{stty} prints the baud rate, line -discipline number (on systems that support it), and line settings -that have been changed from the values set by @samp{stty sane}. -By default, mode reading and setting are performed on the tty line -connected to standard input, although this can be modified by the -@samp{--file} option. - -@code{stty} accepts many non-option arguments that change aspects of -the terminal line operation, as described below. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp -@item -a -@itemx --all -@opindex -a -@opindex --all -Print all current settings in human-readable form. This option may not -be used in combination with any line settings. - -@item -F @var{device} -@itemx --file=@var{device} -@opindex -F -@opindex --file -Set the line opened by the filename specified in @var{device} instead of -the tty line connected to standard input. This option is necessary -because opening a @sc{posix} tty requires use of the @code{O_NONDELAY} flag to -prevent a @sc{posix} tty from blocking until the carrier detect line is high if -the @code{clocal} flag is not set. Hence, it is not always possible -to allow the shell to open the device in the traditional manner. - -@item -g -@itemx --save -@opindex -g -@opindex --save -@cindex machine-readable @code{stty} output -Print all current settings in a form that can be used as an argument to -another @code{stty} command to restore the current settings. This option -may not be used in combination with any line settings. - -@end table - -Many settings can be turned off by preceding them with a @samp{-}. -Such arguments are marked below with ``May be negated'' in their -description. The descriptions themselves refer to the positive -case, that is, when @emph{not} negated (unless stated otherwise, -of course). - -Some settings are not available on all @sc{posix} systems, since they use -extensions. Such arguments are marked below with ``Non-@sc{posix}'' in their -description. On non-@sc{posix} systems, those or other settings also may not -be available, but it's not feasible to document all the variations: just -try it and see. - -@menu -* Control:: Control settings -* Input:: Input settings -* Output:: Output settings -* Local:: Local settings -* Combination:: Combination settings -* Characters:: Special characters -* Special:: Special settings -@end menu - - -@node Control -@subsection Control settings - -@cindex control settings -Control settings: - -@table @samp -@item parenb -@opindex parenb -@cindex two-way parity -Generate parity bit in output and expect parity bit in input. -May be negated. - -@item parodd -@opindex parodd -@cindex odd parity -@cindex even parity -Set odd parity (even if negated). May be negated. - -@item cs5 -@itemx cs6 -@itemx cs7 -@itemx cs8 -@opindex cs@var{n} -@cindex character size -@cindex eight-bit characters -Set character size to 5, 6, 7, or 8 bits. - -@item hup -@itemx hupcl -@opindex hup[cl] -Send a hangup signal when the last process closes the tty. May be -negated. - -@item cstopb -@opindex cstopb -@cindex stop bits -Use two stop bits per character (one if negated). May be negated. - -@item cread -@opindex cread -Allow input to be received. May be negated. - -@item clocal -@opindex clocal -@cindex modem control -Disable modem control signals. May be negated. - -@item crtscts -@opindex crtscts -@cindex hardware flow control -@cindex flow control, hardware -@cindex RTS/CTS flow control -Enable RTS/CTS flow control. Non-@sc{posix}. May be negated. -@end table - - -@node Input -@subsection Input settings - -@cindex input settings - -@table @samp -@item ignbrk -@opindex ignbrk -@cindex breaks, ignoring -Ignore break characters. May be negated. - -@item brkint -@opindex brkint -@cindex breaks, cause interrupts -Make breaks cause an interrupt signal. May be negated. - -@item ignpar -@opindex ignpar -@cindex parity, ignoring -Ignore characters with parity errors. May be negated. - -@item parmrk -@opindex parmrk -@cindex parity errors, marking -Mark parity errors (with a 255-0-character sequence). May be negated. - -@item inpck -@opindex inpck -Enable input parity checking. May be negated. - -@item istrip -@opindex istrip -@cindex eight-bit input -Clear high (8th) bit of input characters. May be negated. - -@item inlcr -@opindex inlcr -@cindex newline, translating to return -Translate newline to carriage return. May be negated. - -@item igncr -@opindex igncr -@cindex return, ignoring -Ignore carriage return. May be negated. - -@item icrnl -@opindex icrnl -@cindex return, translating to newline -Translate carriage return to newline. May be negated. - -@item ixon -@opindex ixon -@kindex C-s/C-q flow control -@cindex XON/XOFF flow control -Enable XON/XOFF flow control (that is, @kbd{CTRL-S}/@kbd{CTRL-Q}). May -be negated. - -@item ixoff -@itemx tandem -@opindex ixoff -@opindex tandem -@cindex software flow control -@cindex flow control, software -Enable sending of @code{stop} character when the system input buffer -is almost full, and @code{start} character when it becomes almost -empty again. May be negated. - -@item iuclc -@opindex iuclc -@cindex uppercase, translating to lowercase -Translate uppercase characters to lowercase. Non-@sc{posix}. May be -negated. - -@item ixany -@opindex ixany -Allow any character to restart output (only the start character -if negated). Non-@sc{posix}. May be negated. - -@item imaxbel -@opindex imaxbel -@cindex beeping at input buffer full -Enable beeping and not flushing input buffer if a character arrives -when the input buffer is full. Non-@sc{posix}. May be negated. -@end table - - -@node Output -@subsection Output settings - -@cindex output settings -These arguments specify output-related operations. - -@table @samp -@item opost -@opindex opost -Postprocess output. May be negated. - -@item olcuc -@opindex olcuc -@cindex lowercase, translating to output -Translate lowercase characters to uppercase. Non-@sc{posix}. May be -negated. - -@item ocrnl -@opindex ocrnl -@cindex return, translating to newline -Translate carriage return to newline. Non-@sc{posix}. May be negated. - -@item onlcr -@opindex onlcr -@cindex newline, translating to crlf -Translate newline to carriage return-newline. Non-@sc{posix}. May be -negated. - -@item onocr -@opindex onocr -Do not print carriage returns in the first column. Non-@sc{posix}. -May be negated. - -@item onlret -@opindex onlret -Newline performs a carriage return. Non-@sc{posix}. May be negated. - -@item ofill -@opindex ofill -@cindex pad instead of timing for delaying -Use fill (padding) characters instead of timing for delays. Non-@sc{posix}. -May be negated. - -@item ofdel -@opindex ofdel -@cindex pad character -Use delete characters for fill instead of null characters. Non-@sc{posix}. -May be negated. - -@item nl1 -@itemx nl0 -@opindex nl@var{n} -Newline delay style. Non-@sc{posix}. - -@item cr3 -@itemx cr2 -@itemx cr1 -@itemx cr0 -@opindex cr@var{n} -Carriage return delay style. Non-@sc{posix}. - -@item tab3 -@itemx tab2 -@itemx tab1 -@itemx tab0 -@opindex tab@var{n} -Horizontal tab delay style. Non-@sc{posix}. - -@item bs1 -@itemx bs0 -@opindex bs@var{n} -Backspace delay style. Non-@sc{posix}. - -@item vt1 -@itemx vt0 -@opindex vt@var{n} -Vertical tab delay style. Non-@sc{posix}. - -@item ff1 -@itemx ff0 -@opindex ff@var{n} -Form feed delay style. Non-@sc{posix}. -@end table - - -@node Local -@subsection Local settings - -@cindex local settings - -@table @samp -@item isig -@opindex isig -Enable @code{interrupt}, @code{quit}, and @code{suspend} special -characters. May be negated. - -@item icanon -@opindex icanon -Enable @code{erase}, @code{kill}, @code{werase}, and @code{rprnt} -special characters. May be negated. - -@item iexten -@opindex iexten -Enable non-@sc{posix} special characters. May be negated. - -@item echo -@opindex echo -Echo input characters. May be negated. - -@item echoe -@itemx crterase -@opindex echoe -@opindex crterase -Echo @code{erase} characters as backspace-space-backspace. May be -negated. - -@item echok -@opindex echok -@cindex newline echoing after @code{kill} -Echo a newline after a @code{kill} character. May be negated. - -@item echonl -@opindex echonl -@cindex newline, echoing -Echo newline even if not echoing other characters. May be negated. - -@item noflsh -@opindex noflsh -@cindex flushing, disabling -Disable flushing after @code{interrupt} and @code{quit} special -characters. May be negated. - -@item xcase -@opindex xcase -@cindex case translation -Enable input and output of uppercase characters by preceding their -lowercase equivalents with @samp{\}, when @code{icanon} is set. -Non-@sc{posix}. May be negated. - -@item tostop -@opindex tostop -@cindex background jobs, stopping at terminal write -Stop background jobs that try to write to the terminal. Non-@sc{posix}. -May be negated. - -@item echoprt -@itemx prterase -@opindex echoprt -@opindex prterase -Echo erased characters backward, between @samp{\} and @samp{/}. -Non-@sc{posix}. May be negated. - -@item echoctl -@itemx ctlecho -@opindex echoctl -@opindex ctlecho -@cindex control characters, using @samp{^@var{c}} -@cindex hat notation for control characters -Echo control characters in hat notation (@samp{^@var{c}}) instead -of literally. Non-@sc{posix}. May be negated. - -@item echoke -@itemx crtkill -@opindex echoke -@opindex crtkill -Echo the @code{kill} special character by erasing each character on -the line as indicated by the @code{echoprt} and @code{echoe} settings, -instead of by the @code{echoctl} and @code{echok} settings. Non-@sc{posix}. -May be negated. -@end table - - -@node Combination -@subsection Combination settings - -@cindex combination settings -Combination settings: - -@table @samp -@item evenp -@opindex evenp -@itemx parity -@opindex parity -Same as @code{parenb -parodd cs7}. May be negated. If negated, same -as @code{-parenb cs8}. - -@item oddp -@opindex oddp -Same as @code{parenb parodd cs7}. May be negated. If negated, same -as @code{-parenb cs8}. - -@item nl -@opindex nl -Same as @code{-icrnl -onlcr}. May be negated. If negated, same as -@code{icrnl -inlcr -igncr onlcr -ocrnl -onlret}. - -@item ek -@opindex ek -Reset the @code{erase} and @code{kill} special characters to their default -values. - -@item sane -@opindex sane -Same as: -@c This is too long to write inline. -@example -cread -ignbrk brkint -inlcr -igncr icrnl -ixoff --iuclc -ixany imaxbel opost -olcuc -ocrnl onlcr --onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 -ff0 isig icanon iexten echo echoe echok -echonl --noflsh -xcase -tostop -echoprt echoctl echoke -@end example -@noindent and also sets all special characters to their default values. - -@item cooked -@opindex cooked -Same as @code{brkint ignpar istrip icrnl ixon opost isig icanon}, plus -sets the @code{eof} and @code{eol} characters to their default values -if they are the same as the @code{min} and @code{time} characters. -May be negated. If negated, same as @code{raw}. - -@item raw -@opindex raw -Same as: -@example --ignbrk -brkint -ignpar -parmrk -inpck -istrip --inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany --imaxbel -opost -isig -icanon -xcase min 1 time 0 -@end example -@noindent May be negated. If negated, same as @code{cooked}. - -@item cbreak -@opindex cbreak -Same as @code{-icanon}. May be negated. If negated, same as -@code{icanon}. - -@item pass8 -@opindex pass8 -@cindex eight-bit characters -Same as @code{-parenb -istrip cs8}. May be negated. If negated, -same as @code{parenb istrip cs7}. - -@item litout -@opindex litout -Same as @code{-parenb -istrip -opost cs8}. May be negated. -If negated, same as @code{parenb istrip opost cs7}. - -@item decctlq -@opindex decctlq -Same as @code{-ixany}. Non-@sc{posix}. May be negated. - -@item tabs -@opindex tabs -Same as @code{tab0}. Non-@sc{posix}. May be negated. If negated, same -as @code{tab3}. - -@item lcase -@itemx LCASE -@opindex lcase -@opindex LCASE -Same as @code{xcase iuclc olcuc}. Non-@sc{posix}. May be negated. - -@item crt -@opindex crt -Same as @code{echoe echoctl echoke}. - -@item dec -@opindex dec -Same as @code{echoe echoctl echoke -ixany intr ^C erase ^? kill C-u}. -@end table - - -@node Characters -@subsection Special characters - -@cindex special characters -@cindex characters, special - -The special characters' default values vary from system to system. -They are set with the syntax @samp{name value}, where the names are -listed below and the value can be given either literally, in hat -notation (@samp{^@var{c}}), or as an integer which may start with -@samp{0x} to indicate hexadecimal, @samp{0} to indicate octal, or -any other digit to indicate decimal. - -@cindex disabling special characters -@kindex u@r{, and disabling special characters} -For GNU stty, giving a value of @code{^-} or @code{undef} disables that -special character. (This is incompatible with Ultrix @code{stty}, -which uses a value of @samp{u} to disable a special character. GNU -@code{stty} treats a value @samp{u} like any other, namely to set that -special character to @key{U}.) - -@table @samp - -@item intr -@opindex intr -Send an interrupt signal. - -@item quit -@opindex quit -Send a quit signal. - -@item erase -@opindex erase -Erase the last character typed. - -@item kill -@opindex kill -Erase the current line. - -@item eof -@opindex eof -Send an end of file (terminate the input). - -@item eol -@opindex eol -End the line. - -@item eol2 -@opindex eol2 -Alternate character to end the line. Non-@sc{posix}. - -@item swtch -@opindex swtch -Switch to a different shell layer. Non-@sc{posix}. - -@item start -@opindex start -Restart the output after stopping it. - -@item stop -@opindex stop -Stop the output. - -@item susp -@opindex susp -Send a terminal stop signal. - -@item dsusp -@opindex dsusp -Send a terminal stop signal after flushing the input. Non-@sc{posix}. - -@item rprnt -@opindex rprnt -Redraw the current line. Non-@sc{posix}. - -@item werase -@opindex werase -Erase the last word typed. Non-@sc{posix}. - -@item lnext -@opindex lnext -Enter the next character typed literally, even if it is a special -character. Non-@sc{posix}. -@end table - - -@node Special -@subsection Special settings - -@cindex special settings - -@table @samp -@item min @var{n} -@opindex min -Set the minimum number of characters that will satisfy a read until -the time value has expired, when @code{-icanon} is set. - -@item time @var{n} -@opindex time -Set the number of tenths of a second before reads time out if the minimum -number of characters have not been read, when @code{-icanon} is set. - -@item ispeed @var{n} -@opindex ispeed -Set the input speed to @var{n}. - -@item ospeed @var{n} -@opindex ospeed -Set the output speed to @var{n}. - -@item rows @var{n} -@opindex rows -Tell the tty kernel driver that the terminal has @var{n} rows. Non-@sc{posix}. - -@item cols @var{n} -@itemx columns @var{n} -@opindex cols -@opindex columns -Tell the kernel that the terminal has @var{n} columns. Non-@sc{posix}. - -@item size -@opindex size -@vindex LINES -@vindex COLUMNS -Print the number of rows and columns that the kernel thinks the -terminal has. (Systems that don't support rows and columns in the kernel -typically use the environment variables @env{LINES} and @env{COLUMNS} -instead; however, GNU @code{stty} does not know anything about them.) -Non-@sc{posix}. - -@item line @var{n} -@opindex line -Use line discipline @var{n}. Non-@sc{posix}. - -@item speed -@opindex speed -Print the terminal speed. - -@item @var{n} -@cindex baud rate, setting -@c FIXME: Is this still true that the baud rate can't be set -@c higher than 38400? -Set the input and output speeds to @var{n}. @var{n} can be one -of: 0 50 75 110 134 134.5 150 200 300 600 1200 1800 2400 4800 9600 -19200 38400 @code{exta} @code{extb}. @code{exta} is the same as -19200; @code{extb} is the same as 38400. 0 hangs up the line if -@code{-clocal} is set. -@end table - - -@node printenv invocation -@section @code{printenv}: Print all or some environment variables - -@pindex printenv -@cindex printing all or some environment variables -@cindex environment variables, printing - -@code{printenv} prints environment variable values. Synopsis: - -@example -printenv [@var{option}] [@var{variable}]@dots{} -@end example - -If no @var{variable}s are specified, @code{printenv} prints the value of -every environment variable. Otherwise, it prints the value of each -@var{variable} that is set, and nothing for those that are not set. - -The only options are a lone @samp{--help} or @samp{--version}. -@xref{Common options}. - -@cindex exit status of @code{printenv} -Exit status: - -@display -0 if all variables specified were found -1 if at least one specified variable was not found -2 if a write error occurred -@end display - - -@node tty invocation -@section @code{tty}: Print file name of terminal on standard input - -@pindex tty -@cindex print terminal file name -@cindex terminal file name, printing - -@code{tty} prints the file name of the terminal connected to its standard -input. It prints @samp{not a tty} if standard input is not a terminal. -Synopsis: - -@example -tty [@var{option}]@dots{} -@end example - -The program accepts the following option. Also see @ref{Common options}. - -@table @samp - -@item -s -@itemx --silent -@itemx --quiet -@opindex -s -@opindex --silent -@opindex --quiet -Print nothing; only return an exit status. - -@end table - -@cindex exit status of @code{tty} -Exit status: - -@display -0 if standard input is a terminal -1 if standard input is not a terminal -2 if given incorrect arguments -3 if a write error occurs -@end display - - -@node User information -@chapter User information - -@cindex user information, commands for -@cindex commands for printing user information - -This section describes commands that print user-related information: -logins, groups, and so forth. - -@menu -* id invocation:: Print real and effective uid and gid. -* logname invocation:: Print current login name. -* whoami invocation:: Print effective user id. -* groups invocation:: Print group names a user is in. -* users invocation:: Print login names of users currently logged in. -* who invocation:: Print who is currently logged in. -@end menu - - -@node id invocation -@section @code{id}: Print real and effective uid and gid - -@pindex id -@cindex real uid and gid, printing -@cindex effective uid and gid, printing -@cindex printing real and effective uid and gid - -@code{id} prints information about the given user, or the process -running it if no user is specified. Synopsis: - -@example -id [@var{option}]@dots{} [@var{username}] -@end example - -By default, it prints the real user id, real group id, effective user id -if different from the real user id, effective group id if different from -the real group id, and supplemental group ids. - -Each of these numeric values is preceded by an identifying string and -followed by the corresponding user or group name in parentheses. - -The options cause @code{id} to print only part of the above information. -Also see @ref{Common options}. - -@table @samp -@item -g -@itemx --group -@opindex -g -@opindex --group -Print only the group id. - -@item -G -@itemx --groups -@opindex -G -@opindex --groups -Print only the supplementary groups. - -@item -n -@itemx --name -@opindex -n -@opindex --name -Print the user or group name instead of the ID number. Requires -@code{-u}, @code{-g}, or @code{-G}. - -@item -r -@itemx --real -@opindex -r -@opindex --real -Print the real, instead of effective, user or group id. Requires -@code{-u}, @code{-g}, or @code{-G}. - -@item -u -@itemx --user -@opindex -u -@opindex --user -Print only the user id. - -@end table - - -@node logname invocation -@section @code{logname}: Print current login name - -@pindex logname -@cindex printing user's login name -@cindex login name, printing -@cindex user name, printing - -@flindex /etc/utmp -@flindex utmp - -@code{logname} prints the calling user's name, as found in the file -@file{/etc/utmp}, and exits with a status of 0. If there is no -@file{/etc/utmp} entry for the calling process, @code{logname} prints -an error message and exits with a status of 1. - -The only options are @samp{--help} and @samp{--version}. @xref{Common -options}. - - -@node whoami invocation -@section @code{whoami}: Print effective user id - -@pindex whoami -@cindex effective UID, printing -@cindex printing the effective UID - -@code{whoami} prints the user name associated with the current -effective user id. It is equivalent to the command @samp{id -un}. - -The only options are @samp{--help} and @samp{--version}. @xref{Common -options}. - - -@node groups invocation -@section @code{groups}: Print group names a user is in - -@pindex groups -@cindex printing groups a user is in -@cindex supplementary groups, printing - -@code{groups} prints the names of the primary and any supplementary -groups for each given @var{username}, or the current process if no names -are given. If names are given, the name of each user is printed before -the list of that user's groups. Synopsis: - -@example -groups [@var{username}]@dots{} -@end example - -The group lists are equivalent to the output of the command @samp{id -Gn}. - -The only options are @samp{--help} and @samp{--version}. @xref{Common -options}. - - -@node users invocation -@section @code{users}: Print login names of users currently logged in - -@pindex users -@cindex printing current usernames -@cindex usernames, printing current - -@cindex login sessions, printing users with -@code{users} prints on a single line a blank-separated list of user -names of users currently logged in to the current host. Each user name -corresponds to a login session, so if a user has more than one login -session, that user's name will appear the same number of times in the -output. Synopsis: - -@example -users [@var{file}] -@end example - -@flindex /etc/utmp -@flindex /etc/wtmp -With no @var{file} argument, @code{users} extracts its information from -the file @file{/etc/utmp}. If a file argument is given, @code{users} -uses that file instead. A common choice is @file{/etc/wtmp}. - -The only options are @samp{--help} and @samp{--version}. @xref{Common -options}. - - -@node who invocation -@section @code{who}: Print who is currently logged in - -@pindex who -@cindex printing current user information -@cindex information, about current users - -@code{who} prints information about users who are currently logged on. -Synopsis: - -@example -@code{who} [@var{option}] [@var{file}] [am i] -@end example - -@cindex terminal lines, currently used -@cindex login time -@cindex remote hostname -If given no non-option arguments, @code{who} prints the following -information for each user currently logged on: login name, terminal -line, login time, and remote hostname or X display. - -@flindex /etc/utmp -@flindex /etc/wtmp -If given one non-option argument, @code{who} uses that instead of -@file{/etc/utmp} as the name of the file containing the record of -users logged on. @file{/etc/wtmp} is commonly given as an argument -to @code{who} to look at who has previously logged on. - -@opindex am i -@opindex who am i -If given two non-option arguments, @code{who} prints only the entry -for the user running it (determined from its standard input), preceded -by the hostname. Traditionally, the two arguments given are @samp{am -i}, as in @samp{who am i}. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp -@item -m -@opindex -m -Same as @samp{who am i}. - -@item -q -@itemx --count -@opindex -q -@opindex --count -Print only the login names and the number of users logged on. -Overrides all other options. - -@item -s -@opindex -s -Ignored; for compatibility with other versions of @code{who}. - -@item -i -@itemx -u -@itemx --idle -@opindex -i -@opindex -u -@opindex --idle -@cindex idle time -After the login time, print the number of hours and minutes that the -user has been idle. @samp{.} means the user was active in last minute. -@samp{old} means the user was idle for more than 24 hours. - -@item -l -@itemx --lookup -@opindex -l -@opindex --lookup -Attempt to canonicalize hostnames found in utmp through a DNS lookup. This -is not the default because it can cause significant delays on systems with -automatic dial-up internet access. - -@item -H -@itemx --heading -@opindex -H -@opindex --heading -Print a line of column headings. - -@item -w -@itemx -T -@itemx --mesg -@itemx --message -@itemx --writable -@opindex -w -@opindex -T -@opindex --mesg -@opindex --message -@opindex --writable -@cindex message status -@pindex write@r{, allowed} -After each login name print a character indicating the user's message status: - -@display -@samp{+} allowing @code{write} messages -@samp{-} disallowing @code{write} messages -@samp{?} cannot find terminal device -@end display - -@end table - - -@node System context -@chapter System context - -@cindex system context -@cindex context, system -@cindex commands for system context - -This section describes commands that print or change system-wide -information. - -@menu -* date invocation:: Print or set system date and time. -* uname invocation:: Print system information. -* hostname invocation:: Print or set system name. -* hostid invocation:: Print numeric host identifier. -@end menu - - -@node date invocation -@section @code{date}: Print or set system date and time - -@pindex date -@cindex time, printing or setting -@cindex printing the current time - -Synopses: - -@example -date [@var{option}]@dots{} [+@var{format}] -date [-u|--utc|--universal] @c this avoids a newline in the output -[ MMDDhhmm[[CC]YY][.ss] ] -@end example - -Invoking @code{date} with no @var{format} argument is equivalent to invoking -@samp{date '+%a %b %e %H:%M:%S %Z %Y'}. - -@findex strftime @r{and @code{date}} -@cindex time formats -@cindex formatting times -If given an argument that starts with a @samp{+}, @code{date} prints the -current time and date (or the time and date specified by the -@code{--date} option, see below) in the format defined by that argument, -which is the same as in the @code{strftime} function. Except for -directives, which start with @samp{%}, characters in the format string -are printed unchanged. The directives are described below. - -@menu -* Time directives:: %[HIklMprsSTXzZ] -* Date directives:: %[aAbBcdDhjmUwWxyY] -* Literal directives:: %[%nt] -* Padding:: Pad with zeroes, spaces (%_), or nothing (%-). -* Setting the time:: Changing the system clock. -* Options for date:: Instead of the current time. -* Examples of date:: Examples. -@end menu - -@node Time directives -@subsection Time directives - -@cindex time directives -@cindex directives, time - -@code{date} directives related to times. - -@table @samp -@item %H -hour (00@dots{}23) -@item %I -hour (01@dots{}12) -@item %k -hour ( 0@dots{}23) -@item %l -hour ( 1@dots{}12) -@item %M -minute (00@dots{}59) -@item %p -locale's AM or PM -@item %r -time, 12-hour (hh:mm:ss [AP]M) -@item %s -@cindex epoch, seconds since -@cindex seconds since the epoch -@cindex beginning of time -seconds since the epoch, i.e., 1 January 1970 00:00:00 UTC (a -GNU extension). -Note that this value is the number of seconds between the epoch -and the current date as defined by the localtime system call. -It isn't changed by the @samp{--date} option. -@item %S -second (00@dots{}60) -@item %T -time, 24-hour (hh:mm:ss) -@item %X -locale's time representation (%H:%M:%S) -@item %z -RFC-822 style numeric time zone (e.g., -0600 or +0100), or nothing if no -time zone is determinable. This value reflects the @emph{current} time -zone. It isn't changed by the @samp{--date} option. -@item %Z -time zone (e.g., EDT), or nothing if no time zone is -determinable. -Note that this value reflects the @emph{current} time zone. -It isn't changed by the @samp{--date} option. -@end table - - -@node Date directives -@subsection Date directives - -@cindex date directives -@cindex directives, date - -@code{date} directives related to dates. - -@table @samp -@item %a -locale's abbreviated weekday name (Sun@dots{}Sat) -@item %A -locale's full weekday name, variable length (Sunday@dots{}Saturday) -@item %b -locale's abbreviated month name (Jan@dots{}Dec) -@item %B -locale's full month name, variable length (January@dots{}December) -@item %c -locale's date and time (Sat Nov 04 12:02:33 EST 1989) -@item %C -century (year divided by 100 and truncated to an integer) (00@dots{}99) -@item %d -day of month (01@dots{}31) -@item %D -date (mm/dd/yy) -@item %h -same as %b -@item %j -day of year (001@dots{}366) -@item %m -month (01@dots{}12) -@item %U -week number of year with Sunday as first day of week (00@dots{}53). -Days in a new year preceding the first Sunday are in week zero. -@item %V -week number of year with Monday as first day of the week as a decimal -(01@dots{}53). If the week containing January 1 has four or more days in -the new year, then it is considered week 1; otherwise, it is week 53 of -the previous year, and the next week is week 1. (See the ISO 8601: 1988 -standard.) -@item %w -day of week (0@dots{}6) with 0 corresponding to Sunday -@item %W -week number of year with Monday as first day of week (00@dots{}53). -Days in a new year preceding the first Monday are in week zero. -@item %x -locale's date representation (mm/dd/yy) -@item %y -last two digits of year (00@dots{}99) -@item %Y -year (1970@dots{}.) -@end table - - -@node Literal directives -@subsection Literal directives - -@cindex literal directives -@cindex directives, literal - -@code{date} directives that produce literal strings. - -@table @samp -@item %% -a literal % -@item %n -a newline -@item %t -a horizontal tab -@end table - - -@node Padding -@subsection Padding - -@cindex numeric field padding -@cindex padding of numeric fields -@cindex fields, padding numeric - -By default, @code{date} pads numeric fields with zeroes, so that, for -example, numeric months are always output as two digits. GNU @code{date} -recognizes the following numeric modifiers between the @samp{%} and the -directive. - -@table @samp -@item - -(hyphen) do not pad the field; useful if the output is intended for -human consumption. -@item _ -(underscore) pad the field with spaces; useful if you need a fixed -number of characters in the output, but zeroes are too distracting. -@end table - -@noindent -These are GNU extensions. - -Here is an example illustrating the differences: - -@example -date +%d/%m -d "Feb 1" -@result{} 01/02 -date +%-d/%-m -d "Feb 1" -@result{} 1/2 -date +%_d/%_m -d "Feb 1" -@result{} 1/ 2 -@end example - - -@node Setting the time -@subsection Setting the time - -@cindex setting the time -@cindex time setting -@cindex appropriate privileges - -If given an argument that does not start with @samp{+}, @code{date} sets -the system clock to the time and date specified by that argument (as -described below). You must have appropriate privileges to set the -system clock. The @samp{--date} and @samp{--set} options may not be -used with such an argument. The @samp{--universal} option may be used -with such an argument to indicate that the specified time and date are -relative to Coordinated Universal Time rather than to the local time -zone. - -The argument must consist entirely of digits, which have the following -meaning: - -@table @samp -@item MM -month -@item DD -day within month -@item hh -hour -@item mm -minute -@item CC -first two digits of year (optional) -@item YY -last two digits of year (optional) -@item ss -second (optional) -@end table - -The @samp{--set} option also sets the system clock; see the next section. - - -@node Options for date -@subsection Options for @code{date} - -@cindex @code{date} options -@cindex options for @code{date} - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -d @var{datestr} -@itemx --date=@var{datestr} -@opindex -d -@opindex --date -@cindex parsing date strings -@cindex date strings, parsing -@cindex arbitrary date strings, parsing -@opindex yesterday -@opindex tomorrow -@opindex next @var{day} -@opindex last @var{day} -Display the time and date specified in @var{datestr} instead of the -current time and date. @var{datestr} can be in almost any common -format. It can contain month names, time zones, @samp{am} and @samp{pm}, -@samp{yesterday}, @samp{ago}, @samp{next}, etc. @xref{Date input formats}. - -@item -f @var{datefile} -@itemx --file=@var{datefile} -@opindex -f -@opindex --file -Parse each line in @var{datefile} as with @samp{-d} and display the -resulting time and date. If @var{datefile} is @samp{-}, use standard -input. This is useful when you have many dates to process, because the -system overhead of starting up the @code{date} executable many times can -be considerable. - -@item -I[@var{timespec}] -@itemx --iso-8601[=@var{timespec}] -@opindex -I[@var{timespec}] -@opindex --iso-8601[=@var{timespec}] -Display the date using the ISO 8601 format, @samp{%Y-%m-%d}. - -The optional argument @var{timespec} specifies the number of additional -terms of the time to include. It can be one of the following: -@table @samp -@item auto -The default behavior: print just the date. - -@item hours -Append the hour of the day to the date. - -@item minutes -Append the hours and minutes. - -@item seconds -Append the hours, minutes, and seconds. -@end table - -If showing any time terms, then include the time zone using the format -@samp{%z}. - -@item -R -@itemx --rfc-822 -@opindex -R -@opindex --rfc-822 -Display the time and date using the RFC-822-conforming -format, @samp{%a, %_d %b %Y %H:%M:%S %z}. - -@item -r @var{file} -@itemx --reference=@var{file} -@opindex -r -@opindex --reference -Display the time and date reference according to the last modification -time of @var{file}, instead of the current time and date. - -@item -s @var{datestr} -@itemx --set=@var{datestr} -@opindex -s -@opindex --set -Set the time and date to @var{datestr}. See @samp{-d} above. - -@item -u -@itemx --utc -@itemx --universal -@opindex -u -@opindex --utc -@opindex --universal -@cindex Coordinated Universal Time -@cindex UTC -@cindex Greenwich Mean Time -@cindex GMT -Use Coordinated Universal Time (@sc{utc}) by operating as if the -@env{TZ} environment variable were set to the string @samp{UTC0}. -Normally, @command{date} operates in the time zone indicated by -@env{TZ}, or the system default if @env{TZ} is not set. Coordinated -Universal Time is often called ``Greenwich Mean Time'' (@sc{gmt}) for -historical reasons. -@end table - - -@node Examples of date -@subsection Examples of @code{date} - -@cindex examples of @code{date} - -Here are a few examples. Also see the documentation for the @samp{-d} -option in the previous section. - -@itemize @bullet - -@item -To print the date of the day before yesterday: - -@example -date --date='2 days ago' -@end example - -@item -To print the date of the day three months and one day hence: -@example -date --date='3 months 1 day' -@end example - -@item -To print the day of year of Christmas in the current year: -@example -date --date='25 Dec' +%j -@end example - -@item -To print the current full month name and the day of the month: -@example -date '+%B %d' -@end example - -But this may not be what you want because for the first nine days of -the month, the @samp{%d} expands to a zero-padded two-digit field, -for example @samp{date -d 1may '+%B %d'} will print @samp{May 01}. - -@item -To print a date without the leading zero for one-digit days -of the month, you can use the (GNU extension) @code{-} modifier to suppress -the padding altogether. -@example -date -d 1may '+%B %-d -@end example - -@item -To print the current date and time in the format required by many -non-GNU versions of @code{date} when setting the system clock: -@example -date +%m%d%H%M%Y.%S -@end example - -@item -To set the system clock forward by two minutes: -@example -date --set='+2 minutes' -@end example - -@item -To print the date in the format specified by RFC-822, -use @samp{date --rfc}. I just did and saw this: - -@example -Mon, 25 Mar 1996 23:34:17 -0600 -@end example - -@item -To convert a date string to the number of seconds since the epoch -(which is 1970-01-01 00:00:00 UTC), use the @samp{--date} option with -the @samp{%s} format. That can be useful in sorting and/or graphing -and/or comparing data by date. The following command outputs the -number of the seconds since the epoch for the time two minutes after the -epoch: - -@example -date --date='1970-01-01 00:02:00 +0000' +%s -120 -@end example - -If you do not specify time zone information in the date string, -@command{date} uses your computer's idea of the time zone when -interpreting the string. For example, if your computer's time zone is -that of Cambridge, Massachusetts, which was then 5 hours (i.e., 18,000 -seconds) behind UTC: - -@example -# local time zone used -date --date='1970-01-01 00:02:00' +%s -18120 -@end example - -@item -If you're sorting or graphing dated data, your raw date values may be -represented as seconds since the epoch. But few people can look at -the date @samp{946684800} and casually note ``Oh, that's the first second -of the year 2000 in Greenwich, England.'' - -@example -date --date='2000-01-01 UTC' +%s -946684800 -@end example - -To convert such an unwieldy number of seconds back to -a more readable form, use a command like this: - -@smallexample -# local time zone used -date -d '1970-01-01 UTC 946684800 seconds' +"%Y-%m-%d %T %z" -1999-12-31 19:00:00 -0500 -@end smallexample - -@end itemize - - -@node uname invocation -@section @code{uname}: Print system information - -@pindex uname -@cindex print system information -@cindex system information, printing - -@code{uname} prints information about the machine and operating system -it is run on. If no options are given, @code{uname} acts as if the -@code{-s} option were given. Synopsis: - -@example -uname [@var{option}]@dots{} -@end example - -If multiple options or @code{-a} are given, the selected information is -printed in this order: - -@example -@var{sysname} @var{nodename} @var{release} @var{osversion} @var{machine} -@end example - -The @var{osversion}, at least, may well be multiple words. For example: - -@example -uname -a -@result{} Linux hayley 1.0.4 #3 Thu May 12 18:06:34 1994 i486 -@end example - - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -a -@itemx --all -@opindex -a -@opindex --all -Print all of the below information. - -@item -m -@itemx --machine -@opindex -m -@opindex --machine -@cindex machine type -@cindex hardware type -Print the machine (hardware) type. - -@item -n -@itemx --nodename -@opindex -n -@opindex --nodename -@cindex hostname -@cindex node name -@cindex network node name -Print the machine's network node hostname. - -@item -p -@itemx --processor -@opindex -p -@opindex --processor -@cindex host processor type -Print the machine's processor type - -@item -r -@itemx --release -@opindex -r -@opindex --release -@cindex operating system release -@cindex release of operating system -Print the operating system release. - -@item -s -@itemx --sysname -@opindex -s -@opindex --sysname -@cindex operating system name -@cindex name of operating system -Print the operating system name. - -@item -v -@opindex -v -@cindex operating system version -@cindex version of operating system -Print the operating system version. - -@end table - -@node hostname invocation -@section @code{hostname}: Print or set system name - -@pindex hostname -@cindex setting the hostname -@cindex printing the hostname -@cindex system name, printing -@cindex appropriate privileges - -With no arguments, @code{hostname} prints the name of the current host -system. With one argument, it sets the current host name to the -specified string. You must have appropriate privileges to set the host -name. Synopsis: - -@example -hostname [@var{name}] -@end example - -The only options are @samp{--help} and @samp{--version}. @xref{Common -options}. - - -@node hostid invocation -@section @code{hostid}: Print numeric host identifier. - -@pindex hostid -@cindex printing the host identifier - -@code{hostid} prints the numeric identifier of the current host -in hexadecimal. This command accepts no arguments. -The only options are @samp{--help} and @samp{--version}. -@xref{Common options}. - -For example, here's what it prints on one system I use: - -@example -$ hostid -1bac013d -@end example - -On that system, the 32-bit quantity happens to be closely -related to the system's Internet address, but that isn't always -the case. - - -@node Modified command invocation -@chapter Modified command invocation - -@cindex modified command invocation -@cindex invocation of commands, modified -@cindex commands for invoking other commands - -This section describes commands that run other commands in some context -different than the current one: a modified environment, as a different -user, etc. - -@menu -* chroot invocation:: Modify the root directory. -* env invocation:: Modify environment variables. -* nice invocation:: Modify scheduling priority. -* nohup invocation:: Immunize to hangups. -* su invocation:: Modify user and group id. -@end menu - - -@node chroot invocation -@section @code{chroot}: Run a command with a different root directory - -@pindex chroot -@cindex running a program in a specified root directory -@cindex root directory, running a program in a specified - -@code{chroot} runs a command with a specified root directory. -On many systems, only the super-user can do this. -Synopses: - -@example -chroot @var{newroot} [@var{command} [@var{args}]@dots{}] -chroot @var{option} -@end example - -Ordinarily, filenames are looked up starting at the root of the -directory structure, i.e., @file{/}. @code{chroot} changes the root to -the directory @var{newroot} (which must exist) and then runs -@var{command} with optional @var{args}. If @var{command} is not -specified, the default is the value of the @env{SHELL} environment -variable or @code{/bin/sh} if not set, invoked with the @samp{-i} option. - -The only options are @samp{--help} and @samp{--version}. @xref{Common -options}. - -Here are a few tips to help avoid common problems in using chroot. -To start with a simple example, make @var{command} refer to a statically -linked binary. If you were to use a dynamically linked executable, then -you'd have to arrange to have the shared libraries in the right place under -your new root directory. - -For example, if you create a statically linked `ls' executable, -and put it in /tmp/empty, you can run this command as root: - -@example -$ chroot /tmp/empty /ls -Rl / -@end example - -Then you'll see output like this: - -@example -/: -total 1023 --rwxr-xr-x 1 0 0 1041745 Aug 16 11:17 ls -@end example - -If you want to use a dynamically linked executable, say @code{bash}, -then first run @samp{ldd bash} to see what shared objects it needs. -Then, in addition to copying the actual binary, also copy the listed -files to the required positions under your intended new root directory. -Finally, if the executable requires any other files (e.g., data, state, -device files), copy them into place, too. - - -@node env invocation -@section @code{env}: Run a command in a modified environment - -@pindex env -@cindex environment, running a program in a modified -@cindex modified environment, running a program in a -@cindex running a program in a modified environment - -@code{env} runs a command with a modified environment. Synopses: - -@example -env [@var{option}]@dots{} [@var{name}=@var{value}]@dots{} @c -[@var{command} [@var{args}]@dots{}] -env -@end example - -Arguments of the form @samp{@var{variable}=@var{value}} set -the environment variable @var{variable} to value @var{value}. -@var{value} may be empty (@samp{@var{variable}=}). Setting a variable -to an empty value is different from unsetting it. - -@vindex PATH -The first remaining argument specifies the program name to invoke; it is -searched for according to the @env{PATH} environment variable. Any -remaining arguments are passed as arguments to that program. - -@cindex environment, printing - -If no command name is specified following the environment -specifications, the resulting environment is printed. This is like -specifying a command name of @code{printenv}. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp - -@item -u @var{name} -@itemx --unset=@var{name} -@opindex -u -@opindex -unset -Remove variable @var{name} from the environment, if it was in the -environment. - -@item - -@itemx -i -@itemx --ignore-environment -@opindex - -@opindex -i -@opindex --ignore-environment -Start with an empty environment, ignoring the inherited environment. - -@end table - - -@node nice invocation -@section @code{nice}: Run a command with modified scheduling priority - -@pindex nice -@cindex modifying scheduling priority -@cindex scheduling priority, modifying -@cindex priority, modifying -@cindex appropriate privileges - -@code{nice} prints or modifies the scheduling priority of a job. -Synopsis: - -@example -nice [@var{option}]@dots{} [@var{command} [@var{arg}]@dots{}] -@end example - -If no arguments are given, @code{nice} prints the current scheduling -priority, which it inherited. Otherwise, @code{nice} runs the given -@var{command} with its scheduling priority adjusted. If no -@var{adjustment} is given, the priority of the command is incremented by -10. You must have appropriate privileges to specify a negative -adjustment. The priority can be adjusted by @code{nice} over the range -of -20 (the highest priority) to 19 (the lowest). - -@cindex conflicts with shell built-ins -@cindex built-in shell commands, conflicts with -Because most shells have a built-in command by the same name, using the -unadorned command name in a script or interactively may get you -different functionality than that described here. - -The program accepts the following option. Also see @ref{Common options}. - -@table @samp -@item -n @var{adjustment} -@itemx -@var{adjustment} -@itemx --adjustment=@var{adjustment} -@opindex -n -@opindex --adjustment -@opindex -@var{adjustment} -Add @var{adjustment} instead of 10 to the command's priority. -@end table - - -@node nohup invocation -@section @code{nohup}: Run a command immune to hangups - -@pindex nohup -@cindex hangups, immunity to -@cindex immunity to hangups -@cindex logging out and continuing to run - -@flindex nohup.out -@code{nohup} runs the given @var{command} with hangup signals ignored, -so that the command can continue running in the background after you log -out. Synopsis: - -@example -nohup @var{command} [@var{arg}]@dots{} -@end example - -@flindex nohup.out -@code{nohup} increases the scheduling priority of @var{command} by 5, so -it has a slightly smaller chance to run. If standard output is a terminal, -it and standard error are redirected so that they are appended to the -file @file{nohup.out}; if that cannot be written to, they are appended -to the file @file{$HOME/nohup.out}. If that cannot be written to, the -command is not run. - -If @code{nohup} creates either @file{nohup.out} or -@file{$HOME/nohup.out}, it creates it with no ``group'' or ``other'' -access permissions. It does not change the permissions if the output -file already existed. - -@code{nohup} does not automatically put the command it runs in the -background; you must do that explicitly, by ending the command line -with an @samp{&}. - -The only options are @samp{--help} and @samp{--version}. @xref{Common -options}. - - -@node su invocation -@section @code{su}: Run a command with substitute user and group id - -@pindex su -@cindex substitute user and group ids -@cindex user id, switching -@cindex super-user, becoming -@cindex root, becoming - -@code{su} allows one user to temporarily become another user. It runs a -command (often an interactive shell) with the real and effective user -id, group id, and supplemental groups of a given @var{user}. Synopsis: - -@example -su [@var{option}]@dots{} [@var{user} [@var{arg}]@dots{}] -@end example - -@cindex passwd entry, and @code{su} shell -@flindex /bin/sh -@flindex /etc/passwd -If no @var{user} is given, the default is @code{root}, the super-user. -The shell to use is taken from @var{user}'s @code{passwd} entry, or -@file{/bin/sh} if none is specified there. If @var{user} has a -password, @code{su} prompts for the password unless run by a user with -effective user id of zero (the super-user). - -@vindex HOME -@vindex SHELL -@vindex USER -@vindex LOGNAME -@cindex login shell -By default, @code{su} does not change the current directory. -It sets the environment variables @env{HOME} and @env{SHELL} -from the password entry for @var{user}, and if @var{user} is not -the super-user, sets @env{USER} and @env{LOGNAME} to @var{user}. -By default, the shell is not a login shell. - -Any additional @var{arg}s are passed as additional arguments to the -shell. - -@cindex @samp{-su} -GNU @code{su} does not treat @file{/bin/sh} or any other shells specially -(e.g., by setting @code{argv[0]} to @samp{-su}, passing @code{-c} only -to certain shells, etc.). - -@findex syslog -@code{su} can optionally be compiled to use @code{syslog} to report -failed, and optionally successful, @code{su} attempts. (If the system -supports @code{syslog}.) However, GNU @code{su} does not check if the -user is a member of the @code{wheel} group; see below. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp -@item -c @var{command} -@itemx --command=@var{command} -@opindex -c -@opindex --command -Pass @var{command}, a single command line to run, to the shell with -a @code{-c} option instead of starting an interactive shell. - -@item -f -@itemx --fast -@opindex -f -@opindex --fast -@flindex .cshrc -@cindex file name pattern expansion, disabled -@cindex globbing, disabled -Pass the @code{-f} option to the shell. This probably only makes sense -if the shell run is @code{csh} or @code{tcsh}, for which the @code{-f} -option prevents reading the startup file (@file{.cshrc}). With -Bourne-like shells, the @code{-f} option disables file name pattern -expansion (globbing), which is not likely to be useful. - -@item - -@itemx -l -@itemx --login -@opindex - -@opindex -l -@opindex --login -@c other variables already indexed above -@vindex TERM -@vindex PATH -@cindex login shell, creating -Make the shell a login shell. This means the following. Unset all -environment variables except @env{TERM}, @env{HOME}, and @env{SHELL} -(which are set as described above), and @env{USER} and @env{LOGNAME} -(which are set, even for the super-user, as described above), and set -@env{PATH} to a compiled-in default value. Change to @var{user}'s home -directory. Prepend @samp{-} to the shell's name, intended to make it -read its login startup file(s). - -@item -m -@itemx -p -@itemx --preserve-environment -@opindex -m -@opindex -p -@opindex --preserve-environment -@cindex environment, preserving -@flindex /etc/shells -@cindex restricted shell -Do not change the environment variables @env{HOME}, @env{USER}, -@env{LOGNAME}, or @env{SHELL}. Run the shell given in the environment -variable @env{SHELL} instead of the shell from @var{user}'s passwd -entry, unless the user running @code{su} is not the superuser and -@var{user}'s shell is restricted. A @dfn{restricted shell} is one that -is not listed in the file @file{/etc/shells}, or in a compiled-in list -if that file does not exist. Parts of what this option does can be -overridden by @code{--login} and @code{--shell}. - -@item -s @var{shell} -@itemx --shell=@var{shell} -@opindex -s -@opindex --shell -Run @var{shell} instead of the shell from @var{user}'s passwd entry, -unless the user running @code{su} is not the superuser and @var{user}'s -shell is restricted (see @samp{-m} just above). - -@end table - -@cindex wheel group, not supported -@cindex group wheel, not supported -@cindex fascism -@heading Why GNU @code{su} does not support the @samp{wheel} group - -(This section is by Richard Stallman.) - -@cindex Twenex -@cindex MIT AI lab -Sometimes a few of the users try to hold total power over all the -rest. For example, in 1984, a few users at the MIT AI lab decided to -seize power by changing the operator password on the Twenex system and -keeping it secret from everyone else. (I was able to thwart this coup -and give power back to the users by patching the kernel, but I -wouldn't know how to do that in Unix.) - -However, occasionally the rulers do tell someone. Under the usual -@code{su} mechanism, once someone learns the root password who -sympathizes with the ordinary users, he or she can tell the rest. The -``wheel group'' feature would make this impossible, and thus cement the -power of the rulers. - -I'm on the side of the masses, not that of the rulers. If you are -used to supporting the bosses and sysadmins in whatever they do, you -might find this idea strange at first. - - -@node Delaying -@chapter Delaying - -@cindex delaying commands -@cindex commands for delaying - -@c Perhaps @code{wait} or other commands should be described here also? - -@menu -* sleep invocation:: Delay for a specified time. -@end menu - - -@node sleep invocation -@section @code{sleep}: Delay for a specified time - -@pindex sleep -@cindex delay for a specified time - -@code{sleep} pauses for an amount of time specified by the sum of -the values of the command line arguments. -Synopsis: - -@example -sleep @var{number}[smhd]@dots{} -@end example - -@cindex time units -Each argument is a number followed by an optional unit; the default -is seconds. The units are: - -@table @samp -@item s -seconds -@item m -minutes -@item h -hours -@item d -days -@end table - -Historical implementations of @code{sleep} have required that -@var{number} be an integer. However, GNU @code{sleep} accepts -arbitrary floating point numbers. - -The only options are @samp{--help} and @samp{--version}. @xref{Common -options}. - - -@node Numeric operations -@chapter Numeric operations - -@cindex numeric operations -These programs do numerically-related operations. - -@menu -* factor invocation:: Show factors of numbers. -* seq invocation:: Print sequences of numbers. -@end menu - - -@node factor invocation -@section @code{factor}: Print prime factors - -@pindex factor -@cindex prime factors - -@code{factor} prints prime factors. Synopses: - -@example -factor [@var{number}]@dots{} -factor @var{option} -@end example - -If no @var{number} is specified on the command line, @code{factor} reads -numbers from standard input, delimited by newlines, tabs, or spaces. - -The only options are @samp{--help} and @samp{--version}. @xref{Common -options}. - -The algorithm it uses is not very sophisticated, so for some inputs -@code{factor} runs for a long time. The hardest numbers to factor are -the products of large primes. Factoring the product of the two largest 32-bit -prime numbers takes over 10 minutes of CPU time on a 400MHz Pentium II. - -@example -$ p=`echo '4294967279 * 4294967291'|bc` -$ factor $p -18446743979220271189: 4294967279 4294967291 -@end example - -In contrast, @code{factor} factors the largest 64-bit number in just -over a tenth of a second: - -@example -$ factor `echo '2^64-1'|bc` -18446744073709551615: 3 5 17 257 641 65537 6700417 -@end example - -@node seq invocation -@section @code{seq}: Print numeric sequences - -@pindex seq -@cindex numeric sequences -@cindex sequence of numbers - -@code{seq} prints a sequence of numbers to standard output. Synopses: - -@example -seq [@var{option}]@dots{} [@var{first} [@var{increment}]] @var{last}@dots{} -@end example - -@code{seq} prints the numbers from @var{first} to @var{last} by -@var{increment}. By default, @var{first} and @var{increment} are both 1, -and each number is printed on its own line. All numbers can be reals, -not just integers. - -The program accepts the following options. Also see @ref{Common options}. - -@table @samp -@item -f @var{format} -@itemx --format=@var{format} -@opindex -f @var{format} -@opindex --format=@var{format} -@cindex formatting of numbers in @code{seq} -Print all numbers using @var{format}; default @samp{%g}. -@var{format} must contain exactly one of the floating point -output formats @samp{%e}, @samp{%f}, or @samp{%g}. - -@item -s @var{string} -@itemx --separator=@var{string} -@cindex separator for numbers in @code{seq} -Separate numbers with @var{string}; default is a newline. -The output always terminates with a newline. - -@item -w -@itemx --equal-width -Print all numbers with the same width, by padding with leading zeroes. -(To have other kinds of padding, use @samp{--format}). - -@end table - -If you want to use @code{seq} to print sequences of large integer values, -don't use the default @samp{%g} format since it can result in -loss of precision: - -@example -$ seq 1000000 1000001 -1e+06 -1e+06 -@end example - -Instead, you can use the format, @samp{%1.f}, -to print large decimal numbers with no exponent and no decimal point. - -@example -$ seq --format=%1.f 1000000 1000001 -1000000 -1000001 -@end example - -If you want hexadecimal output, you can use @code{printf} -to perform the conversion: - -@example -$ printf %x'\n' `seq -f %1.f 1048575 1024 1050623` -fffff -1003ff -1007ff -@end example - -For very long lists of numbers, use xargs to avoid -system limitations on the length of an argument list: - -@example -$ seq -f %1.f 1000000 | xargs printf %x'\n' |tail -3 -f423e -f423f -f4240 -@end example - -To generate octal output, use the printf @code{%o} format instead -of @code{%x}. Note however that using printf works only for numbers -smaller than @code{2^32}: - -@example -$ printf "%x\n" `seq -f %1.f 4294967295 4294967296` -ffffffff -bash: printf: 4294967296: Numerical result out of range -@end example - -On most systems, seq can produce whole-number output for values up to -@code{2^53}, so here's a more general approach to base conversion that -also happens to be more robust for such large numbers. It works by -using @code{bc} and setting its output radix variable, @var{obase}, -to @samp{16} in this case to produce hexadecimal output. - -@example -$ (echo obase=16; seq -f %1.f 4294967295 4294967296)|bc -FFFFFFFF -100000000 -@end example - -Be careful when using @code{seq} with a fractional @var{increment}, -otherwise you may see surprising results. Most people would expect to -see @code{0.3} printed as the last number in this example: - -@example -$ seq -s' ' 0 .1 .3 -0 0.1 0.2 -@end example - -But that doesn't happen on most systems because @code{seq} is -implemented using binary floating point arithmetic (via the C -@code{double} type) -- which means some decimal numbers like @code{.1} -cannot be represented exactly. That in turn means some nonintuitive -conditions like @code{.1 * 3 > .3} will end up being true. - -To work around that in the above example, use a slightly larger number as -the @var{last} value: - -@example -$ seq -s' ' 0 .1 .31 -0 0.1 0.2 0.3 -@end example - -In general, when using an @var{increment} with a fractional part, where -(@var{last} - @var{first}) / @var{increment} is (mathematically) a whole -number, specify a slightly larger (or smaller, if @var{increment} is negative) -value for @var{last} to ensure that @var{last} is the final value printed -by seq. - -@node File permissions -@chapter File permissions -@include perm.texi - -@include getdate.texi - -@c What's GNU? -@c Arnold Robbins -@node Opening the software toolbox -@chapter Opening the Software Toolbox - -This chapter originally appeared in @cite{Linux Journal}, volume 1, -number 2, in the @cite{What's GNU?} column. It was written by Arnold -Robbins. - -@menu -* Toolbox introduction:: Toolbox introduction -* I/O redirection:: I/O redirection -* The who command:: The @command{who} command -* The cut command:: The @command{cut} command -* The sort command:: The @command{sort} command -* The uniq command:: The @command{uniq} command -* Putting the tools together:: Putting the tools together -@end menu - - -@node Toolbox introduction -@unnumberedsec Toolbox Introduction - -This month's column is only peripherally related to the GNU Project, in -that it describes a number of the GNU tools on your GNU/Linux system and how they -might be used. What it's really about is the ``Software Tools'' philosophy -of program development and usage. - -The software tools philosophy was an important and integral concept -in the initial design and development of Unix (of which Linux and GNU are -essentially clones). Unfortunately, in the modern day press of -Internetworking and flashy GUIs, it seems to have fallen by the -wayside. This is a shame, since it provides a powerful mental model -for solving many kinds of problems. - -Many people carry a Swiss Army knife around in their pants pockets (or -purse). A Swiss Army knife is a handy tool to have: it has several knife -blades, a screwdriver, tweezers, toothpick, nail file, corkscrew, and perhaps -a number of other things on it. For the everyday, small miscellaneous jobs -where you need a simple, general purpose tool, it's just the thing. - -On the other hand, an experienced carpenter doesn't build a house using -a Swiss Army knife. Instead, he has a toolbox chock full of specialized -tools---a saw, a hammer, a screwdriver, a plane, and so on. And he knows -exactly when and where to use each tool; you won't catch him hammering nails -with the handle of his screwdriver. - -The Unix developers at Bell Labs were all professional programmers and trained -computer scientists. They had found that while a one-size-fits-all program -might appeal to a user because there's only one program to use, in practice -such programs are - -@enumerate a -@item -difficult to write, - -@item -difficult to maintain and -debug, and - -@item -difficult to extend to meet new situations. -@end enumerate - -Instead, they felt that programs should be specialized tools. In short, each -program ``should do one thing well.'' No more and no less. Such programs are -simpler to design, write, and get right---they only do one thing. - -Furthermore, they found that with the right machinery for hooking programs -together, that the whole was greater than the sum of the parts. By combining -several special purpose programs, you could accomplish a specific task -that none of the programs was designed for, and accomplish it much more -quickly and easily than if you had to write a special purpose program. -We will see some (classic) examples of this further on in the column. -(An important additional point was that, if necessary, take a detour -and build any software tools you may need first, if you don't already -have something appropriate in the toolbox.) - -@node I/O redirection -@unnumberedsec I/O Redirection - -Hopefully, you are familiar with the basics of I/O redirection in the -shell, in particular the concepts of ``standard input,'' ``standard output,'' -and ``standard error''. Briefly, ``standard input'' is a data source, where -data comes from. A program should not need to either know or care if the -data source is a disk file, a keyboard, a magnetic tape, or even a punched -card reader. Similarly, ``standard output'' is a data sink, where data goes -to. The program should neither know nor care where this might be. -Programs that only read their standard input, do something to the data, -and then send it on, are called @dfn{filters}, by analogy to filters in a -water pipeline. - -With the Unix shell, it's very easy to set up data pipelines: - -@smallexample -program_to_create_data | filter1 | .... | filterN > final.pretty.data -@end smallexample - -We start out by creating the raw data; each filter applies some successive -transformation to the data, until by the time it comes out of the pipeline, -it is in the desired form. - -This is fine and good for standard input and standard output. Where does the -standard error come in to play? Well, think about @command{filter1} in -the pipeline above. What happens if it encounters an error in the data it -sees? If it writes an error message to standard output, it will just -disappear down the pipeline into @command{filter2}'s input, and the -user will probably never see it. So programs need a place where they can send -error messages so that the user will notice them. This is standard error, -and it is usually connected to your console or window, even if you have -redirected standard output of your program away from your screen. - -For filter programs to work together, the format of the data has to be -agreed upon. The most straightforward and easiest format to use is simply -lines of text. Unix data files are generally just streams of bytes, with -lines delimited by the @sc{ascii} @sc{lf} (Line Feed) character, -conventionally called a ``newline'' in the Unix literature. (This is -@code{'\n'} if you're a C programmer.) This is the format used by all -the traditional filtering programs. (Many earlier operating systems -had elaborate facilities and special purpose programs for managing -binary data. Unix has always shied away from such things, under the -philosophy that it's easiest to simply be able to view and edit your -data with a text editor.) - -OK, enough introduction. Let's take a look at some of the tools, and then -we'll see how to hook them together in interesting ways. In the following -discussion, we will only present those command line options that interest -us. As you should always do, double check your system documentation -for the full story. - -@node The who command -@unnumberedsec The @command{who} Command - -The first program is the @command{who} command. By itself, it generates a -list of the users who are currently logged in. Although I'm writing -this on a single-user system, we'll pretend that several people are -logged in: - -@example -$ who -@print{} arnold console Jan 22 19:57 -@print{} miriam ttyp0 Jan 23 14:19(:0.0) -@print{} bill ttyp1 Jan 21 09:32(:0.0) -@print{} arnold ttyp2 Jan 23 20:48(:0.0) -@end example - -Here, the @samp{$} is the usual shell prompt, at which I typed @samp{who}. -There are three people logged in, and I am logged in twice. On traditional -Unix systems, user names are never more than eight characters long. This -little bit of trivia will be useful later. The output of @command{who} is nice, -but the data is not all that exciting. - -@node The cut command -@unnumberedsec The @command{cut} Command - -The next program we'll look at is the @command{cut} command. This program -cuts out columns or fields of input data. For example, we can tell it -to print just the login name and full name from the @file{/etc/passwd} -file. The @file{/etc/passwd} file has seven fields, separated by -colons: - -@example -arnold:xyzzy:2076:10:Arnold D. Robbins:/home/arnold:/bin/bash -@end example - -To get the first and fifth fields, we would use @command{cut} like this: - -@example -$ cut -d: -f1,5 /etc/passwd -@print{} root:Operator -@dots{} -@print{} arnold:Arnold D. Robbins -@print{} miriam:Miriam A. Robbins -@dots{} -@end example - -With the @option{-c} option, @command{cut} will cut out specific characters -(i.e., columns) in the input lines. This command looks like it might be -useful for data filtering. - - -@node The sort command -@unnumberedsec The @command{sort} Command - -Next we'll look at the @command{sort} command. This is one of the most -powerful commands on a Unix-style system; one that you will often find -yourself using when setting up fancy data plumbing. - -The @command{sort} -command reads and sorts each file named on the command line. It then -merges the sorted data and writes it to standard output. It will read -standard input if no files are given on the command line (thus -making it into a filter). The sort is based on the character collating -sequence or based on user-supplied ordering criteria. - - -@node The uniq command -@unnumberedsec The @command{uniq} Command - -Finally (at least for now), we'll look at the @command{uniq} program. When -sorting data, you will often end up with duplicate lines, lines that -are identical. Usually, all you need is one instance of each line. -This is where @command{uniq} comes in. The @command{uniq} program reads its -standard input, which it expects to be sorted. It only prints out one -copy of each duplicated line. It does have several options. Later on, -we'll use the @option{-c} option, which prints each unique line, preceded -by a count of the number of times that line occurred in the input. - - -@node Putting the tools together -@unnumberedsec Putting the Tools Together - -Now, let's suppose this is a large ISP server system with dozens of users -logged in. The management wants the system administrator to write a program that will -generate a sorted list of logged in users. Furthermore, even if a user -is logged in multiple times, his or her name should only show up in the -output once. - -The administrator could sit down with the system documentation and write a C -program that did this. It would take perhaps a couple of hundred lines -of code and about two hours to write it, test it, and debug it. -However, knowing the software toolbox, the administrator can instead start out -by generating just a list of logged on users: - -@example -$ who | cut -c1-8 -@print{} arnold -@print{} miriam -@print{} bill -@print{} arnold -@end example - -Next, sort the list: - -@example -$ who | cut -c1-8 | sort -@print{} arnold -@print{} arnold -@print{} bill -@print{} miriam -@end example - -Finally, run the sorted list through @command{uniq}, to weed out duplicates: - -@example -$ who | cut -c1-8 | sort | uniq -@print{} arnold -@print{} bill -@print{} miriam -@end example - -The @command{sort} command actually has a @option{-u} option that does what -@command{uniq} does. However, @command{uniq} has other uses for which one -cannot substitute @samp{sort -u}. - -The administrator puts this pipeline into a shell script, and makes it available for -all the users on the system (@samp{#} is the system administrator, -or @code{root}, prompt): - -@example -# cat > /usr/local/bin/listusers -who | cut -c1-8 | sort | uniq -^D -# chmod +x /usr/local/bin/listusers -@end example - -There are four major points to note here. First, with just four -programs, on one command line, the administrator was able to save about two -hours worth of work. Furthermore, the shell pipeline is just about as -efficient as the C program would be, and it is much more efficient in -terms of programmer time. People time is much more expensive than -computer time, and in our modern ``there's never enough time to do -everything'' society, saving two hours of programmer time is no mean -feat. - -Second, it is also important to emphasize that with the -@emph{combination} of the tools, it is possible to do a special -purpose job never imagined by the authors of the individual programs. - -Third, it is also valuable to build up your pipeline in stages, as we did here. -This allows you to view the data at each stage in the pipeline, which helps -you acquire the confidence that you are indeed using these tools correctly. - -Finally, by bundling the pipeline in a shell script, other users can use -your command, without having to remember the fancy plumbing you set up for -them. In terms of how you run them, shell scripts and compiled programs are -indistinguishable. - -After the previous warm-up exercise, we'll look at two additional, more -complicated pipelines. For them, we need to introduce two more tools. - -The first is the @command{tr} command, which stands for ``transliterate.'' -The @command{tr} command works on a character-by-character basis, changing -characters. Normally it is used for things like mapping upper case to -lower case: - -@example -$ echo ThIs ExAmPlE HaS MIXED case! | tr '[A-Z]' '[a-z]' -@print{} this example has mixed case! -@end example - -There are several options of interest: - -@table @code -@item -c -work on the complement of the listed characters, i.e., -operations apply to characters not in the given set - -@item -d -delete characters in the first set from the output - -@item -s -squeeze repeated characters in the output into just one character. -@end table - -We will be using all three options in a moment. - -The other command we'll look at is @command{comm}. The @command{comm} -command takes two sorted input files as input data, and prints out the -files' lines in three columns. The output columns are the data lines -unique to the first file, the data lines unique to the second file, and -the data lines that are common to both. The @option{-1}, @option{-2}, and -@option{-3} command line options @emph{omit} the respective columns. (This is -non-intuitive and takes a little getting used to.) For example: - -@example -$ cat f1 -@print{} 11111 -@print{} 22222 -@print{} 33333 -@print{} 44444 -$ cat f2 -@print{} 00000 -@print{} 22222 -@print{} 33333 -@print{} 55555 -$ comm f1 f2 -@print{} 00000 -@print{} 11111 -@print{} 22222 -@print{} 33333 -@print{} 44444 -@print{} 55555 -@end example - -The single dash as a filename tells @command{comm} to read standard input -instead of a regular file. - -Now we're ready to build a fancy pipeline. The first application is a word -frequency counter. This helps an author determine if he or she is over-using -certain words. - -The first step is to change the case of all the letters in our input file -to one case. ``The'' and ``the'' are the same word when doing counting. - -@example -$ tr '[A-Z]' '[a-z]' < whats.gnu | ... -@end example - -The next step is to get rid of punctuation. Quoted words and unquoted words -should be treated identically; it's easiest to just get the punctuation out of -the way. - -@smallexample -$ tr '[A-Z]' '[a-z]' < whats.gnu | tr -cd '[A-Za-z0-9_ \012]' | ... -@end smallexample - -The second @command{tr} command operates on the complement of the listed -characters, which are all the letters, the digits, the underscore, and -the blank. The @samp{\012} represents the newline character; it has to -be left alone. (The @sc{ascii} tab character should also be included for -good measure in a production script.) - -At this point, we have data consisting of words separated by blank space. -The words only contain alphanumeric characters (and the underscore). The -next step is break the data apart so that we have one word per line. This -makes the counting operation much easier, as we will see shortly. - -@smallexample -$ tr '[A-Z]' '[a-z]' < whats.gnu | tr -cd '[A-Za-z0-9_ \012]' | -> tr -s '[ ]' '\012' | ... -@end smallexample - -This command turns blanks into newlines. The @option{-s} option squeezes -multiple newline characters in the output into just one. This helps us -avoid blank lines. (The @samp{>} is the shell's ``secondary prompt.'' -This is what the shell prints when it notices you haven't finished -typing in all of a command.) - -We now have data consisting of one word per line, no punctuation, all one -case. We're ready to count each word: - -@smallexample -$ tr '[A-Z]' '[a-z]' < whats.gnu | tr -cd '[A-Za-z0-9_ \012]' | -> tr -s '[ ]' '\012' | sort | uniq -c | ... -@end smallexample - -At this point, the data might look something like this: - -@example - 60 a - 2 able - 6 about - 1 above - 2 accomplish - 1 acquire - 1 actually - 2 additional -@end example - -The output is sorted by word, not by count! What we want is the most -frequently used words first. Fortunately, this is easy to accomplish, -with the help of two more @command{sort} options: - -@table @code -@item -n -do a numeric sort, not a textual one - -@item -r -reverse the order of the sort -@end table - -The final pipeline looks like this: - -@smallexample -$ tr '[A-Z]' '[a-z]' < whats.gnu | tr -cd '[A-Za-z0-9_ \012]' | -> tr -s '[ ]' '\012' | sort | uniq -c | sort -nr -@print{} 156 the -@print{} 60 a -@print{} 58 to -@print{} 51 of -@print{} 51 and -@dots{} -@end smallexample - -Whew! That's a lot to digest. Yet, the same principles apply. With six -commands, on two lines (really one long one split for convenience), we've -created a program that does something interesting and useful, in much -less time than we could have written a C program to do the same thing. - -A minor modification to the above pipeline can give us a simple spelling -checker! To determine if you've spelled a word correctly, all you have to -do is look it up in a dictionary. If it is not there, then chances are -that your spelling is incorrect. So, we need a dictionary. -The conventional location for a dictionary is @file{/usr/dict/words}. -On my GNU/Linux system,@footnote{Redhat Linux 6.1, for the November 2000 -revision of this article.} -this is a is a sorted, 45,402 word dictionary. - -Now, how to compare our file with the dictionary? As before, we generate -a sorted list of words, one per line: - -@smallexample -$ tr '[A-Z]' '[a-z]' < whats.gnu | tr -cd '[A-Za-z0-9_ \012]' | -> tr -s '[ ]' '\012' | sort -u | ... -@end smallexample - -Now, all we need is a list of words that are @emph{not} in the -dictionary. Here is where the @command{comm} command comes in. - -@smallexample -$ tr '[A-Z]' '[a-z]' < whats.gnu | tr -cd '[A-Za-z0-9_ \012]' | -> tr -s '[ ]' '\012' | sort -u | -> comm -23 - /usr/dict/words -@end smallexample - -The @option{-2} and @option{-3} options eliminate lines that are only in the -dictionary (the second file), and lines that are in both files. Lines -only in the first file (standard input, our stream of words), are -words that are not in the dictionary. These are likely candidates for -spelling errors. This pipeline was the first cut at a production -spelling checker on Unix. - -There are some other tools that deserve brief mention. - -@table @command -@item grep -search files for text that matches a regular expression - -@item egrep -like @command{grep}, but with more powerful regular expressions - -@item wc -count lines, words, characters - -@item tee -a T-fitting for data pipes, copies data to files and to standard output - -@item sed -the stream editor, an advanced tool - -@item awk -a data manipulation language, another advanced tool -@end table - -The software tools philosophy also espoused the following bit of -advice: ``Let someone else do the hard part.'' This means, take -something that gives you most of what you need, and then massage it the -rest of the way until it's in the form that you want. - -To summarize: - -@enumerate 1 -@item -Each program should do one thing well. No more, no less. - -@item -Combining programs with appropriate plumbing leads to results where -the whole is greater than the sum of the parts. It also leads to novel -uses of programs that the authors might never have imagined. - -@item -Programs should never print extraneous header or trailer data, since these -could get sent on down a pipeline. (A point we didn't mention earlier.) - -@item -Let someone else do the hard part. - -@item -Know your toolbox! Use each program appropriately. If you don't have an -appropriate tool, build one. -@end enumerate - -As of this writing, all the programs we've discussed are available via -anonymous @command{ftp} from: @* -@uref{ftp://gnudist.gnu.org/textutils/textutils-1.22.tar.gz}. (There may -be more recent versions available now.) - -None of what I have presented in this column is new. The Software Tools -philosophy was first introduced in the book @cite{Software Tools}, by -Brian Kernighan and P.J. Plauger (Addison-Wesley, ISBN 0-201-03669-X). -This book showed how to write and use software tools. It was written in -1976, using a preprocessor for FORTRAN named @command{ratfor} (RATional -FORtran). At the time, C was not as ubiquitous as it is now; FORTRAN -was. The last chapter presented a @command{ratfor} to FORTRAN -processor, written in @command{ratfor}. @command{ratfor} looks an awful -lot like C; if you know C, you won't have any problem following the -code. - -In 1981, the book was updated and made available as @cite{Software Tools -in Pascal} (Addison-Wesley, ISBN 0-201-10342-7). The first book is -still in print; the second, alas, is not. Both books are well worth -reading if you're a programmer. They certainly made a major change in -how I view programming. - -Initially, the programs in both books were available (on 9-track tape) -from Addison-Wesley. Unfortunately, this is no longer the case, -although the @command{ratfor} versions are available from -@uref{http://cm.bell-labs.come/who/bwk, Brian Kernighan's home page}, -and you might be able to find copies of the Pascal versions floating -around the Internet. For a number of years, there was an active -Software Tools Users Group, whose members had ported the original -@command{ratfor} programs to essentially every computer system with a -FORTRAN compiler. The popularity of the group waned in the middle 1980s -as Unix began to spread beyond universities. - -With the current proliferation of GNU code and other clones of Unix programs, -these programs now receive little attention; modern C versions are -much more efficient and do more than these programs do. Nevertheless, as -exposition of good programming style, and evangelism for a still-valuable -philosophy, these books are unparalleled, and I recommend them highly. - -Acknowledgment: I would like to express my gratitude to Brian Kernighan -of Bell Labs, the original Software Toolsmith, for reviewing this column. - -@include doclicense.texi - -@node Index -@unnumbered Index - -@printindex cp - -@shortcontents -@contents -@bye - -@c Local variables: -@c texinfo-column-for-description: 32 -@c End: |