Linux Shell笔记

PS.个人觉得shell命令偏记忆,所以与其说是笔记不如干脆说是书摘,这里先列出我要粗读的书

0.Linux就该这么学(弃坑,广告太多)

  1. Linux命令行(30%)

  2. how linux works(30%)

  3. red hat linux用户基础

  4. LINUX系统管理技术手册(可选)

  5. 老师发的文件

命令

echo 打印

date[参数][-指定格式]

%t 跳格[Tab 键]
%H 小时(00~23)
%I 小时(00~12)
%M 分钟(00~59)
%S 秒(00~59)
%j 今年中的第几天

reboot poweroff

wget

-b 后台下载模式
-P 下载到指定目录
-t 最大尝试次数
-c 断点续传
-p 下载页面内所有资源,包括图片、视频等
-r 递归下载

ps 查看进程

用例 ps aux(不必使用-前缀)

-a 显示所有进程(包括其他用户的进程)
-u 用户以及其他详细信息
-x 显示没有控制终端的进程

top 监视系统

pidof [参数] [服务名称]

kill [参数] [进程 PID]

killall [参数] [服务名称]

ifconfig [网络设备] [参数

uname [-a]

cat /etc/redhat-release

uptime 查看系统负载信息

free 显示内存信息 free [-h]

who 查看当前登入主机的用户终端信息

last 查看所有系统登入信息

history [-c] 显示执行过的命令 /etc/profile 中 HISTSIZE为大小

sosreport 收集系统配置及架构信息并输出诊断文档

pwd 当前目录

cd 切换目录 -上一次的目录,~家目录

ls 显示当前目录文件信息,-a查看所有,-l查看属性/大小,-d目录属性,用例ls -ld /etc

cat[选项] [文件] , -n显示行号

more

head 前n页 tail 后n页(持续刷新) ,-f

tr[原始] [目标] 替换文本,用例cat anaconda-ks.cfg | tr [a-z] [A-Z]

wc word count,-l 行数,-w单词数,-c字节数

stat 文件的具体存储信息和时间等信息

cut[参数] 文本,提取文本字符 -f列数,-d间隔符号,用例cut -d: -f1 /etc/passwd

diff[参数] 文本,-c具体不同,--brief仅判断

touch[选项] [文件],创建空白文件或设置文件的时间,-a修改atime,-m修改mtime,-d都修改

mkdir[选项] 目录,-p嵌套,用例mkdir -p a/b/c/d

cp[选项] 源 目标,-p保留属性,-d保留链接属性(?),-r递归,-i询问覆盖,-a等于-pdr

mv 剪切/重命名

rm 删除,-f强制删除.-r删除目录

dd,if输入文件,of输出,bs块大小,count块数量,用例dd if=/dev/zero of=560_file count=1 bs=560M

dd刻录isodd if=/dev/cdrom of=RHEL-server-7.0-x86_64.iso

file查看文件类型

tar

-c 创建压缩文件
-x 解开压缩文件
-t 查看压缩包内有哪些文件
-z 用 Gzip 压缩或解压
-j 用 bzip2 压缩或解压
-v 显示压缩或解压的过程
-f 目标文件名
-p 保留原始的权限与属性
-P 使用绝对路径来压缩
-C 指定解压到的目录

一般用-czvfxzvf

示例tar -czvf etc.tar.gz /etc.mkdir /root/etc,tar xzvf etc.tar.gz -C /root/etc

grep 关键词搜索

-b 将可执行文件(binary)当作文本文件(text)来搜索
-c 仅显示找到的行数
-i 忽略大小写
-n 显示行号
-v 反向选择—仅列出没有“关键词”的行

小知识

Linux中的进程分为5个状态,

R(运行) 进程正在运行或在运行队列中等待

S(中断) 进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该状态。

D(不可中断) 进程不响应系统异步信号,即便用 kill 命令也不能将其中断

Z(僵死), 进程已经终止,但进程描述符依然存在, 直到父进程调用 wait4()系统函数后将进程释放

T(停止) 进程收到停止信号后停止运行

输入重定向符号

命令 < 文件

命令 << 分界符 从STDIN读入,直到遇到分界符停止

命令 < 文件1 > 文件2

输出重定向符号

命令 > 文件

命令 2> 文件 STDERR

命令 >> 文件 追加模式

命令 2>> 文件 追加

命令 >> 文件 2>&1 或者 命令 &>> 文件 STDOUT和STDERR追加到同一文件

其中描述符 0 是STDIN 1是STDOUT 2是STDERR

管道命令符|a|b作用为把前一个命令当作是后一个命令的标准输入

通配符*表示0个或多个,?匹配单个,[0-9]匹配0-9之间的单个数,可用于文件操作

转义字符\后面一个变量变为字符串,"所有变量变为字符串,""保留变量属性不专义,``执行命令并返回

last update:2019/02/13

以下为The Linux Command Line笔记

ls命令有两个选项,“l”选项产生长格式输出,“t”选项按文件 修改时间的先后来排序。

加上长选项 “–reverse”,则结果会以相反的顺序输出

[me@linuxbox ~]$ ls -lt --reverse

ls 命令有大量的选项。表4-1列出了最常使用的选项。
表 4-1: ls 命令选项

选项长选项描述
-a--all列出所有文件,甚至包括文件名以圆点开头的默认会被隐藏的隐藏文件。
-d--directory通常,如果指定了目录名,ls 命令会列出这个目录中的内容,而不是目录本身。 把这 个选项与 -l 选项结合使用,可以看到所指定目录的详细信息,而不是目录中的内容。
-F--classify这个选项会在每个所列出的名字后面加上一个指示符。例如,如果名字是 目录名,则会 加上一个'/'字符。
-h--human-readable当以长格式列出时,以人们可读的格式,而不是以字节数来显示文件的大小。
-l以长格式显示结果。
-r--reverse以相反的顺序来显示结果。通常,ls 命令的输出结果按照字母升序排列。
-S命令输出结果按照文件大小来排序。
-t按照修改时间来排序。

-rw-r--r-- 1 root root 32059 2007-04-03 11:05 oo-cd-cover.odf

字段含义
-rw-r--r--对于文件的访问权限。第一个字符指明文件类型。在不同类型之间, 开头的“-”说明是一 个普通文件,“d”表明是一个目录。其后三个字符是文件所有者的 访问权限,再其后的三个字符是文件 所属组中成员的访问权限,最后三个字符是其他所 有人的访问权限。这个字段的完整含义将在第十章讨 论。
1文件的硬链接数目。参考随后讨论的关于链接的内容。
root文件属主的用户名。
root文件所属用户组的名字。
32059以字节数表示的文件大小。
2007-04-03 11:05上次修改文件的时间和日期。
oo-cd-cover.odf文件名。

有些可执行文件的执行位是s(setuid)而不是x,表示你将以文件拥有者的身份运行该文件,而不是你自己

file picture.jpg picture.jpg: JPEG image data, JFIF standard 1.01

less 命令是一个用来浏览文本文件的程序。less filename

命令行为
Page UP or b向上翻滚一页
Page Down or space向下翻滚一页
UP Arrow向上翻滚一行
Down Arrow向下翻滚一行
G移动到最后一行
1G or g移动到开头一行
/charaters向前查找指定的字符串
n向前查找下一个出现的字符串,这个字符串是之前所指定查找的
h显示帮助屏幕
q退出 less 程序

你可以在less命令的输出结果中进行搜索。例如:使用/word从当前位置向前搜索word这个词,使用? word从当前位置向后搜索。当找到一个匹配的时候,按N键可以跳到下一个匹配。

表 4-4: Linux 系统中的目录
| 目录 | 评论 |
|-----|---------|
| / | 根目录,万物起源。 |
| /bin | 包含系统启动和运行所必须的二进制程序。 |
| /boot | 包含 Linux 内核,最初的 RMA 磁盘映像(系统启动时,由驱动程序所需),和 启动加载程序。有趣的文件: /boot/grub/grub.conf or menu.lst, 被用来配置启动加载程序。 /boot/vmlinuz,Linux 内核。 |
| /dev | 这是一个包含设备结点的特殊目录。“一切都是文件”,也使用于设备。 在这个目录里,内核维护着它支持的设备。 |
| /etc | 这个目录包含所有系统层面的配置文件。它也包含一系列的 shell 脚本, 在系统启动时,这些脚本会运行每个系统服务。这个目录中的任何文件应该是可读的文本文件。有意思的文件:虽然/etc 目录中的任何文件都有趣,但这里只列出了一些我一直喜欢的文件: /etc/crontab, 定义自动运行的任务。 /etc/fstab,包含存储设备的列表,以及与他们相关的挂载点。/etc/passwd,包含用户帐号列表。 |
| /home | 在通常的配置环境下,系统会在/home 下,给每个用户分配一个目录。普通只能 在他们自己的目录下创建文件。这个限制保护系统免受错误的用户活动破坏。 |
| /lib | 包含核心系统程序所需的库文件。这些文件与 Windows 中的动态链接库相似。 |
| /lost+found | 每个使用 Linux 文件系统的格式化分区或设备,例如 ext3文件系统, 都会有这个目录。当部分恢复一个损坏的文件系统时,会用到这个目录。除非文件系统 真正的损坏了,那么这个目录会是个空目录。 |
| /media | 在现在的 Linux 系统中,/media 目录会包含可移除媒体设备的挂载点, 例如 USB 驱动器,CD-ROMs 等等。这些设备连接到计算机之后,会自动地挂载到这个目录结点下。 |
| /mnt | 在早些的 Linux 系统中,/mnt 目录包含可移除设备的挂载点。 |
| /opt | 这个/opt 目录被用来安装“可选的”软件。这个主要用来存储可能 安装在系统中的商业软件产品。 |
| /proc | 这个/proc 目录很特殊。从存储在硬盘上的文件的意义上说,它不是真正的文件系统。 反而,它是一个由 Linux 内核维护的虚拟文件系统。它所包含的文件是内核的窥视孔。这些文件是可读的, 它们会告诉你内核是怎样监管计算机的。 |
| /root | root 帐户的家目录。 |
| /sbin | 这个目录包含“系统”二进制文件。它们是完成重大系统任务的程序,通常为超级用户保留。 |
| /tmp | 这个/tmp 目录,是用来存储由各种程序创建的临时文件的地方。一些配置,导致系统每次 重新启动时,都会清空这个目录。 |
| /usr | 在 Linux 系统中,/usr 目录可能是最大的一个。它包含普通用户所需要的所有程序和文件。 |
| /usr/bin | /usr/bin 目录包含系统安装的可执行程序。通常,这个目录会包含许多程序。 |
| /usr/lib | 包含由/usr/bin 目录中的程序所用的共享库。 |
| /usr/local | 这个/usr/local 目录,是非系统发行版自带,却打算让系统使用的程序的安装目录。 通常,由源码编译的程序会安装在/usr/local/bin 目录下。新安装的 Linux 系统中,会存在这个目录, 但却是空目录,直到系统管理员放些东西到它里面。 |
| /usr/sbin | 包含许多系统管理程序。 |
| /usr/share | /usr/share 目录包含许多由/usr/bin 目录中的程序使用的共享数据。 其中包括像默认的配置文件,图标,桌面背景,音频文件等等。 |
| /usr/share/doc | 大多数安装在系统中的软件包会包含一些文档。在/usr/share/doc 目录下, 我们可以找到按照软件包分类的文档。 |
| /var | 除了/tmp 和/home 目录之外,相对来说,目前我们看到的目录是静态的,这是说, 它们的内容不会改变。/var 目录是可能需要改动的文件存储的地方。各种数据库,假脱机文件, 用户邮件等等,都驻扎在这里。 |
| /var/log | 这个/var/log 目录包含日志文件,各种系统活动的记录。这些文件非常重要,并且 应该时时监测它们。其中最重要的一个文件是/var/log/messages。注意,为了系统安全,在一些系统中, 你必须是超级用户才能查看这些日志文件。 |

完整的 Linux 文件系统层次体系标准可通过以下链接找到:

http://www.pathname.com/fhs/

Q.什么是软链接/硬链接

操作文件和目录

  • cp — 复制文件和目录
  • mv — 移动/重命名文件和目录
  • mkdir — 创建目录
  • rm — 删除文件和目录
  • ln — 创建硬链接和符号链接

通配符

通配符意义
*匹配任意多个字符(包括零个或一个)
?匹配任意一个字符(不包括零个)
[characters]匹配任意一个属于字符集中的字符
[!characters]匹配任意一个不是字符集中的字符
[[:class:]]匹配任意一个属于指定字符类中的字符

shell通配符不匹配dot文件,除非明确指定.*

在通配符中使用.*可能会导致一些问题,因为.*匹配...(当前目录和上级目录)。你可以使用正则表达式.[^.]*.??*来排除这两个目录

表5-2: 普遍使用的字符类

字符类意义
[:alnum:]匹配任意一个字母或数字
[:alpha:]匹配任意一个字母
[:digit:]匹配任意一个数字
[:lower:]匹配任意一个小写字母
[:upper]匹配任意一个大写字母

mkdir directory...(可重复,如mkdir dir1 dir2 dir3)

cp item1 item2cp item... directory

表5-4: cp 选项
| 选项 | 意义 |
|--------|-------|
| -a, --archive | 复制文件和目录,以及它们的属性,包括所有权和权限。 通常,复本具有用户所操作文件的默认属性。 |
| -i, --interactive | 在重写已存在文件之前,提示用户确认。如果这个选项不指定, cp 命令会默认重写文件。 |
| -r, --recursive | 递归地复制目录及目录中的内容。当复制目录时, 需要这个选项(或者-a 选项)。 |
| -u, --update | 当把文件从一个目录复制到另一个目录时,仅复制 目标目录中不存在的文件,或者是文件内容新于目标目录中已经存在的文件。 |
| -v, --verbose | 显示翔实的命令操作信息 |
表5-5: cp 实例
| 命令 | 运行结果 |
|--------|-------|
| cp file1 file2 | 复制文件 file1 内容到文件 file2。如果 file2 已经存在, file2 的内容会被 file1 的内容重写。如果 file2 不存在,则会创建 file2。 |
| cp -i file1 file2 | 这条命令和上面的命令一样,除了如果文件 file2 存在的话,在文件 file2 被重写之前, 会提示用户确认信息。 |
| cp file1 file2 dir1 | 复制文件 file1 和文件 file2 到目录 dir1。目录 dir1 必须存在。 |
| cp dir1/* dir2 | 使用一个通配符,在目录 dir1 中的所有文件都被复制到目录 dir2 中。 dir2 必须已经存在。 |
| cp -r dir1 dir2 | 复制目录 dir1 中的内容到目录dir2。如果目录 dir2 不存在, 创建目录 dir2,操作完成后,目录 dir2 中的内容和 dir1 中的一样。 如果目录 dir2 存在,则目录 dir1 (和目录中的内容)将会被复制到 dir2 中。 |

mv item1 item2mv item... directory

表5-6: mv 选项
| 选项 | 意义 |
|--------|-------|
| -i --interactive | 在重写一个已经存在的文件之前,提示用户确认信息。 如果不指定这个选项,mv 命令会默认重写文件内容。 |
| -u --update | 当把文件从一个目录移动另一个目录时,只是移动不存在的文件, 或者文件内容新于目标目录相对应文件的内容。 |
| -v --verbose | 当操作 mv 命令时,显示翔实的操作信息。 |
表5-7: mv 实例
|||
|--------|-------|
| mv file1 file2 | 移动 file1 到 file2。如果 file2 存在,它的内容会被 file1 的内容重写。 如果 file2 不存在,则创建 file2。 每种情况下,file1 不再存在。 |
| mv -i file1 file2 | 除了如果 file2 存在的话,在 file2 被重写之前,用户会得到 提示信息外,这个和上面的选项一样。 |
| mv file1 file2 dir1 | 移动 file1 和 file2 到目录 dir1 中。dir1 必须已经存在。 |
| mv dir1 dir2 | 如果目录 dir2 不存在,创建目录 dir2,并且移动目录 dir1 的内容到 目录 dir2 中,同时删除目录 dir1。如果目录 dir2 存在,移动目录 dir1(及它的内容)到目录 dir2。 |

touch命令用来创建文件。如果文件已经存在,则该命令会更新文件的时间戳

rm item...

表5-8: rm 选项
| 选项 | 意义 |
|--------|-------|
| -i, --interactive | 在删除已存在的文件前,提示用户确认信息。 如果不指定这个选项,rm 会默默地删除文件 |
| -r, --recursive | 递归地删除文件,这意味着,如果要删除一个目录,而此目录 又包含子目录,那么子目录也会被删除。要删除一个目录,必须指定这个选项。 |
| -f, --force | 忽视不存在的文件,不显示提示信息。这选项颠覆了“--interactive”选项。 |
| -v, --verbose | 在执行 rm 命令时,显示翔实的操作信息。 |
表5-9: rm 实例
| 命令 | 运行结果 |
|--------|-------|
| rm file1 | 默默地删除文件 |
| rm -i file1 | 除了在删除文件之前,提示用户确认信息之外,和上面的命令作用一样。 |
| rm -r file1 dir1 | 删除文件 file1, 目录 dir1,及 dir1 中的内容。 |
| rm -rf file1 dir1 | 同上,除了如果文件 file1,或目录 dir1 不存在的话,rm 仍会继续执行。 |

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

ln file link

使用ln -s命令创建符号链接

$ ln -s target linkname 

linkname参数是符号链接名称,target参数是要指向的目标路径,-s选项表示这是一个符号链接

  • type – 说明怎样解释一个命令名
  • which – 显示会执行哪个可执行程序
  • man – 显示命令手册页
  • apropos – 显示一系列适合的命令
  • info – 显示命令 info
  • whatis – 显示一个命令的简洁描述
  • alias – 创建命令别名

type command

[me@linuxbox ~]$ type type
type is a shell builtins
[me@linuxbox ~]$ type ls
ls is aliased to `ls --color=tty`
[me@linuxbox ~]$ type cp
cp is /bin/cp
[me@linuxbox ~]$ which ls
/bin/ls

注意which只对可执行程序有效

cd [-L|-P] [dir]

(一个竖杠字符 表示互斥选项)

重定向

  • cat - 连接文件
  • sort - 排序文本行
  • uniq - 报道或省略重复行
  • grep - 打印匹配行
  • wc - 打印文件中换行符,字,和字节个数
  • head - 输出文件第一部分
  • tail - 输出文件最后一部分

事实上,如果我们需要删除一个文件内容(或者创建一个 新的空文件),可以使用这样的技巧:

[me@linuxbox ~]$ > ls-output.txt

怎样才能把重定向结果追加到文件内容后面,而不是从开头重写文件?为了这个目的, 我们使用>>重定向符

[me@linuxbox ~]$ ls -l /bin/usr > ls-output.txt 2>&1

使用这种方法,我们完成两个重定向

重定向文件描述符2(标准错误)到文件描述符1(标准输出)使用表示法2>&1。

现在的 bash 版本提供了第二种方法,更精简合理的方法来执行这种联合的重定向。

[me@linuxbox ~]$ ls -l /bin/usr &> ls-output.txt

在这个例子里面,我们使用单单一个表示法 &> 来重定向标准输出和错误到文件 ls-output.txt

通过重定向输出结果 到一个特殊的叫做”/dev/null”的文件。这个文件是系统设备,叫做位存储桶,它可以 接受输入,并且对输入不做任何处理。为了隐瞒命令错误信息,我们这样做:

[me@linuxbox ~]$ ls -l /bin/usr 2> /dev/null

cat 命令读取一个或多个文件,然后复制它们到标准输出

cat [file]

你可以使用 cat 来显示 文件而没有分页,例如:

[me@linuxbox ~]$ cat ls-output.txt

将会显示文件 ls-output.txt 的内容。cat 经常被用来显示简短的文本文件

我们能用这个命令把它们连接起来:

cat movie.mpeg.0* > movie.mpeg

因为通配符总是以有序的方式展开,所以这些参数会以正确顺序安排。

如果 cat 没有给出任何参数,它会从标准输入读入数据,因为标准输入,默认情况下,连接到键盘。

[me@linuxbox ~]$ cat > lazy_dog.txt
The quick brown fox jumped over the lazy dog.
^d

使用“<”重定向操作符,我们把标准输入源从键盘改到文件 lazy_dog.tx。我们看到结果 和传递单个文件名作为参数的执行结果一样(cat lazy_dog.txt)

[me@linuxbox ~]$ cat < lazy_dog.txt
The quick brown fox jumped over the lazy dog.

命令可以从标准输入读取数据,然后再把数据输送到标准输出,命令的这种能力被 一个 shell 特性所利用,这个特性叫做管道线|

一个命令的 标准输出可以管道到另一个命令的标准输入:

command1 | command2

我们用 less 来一页一页地显示任何命令的输出,命令把 它的运行结果输送到标准输出:

[me@linuxbox ~]$ ls -l /usr/bin | less

想象一下,我们想把目录/bin 和/usr/bin 中 的可执行程序都联合在一起,再把它们排序,然后浏览执行结果:

[me@linuxbox ~]$ ls /bin /usr/bin | sort | less

为了确信 我们的列表中不包含重复句子(这是说,出现在目录/bin 和/usr/bin 中重名的程序),我们添加 uniq 到我们的管道线中:

[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | less

如果我们想看到重复的数据列表,让 uniq 命令带上”-d”选项,就像这样:

[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq -d | less

如果 wc 不带命令行参数,它接受标准输入。”-l”选项限制命令输出只能 报道行数。添加 wc 到管道线来统计数据,是个很便利的方法。查看我们的有序列表中程序个数, 我们可以这样做:

[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | wc -l
2728

grep 是个很强大的程序,用来找到文件中的匹配文本。这样使用 grep 命令:

grep pattern [file...]

当 grep 遇到一个文件中的匹配”模式”,它会打印出包含这个类型的行

我们想在我们的程序列表中,找到文件名中包含单词”zip”的所有文件

[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | grep zip
bunzip2
bzip2
gunzip
...

-i导致 grep 忽略大小写当执行搜索时(通常,搜索是大小写 敏感的)

-v选项会告诉 grep 只打印不匹配的行

head / tail - 打印文件开头部分/结尾部分,两个命令都打印十行文本,但是可以通过”-n”选项来调整命令打印的行数。

[me@linuxbox ~]$ head -n 5 ls-output.txt
total 343496
...
[me@linuxbox ~]$ tail -n 5 ls-output.txt
...
[me@linuxbox ~]$ ls /usr/bin | tail -n 5
znew
...

使用-f选项,tail 命令继续监测这个文件,当新的内容添加到文件后,它们会立即 出现在屏幕上。这会一直继续下去直到你输入 Ctrl-c

tee - 从 Stdin 读取数据,并同时输出到 Stdout 和文件

在 grep 过滤管道线的内容之前,来捕捉整个目录列表到文件 ls.txt

[me@linuxbox ~]$ ls /usr/bin | tee ls.txt | grep zip
bunzip2
bzip2
....

shell特技

shell 把“*”展开成了 另外的东西,在 echo 命令被执行前。当回车键被按下时,shell 在命令被执行前在命令行上自动展开任何符合条件的字符, 所以 echo 命令从不会发现“*”,只把它展开成结果,这种通配符工作机制叫做路径名展开

[me@linuxbox ~]$ echo *
Desktop Documents ls-output.txt Music Pictures Public Templates Videos

给出一个家目录,它看起来像这样

[me@linuxbox ~]$ ls
Desktop   ls-output.txt   Pictures   Templates
....

我们能够执行以下参数展开模式:

[me@linuxbox ~]$ echo D*
Desktop  Documents

和:

[me@linuxbox ~]$ echo *s
Documents Pictures Templates Videos

甚至是:

[me@linuxbox ~]$ echo [[:upper:]]*
Desktop Documents Music Pictures Public Templates Videos

波浪号展开:

如果有用户”foo”这个帐号,然后:

[me@linuxbox ~]$ echo ~foo
/home/foo

算术表达式只支持整数(全部是数字,不带小数点),但是能执行很多不同的操作。这里是 一些它支持的操作符:
表 8-1: 算术操作符

操作符说明
+
-
*
/除(但是记住,因为展开只是支持整数除法,所以结果是整数。)
%取余,只是简单的意味着,“余数”
**取幂

花括号展开

[me@linuxbox ~]$ mkdir Pics
[me@linuxbox ~]$ cd Pics
[me@linuxbox Pics]$ mkdir {2007..2009}-0{1..9} {2007..2009}-{10..12}
[me@linuxbox Pics]$ ls
2007-01 2007-07 2008-01 2008-07 2009-01 2009-07
2007-02 2007-08 2008-02 2008-08 2009-02 2009-08
2007-03 2007-09 2008-03 2008-09 2009-03 2009-09
2007-04 2007-10 2008-04 2008-10 2009-04 2009-10
2007-05 2007-11 2008-05 2008-11 2009-05 2009-11
2007-06 2007-12 2008-06 2008-12 2009-06 2009-12

参数展开$

查看有效的变量列表,试试这个:

[me@linuxbox ~]$ printenv | less

命令替换

[me@linuxbox ~]$ ls -l $(which cp)
-rwxr-xr-x 1 root root 71516 2007-12-05 08:58 /bin/cp

这里我们把 which cp 的执行结果作为一个参数传递给 ls 命令,因此要想得到 cp 程序的 输出列表,不必知道它完整的路径名

我们不只限制于简单命令。也可以使用整个管道线 (只展示部分输出):

[me@linuxbox ~]$ file $(ls /usr/bin/* | grep zip)
/usr/bin/bunzip2:     symbolic link to `bzip2'
....

单词分割机制会导致这个文件名被看作两个独自的参数,而不是所期望 的单个参数:

[me@linuxbox ~]$ ls -l two words.txt
ls: cannot access two: No such file or directory
ls: cannot access words.txt: No such file or directory

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

[me@linuxbox ~]$ ls -l "two words.txt"
-rw-rw-r-- 1 me   me   18 2008-02-20 13:03 two words.txt
[me@linuxbox ~]$ mv "two words.txt" two_words.txt

环境变量可以通过export命令来设置。例如,如果想将shell变量$STUFF变成环境变量,可以执行如下 命令:

$ STUFF=blah 
$ export STUFF

使用以下命令可以将路径dir加入到PATH 的最前面,这样shell会先查找dir路径,然后再查找其他路径,你也可以将路径加入到PATH变量的最后面,这样shell会最后查找dir路径:

$ PATH=dir:$PATH 
$ PATH=$PATH:dir 

键盘操作

clear - 清空屏幕

history - 显示历史列表内容

表9-1: 光标移动命令
| 按键 | 行动 |
|--------|-------|
| Ctrl-a | 移动光标到行首。 |
| Ctrl-e | 移动光标到行尾。 |
| Ctrl-f | 光标前移一个字符;和右箭头作用一样。 |
| Ctrl-b | 光标后移一个字符;和左箭头作用一样。 |
| Alt-f | 光标前移一个字。 |
| Alt-b | 光标后移一个字。 |
| Ctrl-l | 清空屏幕,移动光标到左上角。clear 命令完成同样的工作。 |

表9-2: 文本编辑命令
| 按键 | 行动 |
|--------|-------|
| Ctrl-d | 删除光标位置的字符。 |
| Ctrl-t | 光标位置的字符和光标前面的字符互换位置。 |
| Alt-t | 光标位置的字和其前面的字互换位置。 |
| Alt-l | 把从光标位置到字尾的字符转换成小写字母。 |
| Alt-u | 把从光标位置到字尾的字符转换成大写字母。 |

剪切下来的本文被存储在一个叫做剪切环(kill-ring)的缓冲区中

表9-3: 剪切和粘贴命令

按键行动
Ctrl-k剪切从光标位置到行尾的文本。
Ctrl-u剪切从光标位置到行首的文本。
Alt-d剪切从光标位置到词尾的文本。
Alt-Backspace剪切从光标位置到词头的文本。如果光标在一个单词的开头,剪切前一个单词。
Ctrl-y把剪切环中的文本粘贴到光标位置。

表9-4: 自动补全命令
| 按键 | 行动 |
|--------|-------|
| Alt-? | 显示可能的自动补全列表。在大多数系统中,你也可以完成这个通过按 两次 tab 键,这会更容易些。 |
| Alt-* | 插入所有可能的自动补全。当你想要使用多个可能的匹配项时,这个很有帮助。 |

历史操作

我们想要找到列出目录 /usr/bin 内容的命令。一种方法,我们可以这样做:

[me@linuxbox ~]$ history | grep /usr/bin

我们的搜索结果之中,我们得到一行,包含了有趣的命令,像这样;

88  ls -l /usr/bin > ls-output.txt

数字 “88” 是这个命令在历史列表中的行号。随后在使用另一种展开类型时,叫做 历史命令展开,我们会用到这个数字。我们可以这样做,来使用我们所发现的行:

[me@linuxbox ~]$ !88

bash 会把 “!88” 展开成为历史列表中88行的内容。

权限

  • id – 显示用户身份号
  • chmod – 更改文件模式
  • umask – 设置默认的文件权限
  • su – 以另一个用户的身份来运行 shell
  • sudo – 以另一个用户的身份来执行命令
  • chown – 更改文件所有者
  • chgrp – 更改文件组所有权
  • passwd – 更改用户密码

表10-1: 文件类型
| 属性 | 文件类型 |
| ---- | ------------------------------------------------------------ |
| - | 一个普通文件 |
| d | 一个目录 |
| l | 一个符号链接。注意对于符号链接文件,剩余的文件属性总是"rwxrwxrwx",而且都是 虚拟值。真正的文件属性是指符号链接所指向的文件的属性。 |
| c | 一个字符设备文件。这种文件类型是指按照字节流,来处理数据的设备。 比如说终端机,或者调制解调器 |
| b | 一个块设备文件。这种文件类型是指按照数据块,来处理数据的设备,例如一个硬盘,或者 CD-ROM 盘。 |

表10-4: chmod 命令符号表示法
|||
|-----|-----------|
| u | "user"的简写,意思是文件或目录的所有者。|
| g | 用户组。 |
| o | "others"的简写,意思是其他所有的人。 |
| a | "all"的简写,是"u", "g"和“o”三者的联合。 |

如果没有指定字符,则假定使用”all”。执行的操作可能是一个“+”字符,表示加上一个权限, 一个“-”,表示删掉一个权限,或者是一个“=”,表示只有指定的权限可用,其它所有的权限被删除。

权限由 “r”,“w”,和 “x” 来指定。这里是一些符号表示法的实例:

表10-5: chmod 符号表示法实例
|||
|-----|-----------|
| u+x | 为文件所有者添加可执行权限。 |
| u-x | 删除文件所有者的可执行权限。 |
| +x | 为文件所有者,用户组,和其他所有人添加可执行权限。 等价于 a+x。 |
| o-rw | 除了文件所有者和用户组,删除其他人的读权限和写权限。 |
| go=rw | 给群组的主人和任意文件拥有者的人读写权限。如果群组的主人或全局之前已经有了执行的权限,他们将被移除。 |
| u+x,go=rw | 给文件拥有者执行权限并给组和其他人读和执行的权限。多种设定可以用逗号分开。 |

进程

  • ps – 报告当前进程快照
  • top – 显示任务
  • jobs – 列出活跃的任务
  • bg – 把一个任务放到后台执行
  • fg – 把一个任务放到前台执行
  • kill – 给一个进程发送信号
  • killall – 杀死指定名字的进程
  • shutdown – 关机或重启系统

默认情况下,ps 不会显示很多进程信息,只是列出与当前终端会话相关的进程

[me@linuxbox ~]$ ps
PID TTY           TIME CMD
5198 pts/1    00:00:00 bash
10129 pts/1   00:00:00 ps

TTY 是 “Teletype” 的简写,是指进程的控制终端。这里,Unix 展示它的年龄。TIME 字段表示 进程所消耗的 CPU 时间数量mm:ss。

表11-1: 进程状态
| 状态 | 意义 |
| --- | --- |
| R | 运行。这意味着,进程正在运行或准备运行。 |
| S | 正在睡眠。 进程没有运行,而是,正在等待一个事件, 比如说,一个按键或者网络数据包。 |
| D | 不可中断睡眠。进程正在等待 I/O,比方说,一个磁盘驱动器的 I/O。 |
| T | 已停止. 已经指示进程停止运行。稍后介绍更多。 |
| Z | 一个死进程或“僵尸”进程。这是一个已经终止的子进程,但是它的父进程还没有清空它。 (父进程没有把子进程从进程表中删除) |
| < | 一个高优先级进程。这可能会授予一个进程更多重要的资源,给它更多的 CPU 时间。 进程的这种属性叫做 niceness。具有高优先级的进程据说是不好的(less nice), 因为它占用了比较多的 CPU 时间,这样就给其它进程留下很少时间。 |
| N | 低优先级进程。 一个低优先级进程(一个“好”进程)只有当其它高优先级进程执行之后,才会得到处理器时间。 |

表11-2: BSD 风格的 ps 命令列标题
| 标题 | 意思 |
| --- | --- |
| USER | 用户 ID. 进程的所有者。 |
| %CPU | 以百分比表示的 CPU 使用率 |
| %MEM | 以百分比表示的内存使用率 |
| VSZ | 虚拟内存大小 |
| RSS | 进程占用的物理内存的大小,以千字节为单位。 |
| START | 进程运行的起始时间。若超过24小时,则用天表示。 |

为了看到更多动态的信息,我们使用 top 命令。top 程序连续显示系统进程更新的信息(默认情况下,每三分钟更新一次)

表11-3: top 命令信息字段
| 行号 | 字段 | 意义 |
| --- | --- | --- |
| 1 | top | 程序名。 |
| | 14:59:20 |当前时间。|
| | up 6:30 |这是正常运行时间。它是计算机从上次启动到现在所运行的时间。 在这个例子里,系统已经运行了六个半小时。|
| | 2 users |有两个用户登录系统。|
| | load average: |加载平均值是指,等待运行的进程数目,也就是说,处于运行状态的进程个数, 这些进程共享 CPU。展示了三个数值,每个数值对应不同的时间周期。第一个是最后60秒的平均值, 下一个是前5分钟的平均值,最后一个是前15分钟的平均值。若平均值低于1.0,则指示计算机 工作不忙碌。|
| 2 | Tasks: | 总结了进程数目和各种进程状态。 |
| 3 | Cpu(s): | 这一行描述了 CPU 正在执行的进程的特性。 |
| | 0.7%us |0.7% of the CPU is being used for user processes.这意味着进程在内核之外。|
| | 1.0%sy |1.0%的 CPU 时间被用于系统(内核)进程。|
| | 0.0%ni |0.0%的 CPU 时间被用于"nice"(低优先级)进程。|
| | 98.3%id |98.3%的 CPU 时间是空闲的。|
| | 0.0%wa |0.0%的 CPU 时间来等待 I/O。|
| 4 | Mem: | 展示物理内存的使用情况。 |
| 5 | Swap: | 展示交换分区(虚拟内存)的使用情况。 |

控制进程暂留

终止进程

ctrl+c等价于kill -INT pid

kill pid默认信号为TERM

发 送STOP信号可以让进程暂停kill -STOP pid

此时暂留的进程可以通过CONT信号继续执行

Shell也支持任务控制(Job Control),是通过不同的按键和命令向进程发送TSTP(类似STOP)和CONT 信号的一种方式。例如,你可以使用CTRL-Z发送TSTP信号来停止进程,然后键入fg(将进程置于前 台)或者bg(将进程移入后台,见下一小节)继续运行进程

如果使用CTRL-Z而不是CTRL-C,然后置之不理,最终会 形成大量处于暂停状态的进程。

你可以使用&操作符将进程设置为后台运行

例如,如果你要 解压缩一个很大的文件(我们将在2.18节介绍),同时又不想干等执行结果,你就可以使用下面的命令:

$ gunzip file.gz &

后台交互最好的方式是将输出重定向(输入也可以),比如重定向到文件或别的地方(我们已经在2.14节介绍 过),这样屏幕上就不会出现杂乱无章的输出数据

shell环境

  • printenv - 打印部分或所有的环境变量
  • set - 设置 shell 选项
  • export — 导出环境变量,让随后执行的程序知道。
  • alias - 创建命令别名

vi

表13-1: 光标移动按键
| 按键 | 移动光标 |
| ------------------- | -------------------------------------- |
| l or 右箭头 | 向右移动一个字符 |
| h or 左箭头 | 向左移动一个字符 |
| j or 下箭头 | 向下移动一行 |
| k or 上箭头 | 向上移动一行 |
| 0 (零按键) | 移动到当前行的行首。 |
| ^ | 移动到当前行的第一个非空字符。 |
| $ | 移动到当前行的末尾。 |
| w | 移动到下一个单词或标点符号的开头。 |
| W | 移动到下一个单词的开头,忽略标点符号。 |
| b | 移动到上一个单词或标点符号的开头。 |
| B | 移动到上一个单词的开头,忽略标点符号。 |
| Ctrl-f or Page Down | 向下翻一页 |
| Ctrl-b or Page Up | 向上翻一页 |
| numberG | 移动到第 number 行。例如,1G 移动到文件的第一行。 |
| G | 移动到文件末尾。 |

vi 中的许多命令都可以在前面加上一个数字,比方说上面提到的”G”命令。在命令之前加上一个 数字,我们就可以指定命令执行的次数。例如,命令”5j”导致 vi 向下移动5行。

u撤回

a追加

A

表13-2: 文本行打开按键
| 命令 | 打开行 |
|-------|---------|
| o | 当前行的下方打开一行。 |
| O | 当前行的上方打开一行。 |

表13-3: 文本删除命令
| 命令 | 删除的文本 |
| ---- | ---------------------------------------- |
| x | 当前字符 |
| 3x | 当前字符及其后的两个字符。 |
| dd | 当前行。 |
| 5dd | 当前行及随后的四行文本。 |
| dW | 从光标位置开始到下一个单词的开头。 |
| d$ | 从光标位置开始到当前行的行尾。 |
| d0 | 从光标位置开始到当前行的行首。 |
| d^ | 从光标位置开始到文本行的第一个非空字符。 |
| dG | 从当前行到文件的末尾。 |
| d20G | 从当前行到文件的第20行。 |

表13-4: 复制命令
| 命令 | 复制的内容 |
| ---- | ---------------------------------------- |
| yy | 当前行。 |
| 5yy | 当前行及随后的四行文本。 |
| yW | 从当前光标位置到下一个单词的开头。 |
| y$ | 从当前光标位置到当前行的末尾。 |
| y0 | 从当前光标位置到行首。 |
| y^ | 从当前光标位置到文本行的第一个非空字符。 |
| yG | 从当前行到文件末尾。 |
| y20G | 从当前行到文件的第20行。 |

J连接行

f 命令查找一行,移动光标到下一个所指定的字符上。例如,命令 fa 会把光标定位到同一行中 下一个出现的”a”字符上。在一行中执行了字符的查找命令之后,通过输入分号来重复这个查找。

目前进度30%

压缩文件

gzip命令只压缩单个文件,要压缩和归档多个文件和目录,可以使用tar命令

$ tar cvf archive.tar file1 file2 ...

选项v用来显示详细的命令执行信息(比如正在归档的文件和目录名),再加一个v选项可以显示文件大 小和权限等信息

选项f代表文件,后面需要指定一个归档文件名(如<archive>.tar)。如果不指定归档文件名,则归档到磁带设备,如果文件名为-,则是归档到标准输入或者输出。

解压 选项x代表解压模式

$ tar xvf archive.tar 

Linux编程

fork():当进程调用fork()时,内核创建一个和该进程几乎一模一样的副本。 exec():当进程调用exec(program)时,内核启动program来替换当前的进程。

常见错误

No such file or directory 这可能是我们最常遇到的错误:访问一个不存在的文件或目录。由于Unix的I/O系统对文件和目录不做区 分,所以当你试图访问一个不存在的文件,进入一个不存在的目录,或将文件写入一个不存在的目录 时,都会出现这个错误。
File exists
如果新建文件的名称和现有的文件或者目录重名,就会出现这个错误。

Not a directory, Is a directory
这个错误出现在当你把文件当作目录或者反之,把目录当作文件。例如:

$ touch a 
$ touch a/b 
touch: a/b: Not a directory 

错误出在第二个命令这里,将文件a当作了目录

No space left on device
说明硬盘空间不足。
Permission denied
当你试图读或写一个没有访问权限的文件或目录时,会遇到这个错误。当你试图执行一个你无权执行 (即使你有读的权限)的文件时也会出现这个错误。我们会在2.17节详细介绍。
Operation not permitted
当你试图终止一个你无权终止的进程时,会出现这个错误。
Segmentation fault, Bus error
分段故障,总线错误。分段故障这个错误通常是告诉你,你运行的程序出了问题。可能你的程序试图访问它无权访问的内存空间,这时操作系统就会将其终止。总线错误说明你的程序访问内存的方式有问 题。遇到这类错误通常是因为程序的输入数据有问题。

设备管理

设备文件

ls -l首字母(代表文件模式):字符b(block)、c(character)、p(pipe)和 s(socket)代表设备文件。下面是详细介绍。
块设备
程序从块设备中按固定的块大小读取数据。前面的例子中,sda1是一个磁盘设备,它是块设备的 一种。我们能够轻松地将磁盘划分成数据区块。因为磁盘的容量是固定的,索引起来也很方便, 所以进程能够通过内核访问磁盘上的任意区块。
字符设备
字符设备处理流数据。你只能对字符设备读取和写入字符数据,如前面例子中的/dev/null。字符设 备没有固定容量,当你对字符设备进行读写时,内核对相应的设备进行读写操作。字符设备的一 个例子是打印机,值得注意的是,内核在流数据送达设备和进程后不会备份和再次验证。
管道设备
命名管道设备和字符设备类似,不同的是输入输出端不是内核驱动程序,而是另外一个进程。
套接字设备
套接字设备是跨进程通信经常用到的特殊接口。它们经常会存放于/dev目录之外。套接字文件代 表Unix域套接字

sysfs

Linux内核通过一个文件和目录系统提供sysfs界面,旨在基于硬件属性统一显示设备的相关信息

/dev目录中的文件是供用户进程使用设备的,而/sys/devices中的文件是用来查看 设备信息和管理设备用的

/sys/block目录中包含系统中的所有块设备文件,不过它们都是符号链接。运行命令ls -l /sys/block可以显示指向sysfs的实际路径。

在/dev目录中查看设备文件的sysfs路径不太方便,可以使用udevadm命令来查看路径和其他属性

$ udevadm info --query=all --name=/dev/sda 

dd命令对于块设备和字符设备非常有用,它的主要功能是从输入文件和输入流读取数据然后写入输出文件和输出流,在此过程中可能涉及到编码转换

dd命令复制固定大小的数据块,它使用等号=而不是减号-来设定选项和参数值

$ dd if=/dev/zero of=new_file bs=1024 count=1 

以下是dd命令的一些重要选项。

if=file:代表输入文件,默认是标准输入。

of=file:代表输出文件,默认是标准输出。

bs=size:代表数据块大小。dd命令一次读取或者写入数据的大小。对于海量数据,你可以在数 字后设置b和k来分别代表512字节和1024字节。如:bs=1k和bs=1024一样。

ibs=size,obs=size:代表输入和输出块大小。如果输入输出块大小相同,你可以使用bs选 项,如果不相同的话,可以使用ibs和obs分别指定。

count=num:代表复制块的总数。在处理大文件或者无限数据流(/dev/zero)的时候,你可能会需要在某个地方停止dd复制,不然的话将会消耗大量硬盘空间和CPU时间。这时你可以使用count和skip选项从大文件或设备中复制一小部分数据。

skip=num:代表跳过前面的num个块,不将它们复制到输出。

其余暂留

转载于:https://www.cnblogs.com/caturra/p/10720591.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值