输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。在日常的学习和工作中,相较于输入重定向,我们使用输出重定向的频率更高,所以又将输出重定向分为了标准输出重定向和错误输出重定向两种不同的技术,以及覆盖写入与追加写入两种模式
➢ 标准输入重定向0:默认从键盘输入,也可从其他文件或命令中输入
➢ 标准输出重定向1:默认输出到屏幕
➢ 错误输出重定向2:默认输出到屏幕
touch linuxprobe
ls -l linuxprobe
ls -l xxxx
通过标准输出重定向将 man bash 命令原本要输出到屏幕的信息写入到文件 readme.txt 中,然后显示 readme.txt 文件中的内容。具体命令如下:
man bash > readme.txt
cat readme.txt
首先通过覆盖写入模式向 readme.txt 文件写入多行数据(该文件中已包含上一个实验的 man 命令信息)。需要注意的是,在通过覆盖写入模式向文件中写入数据时,每一次都会覆盖掉上一次写入的内容,所以最终文件中只有最后一次的写入结果:
echo "welcome to LinuxProbe1.Com" > readme.txt
echo "welcome to LinuxProbe2.Com" > readme.txt
echo "welcome to LinuxProbe3.Com" > readme.txt
echo "welcome to LinuxProbe4.Com" > readme.txt
cat readme.txt
再通过追加写入模式向 readme.txt 文件写入一次数据,然后在执行 cat 命令之后,可以看到如下所示的文件内容:
echo "Quality linux learning materials" >> readme.txt
cat readme.txt
虽然都是输出重定向技术,但是命令的标准输出和错误输出还是有区别的。例如查看当前目录中某个文件的信息,这里以 linuxprobe 文件为例。由于这个文件是真实存在的,因此使用标准输出即可将原本要输出到屏幕的信息写入到文件中,而错误的输出重定向则依然把信息输出到了屏幕上。
ls -l linuxprobe > /root/stderr.txt
ls -l linuxprobe 2> /root/stderr.txt
如果想把命令的报错信息写入到文件,该怎么操作呢?当用户在执行一个自动化的 Shell脚本时,这个操作会特别有用,而且特别实用,因为它可以把整个脚本执行过程中的报错信息都记录到文件中,便于安装后的排错工作。接下来以一个不存在的文件进行实验演示:
ls -l xxxxx > /root/stderr.txt
ls -l xxxx 2> /root/stdeerr.txt
cat /root/stderr.txt
还有一种常见情况,就是我们想不区分标准输出和错误输出,只要命令有输出信息则全部追加写入到文件中。这就要用到&>>操作符了:
ls -l linuxprobe &>> readme.txt
ls -l xxxxx &>> readme.txt
输入重定向相对来说有些冷门,在工作中遇到的概率会小一点。输入重定向的作用是把文件直接导入到命令中。接下来使用输入重定向把 readme.txt 文件导入给 wc -l 命令,统计一下文件中的内容行数:
wc -l < readme.txt
wc -l /etc/passwd
没有了文件名称,这是因为此前使用的“wc -l /etc/passwd”是一种非常标准的“命令+参数+对象”的执行格式,而这次的“wc -l < readme.txt”则是将 readme.txt 文件中的内容通过操作符导入到命令中,没有被当作命令对象进行执行,因此 wc 命令只能读到信息流数据,而没有文件名称的信息。
管道命令符
➢ 找出被限制登录用户的命令是 grep /sbin/nologin /etc/passwd;
➢ 统计文本行数的命令则是 wc–l。
现在要做的就是把 grep 搜索命令的输出值传递给 wc 统计命令,即把原本要输出到屏幕的用户信息列表再交给 wc 命令作进一步的加工,因此只需要把管道符放到两条命令之间即可,具体如下:
grep /sbin/nologin/etc/passwd | wc -l
比如用翻页的形式查看/etc 目录中的文件列表及属性信息(这些内容默认会一股脑儿显示到屏幕上,根本看不清楚):
ls -l /etc/ | more
在修改用户密码时,通常都需要输入两次密码以进行确认,这在编写自动化脚本时将成为一个非常致命的缺陷。通过把管道符和 passwd 命令的–stdin 参数相结合,可以用一条命令来完成密码重置操作:
echo "linuxprobe" | passwd --stdin root
在修改用户密码时,通常都需要输入两次密码以进行确认,这在编写自动化脚本时将成为一个非常致命的缺陷。通过把管道符和 passwd 命令的–stdin 参数相结合,可以用一条命令来完成密码重置操作:
ps aux | grep bash
如果需要将管道符处理后的结果既输出到屏幕,又同时写入到文件中,则可以与 tee 命令结合使用。
ps aux | grep bash | tee result.txt
命令行的通配符
批量查看所有硬盘文件的相关权限属性,有一种实现方式是下面这样的:
ls -l /dev/sda
ls -l /dev/sdal
ls -l /dev/sad2
ls -l /dev/sda3
顾名思义,通配符就是通用的匹配信息的符号,比如星号(*)代表匹配零个或多个字符,问号(?)代表匹配单个字符,中括号内加上数字[0-9]代表匹配 0~9 之间的单个数字的字符,而中括号内加上字母[abc]则是代表匹配 a、b、c 三个字符中的任意一个字符。Linux 系统中的通配符及含义如表所示(类似于python中的正则表达式)
来匹配所有在/dev 目录中且以 sda开头的文件:
ls -l /dev/sda*
如果只想查看文件名以 sda 开头,但是后面还紧跟其他某一个字符的文件的相关信息,这时就需要用到问号来进行通配了:
ls -l /dev/sda?
除了使用[0-9]来匹配 0~9 之间的单个数字,也可以用[135]这样的方式仅匹配这 3 个指定数字中的一个;若没有匹配到数字 1 或 2 或 3,则不会显示出来:
ls -l /dev/sda[0-9]
ls -l /dev/sda[135]
搜索/etc/目录中所有以.conf 结尾的配置文件有哪些:
ls -l /etc/*.conf
通配符不仅可用于搜索文件或代替被通配的字符,还可以与创建文件的命令相结合,一口气创建出好多个文件。不过在创建多个文件时,需要使用大括号,并且字段之间用逗号间隔:
touch {AA, BB, CC}.conf
ls -l *.conf
使用通配符还可以输出一些指定的信息:
echo file{1,2 3,4,5}
常用的转义字符
4 个最常用的转义字符如下所示。
➢ 反斜杠(\ ):使反斜杠后面的一个变量变为单纯的字符。
➢ 单引号(‘’) :转义其中所有的变量为单纯的字符串。
➢ 双引号(" "):保留其中的变量属性,不进行转义处理。
➢ 反引号(` `):把其中的命令执行后返回结果。
先定义一个名为 PRICE 的变量并赋值为 5,然后输出以双引号括起来的字符串与变量信息:
PRICE=5
echo "Price is $PRICE"
echo "Price is $$PRICE"
echo "Price is \$$PRICE"
而如果只需要某个命令的输出值,可以像`命令`这样,将命令用反引号括起来,达到预期的效果。例如,将反引号与 uname -a 命令结合,然后使用 echo 命令来查看本机的 Linux 版本和内核信息:
echo `uname -a`
反斜杠和反引号的功能比较有特点,同学们一般不会犯错,但对于什么时候使用双引号却容易混淆,因为在大多数情况下好像加不加双引号,效果都一样:
echo AA B CC
echo "AA BB CC"
两者的区别在于用户无法得知第一种执行方式中到底有几个参数。是的,不能确定!因为有可能把“AA BB CC”当作一个参数整体直接输出到屏幕,也有可能分别将 AA、BB 和CC 输出到屏幕。而且,就算摸清了 echo 命令处理参数的机制,在使用其他命令时依然存在这种情况。
这里给大家总结一个简单小技巧,虽然可能不够严谨,但绝对简单:如果参数中出现了空格,就加双引号;如果参数中没有空格,那就不用加双引号。
重要的环境变量
在 Linux 系统中,变量名称一般都是大写的,命令则都是小写的,这是一种约定俗成的规范。
ls
rm anaconda-ks.cfg
可以用 alias 命令来创建一个属于自己的命令别名,语法格式为“alias 别名=命令”。若要取消一个命令别名,则是用 unalias 命令,语法格式为“unalias 别名”。
将当前 rm 命令所被设置的别名取消掉,再删除文件试试:
unalias rm
rm initial -setup-ks.cfg
可以使用“type 命令名称”来判断用户输入的命令是内部命令还是外部命令:
type echo
type uptime
PATH 是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到 Bash 解释器对Linux 命令的查找。
echo $PATH
PATH = $PATH:/root/bin
echo $PATH
因此,一个相同的变量会因为用户身份的不同而具有不同的值。例如,使用下述命令来查看 HOME 变量在不同的用户身份下都有哪些值
echo $HOME
su - linuxprobe
其实变量是由固定的变量名与用户或系统设置的变量值两部分组成的,我们完全可以自行创建变量来满足工作需求。例如,设置一个名称为 WORKDIR 的变量,方便用户更轻松地进入一个层次较深的目录:
mkdir /home/workdir
WORKDIR=/home/workdir
cd $WORKDIR
pwd
但是,这样的变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用:
su linuxprobe
如果工作需要,可以使用 export 命令将其提升为全局变量,这样其他用户也就可以使用它了:
export WORKDIR
su linuxprobe
后续要是不使用这个变量了,则可执行 unset 命令把它取消掉:
unset WORKDIR
使用什么命令可以把名为 LINUX 的一般变量转换成全局变量?
答:export LINUX。