linux学习笔记

一、和yum有关

1. /var/log/yum.log 会记录所有的yum记录,通过它可以查到什么时候装/卸/更新了哪些包。

2. yum源的配置:yum源的配置一般有两种方式,一种是直接配置/etc目录下的yum.conf文件,另外一种是在/etc/yum.repos.d目录下增加.repo文件。详细参考:《yum配置与使用(很详细)》(http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/10/09/2203916.html)  《深入理解yum工作原理》(http://www.firefoxbug.com/index.php/archives/2777/)

3. yum安装一个包时会分析依赖包,然后安装相应得依赖包;用yum remove deppackage时,会检查有哪些包依赖了deppackage,然后把依赖于deppackage的包也移除。这么做的原因是,当依赖包被移除了之后,所有以来它的包都可能不能用了(之所以说“可能”,是因为可能只有一部分功能需要这个依赖包),所以干脆把它们都移除了。但是卸载一个包时,不会把它的依赖包也移除了,这是因为这个依赖包可能还有别的包依赖它,如果也删除了,另外一个包就不能用了。

    但是,最近yum出了一个和apt一样的autoremove,这个操作可以分析哪些包没有被别的包依赖并且把本身不是可以直接使用的软件,这样的包叫做叶子包(leaf),然后把叶子包移除。

4.yum update更新一个包时,它的依赖包也会被更新。但是,如果这个依赖包被别的包依赖了,则整个更新都会失败。这是因为,更新一个包的操作相当于是先把他移除了,在安装一个新版本的包。但是因为依赖包还被别的包依赖了,所以不能移除(rpm不能移除,yum如果你是直接移除这样的包的话,会告诉你哪些包依赖这个包然后叫你确认确实需要把依赖此包的包也删除了,参见第3点。)。如果要更新这样的包,那么,需要把依赖于相应依赖包的另一个包也一起更新,并且还要保证两个包所依赖的共同库的版本一致。

    这里其实反应了一个问题,就是linux的同一个包只能有一个版本,如果有两个软件依赖的包的版本不一样,那么对不起,你只能选其中一个,是没有办法两个软件都安装的,这一点比较坑爹。当然,你可以自己编译包,并放在不同位置,这个就需要高手来做了。

二、和查找有关

和文件操作有关的时候,涉及到文件名,文件名可以使用通配符,这样文件名就会通过一种叫“命名展开”的机制展开成一系列文件。需要注意的是,通配符和正则表达式式有区别的,比如*是匹配任意字符任意次的意思(包括没有字符),而不是正则表达式中重复前面字符任意次,再比如通配符中没有+这个字符。这一点和在windows中用通配符查找文件类似。

1. locate只能查找文件缓存数据库里有的数据,不是直接搜索文件系统的,所以有一定的滞后性,刚刚添加的文件是不能被查询到的。locate的pattern如果不开启--regex,那么是使用匹配通配符的,而不是正则表达,但是要注意会被shell预处理先执行展开预处理的,因此要把pattern放在引号里,这一点所有的shell语言都是这样的,因为shell预处理是在执行任何语句之前进行的。如果不包含任何统配符成份,则默认是*pattern*形式,也就是说会匹配所有名字里带pattern的文件。并且默认是--wholename形式,也就是匹配全名,所以某一级文件夹里有pattern的文件,也会匹配到。和--wholename相反的是--basename(-b),只匹配文件名。另外,可以连用多个pattern,默认的是只要匹配其中一个就列出,如果有-a(--all)选项存在,则需要匹配上所有的pattern。

因为默认是--wholename形式,而且当含有统配符时,不会默认是*pattern*,所以使用 locate "yum*" 会什么也查不到,因为没有以"yum"开头的文件,所有的文件都是以"/"开头的。因为在--wholename下,locate是去测试带全路径名的文件,而每一个文件的全路径名必然是以斜杆"/“开头的。所以,可以肯定的是,所有的 locate "xxx*" 都会失败。

2. grep使用的是正则表达,见下图:

这里点号和星号都用上了,说明了确实是按正则表达式匹配。其实grep是查找文本,所以用正则,只有在文件系统中查找文件(包括文件夹)才会是按通配符查找。

3. find的--name是通统配符匹配文件(包括文件夹)名的,且是去除了前面的文件路径(或父文件路径)的basename。要用正则匹配,就用--regex或者--iregex(忽略大小写),匹配的是全名而不是basename。下面是一段man的摘抄:

TESTS
-iregex pattern
              Like -regex, but the match is case insensitive.
-name pattern
              Base of  file  name  (the  path  with  the  leading  directories
              removed)  matches  shell  pattern  pattern.  Because the leading
              directories are removed, the file names considered for  a  match
              with -name will never include a slash, so `-name a/b' will never
              match anything (you probably need to use  -path  instead).   The
              metacharacters  (`*', `?', and `[]') match a `.' at the start of
              the base name (this is a change in findutils-4.2.2; see  section
              STANDARDS  CONFORMANCE  below).   To  ignore a directory and the
              files under it, use -prune; see an example in the description of
              -path.   Braces are not recognised as being special, despite the
              fact that some shells including Bash imbue braces with a special
              meaning  in  shell patterns.  The filename matching is performed
              with the use of the fnmatch(3) library function.   Don't  forget
              to  enclose  the  pattern  in quotes in order to protect it from
              expansion by the shell.
-regex pattern
              File  name  matches regular expression pattern.  This is a match
              on the whole path, not a search.  For example, to match  a  file
              named `./fubar3', you can use the regular expression `.*bar.' or
              `.*b.*3', but not `f.*r3'.  The regular  expressions  understood
              by  find  are by default Emacs Regular Expressions, but this can
              be changed with the -regextype option.

 更为全面的理解如下(但不涉及到具体每一项选项,要知道具体每一个test以及action,可以查man):

find的执行过程其实分为三步:查找读取->测试属性->执行action。而且还有需要明确的一点是,在find的过程中,文件可能已经发生了变化(比如在读取之后,还没做测试,文件就被删除了),所以可能会产生一些错误提示。

三、文件系统

1、/opt 和/usr/local的联系和区别

联系就是二者都是用来让用户自己安装软件的,即那些不是通过YUM或者RPM等包管理工具安装的。删除这两个地方软件一般不会影响到其他软件的使用。

区别就是/opt是安装附加软件的,一般是测试版本的。local一般是自己通过原码进行安装的。

下面是关于两个文件夹比较详细的解释:

/opt

Here’s where optional stuff is put. Trying out the latest Firefox beta? Install it to /opt where you can delete it without affecting other settings. Programs in here usually live inside a single folder whick contains all of their data, libraries, etc.

/opt

这里主要存放那些可选的程序。你想尝试最新的firefox测试版吗?那就装到/opt目录下吧,这样,当你尝试完,想删掉firefox的时候,你就可 以直接删除它,而不影响系统其他任何设置。安装到/opt目录下的程序,它所有的数据、库文件等等都是放在同个目录下面。

举个例子:刚才装的测试版firefox,就可以装到/opt/firefox_beta目录下,/opt/firefox_beta目录下面就包含了运 行firefox所需要的所有文件、库、数据等等。要删除firefox的时候,你只需删除/opt/firefox_beta目录即可,非常简单。

/usr/local

This is where most manually installed (ie. outside of your package manager) software goes. It has the same structure as /usr. It is a good idea to leave /usr to your package manager and put any custom scripts and things into /usr/local, since nothing important normally lives in /usr/local.

/usr/local

这里主要存放那些手动安装的软件,即 不是通过“新立得”或apt-get安装的软件 。 它和/usr目录具有相类似的目录结构 。让软件包管理器来管理/usr目录,而把自定义的脚本(scripts)放到/usr/local目录下面,我想这应该是个不错的主意。

四、和系统工具有关

1.test 命令一般不单独使用,而是在脚本中和if配合使用,并前以中括号的形式出现,常见的形式是这样的:

if [ -n "$1"]; then
echo "有命令行参数"
if

在脚本命令中,通常会判断一个命令脚本后面是否有命令行参数,用-n(命令行参数长度不是0,即有命令行参数)或者-z(长度为zero,即没有)。但是这不是直接通过判断$1是否存在来判断是否有命令行参数的,而是通过判断字符串长度是否为0来间接判断的。这就引出了一个问题:只有一个字符串本身存在,才能去判断它的长度,如果一个字符串都不存在,那么就所谓的长度就无从谈起。为了让这个字符串一定存在,所以需要将$1用引号引起来,像这样 "$1" 。如果不引起来,那么$1将为空,test -z 和test -n接空,都会返回true,导致程序无法按程序员本来的意图执行。

原文地址:https://www.cnblogs.com/JMLiu/p/7643385.html