linux基础命令2
linux基础命令2
命令类型:
外部命令
shell内嵌命令
区分内嵌命令还是外部命令可以type COMMAND来查看
[root@localhost /]# type cd
cd is a shell builtin
[root@localhost /]# type whatis
whatis is hashed (/usr/bin/whatis)
命令别名:
获取所有可用别名的命令
[root@localhost /]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
自定义别名: 别名只在自己这个shell环境生效, 且重启后, 也会失效, 想要永久使用必须写在配置文件中
linux法则: 在进程中定义的东西都会随着进程结束而结束, 只有在配置文件中的东西才能永久保存.
[root@localhost /]# alias 'lsroot=ls -l /'
# 使用alias NAME=COMMAND 命令如果带空格, 必须使用引号
[root@localhost /]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias lsroot='ls -l /'
...
# 取消别名
unalias NAME
bash的基础特性
命令历史: shell进程会自动保存其会话中的用户提交的命令.
history: 定制history的功能, 可通过环境变量实现
HISTSIZE: shell进程可保存的最大命令条数
HISTFILE: 历史命令保存的文件地址
默认保存在自己的家目录下, 是一个隐藏文件. ./bash_history
HISTFILESIZE: 历史命令保存的文件的最大条数
history: 默认是查看内存中和文件中的所有历史命令记录
参数:
-c: 清空内存中的历史命令记录
-d: 删除指定条的历史命令
-w: 将内存中的历史命令保存到文件中..
-r: 从文件读取命令历史到内存中的历史列表中.
history n: 显示最近的n条记录
调用命令历史列表中的命令
!# 再一次执行历史中第#条命令
!! 再一次执行上一次命令
!STRING再一次执行最近上次以指定字符串开头的命令
命令允许重复执行需要命令能够有幂等性的特性, 即多次调用不会改变原有结果的.
调用上一次命令的最后一个参数
可以使用esc + . 可以实现
也可以使用命令 + !$ 来达到esc+. 的功能.
或者快捷键 alt+. 号来实现.
控制命令历史记录的方式:
通过修改环境变量的方式
默认的环境变量是 $HISTORY
ignoredups: 忽略重复的命令, 即历史命令不会记录最近的连续重复的命令, 只会记录一条
ignorespace: 顾略以空白字符开头的命令, 即以空白字符开头的命令不会被记录到历史命令记录里面
ignoreboth: 同时忽略以上两者
修改环境变量: 变量名='VALUE' 即可修改.(仅对当前进程的shell有效)
[root@localhost ~]# echo $HISTCONTROL
ignoredups
[root@localhost ~]# HISTCONTROL=ignorespace
[root@localhost ~]# echo $HISTCONTROL
ignorespace
命令补全
shell程序在接收到用户执行命令的时候, 分析完成后会把最左侧的字符串当做命令, 然后按照自己的规则查找
命令查找机制:
查找内部命令
根据PATH环境变量的目录一次查找, 自左而右依次查找每一个目录
当按下第一次tab的时候, 如果能够唯一标识的话, 会直接补全, 否则当再按下一次tab的时候, 会打印一个列表,来提示 用户.
路径补全
在给定的起始路径下, 以该路径下的开头字符串逐一匹配起始路径下的每一个文件名,
按下tab的功能和普通命令补全机制一样.
目录管理类的命令
文件类型:
-: 普通类型, 常规文件
d: directory, 目录文件
b: block device 块设备文件, 以一个块为单位的读取数据
c: character device 字符设备文件, 以一个字符为单位的读取数据
l: symbolic link, 符号链接文件
p: pipe, 命名管道
s: socket 套接字文件.
mkdir, rmdir
mkdir: make directory 创建目录文件
mkdir [OPTION]... DIRECTORY... 可以同时创建多个路径
-p 当父路径不存在时会自动创建父目录
-v: 创建过程中显示创建的详细过程
-m: 创建路径的时候, 直接给定权限
rmdir: remove empry directions 删除空目录
-p: 递归的删除一个空目录
-v: 显示过程
命令行展开
~: 可以自动展开为用户的家目录, 或指定的用户的家目录
{}: 里面是一个以,为分割的路径列表, 并能够展开为多个路径, 相当于编程语言中的|
eg: /temp{a,b} === /temp/a /temp/b
现在有一个问题,需要创建如下目录结构
/tmp/mysysroot/
bin
sbin
local
bin
sbin
etc
lib
lib
lib64
var
cache
log
run
tmp
└── mysysroot
├── bin
├── lib
├── lib64
├── local
│ ├── bin
│ ├── etc
│ ├── lib
│ └── sbin
├── sbin
└── var
├── cache
├── log
└── run
命令的执行状态结果
命令执行的状态结果:
bash通过状态返回值来输出此结果
成功: 0
失败: 1-255
命令执行完成之后, 其状态返回值保存在bash的特殊变量$?中
[root@localhost ~]# echo $?
127
[root@localhost ~]# ls /edfsa
ls: cannot access /edfsa: No such file or directory
[root@localhost ~]# echo $?
2
引用命令执行的结果
$(COMMOND)
或COMMOND 反引号引起的命令内容
下面的echo 打印出了ls命令执行的返回结果
[root@localhost ~]# echo `ls`
anaconda-ks.cfg core.2463 Desktop dir Documents Downloads initial-setup-ks.cfg Music Pictures Public Templates test.txt tmp Videos
[root@localhost ~]# echo $(ls)
anaconda-ks.cfg core.2463 Desktop dir Documents Downloads initial-setup-ks.cfg Music Pictures Public Templates test.txt tmp Videos
[root@localhost ~]# echo $(date +%T)
20:57:20
bash的基础特性: 引用
强引用: ' '
弱引用: " "
命令引用: COMMMOND 建议不要使用两个反引号来引用命令, 使用$(COMMOND)的形式来引用
bash基础特性:快捷键
Ctrl+a: 跳转到命令行的行首
Ctrl+e: 跳转到命令行的行尾
Ctrl+u: 删除行首至光标处之间的字符
Ctrl+k: 删除行尾至光标处之间的字符
Ctrl+l: 清屏, 相当于clear
文本文件查看命令:
cat, tac, head, tail, more, less
分屏查看命令: more, less
more FILE
特点: 翻屏至文件尾部自动退出
less FILE
特点: 支持前翻和后翻, man命令就是调用less命令来实现的.
head命令:
特点: 查看文件的头, 查看前n行
head [options] FILE
head -n FILE 默认查看前10行, 可以指定查看n行
tail命令:
特点: 查看文件的尾, 默认查看后10行
参数:
-f 参数 执行完后不退出, 可以一直查看文件的尾部内容, 跟随显示新增的行, 监视文件的内容
-f, --follow[={name|descriptor}]
output appended data as the file grows;
an absent option argument means 'descriptor'
-F same as --follow=name --retry
根据man手册使用说明, 使用小f的时候, 当使用vim等编辑器修改文件后会使得tail命令失去访问权限, 而-F则会重新尝试读取这个文件内容, 然后输出
stat命令:
stat - display file or file system status
显示文件或文件系统的状态信息
文件: 元数据 和 数据
一般都是 stat FILE...
[root@localhost ~]# stat /tmp
File: ‘/tmp’
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd00h/64768d Inode: 100663425 Links: 31
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:tmp_t:s0
Access: 2015-08-12 22:22:27.000000000 +0800
Modify: 2019-08-08 06:04:11.754551295 +0800
Change: 2019-08-08 06:04:11.754551295 +0800
Birth: -
touch命令
改变文件的时间戳: 时间戳主要指代访问时间, 修改时间,改变时间
如果文件不存在, 则创建一个空文件, 否则只修改时间戳
文件管理工具: cp, mv, rm
cp命令: copy
源文件: 目标文件:
# 单源复制
cp [OPTION]... [-T] SOURCE DEST
# 多源复制
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
单源复制: 分几种情况
如果DEST不存在: 则会先创建此文件, 并复制源文件内容
如果DEST存在:
如果DEST是文件: 则会覆盖目标文件的内容
如果DEST是目录文件: 则会先创建一个与源文件同名的文件,然后复制数据流
多源复制
目标文件必须是目录
如果目标文件不存在或是文件的话, 则会报错
如果目标文件是目录的话, 则会依次把源文件的内容复制过去.遇到存在的文件则会覆盖
cp命令常用选项:
-i 交互式: 覆盖文件前提醒确认
-f force: 强制复制目标文件
-r: 递归的复制目录
-d: 如果源文件是一个链接文件的话, 则只会复制这个链接, 而不会复制这个链接指向的那个文件的内容
-a: 相当于-dR--preserve=all , 递归的复制源文件的所有内容, 包括链接文件, 并保留所有源文件的权限内容等等. 常 被用来备份文件,(归档)
--preserve=
mode: 文件的权限
ownership: 文件的属主, 属组
timestamps: 文件的时间戳(创建时间, 访问时间, 修改时间)
context: 文件的安全标签(上下文)
xattr: 文件的扩展属性
links: 文件的链接情况
all: 复制以上所有情况
mv命令: move
使用情况基本与cp一样, 如果源文件与目标文件在同一目录的话, 就相当于重命名,
-i: 交互式
-f: 强制性
rm命令: 删除命令
这个命令非常的危险, 一旦删除想要恢复, 就会非常的困难
参数与cp也一样很相似
-i: 交互式的, 这个模式只有管理员才是默认这个携带这个参数
-f: 强制性的
-r: 递归式的删除, 可以使用这个参数来删除非空目录文件.
以后可以自建回收站, 即专门创建一个目录文件来保存不用的文件, 真正确认不用的时候, 才去删除.
bash基础特性:
globbing: 文件名的通配
匹配模式: 元字符
*: 匹配任意长度的任意字符
py* 表示已py开头的文件名
py*: 表示以py结尾的文件名
*py *: 表示文件名的某处含有py
p * y: 表示文件名中含有p, y字符
?: 匹配任意单个字符,必须要有一个.
[a-z], [A-Z], [0-9], [0-9a-zA-Z_] 匹配这里面的其中一个, 和正则规则类似. 但是忽略大小写
[[:upper:]] 明确只匹配大写
[[:lower:]] 只匹配小写
[[:alpha:]] 所有字母
[[:digit:]] 所有数字
[[:alnum:]] 所有字母和数字
[[:space:]] 所有空白字符
[[:punct:]] 所有标点符号
[ ^] : 匹配范围外的字符 和正则一样
IO重定向及管道
程序: 指令+数据
程序: IO
程序的输出流:
标准输入: stdin, 键盘
标准输出: stdout, 显示屏
错误输出流: stderr: 显示屏
fd: file description, 文件描述符
标准输入: 0
标准输出: 1
错误输出: 2
IO重定向:
> 表示输出重定向
特性: 覆盖输出重定向, 不会提示
[root@localhost tmp]# cat /etc/issue > /dev/tty2
# 表示重定向到tty2终端上
输出重定向: >>
特性: 追加输出重定向
set -C 禁止输出重定向
[root@localhost tmp]# cat /etc/issue > ~/tmp/issue.out
-bash: /root/tmp/issue.out: cannot overwrite existing file
[root@localhost tmp]# cat /etc/issue >| ~/tmp/issue.out
# 强制覆盖, 即使已经设置了禁止输出重定向到已经存在的文件了
错误输出流重定向: 2>, 2>> 特性和标准输出流一样..
合并输出流到一个文件:
1): 使用&>, &>>符号,
2): COMMAND > PATH 2>&1
COMMAND >> PATH 2>&1
输入重定向: <
tr命令:
tr [OPTION]... SET1 [SET2]
功能: 把输入的数据中的字符, 凡是出现在set1中的字符, 都对位替换成set2中的字符, 相当于一个映射表
[root@localhost tmp]# tr [a-z] [A-Z] < /etc/issue
\S
KERNEL \R ON AN \M
# 对位全部映射成大写了.
tr -d [a-d] : s删除出现了a-d的字符
HERE DOCUMENT: <<
cat << EOF
cat > /PATH/TO/SOMEFILE << EOF 输出到文件中
管道:
连接程序, 实现将前一个命令的输出当做后一个命令的输入...
COMMAND | COMMAND2 | COMMAND3
[root@localhost tmp]# cat /etc/issue | tr 'a-z' 'A-Z'
\S
KERNEL \R ON AN \M
# 同样实现了前面利用输入重定向的功能将一个文件的内容全部转换成大写输出..
[root@localhost ~]# who | head -2 | tr 'a-z' 'A-Z'
(UNKNOWN) :0 2019-08-08 06:03 (:0)
ROOT PTS/0 2019-08-08 06:21 (192.168.12.24)
tee命令:
从标准输入中读取, 在文件中保存一份的同时输出到标准输出中..., 与管道符一起用
[root@localhost ~]# who | head -2 | tee /tmp/temp.txt
(unknown) :0 2019-08-08 06:03 (:0)
root pts/0 2019-08-08 06:21 (192.168.12.24)
特殊设备
/dev/null 无论什么数据重定向到这的话, 数据都会被丢弃
当我们不关心数据流式什么的时候, 而只关心命令执行的结果的时候, 这个时候, 就可以使用这个合并错误和标准输出到/dev/null这个特殊设备中...再通过查找最近的命令的状态即可..
[root@localhost ~]# ls /var &> /dev/null
[root@localhost ~]# echo $?
0
[root@localhost ~]# ls /asfjlfdj &> /dev/null
[root@localhost ~]# echo $?
2

浙公网安备 33010602011771号