Linux学习
占位符(不应该按字面直接照搬的命令参数)采用斜体表示
中括号[]之间的任何内容都是可选的
英文省略号...后面的任何内容都是可重复的
大括号{}表示应该选择由竖线|隔开的各项中的一个
一、软件
1、判断软件是否已经安装
-[ ] which
which nginx
which命令是使用shell命令,找出相差的二进制程序是否已经在搜索路径中
-[ ] whereis
whereis nginx
该命令搜索更大范围的系统目录,与shell的搜索路径无关
-[ ] locate
locate signal.h
locate命令参照预先编译好的一个文件系统索引,以此确定与特定模式相匹配的文件名。locate命令是GNU的findutils软件包里的一个程序,在大多数linux系统上都是默认包含的,但在UNIX系统上必须手动安装。
locate的搜索并不只针对命令或者软件包,而是能够找到任何类型的文件
locate的数据库通常由updatedb命令定期更新,这条命令由cron来运行。因此,执行一次locate的结果并不是总能够反映文件系统新近的变化。
-[ ] 软件包工具
例如在Red Hat或者SUSE系统上,可以通过rpm -q命令来检查
rpm -q python
2、安装新软件
举例wget命令的初始化安装和后续升级
-[ ] Ubuntu
Ubuntu使用APT(Debian Advanced PackageTool,Debian高级软件包工具)
apt-get install wget
-[ ] SUSE
yast --install wget
-[ ] Red Hat
yum install wget
-[ ] Solaris
在已经装 有pkgutil的Solaris系统上
/opt/scw/bin/pkgutil -- install wget
-[ ] 从源代码编译软件
网上找到wget的源代码包,将当前版本的代码下载到/tmp目录下,再解开,配置安装
cd /tmp;gunzip wget-1.11.4.tar.gz
tar xfp wget-1.11.4.tar
cd wget1-11.4
./configure --disable-ssl --disable-nls
make && make install
configure命令的两个选项--disable-ssl和--disable-nls省略了wget的一些特性,这些特性要依赖其他一些还没有安装的库。在实际中,用户可能想还是安装要求预装的那些库。使用configure--help查看所有的配置选项。另一个有用的配置选项是--prefix=directory,这个选项可以把软件安装到/usr/local之外的其他目录里
二、脚本和shell
1、shell
1.1管道和重定向
每个进程都至少有三个信道:标准输入STDIN、标准输出STDOUT、标准报错STDERR,内核给每个进程都设置了这三个信道。
在交互式终端窗口里,STDIN一般读取键盘的输入,STDOUT和STDERR把它们的输出写到屏幕上。
大多数命令都接受从STDIN来的输入,并且把自己的输出写到STDOUT,而把出错消息写到STDERR,有了这样的约定,用户就能把命令像积木一样串起来,创建出混合信道。
shell将<、>、>>解释成指令
<:把这条命令的STDIN和已有的某个文件的内容联系起来
>:重定向STDOUT,替换文件现有内容
>>:重定向STDOUT,给文件追加内容
例如:
# 在/tmp/mymessage这个文件里存入一行内容,如果必要,还会创建该文件
echo "This is a test message" > /tmp/mymessage
# 把该文件内容用电子邮件发给用户johndoe
mail -s "Mail test" johndoe < /tmp/mymessage
">&"可以将STDOUT和STDERR都重定向到同一个地方,仅仅重定向STDOUT的话,则用2>
为什么要分开处理STDOUT和STDERR呢?
当采用非特权用户运行以下命令时:
find / -name core
通常会导致很多"permission denied"这样的报错消息,从而把真正的结果给淹没 在混乱的输出里了,要消除所有的报错信息,可以用这条命令:
find / -name core 2> /dev/null
要把匹配路径的清单保存在一个文件里,可以采用下面的命令:
find / -name core > /tmp/corefiles 2> /dev/null
要把一条命令的STDOUT连接到另一条命令的STDIN上,可以用|管道符:
# 运行ps产生一份进程清单,由管道符送给grep命令选出包含httpd这个词的若干行,grep的输出没有重定向,所以匹配的结果都出现在终端窗口里
ps -ef | grep httpd
要让第二条命令只有在第一条命令成功完成之后才执行,可以用一个&&符把两个命令隔开
# 当且仅当/tmp/t2成功送入打印队列后,才会删除/tmp/t2,在这里,lpr命令产生的退出码为0的话,就算它执行成功
lpr /tmp/t2 && rm /tmp/t2
相反,||这个符号表示,只有前一条命令执行不成功,(产生了一个非零的退出码)时,才执行后面的命令。
在一个脚本里,可以用反斜线把一条命令分成多行来写,从而把出错处理代码和命令管理的其他部分区分开来
cp --presever --recursive /etc/* /spare/backup \
|| echo "Did Not make backup"
要实现相反的效果,将多条命令整合在一行里,可以用分号作为语句分隔符
1.2、变量和引用
变量名在赋值的时候没有标记,但在访问它们的值的时候要在变量名之前加一相$符,例如:
etcdir = '/etc'
echo $etcdir
不能在等号两边留空白,否则shell会把变量名误认为是命令名
引用一个变量的时候,可以用花括号把这个变量的名字括起来,增加辨识度。
当想要在双引号引起来的字符串里扩展变量时:
rev = 8
echo "Save ${rev}th version of mdadm.conf"
# 输出结果为 Save 8th version of mdadm.conf
变量名区分大小写,一般来说,环境变量或从全局配置文件里读取的变量,所有字母都大写,本地变量则多是所有字母都小写,而且在变量名各个部分之间用下划线隔开。
环境变量会自动导入到bash的变量名空间,所以它们是可以用标准的语法来设置和读取的。
对于单引号和双引用括起来的字符串而言,shell以相似的方式处理,区别在于,双引号括起来的变量可以进行替换和变量扩展,例如
mylang = "Chinese"
echo "I speak ${mylang}"
echo 'i speak ${mylang}'
# i speak Chinese
# i speak ${mylang}
当’‘出现在""内部时,’’内的字符串内容会按一条shell命令来执行,并且用命令输出结果替换该字符串
echo "There are 'wc -l /etc/passwd' lines in passwd file."
#There are 28 lines in passwd file.
1.3、常见的过滤命令
任何“从STDIN读入数据,向STDOUT输出结果”这样循规蹈矩的命令,都可以当作一个过滤器(也就是说,管理的一个环节)来处理数据。
大多数过滤器命令都接受在命令行上提供一个或者多个文件名作为输入