简单命令
第二天
ABI:Application Binary Interface
ABI描述了应用程序与OS之间的底层接口,允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行
API:Application programming Interface
API定义了源代码和库之间的接口,因此同样的源代码可以在支持这个API的任何系统中编译
POSIX:Portable Operating System Interface
POSIX兼容的程序可以在其他的POSIX操作系统编译执行
示例
str = 'www.maagedu.com' #用户空间
x += 10 #用户空间
file.write(str) #内核空间
y = x + 200 #用户空间
#第一行、第二行都是简单的赋值运算,在用户空间执行。
#第三行需要写入文件,就要切换到内核空间,因为用户不能直接写文件,必须内核安排
#第四行又是赋值运算,就又切换回用户空间
#这里可以关注下,程序中需要优化的一点,就是不要让程序经常性的在用户空间和内核空间切换,因为切换是需要花费资源的。。。有代价!
-
命令提示符
显示提示符格式
[[email protected] ~]#echo $PS1
修改提示符格式
PS1="[\e[1;5;41;33m][\[email protected]\h \W]\$[\e[0m]"
PS1="[\e[1;32m][[\e[0m]\t [\e[1;33m]\u[\e[36m]@\h[\e[1;31m] \W[\e[1;32m]][\e[0m]\$"\e \033
\u 当前用户
\h 主机名简称
\H 主机名
\w 当前工作目录
\W 当前工作目录基名
\t 24小时时间格式
\T 12小时时间格式
! 命令历史数 # 开机后命令历史数 -
可执行命令
shell中有两种可执行的命令:内部命令、外部命令
enable 可查看所有的内部命令
enable -n 查看所有被禁用的内部命令
enable -n CMD 禁用内部命令
enable CMD 启用内部命令
示例
~]# enable
enable . #记得怎么用么?==source
enable : #这个也是命令哦
enable [ #记得这个是干什么的么?
enable alias
enable bg
enable bind
enable break
enable builtin
enable caller
enable cd
enable command
...
[[email protected] home]# enable -n cd #禁用掉cd命令
[[email protected] home]# cd /data #无法使用了
[[email protected] home]# enable -n #查看禁用列表,所以在禁用列表
enable -n cd #里找到了刚才禁用的cd命令
[[email protected] home]# enable cd #重新启用cd命令
[[email protected] home]# cd /data #可以继续使用了
[[email protected] data]# pwd
/data
type COMMAND
#可以查看命令是内部命令还是外部命令
系统初始hash表为空,当外部命令执行时,默认会从PATH路径下寻找该命令,找到后会将这条命令的路径记录到hash表中,当再次使用该命令时,shell解释器首先会查看hash表,存在将执行之,如果不存在,将会去PATH路径下寻找。利用hash缓存表可大大提高命令的调用速率
hash -r #清除缓存
hash 显示hash缓存
撤销别名unalias
unalias -a #取消所有的别名
如果别名同原命令同名,如果要执行原命令,可使用如下方法:
- 在命令前加 ‘\’ # \ALIASNAME
- 用引号将命令引起来 # ‘ALIASNAME’
- 直接使用命令的绝对路径
快捷键
ctrl + c #强制取消命令的执行
ctrl + d #结束命令的执行 //这个要温和一点点
时间和日期
date 命令
date +%s //显示从1970-1-1 到现在有多少秒
date -s ‘string’ //string是日期或时间,修改到后面的string.
~]# date -s '2018-03-12 12:30:12'
Mon Mar 12 12:30:12 CST 2018
~]# date -s '2017-01-22' #这种修改日期的会将时间默认设置为0:0:0
Sun Jan 22 00:00:00 CST 2017
~]# date -s '1 year' #增加一年
Tue Mar 12 12:31:25 CST 2019
date -d @SECONDS #seconds为从1979年到你要改到的时间的秒数
timedatactl 查看时间时区
~]# timedatectl status
Local time: Tue 2019-03-12 12:35:29 CST
Universal time: Tue 2019-03-12 04:35:29 UTC
RTC time: Thu 2019-03-21 00:37:01
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
简单命令
-
screen 命令
screen -S [SESSION] #创建新会话
screen -ls #显示所有已经打开的screen会话(貌似只能同用户查看)
screen -x [SESSION] #加入screen会话
exit #退出会话
ctrl a ,d #临时剥离会话,以便离开当前会话做点其他的
screen -r [SESSION] #恢复某会话,如果只有一个会话可以不用加SESSION -
命令扩展{}
[[email protected] ~]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
[[email protected] ~]# echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[[email protected] ~]# echo {0..10..2} #这个可以哦
0 2 4 6 8 10
-
命令行历史
ctrl + r #在命令历史中搜索命令
ctrl + g #从历史搜索模式退出
-
makewhatis 和 mandb 后者只在centos7上有
-
]# ls ~-/DIR/FILENAME #查看上一次工作目录里的文件 ~- 上一次的工作目录
文件通配符
#第一部分
* 匹配0、多个字符
? 匹配任何单个字符
~ 当前用户家目录
~USERNAME 用户USERNAME的家目录
~+ 当前工作目录
~- 前一个工作目录
[0-9] 匹配数字范围
[a-z] 字母
[A-Z]
[^] 匹配列表中以外的字符
示例
[[email protected] test]# ll f[a-d].txt #注意最后一个D文件未显示
-rw-r--r--. 1 root root 0 Jan 22 01:03 fa.txt
-rw-r--r--. 1 root root 0 Jan 22 01:03 fA.txt
-rw-r--r--. 1 root root 0 Jan 22 01:03 fb.txt
-rw-r--r--. 1 root root 0 Jan 22 01:03 fB.txt
-rw-r--r--. 1 root root 0 Jan 22 01:03 fc.txt
-rw-r--r--. 1 root root 0 Jan 22 01:03 fC.txt
-rw-r--r--. 1 root root 0 Jan 22 01:03 fd.txt
[[email protected] test]# ll f[A-D].txt #注意最前一个a文件未显示
-rw-r--r--. 1 root root 0 Jan 22 01:03 fA.txt
-rw-r--r--. 1 root root 0 Jan 22 01:03 fb.txt
-rw-r--r--. 1 root root 0 Jan 22 01:03 fB.txt
-rw-r--r--. 1 root root 0 Jan 22 01:03 fc.txt
-rw-r--r--. 1 root root 0 Jan 22 01:03 fC.txt
-rw-r--r--. 1 root root 0 Jan 22 01:03 fd.txt
-rw-r--r--. 1 root root 0 Jan 22 01:03 fD.txt
#顺序为aAbBcCdD小写字母和大写字母交叉的
#第二部分 man 7 glob
[:digit:] 任意数字,相当于0-9
[:lower:] 任意小写字母
[:upper:] 任意大写字母
[:alpha:] 任意大小写字母
[:alnum:] 任意数字或字母
[:punct:] 标点符号
[:blank:] 水平空白字符
[:space:] 水平或垂直空白字符
[:print:] 可打印字符
[:cntrl:] 控制(非打印)字符
[:graph:] 图形字符
[:xdigit:] 十六进制字符
]# df | tr -s ' ' //tr -s ' '将相邻的空格压缩成一个空格
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 104806400 3943208 100863192 4% /
devtmpfs 915768 0 915768 0% /dev
tmpfs 931612 0 931612 0% /dev/shm
tmpfs 931612 18968 912644 3% /run
tmpfs 931612 0 931612 0% /sys/fs/cgroup
/dev/sda3 52403200 33060 52370140 1% /data
/dev/sda1 1038336 178100 860236 18% /boot
tmpfs 186324 4 186320 1% /run/user/42
tmpfs 186324 28 186296 1% /run/user/0
/dev/sr0 10491772 10491772 0 100% /run/media/root/CentOS 7 x86_64
/dev/loop0 10491772 10491772 0 100% /mnt/dvd
# echo f{1..9999999} | xargs touch 可以创建大数量的文件
直接touch是不会成功的删除大文件时,最好不要直接使用rm 而是先使用>填充0 然后使用rm删除
软连接
[[email protected] data]# ln -s f1 /root/f1
[[email protected] data]# ll /root/f1
lrwxrwxrwx. 1 root root 2 Jan 22 02:24 /root/f1 -> f1 #错误的
[[email protected] data]# ln -s ../data/f1 /root/ff1
[[email protected] data]# ll /root/ff1
lrwxrwxrwx. 1 root root 10 Jan 22 02:24 /root/ff1 -> ../data/f1 #正确的
#注意建立软连接时,使用相对路径时,是相对于你要针对的文件建立软连接,而不是针对当前目录建立软连接,后者会错
软连接到目录的注意
[[email protected] data]# ln -s dir dir2
[[email protected] data]# rm -rf dir2 #这种只是删除软连接目录dir2
[[email protected] data]# ls dir
a b c
[[email protected] data]# ln -s dir dir2
[[email protected] data]# rm -rf dir2/ # 这种删除的是连接的原始目录里的文件,但是软连接目录未删,还是存在的
[[email protected] data]# ls dir
[[email protected] data]# ll
total 0
drwxr-xr-x. 2 root root 6 Jan 22 02:30 dir
lrwxrwxrwx. 1 root root 3 Jan 22 02:30 dir2 -> dir
#现在的centos7上的/bin 目录连接到/usr/bin的,如果需要删除/bin目录时,千万别输入/bin/ 这样的,因为rm -rf /bin/ 的话,会将/usr/bin 下的文件全删掉,最后的'/' 千万别带!!!
#批量计算,将需要计算的表达式存在文件中,然后用重定向输入
[[email protected] data]# vim bc.txt
[[email protected] data]# bc <bc.txt
6
5
2
[[email protected] data]# cat bc.txt
2*3
2+3
4/2
> 运用管道时,需要注意的是,前一个命令需要有标准输出,后一个命令需要有标准输入
> 错误的输出也是传不到下一个命令的,所以要求是正确的标准输出到下一个命令
合并标准输出和错误输出为同一个数据流进行重定向
&> 覆盖重定向
&>> 追加重定向
COMMAND > /path/to/file.out 2>&1 (顺序很重要)
COMMAND >> /path/to/file.out 2>&1
示例:
>ls /data /error 2>all2.log >&2 #这个也是可以的,要学会举一反三哦
>ls /data /error >all.log 2>&1
COMMAND | tee -a
#关于管道使用tee命令的覆盖和追加说明
[[email protected] data]# cat /etc/issue | tee tee.log
\S
Kernel \r on an \m
[[email protected] data]# cat tee.log
\S
Kernel \r on an \m
[[email protected] data]# who |tee tee.log #这样子会直接覆盖掉原来tee.log 的内容
root :0 2019-03-19 19:56 (:0)
root pts/0 2019-03-19 19:56 (:0)
root pts/1 2019-03-21 08:15 (192.168.20.1)
root pts/2 2019-03-12 12:37 (192.168.20.1)
stephen :1 2017-01-22 01:38 (:1)
[[email protected] data]# cat tee.log
root :0 2019-03-19 19:56 (:0)
root pts/0 2019-03-19 19:56 (:0)
root pts/1 2019-03-21 08:15 (192.168.20.1)
root pts/2 2019-03-12 12:37 (192.168.20.1)
stephen :1 2017-01-22 01:38 (:1)
[[email protected] data]# hostname | tee -a tee.log #加-a参数可以在tee.log中进行追加内容,避免覆盖文件中的内容
centos7.localdomain
[[email protected] data]# cat tee.log
root :0 2019-03-19 19:56 (:0)
root pts/0 2019-03-19 19:56 (:0)
root pts/1 2019-03-21 08:15 (192.168.20.1)
root pts/2 2019-03-12 12:37 (192.168.20.1)
stephen :1 2017-01-22 01:38 (:1)
centos7.localdomain