的命令执行过程如图2-1所示。
filestdincommandstderrstdoutfile/devicefile/device图2-1 linux命令执行过程
然而,有时候需要改变这种默认的情况,也就是将命令的输入和输出不是来自标准输入或者执行结果输出到标准输出之外的设备或文件中去,这时,就需要使用shell数据重定向符。
数据重定向符: ? “<”:改变读入的数据信道(stdin),使之从指定的档案读入; ? “>”:改变送出的数据信道(stdout, stderr),使之输出到指定的档案; ? “>>”:改变送出的数据信道(stdout, stderr),使之输出到指定的档案,但不同
于“>”,它不会删除指定档案中的内容,而是在末尾添加。 ? “|”:管道,用来将前一个命令的stdout,作为管道后面的命令的stdin 重定向用法说明: cmd > file 把 stdout 重定向到 file 文件中 cmd >> file cmd 1> fiel cmd > file 2>&1 或cmd &>file cmd 2> file cmd 2>> file cmd >> file 2>&1 cmd < file >file2 cmd <>file cmd < file cmd1 | cmd2 说明: 1) shell遇到”>”操作符,会判断右边文件是否存在,如果存在就先删除,并且创建新
文件。不存在直接创建。 无论左边命令执行是否成功。右边文件都会变为空。 2) “>>”操作符,判断右边文件,如果不存在,先创建。以添加方式打开文件,会分配
一个文件描述符[不特别指定,默认为1,2]然后,与左边的标准输出(1)或错误输出(2) 绑定。 3) 当命令执行完,绑定文件的描述符也自动失效。0,1,2又会空闲。
4) 一条命令启动,命令的输入,正确输出,错误输出,默认分别绑定0,1,2文件描述符。 5) 一条命令在执行前,先会检查输出是否正确,如果输出设备错误,将不会进行命令执行
把 stdout 重定向到 file 文件中(追加) 把 stdout 重定向到 file 文件中 把 stdout 和 stderr 一起重定向到 file 文件中 把 stderr 重定向到 file 文件中 把 stderr 重定向到 file 文件中(追加) 把 stdout 和 stderr 一起重定向到 file 文件中(追加) cmd 命令以 file 文件作为 stdin, 以 file2 文件作为 stdout 以读写的方式打开 file cmd 命令以 file 文件作为 stdin cmd1的输出作为cmd2的输入
11
6) 当以文件描述符作为重定向的目标时,需要在文件描述符前面加上符号“&”。符号“&”
也可以看作是“取地址”操作。
2.1.2重定向应用实例 2.1.2.1 输出重定向
图2-2 ls命令输出
图2-2显示执行命令“ls test.0 test.1”列出在当前目录“~/shelltest”中的test.0和test.1两个文件。该命令如图所示的执行结果表示test.1这个文件不存在,而文件test.0确实存在于目录“~/shelltest”中。其中“ls:无法访问test.1:没有那个文件或目录”是一条标准错误输出信息,而“test.0”是一条标准输出信息。在默认情况stdout和stderr都指向显示器。
图2-3 stdout重定向的ls命令输出
图2-3中命令“ls test.0 test.1 1>stdout.txt”,仍然是列出在当前目录“~/shelltest”中的test.0和test.1两个文件,只不过命令中的“1>stdout.txt”将此次命令执行的标准输出重定向到文件“stdout.txt”中,而不是输出到屏幕。从图中的执行结果可以发现本应该在标准输出中输出的信息“test.0”没有显示在屏幕上,而只有那条标准错误输出的信息。
图2-4 stdout和stderr均重定向的ls命令输出
图2-4中将标准输出重定向到文件stdout.txt,将标准错误输出重定向到文件stderr.txt。命令执行结果没有输出到屏幕。 说明:“1>stdout.txt”和“2>stderr.txt”中的“1”和“>”之间及“2”和“>”之间没有空格,切记。
图2-5 stdout和stderr重定向(追加)
图2-5将命令“ls test.0 test.1”的stdout和stderr重定向,如果stdout.txt和stderr.txt存在,那么输出信息就将以追加的模式添加到重定向文件中。
12
2.1.2.2 输入重定向
图2-6 cat命令输出重定向
图2-6中使用cat命令从标准输入接收信息,并将输出内容重定向到文件catfile。输入完成按下“CTRL+d”可以退出cat命令的执行。
图2-7 cat命令输入重定向
2.1.2.3 重定向总结
重定向应用通常就以下两点:
1) 重新设置命令的默认输入,输出,指向到自己文件(文件,文件描述符,设备其实都是
文件,因为linux就是基于设备也是文件,描述符也指向是文件。) 2) 扩展自己新的描述符,对文件进行读写操作。
2.1.3 shell命令提示符
在linux系统中打开终端后,终端中首先显示的就是命令提示符,如图2-8所示。
图2-8 ubuntu终端命令提示符
图2-8中显示命令提示符“whpuser@whpuser-pc:~$”,其中“whpuser”表示当前用户名,“whpuser-pc”表示主机名,“~”表示当前目录,“$”即提示符(一般用户提示符),表示在此后可以输入需要执行的shell命令。
图2-9 root用户命令提示符
13
在图2-9中通过命令“su root”将当前用户切换为root用户,这时可以看到命令提示符变为“root@whpuer-pc:/home/whpuser#”。其中符号“#”表示root用户提示符。
命令提示符的配置与修改
通过在终端窗口输入命令“echo $PS1”可以查看当前shell的命令提示符配置信息。
命令提示符配置常数$PS1
环境变量$PS1的值大致分为2个部分:
“\\[\\e]0;\%u@\\h: \\w\\a\\]”:这部分内容对终端标题栏上显示内容的格式设置。 “${debian_chroot:+($debian_chroot)}\%u@\\h:\\w\\$”:这是对终端命令提示符的显示格式进行设置。
PS1的常用符号说明 信息相关
\%u: 当前用户名 \\h: 主机名的第一部分, \\H: 完整的主机名 \\w: 当前工作路径, \\W: 只显示当前目录名,不显示完整路径 $(__git_ps1 \your current git branch if you're in a git directory, otherwise nothing \\$: 如果当前用户UID为0,那么显示“#”,否则显示“$” \\d: 以\星期 月 日\的格式显示日期 (e.g., \\\t: 以24小时制的HH:MM:SS的格式显示当前时间, \\T: 以12小时制的HH:MM:SS格式显示当前时间, \\@: 以12小时制的HH:MM am/pm格式显示当前时间 \\n: 新行 \\r: 换行 \\\\: 反斜线 颜色及样式
颜色必须进行转义,颜色代码后面需要添加一个字符m。将“\\[\\e[?code?m\\]”和“\\[\\e[0m\\]”之间包含你想应用该颜色或样式的提示信息。 其中?code?的取值组合如下所示:
14
x: 文本属性 3y: 前景色 4y: 背景色 x取值: 0: normal 1: bold 4: underline 7: reverse y 对应颜色: 0 black 1 red 2 green 3 yellow 4 blue 5 magenta 6 cyan 7 white 用法示例: “\\[\\e[0;33m\\]prompt:\\[\\e[0m\\]”中“\\[\\e[0;33m\\]”将会把提示内容“prompt:”显示为普通文本,字体颜色为黄色,而“\\[\\e[0m\\]”将会把颜色重新置为默认。
你可以通过输入export PS1='...'将你自定义的PS1的值写入你家目录下的.bashrc文件或.profile文件中。
2.2 Linux文件及目录操作命令
目录相关符号
~ :当前用户家目录路径 . :当前目录 .. :父目录
/ :根目录或者用作表示文件路径各级目录的分隔符。
cd(change directory):改变当前目录 ls(list):列表显示文件及目录信息
用法实例:
? ls:不带任何参数的情况使用,将显示当前目录的文件和目录,但不包含以“.”开头
的文件;
? ls –a:带上参数-a时,ls命令将会显示当前目录的所有文件。
15