代码改变世界

九十分钟极速入门Linux——Linux Guide for Developments 学习笔记

2015-12-30 18:34  星星之火✨🔥  阅读(2037)  评论(3编辑  收藏  举报

系统信息:CentOS 64位。

  • 一张图了解命令提示符和命令行

  • 一些实用小命令

  mkdir(make directory,创建目录)、ls(list,列出当前目录下的内容)、rm(remove,删除文件,如果删除目录,需要加参数-r,表示递归-recursive删除)、man(manual,手册,后面跟命令打开该命令的使用手册,进入后键入/- 参数:查找参数如何使用,n查找下一处,q退出用户手册)、ctrl+l(清屏)、pwd(print working dir,显示工作路径)、ctrl+a:到达命名行首

更多信息可参见书籍:The Linux Command Line的第二章和第六章(什么是shell、使用命令)

  • 在文件系统中跳转

  cd(change directory)、.表示当前目录、./代表当前目录的子目录、..表示当前目录的父目录、cd /(通过绝对路径的方式进入根目录)、cd -(回到原来的目录)

  Tips:cd 目录名(和cd ./目录名的作用相同) 可以通过Tab键补齐,如果有多个备选项的话,双击Tab列出所有匹配选项

更多参见书籍:The Linux Command Line的第三章(文件系统中跳转)

  • 操作文件和目录

  copy:    $ cp file1 file2    $cp -r dir1 dir2

  move:     $ mv file dir/

  rename:    $ mv file1 file2    $mv dir1 dir2   # 如果dir2 存在,则为移动操作

  remove:    $ rm file         $rm -r dir

  创建文件:    $ touch a.txt      $ >a.txt     查看文件:    $ cat file

  创建目录:    $mkdir dir                 查看文件类型:  $file a.txt

  创建隐藏文件/目录:touch .文件名 或 mkdir .mydir,通过ls -a可以看到。

  利用通配符删除当前目录下的所有文件:rm -rf * 字符串匹配,列出/bin目录下的所有包含"pin"字符串的文件: ls /bin|grep pin

  下载imooc主页:wget http://imooc.com

  分页查看文件内容:less 文件名  (按住j向下滚屏 按住k向上滚屏  /字符:进行字符查找,键入n查找下一处 双击g可以到达文件头 点击G可到达文件尾 q退出),man命令底层的分页就是用的less,因此less中所有的快捷键在man中都是可以使用的。

  放大/缩小/还原终端字体:ctrl + +     ctrl + -     ctrl + 0

  输入命令后不想执行:ctrl+ c

  解压缩zip文件:unzip 文件名       压缩成zip文件:zip -r 压缩后文件名.zip 被压缩的文件名

  解压缩*.tar.gz文件:tar zxvf 文件名   压缩成tar文件:tar zcvf 压缩后文件名.tar.gz 被压缩文件名

  解压缩*.tar.bz2文件:tar jxvf 文件名   压缩成tar文件:tar jcvf 压缩后文件名.tar.gz 被压缩文件名

  • 重定向

  输出重定向(redirect stdout):>

  将程序的输出内容保存到文件中:date >output.txt(注:date是一个系统自带程序,输出当前时间)

  cat file1 >file 表示将file1的内容复制到file中  cat file1 >>file 表示将file1的内容追加到file中  cat file1 file2 >file 表示将file1和file2连接到file中

  标准错误重定向(redirect stderr):2>

  标准输入重定向(redirect stdin):<

  (PS:linux下有一个传统:Everything is a file,如目录是一个目录文件,各种设备都被抽象成了文件放到了目录文件/dev下,系统上有三个非常特殊的文件,因为它们是一直打开的,因此系统为他们分配了三个固定的file descriptor,文件描述符为0的文件叫做标准输入文件(stdin),为1的叫做标准输出文件(stdout),为2的叫做标准错误输出文件(stderr),因此你会看到标准错误输出重定向的标识符为:2>)

  一般情况下,标准输入重定向的使用频率不如管道,如:cat file1|sort|uniq|grep str(sort对每行字符串进行排序,uniq忽略重复行,grep打印匹配行。PS:uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用。换句话说,为了使uniq起作用,所有的重复行必须是相邻的。)

  • 用户和文件权限

  在Linux中有这么一项传统:home is writable but not outside.

  三种权限:用户对文件主要有三种权限:r(reading)、w(writing)、x(executing)。

  三种用户类型:owner、group、world

  对权限的讨论就是看owner、group、world对文件的r/w/x权限。

  如在终端中查看文件权限:$ ls - l a.txt,得到结果(注:查看目录权限,ls -ld mydir):

  -rw-rw-rw-. 1 xpjiang xpjiang 6 12月 23 21:31 a.txt

  该行信息传达的信息如下图:

  对文件的r 权限表示可以查看文件的内容(cat file),对目录的r 权限表示可以查看目录的内容(ls mydir);对文件的w 权限表示可以编辑该文件里的内容,而对目录的w 权限表示我们可以在该目录下创建、删除、重命名文件;对文件的x 权限表示可以把它作为一个程序来执行,对目录的x 权限表示我们可以进入该目录(cd mydir)。

  对当前目录增加写权限:chmod +w .

  用vim编辑器创建一个脚本文件a.sh:vim a.sh(键入i进入插入模式,写入一个简单的打印命令:echo hello,esc退出插入模式,两次大写Z保存文件),执行该脚本:./a.sh,一般情况下,我们没有执行权限,可以这样做:chmod +x a.sh,执行该脚本,终端输出:hello。

  chmod(change file mode):chmod 666 a.txt(666为file mode的八进制表示)

  • 进程

  获取进程号(PID,Process ID)

  终端中启动vim,它会占据当前的shell,敲Ctrl+Shift+T(编辑->键盘快捷键中可查看终端中使用的快捷键,也可根据需要自定义快捷键,例如Ctrl+Shift+C复制内容,Ctrl+Shift+V粘贴)打开一个新的终端标签,ps aux 查看系统上所有的进程情况,因为输出篇幅较长,我们可以在ps aux 后面加上管道符(|),用less 程序做分页器:ps aux|less,输出中的PID字段,就是我们关注的进程号。键入 /vim 进行查找,可以看到vim程序的进程号,不过更一般的查看进程号的方式是用grep 命令查找vim关键字:ps aux|grep vim,使用kill vim进程号 就可以结束vim程序(Ctrl+PgUp,切换到上一个终端标签可以看到vim程序已经被杀死了)。

  后台执行

  在命令行中也可以启动图形化程序,如firefox,Alt+Tab 可以切换回命令行,可以看到firefox占据了当前的shell,如何处理这种情况呢?一个简单的方法是firefox &,这样firefox就自动在后台执行了,而且切换回终端后命令行依然可以使用。但是如果已经出现了firefox占据了shell这种情况,可以Ctrl+z,发现firefox已经没有响应了,切回终端,键入bg,这样就跟firefox & 的情况一样了,fg切换回前台,Ctrl+c 结束firefox(bg:把一个任务放到后台执行,fg:把一个任务放到前台执行)。

  kill

  kill 命令中常用的信号有2、9、15。其中2 表示中断,实现和Ctrl+c 一样的功能,由终端发送,通常它会终止一个程序;15 表示终止,是kill 命令发送的默认信号,如果程序仍然"活着",可以接受信号的话;9 表示杀死,这个信号很特别,鉴于进程可能会选择不同的方式,来处理发送给它的信号,其中也包括忽略信号,这样9号信号并不发送给目标进程,而是内核立即终止这个进程。当一个进程以这种方式终止的时候,它没用机会去做些"清理"工作,或者是保存劳动成果。因为这个原因,可以把9号信号看作杀手锏(kill -9 进程号),当其他终止信号失败后,再使用它。

  除了通过kill终止进程,很多程序也定义了自己的退出方式,比如shell就可以通过exit 命令退出,它等价于Ctrl+d。

  这里顺便说一下一种更糟糕的情况,一个异常的程序占用了大量的内存,导致整个桌面系统卡顿了,使得我们无法在终端中输入命令,此时怎么办呢?Linux是同时运行着七个工作台的敲入Ctrl+Alt+F2到达其中一个工作台,在这里杀死那个进程,Ctrl+Alt+F1回到原来运行着图形化界面的工作台。

  • 查找

  文件和字符串搜索是一个开发者日常工作中颇为重要得一部分,下面就来看看shell中都有哪些命令供我们使用来实现自己的需求:

  locate - 通过名字来在系统全局范围内查找文件

  例:locate vimrc,locate命令还支持正则表达式:locate --regexp vim[a-z]rc

  使用过程中,有时会发现一个奇怪的现象,如首先touch aa.txt,然后locate aa.txt,发现终端中没有输出,通过man locate 了解到locate reads one or more databases prepared by updatedb,换句话说,locate 不是直接搜索整个文件系统,而是从一个数据库中读数据,这也就是为什么locate 跑的如此溜的原因,系统中的命令updatedb 会把系统中的数据存放到数据库之中,但是updatedb 一般都是每天自动运行一次,因此我们刚刚创建的文件locate 是找不到的,解决办法就是手动运行一下:sudo updatedb。

  find - 在目录层次结构中搜索文件,支持很多参数,经常与字符串查找利器grep一起使用,用来处理搜索到的文件列表。

  例:find . 列出当前目录下的所有目录和文件,包括子目录的文件和目录。

    find .|grep .txt,只列出名字包含.txt 目录和文件

    find . -type f,只列出文件。

    find . -type f -exec ls -l '{}' ';',-exec 的结束符是 ';' ,两者之间可以输入任意的系统命令。'{}'代表我们前面找到的文件名。

    echo hello >a.txt   echo Hello >b.txt  find . -type f -exec grep -n hell0 '{}' ';' -print,-print 打印出匹配项(包含字符串"hello")所在的文件,-n 打印出匹配项所在的行号,如果想要忽略大小写可以在grep 后跟参数 -i,或者直接 -ni。

  • 网络操作

  网络操作主要涉及两块内容:远程操作工具ssh和数据传输工具rsync。由于没有可供操作的网络主机,因此这部分内容暂且略过。更多信息可参见书籍:The Linux Command Line第十七章(网络系统)。

  • 软件安装

  在CentOS上安装软件主要有三种方式:

  1. 手动下载编译好的软件或者源码进行安装
  2. 下载rpm 包安装(类似于ubuntu系统安装deb包)
  3. 从官方仓库,用yum 下载安装(类似于从ubuntu官网,用apt-get下载安装)

  手动下载编译好的软件(可执行程序)安装实例:

  从网址 http://sublimetext.com/,下载sublimeText编辑器。使用 tar jxvf Sublime\ Text\ 2.0.2.tar.bz2 解压缩,但是执行程序必须要用全路径来执行压缩包中的sublime_text,如果想方便使用,把它变成一个系统命令,需要把整个解压缩包中的子文件移动到$ PATH 包含的一个目录中(使用命令echo $ PATH查看),或者也可以不移动,方法就是搞一个符号链接:$ ln -s Sublime\ Text\ 2.0.2/sublime_text ~/bin/subl,如此在终端中直接输入subl 即可开启sublimeText编辑器。

  手动下载源码安装实例:

  首先从网址 http://ftp.gnu.org/gnu/hello/,下载 hello-2.2.tar.bz2,依次执行命令:

$ tar jxvf hello-2.2.tar.bz2
$ cd hello-2.2
$ ./configure
$ make
$ sudo make install

  终端中执行$ hello,输出:hello, world!。这里./configure 的作用就是检查当前环境是否满足安装该软件的依赖关系,make 是用来从Makefile中读取指令进行编译的,而make install 是用来从Makefile中读取指令,将软件安装到指定位置的。

  安装rpm 包:rpm -i rpm包

 使用yum 在线下载安装:以安装git 为例:执行命令$ sudo yum install git,git 软件的rpm 包就被下载到本地硬盘,同时yum 命令包裹了rpm 命令,因此直接把安装配置过程也给完成了,也就是一个 yum install git 命令,git 就可以直接使用了,如果想卸载git,只需执行 $ sudo yum remove git即可。
  • shell 脚本编程

  把许多命令集中到一个文件中作为一个脚本来执行,就是所谓的shell 脚本编程。

  关于shell 脚本编程我们划分成以下几个部分一一阐述:

  指定解析器

  可以通过bash、ruby 或python 这样的语言来写脚本,只要在脚本的首行指定用什么语法来进行解析即可(bash 的语法很机器化,很多细节也比较晦涩,因此可以用ruby 这种更加人性化的语言来写脚本)。如:

  #!/usr/bin/env bash  或  #!/usr/bin/env ruby  或  #!/usr/bin/env python

  命令就是语句,语句就是命令

  因为每一个命令都是合法的脚本语句,因此可以把多条语句直接罗列到脚本中,也可以将其包裹到一个函数中:

  #!/usr/bin/env bash
  say_hello()
  {
    echo "hello"
  }
  create_file()
  {
    touch a.txt
  }
  say_hello # 通过呼叫函数名来执行
  create_file 

  此外,还有些元素是脚本语句的一部分:

 if [ $# != 1 ]
  then
    echo "hello"
  fi 
 注意到,这里的[ $# != 1 ] 其实也可以放到终端中去执行 
  $[ $# != 1 ]
  $ echo $?
  0
 查看返回指为0 表示命令执行成功。只要if 后面跟一个可以正确执行的命令,则结果为真;如果跟一个执行会出错的命令,那么结果即为假。此外,由于命令对空格是敏感的,这就导致脚本语句对空格也是变态的敏感。

  位置参数

  执行下面的脚本: $ ./xpjiang.sh a.txt b.txt(执行前需要$ chmod +x xpjiang.sh): 

  #!/usr/bin/env bash
  echo "
  Number of arguments: $#
  The program name is: $0
  The first argument is: $1
  "

  输出如下:

  Number of arguments: 2
  The program name is: ./xpjiang.sh
  The first argument is: a.txt

  这里的$0 代表命令名,$1 代表第一个参数,$2 代表第二个参数...,$# 表示该命令执行时的参数总个数。

  脚本不再当前shell 中执行

  每次启动一个脚本,系统都会为当前shell 单独开启一个子shell,在子shell 中执行脚本中的语句。例如,脚本中导出一个环境变量:

  #!/usr/bin/env bash
  export Direct="/home/xpjiang/mydir/"
  cd $Direct
  touch hello.txt

  执行$ ./xpjiang.sh 会发现,当前shell 中echo $Direct 得到的输出为空并且当前shell 中的工作目录也没有改变,这就说明脚本不在当前shell 中执行。如果需要脚本在当前shell 中执行,则执行 $ source xpjiang.sh,可以发现目录切换到了mydir 下,同时echo $Direct 的输出为/home/xpjiang/mydir。

  循环控制 

  编写脚本rename.sh,更改模式为可执行:

  cd $1
  echo I am in `pwd`  # `pwd` 会取出该命令的输出
  for file in `ls`
  do
    mv $file $file.txt
  done

  添加到 ~/bin 中,使其成为一个系统命令。执行:

  $ mkdir mydir
  $ cd mydir; touch a b c; cd ..
  $ rename.sh mydir  I am in /home/xpjiang/Desktop/mydir
  $ ls mydir
  a.txt b.txt c.txt

  远程控制

  SSH 远程登录服务器的时候,需要先登录再执行命令,实际中每次这样操作很麻烦。可以在本地写一个脚本,在服务器上执行脚本中相关的命令。

  确认执行

  让程序在执行过程中暂停,报告一些信息,用户根据程序提供的信息判断是否允许程序继续执行下面的操作,这就是确认执行。

  #!/usr/bin/env bash

  echo -n "Do you want to say hello? (y/n): "
  read AAA
  if [ "${AAA:-y}" = "y" ]; then
      echo hello
  else
      echo Nothing done, bye.
  fi 

 

 Reference: MOOC_Liunx Guide for Developments. 

最后:
转载请注明出处.
以上.