命令行的使用

前言

一提到Linux,许多人都会说到“自由”,但我不认为他们都知道“自由”的真正涵义。“自由”是一种权力,它意味着你能决定你的计算机能做什么,同时能够拥有这种“自由”的唯一方式就是知道计算机正在做什么。这个时候,我们就需要命令行来帮助我们与计算机交互获得“自由”。所以人们常说,“图形用户界面让简单的任务更容易完成,而命令行界面使完成复杂的任务成为可能”,到现在这句话仍然很正确。接下来的正文有点像是在做笔记的形式,没有成文,写这篇博客的目的也是为了方便查阅。

什么是Shell?

管理整个计算机硬件的是操作系统的内核(kernel),一般用户只能通过Shell命令行工具来跟内核通信。那么为什么叫Shell?因为Shell给用户提供一个与操作系统通信的接口,就如同鸡蛋的外壳一样。

几乎所有的Linux 发行版都提供一个名为bash的来自GNU项目的Shell程序。“bash”是“Bourne Again SHell”的首字母缩写,所指的是这样一个事实,bash是最初Unix 上由Steve Bourne 写成Shell 程序sh 的增强版。

关于Shell的常用知识

终端提示符

在Shell的终端输入提示符的最后会有一个符号分别表示:

$:表示普通用户权限

#:表示root用于权限

命令历史

当我们想要查询之前使用过的的命令时候,可以使用history命令来查看历史,用法如下:

history [n]:查找最近的n条命令

history [-c]:将目前的shell中的所有history命令删除

history [-raw] 文件名:将目前的命令保持到文件中去

终端输入ctrl + r :搜索历史命令。从当前命令行开始,向上递增搜索。
搜索到之后可以直接Enter执行,也可以ctrl + j 复制到终端界面。

!的使用:

! 数字:执行第几条命令

! 命令:由最近的命令向前搜索开头为“命令”的那个命令执行

!? 字符串: 重复最近历史中,包含这个字符串的命令。

!!:执行上一个命令

Shell终端复制字符

按下鼠标左键,沿着文本拖动鼠标(或者双击一个单词)高亮了一些文本,那么这些高亮的文本就被拷贝到了一个缓冲区里面,然后按下鼠标中键,这些文本就被粘贴到光标所在的位置。

注意:不要在一个终端窗口里使用Ctrl-c和Ctrl-v快捷键来执行拷贝和粘贴操作。它们不起作用。对于Shell来说,这两个控制代码有着不同的含义。

关于Shell中常用的路径

绝对路径:由根目录(/)开始写起的文件名或者目录名称。

相对路径:相对于目前路径的文件名写法。

. 代表当前的目录,也可以使用./ 表示;

.. 代表上一层目录,也可以使用 ../表示;

万能的man

命令的使用说明帮助:

man + 命令名称

比如输入:qiu@qiu-empty:~$ man date

会得到date命令的manual(操作说明);

查看的输出结果man page时候,可以用”/word“查找关键词,操作类似less,more等命令查阅文本;

重要的热键

Tab:

命令补全,文件补齐:按一次Tab自动补全,按2次Tab显示所有匹配的命令或者文件。

Ctrl + c:

如果在Linux下输入了错误的命令,导致系统一直在运行,按 Ctrl + c 来中断目前执行的命令。

Ctrl + z:

将任务中止(暂停的意思),但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态,用户可以使用fg/bg操作继续前台或后台的任务,fg命令重新启动前台被中断的任务,bg命令把被中断的任务放在后台执行

Ctrl + d:

表示一个特殊的二进制值,表示 EOF(End Of File)

注:在shell中,ctrl-d表示推出当前shell。相当于输入exit;

Ctrl + U:将整行命令删除

Ctrl + S:暂停屏幕的输出

Ctrl + Q:恢复屏幕的输出

什么是命令?

命令可以是下面四种形式之一:

  1. 是一个可执行程序,就像我们所看到的位于目录/usr/bin 中的文件一样。属于这一类的程序,可以编译成二进制文件,诸如用C 和C++ 语言写成的程序, 也可以是由脚本语言写成的程序,比如说shell,perl,python,ruby,等等。
  2. 是一个内建于shell 自身的命令。bash 支持若干命令,内部叫shell 内部命令(builtins)。例如,cd 命令,就是一个shell 内部命令。
  3. 是一个shell 函数。这些是小规模的shell 脚本,它们混合到环境变量中。在后续的章节
    里,我们将讨论配置环境变量以及书写shell 函数。但是现在,仅仅意识到它们的存在就
    可以了。
  4. 是一个命令别名。我们可以定义自己的命令,建立在其它命令之上。

如何识别命令

type + 命令名 :显示命令的类型

which + 命令名 :显示一个可执行程序的位置

help + 命令名 :得到shell 内部命令的帮助文档

–help : 显示用法信息,许多可执行程序支持一个–help参数选项,这个选项是显示命令所支持的语法和选项说明。

man + 命令名 :显示程序手册页,所有的命令都可以使用man来详细查询使用的方法!

info + 命令名 :显示程序Info 条目

使用别名(alias)

在创建别名之前,我们可以使用type命令查询我们想要的别名是否存在。在命令行中定义的别名,当你的shell会话结束时,它们会消失。我们要学会把自己的别名添加到文件中去,每次我们登录系统,这些文件会建立系统环境。

文件的操作

必须要知道的

Linux文件能不能被执行与文件后缀名无关,是由是否具有”x“这个权限来决定的。”x“权限表示该文件具有可执行权限;

更改文件或目录的模式(权限),可以利用 chmod 命令。注意只有文件的所有者或者超级用户才能更改文件或目录的模式。chmod命令支持两种不同的方法来改变文件模式:八进制数字表示法,或符号表示法。

sudo命令给普通用户以超级用户的权限。

文件名和命令名是大小写敏感的。

在linux中所以设备都是文件!

操作文件的命令

切换目录,Change Directory

关于cd 命令的快捷键:
cd 更改工作目录到你的家目录。

cd - 更改工作目录到先前的工作目录。

cd .. 去上一层目录

显示当前目录

pwd:显示当前目录,Print Working Directory

创建新目录

mkdir:新建新目录,make directory

比如:qiu@qiu-empty:~$ mkdir [-mp] 目录名称

-m:配置文件的权限

-p:递归的创建文件

比如你要创建/test/test1/test2这个文件,你首先要先创建test以及test1,用-p参数可以直接递归的一次性全部创建完成。

查看

ls:查看文件与目录

-a:以 “.” 字符开头的文件名是隐藏文件。这仅表示,ls 命令不能列出它们, 用 ls -a 命令就可以了。

-d:仅列出目录本身,而不是列出目录内的文件数据

-l:列出长数据,包含文件的属性与权限等等

复制

cp(copy):复制文件或目录:

cp [-adfilprsu] source destination

-r:递归持续复制,用于目录的复制行为,目录属性可能会发生变化,想要使得复制之后的目录和原目录完全一样,可以使用cp -a

-s:复制成为符号链接文件,即”快捷方式”文件;

-i:若destination文件已经存在,在覆盖的时候会询问;

删除

rm(remove):移除文件或目录

rm [-fir] filename

-f:force,强制执行;

-i:互动模式,Interaction,在操作前会询问;

-r:递归的删除,谨慎使用;

小贴士: 无论什么时候,rm 命令用到通配符(除了仔细检查输入的内容外!), 用 ls 命令来测试通配符。这会让你看到要删除的文件列表。然后按下上箭头按键,重新调用刚刚执行的命令,用 rm 替换 ls。

移动

mv(move):移动文件或目录,或更名

mv [-fiu] source destination

内容查阅

文件内容查阅:

cat:由第一行开始显示文件内容

tac:cat的倒写,由最后一行开始显示文件内容

nl:显示的时候,顺便输出行号

more:一页一页地显示文件内容

less:与more类似,但是可以往前翻页

head:只看头几行

tail:只看结尾几行

od:以二进制的方式读取文件内容

less查看的操作类似man:

space:向下翻页

b : 向上翻页

PageDown:向下翻页

PageUp:向上翻页

/字符串:向下查询字符串

?字符串:向上查询字符串

q:离开

touch

touch命令:

touch [-acdmt] filename

创建一个空的文件;也可以用于修改文件的日期;

关于文件的日期:mtime(modification time,内容修改日期),ctime(status time,状态修改日期),atime(access time,读取日期)

文件的查询

查看文件类型:file命令

先用whereis,locate来检查(速度快一点),最后找不到了才用find(查找文件的复杂方式)来查询;locate只能依据文件名来查找文件,而find程序能基于各种各样的属性, 搜索一个给定目录(以及它的子目录),来查找文件。

locate命令:

locate [-ir] keyword

-i:忽略大小写

-r:后面可接正则表达式的显示方式

locate与whereis是经由数据库来查找的,当你新建文件后查找该文件有可能会找不到,需要用updatedb命令来手动更新数据库。

压缩与解压文件

tar -zcv -f filename.tar.gz 要被压缩的文件

tar -jcv -f filename.tar.bz2 要被压缩的文件

tar -zxv -f filename.tar.gz -C 欲解压缩的目录

tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录

符号链接

关于符号链接:(类似windows系统中的快捷方式)

在大多数“类 Unix” 系统中,有可能一个文件被多个文件名所指向,叫做符号链接(也称为软链接或者 symlink)。有利于文件的共享的操作,在文件名改动之后不需要修改其他程序。一个符号链接指向一个文件,而且这个符号链接本身与其它的符号链接几乎没有区别。例如,如果你往一个符号链接里面写入东西,那么相关联的文件也被写入。然而,当你删除一个符号链接时,只有这个链接被删除,而不是文件自身。如果先于符号链接删除文件,这个链接仍然存在,但是不指向任何东西。在这种情况下,这个链接被称为坏链接。

重定向

“I/O” 代表输入/输出,通过I/O重定向,你可以重定向命令的输入输出,命令的输入来自文件,而输出也存到文件。也可以把多个命令连接起来组成一个强大的命令管道。

数据流的重定向:将某个命令执行后应该要出现在屏幕上的数据传输到其他的地方去,例如文件或者设备。

管道命令:

使用 | 界定符号,与连续执行命令不一样;

比如我们想知道/etc下文件,输入 ls -a /etc 导致一口气屏幕被塞满,这时我们可以用less命令来协助查看:

ls -a /etc | less

表示这个管道命令 | 仅能处理经由前面一个命令传来的正确的信息,也就是standard output,在管道后面接的第一个数据一定是命令,而且这个命令必须要能接受standard output,例如:(查看)less,more,head,tail,(选取)cut,grep,(排序)sort,wc,uniq,(双重定向)tee,等等

Shell中的命令

echo : 显示一行文本

花括号展开:你可以从一个包含花括号的模式中创建多个文本字符串。

花括号展开模式可能包含一个开头部分叫做报头,一个结尾部分叫做附言。花括号表达式本身可能包含一个由逗号分开的字符串列表,或者一系列整数,或者单个的字符串。这种模式不能嵌入空白字符。

例如:

echo Front-{A,B,C}-Back

输出:Front-A-Back Front-B-Back Front-C-Back

echo Number_{1..5}

输出:Number_1 Number_2 Number_3 Number_4 Number_5

echo {Z..A}

输出:Z Y X W V U T S R Q P O N M L K J I H G F E D C B A

Shell中的变量:

变量的定义:一组文字或者符号等,来替代一些设置或者一串保留的数据;

变量的显示:echo $变量名

比如:echo $PATH

取消变量的设置:unset 变量名

将变量设置为环境变量,提供子进场执行:export 变量名

?变量:上一个执行的命令所传回的值,一般来说,如果成功执行命令,则会回传一个0值。所以我们可以通过echo $? 查看上一个命令是否成功执行;

双引号的作用:

如果你把文本放在双引号中,Shell使用的特殊字符,除了$,\ (反斜杠),和‘(倒引号)之外,则失去它们的特殊含义,被当作普通字符来看待。这意味着单词分割,路径名展开,波浪线展开,和花括号展开都被禁止,然而参数展开,算术展开,和命令替换仍然执行。使用双引号,我们可以处理包含空格的文件名。

比方说:我们是two words.txt文件的受害者。如果我们试图在命令行中使用这个文件,单词分割机制会导致这个文件名被看作两个独自的参数,而不是所期望的单个参数:

ls -l two words.txt

ls: cannot access two: No such file or directory

ls: cannot access words.txt: No such file or directory

使用双引号,我们可以阻止单词分割,得到期望的结果;进一步,我们甚至可以修复破损的文件名。

ls -l “two words.txt”

-rw-rw-r– 1 me me 18 2008-02-20 13:03 two words.txt

记住,在双引号中,参数展开,算术表达式展开,和命令替换仍然有效:

echo “$USER $((2+2)) $(cal)”

me 4 February 2008

Su Mo Tu We Th Fr Sa

….

转义字符的使用:

有时候我们只想引用单个字符。我们可以在字符之前加上一个反斜杠,在这个上下文中叫做转义字符。经常在双引号中使用转义字符,来有选择地阻止展开。

比如:(转义美元符$)

echo “The balance for user $USER is: \$5.00”

The balance for user me is: $5.00

还有一个场景:

命令的执行是从上到下,从左到右的,与命令的执行一样,只识别一个空白格,多个空白格会被忽略掉。如果读到Enter符号(CR),就尝试执行该行的命令,但是可以使用\Enter来转义扩展到下一行输入。

关于键盘的使用技巧

ctrl + a :移动光标到行首

ctrl + e :移动光标到行末

ctrl + d : 删除光标位置的字符

ctrl + u :剪贴从光标到行首的文本

ctrl + k : 剪贴从光标到行尾的文本

ctrl + y : 把剪贴的文本复制粘贴到光标位置

软件包的管理

一般而言,大多数发行版分别属于两大包管理技术阵营:Debian的”.deb”,和红帽的”.rpm”,他们分别对应的系统如下。

Debian Style (.deb):Debian, Ubuntu, Xandros, Linspire

Red Hat Style (.rpm):Fedora, CentOS, Red Hat Enterprise Linux, OpenSUSE, Mandriva, PCLinuxOS

软件包管理系统通常由两种工具类型组成:底层工具用来处理这些任务,比方说安装和删除软件包文件,和上层工具,完成元数据搜索和依赖解析。虽然所有基于 Red Hat风格的发行版都依赖于相同的底层程序(rpm),但是它们却使用不同的上层工具。

如下所示:

Debian-Style:dpkg(底层工具);apt-get, aptitude(上层工具);

Fedora, Red Hat Enterprise Linux,CentOS:rpm(底层工具);yum(上层工具);

如何操作软件包?

1.从资源库中安装一个软件包:
上层工具允许从一个资源库中下载一个软件包,并经过完全依赖解析来安装它。

Debian:apt-get update; apt-get install package_name

Red Hat:yum install package_name

2.通过软件包文件来安装软件:
如果从某处而不是从资源库中下载了一个软件包文件,可以使用底层工具来直接(没有经过依赖解析)安装它。

Debian:dpkg –install package_file

Red Hat:rpm -i package_file

3.卸载软件:
可以使用上层或者底层工具来卸载软件。下面是可用的上层工具。

Debian:apt-get remove package_name

Red Hat:yum erase package_name

4.经过资源库来更新软件包:

Debian:apt-get update; apt-get upgrade

Red Hat:yum update

5.列出所安装的软件包:

Debian:dpkg –list

Red Hat:rpm -qa

6.确定是否安装了一个软件包:

Debian:dpkg –status package_name

Red Hat:rpm -q package_name

关于Shell脚本

什么是Shell脚本

一个 Shell 脚本就是一个包含一系列命令的文件。Shell读取这个文件,然后执行 文件中的所有命令,就好像这些命令已经直接被输入到了命令行中一样。

如何编写Shell脚本

Shell脚本就是普通的文本文件。所以我们需要一个文本编辑器来书写它们。最好的文本编辑器都会支持语法高亮,这样我们就能够看到一个脚本关键字的彩色编码视图。语法高亮会帮助我们查看某种常见错误。

使脚本文件可执行。系统会相当挑剔不允许任何旧的文本文件被看作是一个程序,并且有充分的理由!所以我们需要设置脚本文件的权限来允许其可执行。
对于脚本文件,有两个常见的权限设置;权限为755的脚本,则每个人都能执行,和权限为700的脚本,只有文件所有者能够执行。注意为了能够执行脚本,脚本必须是可读的。

把脚本放置到 shell能够找到的地方.当没有指定可执行文件明确的路径名时,shell 会自动地搜索某些目录,来查找此可执行文件。为了最大程度的方便,我们会把脚本放到这些目录当中。

脚本文件的位置

我们知道,如果没有给出可执行程序的明确路径名,那么系统每次都会搜索一系列的目录,来查找此可执行程序。这个/bin目录就是其中一个系统会自动搜索的目录。 这个目录列表被存储在一个名为PATH的环境变量中。这个PATH变量包含一个由冒号分隔开的目录列表。

这里,如果我们要修改PATH变量添加目录的话,通过修改我们的.bashrc 文件,当做了这个修改之后,它会在每个新的终端会话中生效。为了把这个修改应用到当前的终端会话中, 我们必须让 shell 重新读取这个 .bashrc 文件。这可以通过 “sourcing”.bashrc 文件来完成。

0%