第三章 CentOS基础了解... 36
第一节 语言编码、终端... 36
I 查看语言编码... 36
II Tty?、pts/?. 36
第二节 bash/sh command. 38
I 查找... 39
II 进程... 41
III tar - cz压缩xC解压tv查看... 42
第一节 环境配置文件... 44
I 配置文件... 44
II su切换用户... 45
III 登录模式... 45
第二节 shell 47
I 命令的优先级... 48
II 别名... 48
III 内置命令bash built-in commands. 49
IV 通配符... 49
V 转义符... 51
VI 元字符... 51
VII 多命令分割... 54
VIII 重定向... 54
IX 其他符号... 54
X 特定变量$#,$@,$0,$1,$2,$*,$$,$?的含义... 54
XI Shell命令解析顺序... 56
XII Shell快捷键... 56
XIII file.sh首行#!/bin/sh. 57
第三节 SSH断开进程在后台运行... 57
I 解决思路... 57
II 解决方法... 57
第四节 改主机名... 58
I hostnamectl set-hostname. 58
II /etc/hosts. 60
第五节 安装Vmware-tools. 60
I 依赖组件... 61
II vmware-tools. 61
第六节 安装GNOME. 62
I 快捷键切换... 62
II 开机默认界面GUI/CUI 62
III Gnome为英文UI 63
IV 背景知识... 64
第三章 CentOS基础了解
鳥哥的 Linux 私房菜:http://linux.vbird.org
第一节
语言编码、终端
locale这个单词中文翻译成地区或者地域,其实这个单词包含的意义要宽泛很多。Locale是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。这些locale定义文件放在/usr/share/i18n/locales目录下面:
Locale是软件在运行时的语言环境, 它包括语言(Language), 地域 (Territory)
和字符集(Codeset)。一个locale的书写格式为:语言[_地域[.字符集]],比如:zh_CN.GB2312。
I
语言编码
Locale把按照所涉及到的文化传统的各个方面分成12个大类,分别是:
1、语言符号及其分类(LC_CTYPE)
2、数字(LC_NUMERIC)
3、比较和排序习惯(LC_COLLATE)
4、时间显示格式(LC_TIME)
5、货币单位(LC_MONETARY)
6、信息主要是提示信息,错误信息,状态信息,标题,标签,按钮和菜单等(LC_MESSAGES)
7、姓名书写方式(LC_NAME)
8、地址书写方式(LC_ADDRESS)
9、电话号码书写方式(LC_TELEPHONE)
10、度量衡表达方式 (LC_MEASUREMENT)
11、默认纸张尺寸大小(LC_PAPER)
12、对locale自身包含信息的概述(LC_IDENTIFICATION)。
除了这12个变量(LC_*)可以设定以外,为了简便起见,还有两个变量:LC_ALL和LANG。它们之间有一个优先级的关系:LC_ALL > LC_*
>LANG。可以这么说,LC_ALL是最上级设定或者强制设定,而LANG是默认设定值。
如果你只想要一个可以输入中文的环境,而保持菜单、标题,系统信息等等为英文界面,那么只需要设定LC_CTYPE=zh_CN.XXXX,LANG=en_US.XXXX就可以了。这样LC_CTYPE=zh_CN.XXXX,而LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=en_US.XXXX。
LANG和LANGUAGE区别
LANG - Specifies the default locale for all unset
locale variables
LANGUAGE - Most programs use this for the language of
its interface
LANGUAGE是设置应用程序的界面语言。而LANG是优先级很低的一个变量,它指定所有与locale有关的变量的默认值,
LANGUAGE参数,它与LC_MESSAGES相似,但如果该参数一旦设置,则LC_MESSAGES参数就会失效。 LANGUAGE参数可同时设置多种语言信息,如LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"。
汉字编码
* GB2312字集是简体字集,全称为GB2312(80)字集,共包括国标简体汉字6763个。
* BIG5字集是*繁体字集,共包括国标繁体汉字13053个。
* GBK字集是简繁字集,包括了GB字集、BIG5字集和一些符号,共包括21003个字符。
* GB18030是国家制定的一个强制性大字集标准,全称为GB18030-2000,它的推出使汉字集有了一个“大一统”的标准。
查看与修改
Cat /etc/locale.conf Locale Echo $LANG |
Localectl 查看系统安装的中文语言包:locale -a|grep ‘zh_’ |
修改后使配置生效 #此文件为全局环境配置,建议修改~/.bash_profile文件
source /etc/locale.conf #
或者重新登陆终端连接,/etc/sysconfig/i18n (RHEL6)
如果在安装程中未安装中文,手工安装中文语言包:yum groupinstall chinese-support
II
Tty?、pts/?
纯TTY【纯文本的终端机模式,如:本机】因为图形显示问题,无法显示中文字符,这不是设置的问题,是功能的问题。在TTY中LANG=zh-CN.UTF-8后,中文字符显示为方块了。
在本地机器上可以通过ALT+F1~F7切换到对应的登录控制台,tty1-6是文本型控制台tty7是X-Window(图形)控制台。
伪终端是是一个伪设备对。有两种命名风格,更详细的看这里。
BSD PTYs (obsolete) |
slave |
/dev/tty[p-za-e][o-9a-f] |
[sauser@centos ~]$ /dev/pts/0 [sauser@centos ~]$ speed 38400 baud; line = -brkint -imaxbel |
|
master |
/dev/pty[p-za-e][0-9a-f] |
|||
Unix98 PTYs |
slave |
/dev/pts/N |
||
master |
/dev/ptmx |
终端类型
1. 串行端口终端(/dev/ttySn):对应于DOS系统下的COM1、COM2等
2. 伪终端(/dev/pty/):成对的逻辑终端设备(即master和slave设备, 对master的操作会反映到slave上),例如/dev/ptyp3和/dev/ttyp3(或者在设备文件系统中分别是/dev/pty/m3和 /dev/pty/s3)。
3. 控制终端(/dev/tty):如果当前进程有控制终端(Controlling
Terminal)的话,那么/dev/tty就是当前进程的控制终端的设备特殊文件。使用命令”ps
–ax|grep tty”来查看进程与哪个控制终端相连。
4. 控制台终端(/dev/ttyn,
/dev/console):在Linux系统中,计算机显示器通常被称为控制台终端(Console)。只有系统或超级用户root可以向/dev/tty0进行写操作。
5. 其它类型:Linux系统中还针对很多不同的字符设备存在有很多其它种类的终端设备特殊文件。例如针对ISDN设备的/dev/ttyIn终端设备等。这里不再赘述。
Q:/dev/console 是什么?
A:/dev/console即控制台,是与操作系统交互的设备,系统将一些信息直接输出到控制台上。一般只有在单用户模式下,才允许用户登录控制台。
Q:/dev/tty是什么?
A:tty设备包括虚拟控制台,串口以及伪终端设备。/dev/tty代表当前tty设备,在当前的终端中输入 echo “hello” > /dev/tty,都会直接显示在当前的终端中。
第二节
bash/sh
command
显示当前/活动目录的路径:pwd
查看命令使用手册:man <command>
uname -a |
查看内核/操作系统/CPU信息 |
hostname |
查看计算机名 |
env |
查看环境变量 |
free -m |
查看内存使用量和交换区使用量 |
df -h |
查看各分区使用情况 |
du -sh <目录名> |
查看指定目录的大小 |
uptime |
查看系统运行时间、用户数、负载 |
mount | column -t |
查看挂接的分区状态 |
fdisk -l |
查看所有分区 |
swapon -s |
查看所有交换分区 |
ifconfig |
查看所有网络接口的属性 |
route -n |
查看路由表 |
netstat -lntp |
查看所有监听端口 |
netstat -antp |
查看所有已经建立的连接 |
netstat -s |
查看网络统计信息 |
ps -ef |
查看所有进程 |
top -n 5 -u tomcat |
实时显示进程状态:刷新5次只显示tomcat用户的 |
w |
查看活动用户 |
id <用户名> |
查看指定用户信息 |
last |
查看用户登录日志 |
cut -d : -f 1 /etc/passwd |
查看系统所有用户 |
cut -d : -f 1 /etc/group |
查看系统所有组 |
crontab -l |
查看当前用户的计划任务 |
chkconfig –list |
列出所有系统服务 |
chkconfig –list | grep on |
列出所有启动的系统服务 |
rpm -qa |
查看所有安装的软件包 |
touch命令有两个功能:更新已存在文件的时间标签或创建空的文件。
以.d结尾的文件夹
I
查找
ls文件
Ls -lh
<.|/etc/m|m> <默认>按字母顺序列出指定文件或指定文件夹的文件和文件夹
Ls -lh
</etc/m*|m*> 按字母顺序符合过滤器的文件及子文件夹下的所有文件与目录<隐含-R
>
Ls
-lhd </etc/m*|m*> 按字母顺序符合过滤器的文件及子文件夹的所有文件与目录<不递归显示>
[root@cos7 ~]# mkdir m1;mkdir m;mkdir 123\m34\df
-p
[root@cos7 ~]# touch m2;touch m\a.bc;touch
123\dd
find文件:强大
查找指定目录及递归所有子目录下匹配的文件和文件夹,包含隐藏的。
[root@cos7 ctos]# find /etc -name *.target
/etc/systemd/system/multi-user.target.wants/remote-fs.target
/etc/systemd/system/multi-user.target.wants/nfs-client.target
/etc/systemd/system/remote-fs.target.wants/nfs-client.target
/etc/systemd/system/default.target
[root@cos7 ~]# find /usr -path java
/usr/bin/java
/usr/lib/java
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/jre/bin/java
/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.161-2.6.12.0.el7_4.x86_64/jre/bin/java
/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.161-2.6.12.0.el7_4.x86_64/jre-abrt/bin/java
/usr/share/java
grep内容
-r:子目录递归查找【grep ‘abc’ * #在当前目录搜索含'abc'行的文件】
-i:忽略大小写的不同,所以大小写视为相同
-n:输出行号
-F:以字符方式搜索,不是以正则表达式搜索。
-v:反向选择,亦即显示出没有'搜寻字符串'内容的那一行!
-#:显示匹配行上下#行
-A#:匹配行后面打印#行
-B#:匹配行前面打印#行
可以不加参数即支持正式则表达式,或-e指明。
n 支持符号:^ $ [] [-] [^] * . \ /> \w \W \b \s \S x\{m\} x\{m,\} x\{m,n\}
n 扩展-E支持:| () +
netstat -an|grep -v '^unix' #反向过滤,即排除行首为unix的内容。
lsof进程文件
在linux环境下,任何事物都以文件的形式存在。lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。
-a:列出打开文件存在的进程;
-c<进程名>:列出指定进程所打开的文件;
-g:列出GID号进程详情;
-d<文件号>:列出占用该文件号的进程;
+d<目录>:列出目录下被打开的文件;
+D<目录>:递归列出目录下被打开的文件;
-n<目录>:列出使用NFS的文件;
-i<条件>:列出符合条件的进程。(4、6、协议:端口、@ip)
-p<进程号>:列出指定进程号所打开的文件;
-u:列出UID号进程详情;
II
进程
程序和进程
1、程序:程序是静止的,程序就是磁盘上的一个文件。
2、进程:进程是一个正在执行的程序的实例。
3、一旦程序被操作系统加载进内存了,那么这程序就成为了进程。
PID和PPID
1、PID(process ID):PID是程序被操作系统加载到内存成为进程后动态分配的资源。每次程序执行的时候,操作系统都会重新加载,PID在每次加载的时候都是不同的。
2、PPID(parent process ID):PPID是程序的父进程号。
3、PID和PPID都是非零的整数,
4、PID是唯一的,一个PID只标识一个进程。
5、一个进程创建的另一个新进程称为子进程。相反地,创建子进程的进程称为父进程。
6、对于一个普通的用户进程,它的父进程就是执行它的哪个Shell,对于Linux而言,Shell就是bash。bash所在的目录:type bash
特别说明
1、所有进程追溯其祖先最终都会落到进程号为1的进程身上,这个进程叫init进程
2、init进程是linux内核启动后第一个执行的进程。
3、init引导系统,启动守护进程并且运行必要的程序。
ps、pstree、pgrep查看进程
ps -aux 显示进程信息,参数可省略 -e , -A 显示所有进程 a x u f 树状显示 w 完整显示信息 l 显示长列表 |
pgrep <processname> 显示进程的PID -o:仅显示找到的最小(起始)进程号; -n:仅显示找到的最大(结束)进程号; -l:显示进程名称; -P:指定父进程号; -g:指定进程组; -t:指定开启进程的终端; -u:指定进程的有效用户ID。 |
pstree [pid|user] 树状显示进程信息 |
kill、pkill结束进程
kill [信号代码] 根据PID向进程发送信号,常用来结束进程,默认信号为 |
pkill <进程名> 结束进程族。 如果结束单个进程,请用 kill |
安全剔除用户(得到用户登录相应的进程号pid后kill):
ps -af
kill -9 pid
III
tar - cz压缩xC解压tv查看
6字口记住:cz压缩xC解压tv查看
简单示例
tar -cf archive.tar foo bar # 从文件 foo
和 bar 创建不压缩文件archive.tar。
tar -caf archive.tar.gz foo
bar # 从文件 foo 和 bar
创建gzip压缩文件archive.tar.gz。
tar -tvf archive.tar # 详细列举(-v:与ls
-l效果一致)archive.tar中的所有文件。
tar -xf archive.tar # 在当前目录中解压缩。
tar -xf archive.tar.gz a/b.txt #
仅解压缩archive.tar.gz里的a/b.txt文件。
tar -xf archive.tar -C /home/abc #
在/home/abc目录中解压缩。
tar -N "2012/11/13" -zcvf log17.tar.gz
test #在文件夹中,比某个日期新的文件才备份
tar --exclude scf/service -zcvf scf.tar.gz
scf/* #备份文件夹内容是排除部分文件
主操作模式
-A, --catenate,
--concatenate 追加 tar
文件至归档
-c, --create 创建一个新归档
-d, --diff, --compare 找出归档和文件系统的差异
--delete 从归档(非磁带!)中删除
-r, --append 追加文件至归档结尾
-t, --list 列出归档内容
-u, --update 仅追加比归档中副本更新的文件
-x, --extract, --get 从归档中解出文件,未使用-C时,默认为当前目录。
本地文件选择
-f, --file=ARCHIVE 使用归档文件名称,f后面要接文件名!
-C, --directory=DIR 解压至目录 DIR
--exclude=PATTERN 排除以 PATTERN 指定的文件
-h, --dereference 跟踪符号链接;将它们所指向的文件归档并输出
-N, --newer=DATE-OR-FILE,
--after-date=DATE-OR-FILE 只保存比 DATE-OR-FILE 更新的文件
-T, --files-from=FILE 从 FILE中获取文件名来解压或创建文件
-X, --exclude-from=FILE 排除 FILE
中列出的模式串
压缩方法
-a, --auto-compress 使用归档后缀名来决定压缩程序,不能识别时不压缩。
-j, --bzip2 通过
bzip2 过滤归档
-z, --gzip, --gunzip, --ungzip 通过 gzip
过滤归档
-Z, --compress, --uncompress 通过
compress 过滤归档
其他选项
--keep-newer-files 不要替换比归档中副本更新的已存在的文件
--no-overwrite-dir 保留已存在目录的元数据
--overwrite 解压时重写存在的文件
--overwrite-dir 解压时重写已存在目录的元数据(默认)
--recursive-unlink 解压目录之前先清除目录层次
--remove-files 在添加文件至归档后删除它们
--skip-old-files don't
replace existing files when extracting,silently skip over them
-U, --unlink-first 在解压要重写的文件之前先删除它们
-v, --verbose 详细地列出处理的文件
-W, --verify 在写入以后尝试校验归档
-m, --touch 不要解压文件的修改时间
第一节
环境配置文件
一般约定:变量名称为大写
查看当前所有的环境变量:env
清除环境变量的值用unset命令
I
配置文件
交互式shell登录时读取profile,初始化时读取bashrc。非交互式只会读取bashrc。
一般把alias和function一类的放到bashrc中,而把export更多的放在profile文件中。
/etc/profile
此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从/etc/profile.d目录的配置文件中搜集shell的设置。
~/.bash_profile
每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。默认情况下,执行~/.bashrc文件并设置一些环境变量。
~/.bashrc
该文件包含专用于用户的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。默认情况下,会执行/etc/bashrc文件。
/etc/bashrc
为每一个运行bash
shell的用户执行此文件,当bash
shell被打开时该文件被读取。
~/.bash_logout
当每次退出系统(退出bash
shell)时,执行该文件,默认为空。
II
su切换用户
su切换用户时,仅su
- username或su username -l会加载目标用户的环境变量。
示例:使用su -oracle 或 su -l oracle,这样会连同PATH等环境变量都转成新用户的环境。
[ctos@cos7 ~]$ su oracle
密码:
[oracle@cos7 ctos]$
echo $ORACLE_HOME
[oracle@cos7 ctos]$
exit
exit
[ctos@cos7 ~]$ su - oracle
密码:
上一次登录:四 1月 25
21:47:34 CST 2018pts/0 上
[oracle@cos7 ~]$
echo $ORACLE_HOME
/u01/app/oracle/product/11.2.0/dbhome_1
[oracle@cos7 ~]$
III
登录模式
http://blog.csdn.net/linuxnews/article/details/52579186
bash --help
GNU bash,版本 4.2.46(2)-release-(x86_64-redhat-linux-gnu)
用法: bash [GNU 长选项] [选项] ...
bash [GNU 长选项] [选项]
脚本文件 ...
GNU 常选项:
--debug
--debugger
--dump-po-strings
--dump-strings
--help
--init-file
--login
--noediting
--noprofile
--norc
--posix
--protected
--rcfile
--rpm-requires
--restricted
--verbose
--version
Shell 选项:
-irsD 或 -c 命令 或 -O shopt选项 (仅适合调用)
-abefhkmnptuvxBCHP
或
-o 选项
请输入`bash
-c "help set"' 以获得关于 shell 选项的更多信息
请输入 `bash -c help' 以获得关于 shell
内嵌命令的更多信息.
登录shell
登录shell的参数0($0)是以“-”开头,或者是以--login选项启动的shell。
echo
$0
#如果是登录shell返回-[bash name],否则返回[bash name]。
当一个登录shell退出的时候,如果当前用户的~/.bash_logout存在,bash会读取他。
非登陆shell
no-login shell是我们在终端下直接输入
bash 或者 bash -c “CMD” 来启动的
shell。该模式下是不会自动去运行任何的 profile
文件。
交互式Shell
交互式shell是启动时没有非选项参数,没有-c选项,其标准输入和错误都连接到终端(由isatty(3)确定),或者使用-i选项启动。
交互式shell中变量PS1被设置,变量$-包含小写字母i
当你登录一个交互式的shell后,如果/etc/profile存在,bash首先会读取/etc/profile的配置,然后再依次读取对应用户的~/.bash_profile、~/.bash_login和~/.profile。
$PS1
PS(Prompt Sign)指的是命令提示符,PS1为命令提示符,PS2为一行没输完等待第二行输入的提示符。在/etc/bashrc中第一行就检没了PS1是否存在,并在下文中定义了默认值:[\u@\h
\W]$。可在~/.bash_profile中定义,但无需export语句。
\d:代表日期,格式为weekday month date,例如:"Mon
Aug1"
\H:完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux
\h:仅取主机的第一个名字,如上例,则为fc4,.linux则被省略
\t:显示时间为24小时格式,如:HH:MM:SS
\T:显示时间为12小时格式
\A:显示时间为24小时格式:HH:MM
\u:当前用户的账号名称
\v:BASH的版本信息
\w:完整的工作目录名称。家目录会以
~代替
\W:利用basename取得工作目录名称,所以只会列出最后一个目录
\#:下达的第几个命令
\$:提示字符,如果是root时,提示符为:# ,普通用户则为:$
$-
/ himBH
http://kodango.com/explain-shell-default-options
$-记录着当前设置的shell选项,himBH是默认值,你可以通过
set 命令来设置或者取消一个选项配置。例如:set -x
h
- hashall
猜测打开这个选项后,Shell
会将命令所在的路径记录下来,避免每次都要查询。
i
- interactive
包含这个选项说明当前的 shell 是一个交互式的
shell,何为交互式?你输入命令,shell
解释执行后给你返回结果,我们在 Terminal 下使用的 shell
就是交互式的,所以 $- 会包含 i
字符。如果我们在一个脚本里面 echo $-,结果是不会包含 i
的。
m
- monitor mode
字面意思是说打开监控模式,Bash
手册上后面还有一句话"Job control is enabled",Job
control 是什么?就是说可以控制进程的停止、继续,后台或者前台执行等。
正常情况下,在交互式模式下,该选项默认是打开的,所以再执行一个比较耗时的命令时,你可以按下CTRL+Z 让它在后台运行,然后可以用 fg
命令将后台运行的任务恢复到前台执行。
B
- brace expansion
Brace expansion 是一个很有用的技巧,我这里简单介绍一个:
很多时候大家需要备份某个文件时,非常头疼的一点就是要重复输入长长地路径,利用 Brace
expansion 就可以轻松搞定。
你可以试试通过set
+B来关闭这个功能,与前面几个选项不同的是,这个选项在脚本里面也是默认打开的。
H
- history expand
history expand 这个很多人都基本上不用,包括我也是。我们知道
Shell 会把我们执行的命令记录下来,可以通过 history
命令查看,每一行是序号 + 执行的命令。在 shell
退出时,会将这些信息保存到~/.bash_history
文件中,当然在启动时也会从该文件中加载,不信删除这个文件再打开一个终端试试。
history expand 就是展开历史列表中的命令,可以通过!感叹号来完成,例如"!!"返回上最近的一个历史命令,"!n"返回第 n 个历史命令,等等,具体可以看 Bash 的 Man手册,这里不多介绍。
多扯一句,在命令行下,不要在双引号号里面用!,这会让
Shell "误以为"
你要执行历史展开。
IV
Shell启动顺序
https://blog.flowblok.id.au/2013-02/shell-startup-scripts.html
第二节
shell
https://www.cnblogs.com/sjxsq/p/6934732.html
shell一般代表两个层面的意思,一个是命令解释器,比如BASH,另外一个就是shell脚本。本节我们站在命令解释器的角度来阐述shell.
命令解释器SHELL的发展历史,SH-CSH-KSH-TCSH-BASH,我们先来了解下命令解释器BASH。
I
命令的优先级
命令分为:
==> alias
==> Compound
Commands
==> function
==> build_in
==> hash
==> $PATH
==> error: command not
found
获取一个命令会按照上述优先级取寻找,先找同名的alias命令,再找compound命令。
l 别名:别名命令是为了简化输出给一个长参数命令的整合,别名的定义方法 alias la='ls -al'
取消别名 unalias
la
l 内部命令:是BASH自带的命令 功能简单,内部命令的帮助在builtin(1)里
l 外部命令:是就是一个小程序存在于/bin/、/sbin/、/usr/bin 等地方
命令的执行搜索顺序:
==>别名
(alias可以查看)
==> bash内部命令
==> $PATH 中按冒号分割的每个路径中去搜索
II
别名
ps:登陆后的预置别名从何而来(别名应该学会的东西:取消别名和建立别名,固化别名配置我们会在后续章节介绍,无非将alias定义到文件中):
别名来源:一部分来自/root/.bashrc,但普通用户的~/.bashrc不包含别名,因为普通用户的.bashrc模板是:/etc/skel/.bashrc
而root这个.bashrc在安装完系统就预置了;一部分来自/etc/profile.d/目录里的可执行文件。
grep '^alias' /root/.bashrc
grep -rn 'alias' /etc/profile.d/
III
内置命令bash built-in commands
很多种
第一种:bash自身带的功能
参见man
cd
bash, :, ., [, alias, bg, bind, break, builtin, cd,
command, compgen, complete,continue, declare, dirs, disown, echo, enable, eval,
exec, exit, export, fc, fg,getopts, hash, help, history, jobs, kill, let, local,
logout, popd, printf,pushd, pwd, read, readonly, return, set, shift, shopt,
source, suspend, test,times, trap, type, typeset, ulimit, umask, unalias, unset,
wait
第二种:Compound
Commands
例如 for if
while等
参见 man
bash
第三种:function
function cd() {
echo 'my function cd'; }
IV
通配符
通配符看起来有点象正则表达式语句,但是它与正则表达式不同的,不能相互混淆。把通配符理解为shell 特殊代号字符就可。而且涉及的只有,*,? [] ,{}
这几种。
*任意长度字符串
任意字符,且任意长度。
?
单个字符
任意一个字符。
[]
字符通配
匹配括号内之一:[a3b4]仅匹配a/3/b/4的其中一个。
也可以使用范围 [a-z] 代表aAbBcC,[0-9]代表012345。
-区间/cd
-
{}
字符串匹配
{string1,string2,...} #匹配 sring1
或 string2 (或更多)其一字符串
a{abc,xyz,123}b #a与b之间只能是abc或xyz或123这三个字符串之一。
[ctos@cos7 ~]$ touch a123b a127b
a123bc
[ctos@cos7 ~]$ ls
a123b a123bc a127b
[ctos@cos7 ~]$ ls
a{123,127}b
a123b a127b
[ctos@cos7 ~]$
!
或 ^
取非
# ls
/dev/sda[0123]
/dev/sda1 /dev/sda2
# ls
/dev/sda[!01]
/dev/sda2
,
枚举分隔符
V
转义符
\
转义符
去除其后紧跟的元字符或通配符的特殊意义。
# echo
\\
\
# echo
\'
'
""
软引用
又叫软转义,其内部只允许出现特定的shell
元字符:$用于参数代换 `用于命令代替
''
硬引用
又叫硬转义,其内部所有的shell
元字符、通配符都会被关掉。注意:硬转义中不允许出现’(单引号)。
VI
元字符
键盘上能敲出来的特殊字符,在bash中都有其特殊意义,强调一点:元字符是被shell解释的
``
命令替换 取命令的执行结果
# ls
4.txt anaconda-ks.cfg a.txt B.txt c.txt D.txt
nginx-1.10.3 nginx-1.10.3.tar.gz
#
res=`ls` #取命令的运行结果,赋值给变量res
# echo
$res
#查看变量res的值
4.txt anaconda-ks.cfg a.txt B.txt c.txt D.txt
nginx-1.10.3 nginx-1.10.3.tar.gz
$()
同上,但它弥补了``的嵌套缺陷
# res=`echo
`ls``
#嵌套使用后无法达到预想的效果:取echo 一堆文件名的效果。
!
几种用法
!
历史命令调用并执行
#
!343
!
匹配最近一次历史命令及输出
#
!ls
ls /dev/sda[!01]
/dev/sda2
!
ls 带空格 将命令的返回值取反
# echo
ok
ok
# echo
$?
#上一条命令执行的结果,0代表执行成功,非0代表执行失败
0
# ! echo
ok
#将结果取反
ok
# echo
$?
1
0-255之间,0则为真,非0位假 $?是上一个命令执行结果的代码。
$
或 ${}
变量取值
区别:${}
变量取值时明确变量名
echo
${money}abc
$[]
整数计算 +-*/%
整数计算 echo
$[2+3] - * / %
浮点数用 echo "scale=3; 10/3" | bc
-le
scale=3是将bc输出的小数位为3位,bc命令是一种支持任意精度的交互执行的计算器语言。bash内置了对整数四则运算的支持,但是并不支持浮点运算,而bc命令可以很方便的进行浮点运算,当然整数运算也不再话下。
%
杀后台进程 jobs号
取模
^
取非,见!
替换
# systemctl
restart network
#
^network^sshd^
systemctl restart sshd
&
后台执行
()
在子进程中执行
#
x=1
#
(x=666)
# echo
$x
1
# (x=666;echo
$x)
666
{}
命令列表
[ctos@cos7 ~]$ { ls;cd /;ls; } #注意:括号内的开头和结尾必须是空格
{} 循环列表
[ctos@cos7 ~]$ touch
{1..3}{a..b}
[ctos@cos7 ~]$ ls
1a 1b 2a 2b 3a 3b
:
空命令/真值
VII
多命令分割
;
拼接多个命令
无论对错,会一直执行到最后一条命令。ms-dos下为&
ls;pwd;echo 123
&&
逻辑与
在前一个命令结束时,若返回值为 true,继续执行下一个命令。
||
逻辑或
在前一个命令结束时,若返回值为 false,继续执行下一个命令。
VIII
重定向
| 管道
< 输入重定向
> 输出重定向
>> 追加
<< here document
>& 合并2和1输出
/dev/null是一个文件,这个文件比较特殊,所有传给它的东西它都丢弃掉。
IX
其他符号
_ 无特殊含义
@ 无特殊含义,一般不用。
# 注释
/ 目录分隔符
. 当前目录
.. 上级目录
= 变量赋值
X
特定变量$#,$@,$0,$1,$2,$*,$$,$?的含义
https://www.cnblogs.com/kaituorensheng/p/4002697.html
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 ~ $N 是传递给该shell脚本的第一个参数 到 第N个参数。
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
$*
vs $@ 区别
相同点:都是引用所有参数
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数(分别存储在1
2 3),则"*" 等价于 “1 2
3"(传递了一个参数);而“@" 等价于"1" "2"
"3"(传递了三个参数)
示例:
##dels.sh echo "number:$#" echo "scname:$0" echo "first :$1" echo "second:$2" echo "argume:$@" echo "show parm list:$*" echo "show process id:$$" echo "show precomm stat: $?" |
执行$ number:3 scname:del.sh first: 1 second:2 argume:1 2 3 show parm list:1 2 3 show process id:21057 show precomm stat: 0 |
XI
Shell命令解析顺序
XII
Shell快捷键
CTRL+A 行首
CTRL+E 行尾
CTRL+U 删除自光标到行首串
CTRL+K 删除自光标到行尾串
CTRL+L 清屏
XIII
file.sh首行#!/bin/sh
和c语言中头文件一样是声明文件的路径,#!/bin/sh
是指此脚本使用/bin/sh来执行
#!是特殊的表示符,其后面跟的是解释此脚本的shell的路径,如果没有声明,则脚本将在默认的shell中执行,默认shell是由用户所在的系统定义为执行shell脚本。
GNU/Linux操作系统中的/bin/sh本是bash (Bourne-Again Shell)
的符号链接,但鉴于bash过于复杂,有人把bash从NetBSD移植到Linux并更名为dash (Debian Almquist
Shell),并建议将/bin/sh指向它,以获得更快的脚本执行速度。Dash
Shell 比Bash Shell小的多,符合POSIX标准。
Ubuntu继承了Debian,所以从Ubuntu
6.10开始默认是Dash Shell。
应该说,/bin/sh与/bin/bash虽然大体上没什么区别,但仍存在不同的标准。标记为#!/bin/sh的脚本不应使用任何POSIX没有规定的特性
(如let等命令,
但#!/bin/bash可以)。Debian曾经采用/bin/bash更改/bin/dash,目的使用更少的磁盘空间、提供较少的功能、获取更快的速度。但是后来经过shell脚本测试存在运行问题。因为原先在bash
shell下可以运行的shell script (shell 脚本),在/bin/sh下还是会出现一些意想不到的问题,不是100%的兼用。
所以CentOS中没有!
第三节
SSH断开进程在后台运行
当用户注销(logout)或者网络断开时,终端会收到HUP(hangup)信号从而关闭其所有子进程。
I
解决思路
1.让进程运行在新的session(会话)里即不属于此终端的子进程。
2.可以实现让进程忽略HUP信号
II
解决方法
setsid命令
功能:run a program in a new
session在新的会话中运行程序
参数:-c, --ctty 将控制终端设置为当前终端
实例:setsid
ping 51osos.com > /dev/null
nohup命令
功能:不挂断地运行命令,忽略HUP信号。
语法:nohup
command&
实例:nohup
ping 51osos.com >
/dev/null &
screen命令
此命令非常强大。如果非常多的命令都需要忽略HUP命令,screen可以解决这一问题。screen
提供了 ANSI/VT100
的终端模拟器,使它能够在一个真实终端下运行多个全屏的伪终端(可以在当前 session
里面,新建另一个 session。这样的话,当前 session 一旦结束,不影响其他 session。而且,以后重新登录,还可以再连上早先新建的 session。)。
用screen -dmS session name
来建立一个处于断开模式下的会话(并指定其会话名)。
用screen -list
来列出所有会话。
用screen -r session name
来重新连接指定会话。
其他
用disown -h jobspec
来使某个作业忽略HUP信号。
用disown -ah 来使所有的作业都忽略HUP信号。
用disown -rh
来使正在运行的作业忽略HUP信号。
当使用过 disown
之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps
-ef查找到它。
第四节
改主机名
在CentOS或RHEL中,有三种定义的主机名:
a、静态的(static):也称为内核主机名,是系统在启动时从/etc/hostname自动初始化的主机名。
b、瞬态的(transient):在系统运行时临时分配的主机名,例如,通过DHCP或mDNS服务器分配。
c、灵活的(pretty):
静态主机名和瞬态主机名都遵从作为互联网域名同样的字符限制规则。而另一方面,“灵活”主机名则允许使用*形式(包括特殊/空白字符)的主机名,以展示给终端用户(如Dan's Computer)。
I
hostnamectl set-hostname
要查看主机名相关的设置: hostnamectl status
只查看静态、瞬态或灵活主机名: hostnamectl
--static|--transient|--pretty
修改<静态|瞬态|灵活>主机名,未指明则同时修改前二者,并清空灵活的主机名:hostnamectl [--static|--transient|--pretty]
set-hostname< host-name>
II
/etc/hosts
第五节
安装Vmware-tools
有二个:一个player的光盘,一个是yum install open-vm-tools
open-vm-tools-desktop。
Open-vm-tools不需要像vmware-tools要手动安装依赖组件。
I
依赖组件
0、yum
whatprovides ifconfig #查看ifconfig在哪个包里:net-tool
1、yum install perl gcc
net-tool
yum
upgrade
2、重点是kernel
s uname -r
#看本机kernel版本
s rpm -q
kernel-headers
#看版本
s rpm -q
kernel-devel
#看版本
需要安装与你的kernel版本号一直的kernel-devel,使用yum list
kernel-devel查看存在的kernel-devel包,如果没有对应的kernel包,此时则需要你更新你的kernel,并且重启系统进入到最新的kernel版本中。再使用yum install
kernel-devel安装与此时系统kernel版本号一致的kernel-devel。
II
vmware-tools
1、虚拟机:安装VMware Tools
2、创建挂载点目录:sudo mkdir /mnt/cdrom
3、挂在光驱:sudo mount /dev/cdrom /mnt/cdrom
4、查看挂在光驱结果:ls
/mnt/cdrom
#VMware-Linux-tools.tar.gz
5、解压缩文件到/tmp:tar -zxvf /mnt/cdrom/vmware-linux-tools.tar.gz -C
/tmp
6、
进入到解压缩后的目录:cd /tmp/vmware-tools-distrib
7、执行./vmware-install.pl文件:sudo
./vmware-install.pl #与Ubuntu下一样。
第六节
安装GNOME
懒人大法 yum groupinstall "GNOME Desktop" #这个是一把抓媒体/openJDK都安装了。 安装好后,可以使用 startx 进入GUI环境。 安装输入平台、输入法:yum install im-chooser ibus-libpinyin 第一次进入GNOME时,选择汉语(Intelligent),可托盘上显示输入法指示器。 |
Free -m对比,最小化安装(200M)与GNOME桌面(700M)相差500M的使用内存,没事别开桌面。
I
快捷键切换
在GUI的登录/桌面,切换到CUI的快捷键是:CTRL +ALT +F3/F5
如果安装模式为Gnome桌面,从CUI切换到GUI的快捷键是:ALT+F1
II
开机默认界面GUI/CUI
[root@centos ~]#
systemctl get-default
multi-user.target
[root@centos ~]#
systemctl set-default
graphical.target
Removed symlink
/etc/systemd/system/default.target.
Created symlink from
/etc/systemd/system/default.target to
/usr/lib/systemd/system/graphical.target.
默认为CUI:systemctl set-default multi-user
III
Gnome为英文UI
临时解决解决办法:先LANG=zh_CN.UTF-8后startx,GNOME为中文了。
IV
背景知识
最小化安装是没有图形界面,GNOME/gtk、KDE/qt都是基于X-Windows的经过不同组织进行整合之后的桌面环境,通过X-Window其才能运行。
严格来讲,Linux这个词本身只表示Linux kernel,但实际上习惯用Linux来形容整个基于Linux内核,并且使用 GNU工程各种工具和数据库的操作系统(也被称为GNU/Linux)
。所以Linux内核只是一个基于命令行的操作系统,图形界面并不是Linux内核的一部分。Linux内核相当于Windows 3.X的Dos,Windows 3.x不是独立的操作系统,它只是Dos的扩充,是Dos下的应用程序级别的系统,不是独立的操作系统。
Windows 95~Windows
2003:图形界面就是Windows内核一部分,也是在内核中实现的。从Windows
Vista开始引入WDDM(Windows
Display Driver Model,上一代为XPDM使用2D
的GDI<Graphics Device Interface>或 GDI+),实现了与内核的分离。WDDM允许在显示驱动出错时,重置显示设备而不用重新启动计算机,更不会蓝屏。
Vista之前,第一个登录的用户与Windows服务程序运行在同一个会话(Session
0,通过ProcExp.exe观查)中,第二个以及后续的登录用户就运行在其他的会话中。
Vista开始,Windows服务运行于Session
0,第一个登录的用户则在Session 1中运行。Session 0是一个非交互型的(noninteractive)Session,只能运行系统进程以及服务程序。所以服务程序已经不能像之前一样工作,比如不能访问视频驱动程序。(psexec64.exe可以让程序手工指定运行在Session
0,即不受用户登录与注销的影响)
在Windows Server端,从2008开始增加了版本:服务器核心(Server Core),就是没有GUI的Windows
Server系统。
Linux X Window
System的基本原理,X是一个开放的协议规范,当前版本为11,俗称X11。X Window System由客户端和服务端组成,服务端X
Server负责图形显示,而客户端库X Client根据系统设置的DISPLAY环境变量,将图形显示请求发送给相应的X Server,典型的C/S结构(XFree86、Xorg均是X11的实现,为X11 Server;而GNOME/gtk、KDE/qt、Xfce/gtk均是X11 Client)。
X-Window泛指所有在X11基础上实现的GUI环境,在很多情况下 X-Windows
=X11。
Linux图形界面层次关系:Linux本身-->X服务器<-[通过X协议交谈]->WM (Window Manager/窗口管理器,即桌面环境)-->X应用程序。
Q:为什么Linux服务器不用装图形桌面?
V
NetworkManager
network.service与NetworkManager.service 冲突
VM player中挂起后恢复时,提示CPU计数已改变,只能放弃挂起状态。启动后,发现网络不可用,使用ip addr查看网络配置,接口都有但已没有IP地址。
[root@cos7 ~]#
ping 192.168.19.19
connect: Network is unreachable
[root@cos7 ~]#
systemctl status network.service
● network.service
- LSB: Bring up/down networking
Loaded: loaded
(/etc/rc.d/init.d/network; bad; vendor preset: disabled)
Active: failed
(Result: exit-code) since Thu 2018-02-01 12:30:32 CST; 2min 50s ago
Docs:
man:systemd-sysv-generator(8)
Process: 840
ExecStart=/etc/rc.d/init.d/network start (code=exited,
status=1/FAILURE)
Feb 01 12:30:32 cos7 systemd[1]: Starting LSB: Bring
up/down networking...
Feb 01 12:30:32 cos7 network[840]:
正在打开环回接口: [ 确定 ]
Feb 01 12:30:32 cos7 network[840]:
正在打开接口 ens32:
错误:激活连接失败:No suitable
device found for this connection.
Feb 01 12:30:32 cos7 network[840]:
[失败]
Feb 01 12:30:32 cos7 network[840]:
正在打开接口 ens33: 错误:激活连接失败:No
suitable device found for this connection.
Feb 01 12:30:32 cos7 network[840]:
[失败]
Feb 01 12:30:32 cos7 systemd[1]: network.service:
control process exited, code=exited status=1
Feb 01 12:30:32 cos7 systemd[1]: Failed to start LSB: Bring up/down
networking.
Feb 01 12:30:32 cos7 systemd[1]: Unit network.service
entered failed state.
Feb 01 12:30:32 cos7 systemd[1]: network.service
failed.
[root@cos7 ~]#
systemctl restart network.service
Job for network.service failed because the control
process exited with error code. See "systemctl status network.service" and
"journalctl -xe" for details.
查看 /etc/sysconfig/network-scripts/ifcfg-ens32等文件,为正常。
问百度,大同小异,有说在ifcfg-ens32中修改HWADD的MAC地址值,文件中本无此行,也故障前后的MAC地址也没有变化呀。也有说/etc/udev/rules.d/70-persistent-net.rules,但 CentOS已不使用此文件了。也试过将网卡删除重新增加,重新生成MAC地址,都没有用。
[root@cos7 ~]#
systemctl --failed
UNIT LOAD ACTIVE SUB DESCRIPTION
● network.service
loaded failed failed LSB: Bring up/down networking
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e.
generalization of SUB.
SUB = The low-level unit
activation state, values depend on unit type.
1 loaded units listed. Pass --all to see loaded but
inactive units, too.
To show all installed unit files use 'systemctl
list-unit-files'.
后面发现有人说与NetworkManager有关,发现关闭此服务后,网络即可恢复正常。
[root@cos7 ~]#
systemctl status NetworkManager
● NetworkManager.service
- Network Manager
Loaded: loaded
(/usr/lib/systemd/system/NetworkManager.service; enabled;
vendor preset: enabled)
Active: active
(running) since Thu 2018-02-01 12:30:31 CST; 16min ago
Docs:
man:NetworkManager(8)
Main PID: 779 (NetworkManager)
CGroup:
/system.slice/NetworkManager.service
└─779 /usr/sbin/NetworkManager
--no-daemon
[root@cos7 ~]#
systemctl status NetworkManager-wait-online
● NetworkManager-wait-online.service
- Network Manager Wait Online
Loaded: loaded
(/usr/lib/systemd/system/NetworkManager-wait-online.service; disabled;
vendor preset: disabled)
Active: active
(exited) since Thu 2018-02-01 12:30:31 CST; 17min ago
Docs:
man:nm-online(1)
Process: 797
ExecStart=/usr/bin/nm-online -s -q --timeout=30 (code=exited,
status=0/SUCCESS)
Main PID: 797 (code=exited,
status=0/SUCCESS)
CGroup:
/system.slice/NetworkManager-wait-online.service
Network Manager (NetworkManager)
service在安装了Desktop、Software Development
Workstation软件组后会自动启动,其他(如最小安装、基础网络服务等)都不会安装和启动。
也可以在不关闭NetworkManager服务的情况下,对单独接口关闭NetworkManager功能,在对应的接口配置文件中添加行:
NM_CONTROLLED=no