8.1 shell介绍 8.2 命令历史 8.3 命令补全和别名 8.4 通配符 8.5 输入输出重定向
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8.1 shell介绍 8.2 命令历史 8.3 命令补全和别名 8.4 通配符 8.5 输入输出重定向相关的知识,希望对你有一定的参考价值。
8.1 shell介绍 8.2 命令历史 8.3 命令补全和别名 8.4 通配符 8.5 输入输出重定向 # Linux shell 基础 # 8.1 shell 介绍 - 什么是shell 1. shell 是一个命令解释器,提供用户和机器之间的交互 2. 支持特定语法,比如逻辑判断、循环 3. 每个用户都可以有自己特定的shell 4. CentOS7 默认shell 为bash (Bourne Agin Shell) 5. 还有zsh、ksh等 ``` [[email protected] ~]# [[email protected] ~]# yum list |grep zsh autojump-zsh.noarch 22.3.0-3.el7 epel zsh.x86_64 5.0.2-25.el7_3.1 updates zsh-html.x86_64 5.0.2-25.el7_3.1 updates zsh-lovers.noarch 0.9.0-1.el7 epel [[email protected] ~]# yum list |grep ksh ksh.x86_64 20120801-26.el7 base mksh.x86_64 46-5.el7 base python-XStatic-Rickshaw.noarch 1.5.0.0-4.el7 epel python-moksha-common.noarch 1.2.3-2.el7 epel python-moksha-hub.noarch 1.4.8-1.el7 epel python-moksha-wsgi.noarch 1.2.2-2.el7 epel [[email protected] ~]# ``` # 8.2 命令历史 ![mark](http://oqxf7c508.bkt.clouddn.com/blog/20170814/225032244.png?imageslim) - 很多系统里面的命令都是存在用户的家目录下, /root/.bash_history ``` [[email protected] ~]# ls /root/.bash_history /root/.bash_history [[email protected] ~]# cat /root/.bash_history echo $? yum list |grep -i apr yum list |grep -i pcre yum install -y pcre.x86_64 yum install -y pcre-devel.x86_64 ./configure --prefix=/usr/local/apache2 echo $? make echo $? make install echo $? ls /usr/local/apache2 init 0 [[email protected] ~]# [[email protected] ~]# echo $HISTSIZE 1000 [[email protected] ~]# ``` - 这是我们之前存的命令,这个文件里最大可以存1000条 - histroy -c 仅仅是把内存当中的命令给清空了,并不会去删除配置文件 ``` [[email protected] ~]# history -c [[email protected] ~]# history 8 history [[email protected] ~]# cat .bash_history [[email protected] ~]# ls -l .bash_history -rw-------. 1 root root 15810 8月 12 23:03 .bash_history [[email protected] ~]# ``` - 变量HISTSIZE 可以定义的,在/etc/profile ``` [[email protected] ~]# vi /etc/profile HOSTNAME=`/usr/bin/hostname 2>/dev/null` HISTSIZE=1000 if [ "$HISTCONTROL" = "ignorespace" ] ; then export HISTCONTROL=ignoreboth else export HISTCONTROL=ignoredups fi export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL # By default, we want umask to get set. This sets it for login shell # Current threshold for system reserved uid/gids is 200 # You could check uidgid reservation validity in ``` - 可以把HISTSIZE=1000 改为5000 保存 ``` HOSTNAME=`/usr/bin/hostname 2>/dev/null` HISTSIZE=5000 if [ "$HISTCONTROL" = "ignorespace" ] ; then export HISTCONTROL=ignoreboth else export HISTCONTROL=ignoredups fi export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL # By default, we want umask to get set. This sets it for login shell # Current threshold for system reserved uid/gids is 200 # You could check uidgid reservation validity in -- INSERT -- ``` - 虽然改了,但是并没有生效 ``` [[email protected] ~]# vi /etc/profile [[email protected] ~]# echo $HISTSIZE 1000 [[email protected] ~]# ``` - 使用命令source /etc/profile 或者重新进入终端,才会生效 ``` [[email protected] ~]# source /etc/profile [[email protected] ~]# echo $HISTSIZE 5000 [[email protected] ~]# ``` - 会记录日期时间,这个效果是由环境变量改变的,但是只是在当前终端下生效, ``` [[email protected] ~]# history 8 history 9 cat .bash_history 10 ls -l .bash_history 11 vi /etc/profile 12 echo $HISTSIZE 13 source /etc/profile 14 echo $HISTSIZE 15 history [[email protected] ~]# 改变命令历史的格式 [[email protected] ~]# HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S " [[email protected] ~]# echo $HISTTIMEFORMAT %Y/%m/%d %H:%M:%S [[email protected] ~]# history 8 2017/08/14 23:07:03 history 9 2017/08/14 23:09:09 cat .bash_history 10 2017/08/14 23:10:08 ls -l .bash_history 11 2017/08/14 23:28:55 vi /etc/profile 12 2017/08/14 23:33:10 echo $HISTSIZE 13 2017/08/14 23:34:10 source /etc/profile 14 2017/08/14 23:34:13 echo $HISTSIZE 15 2017/08/14 23:35:40 history 16 2017/08/14 23:39:00 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S " 17 2017/08/14 23:39:15 echo $HISTTIMEFORMAT 18 2017/08/14 23:39:28 history [[email protected] ~]# ``` - 改变命令历史的格式,这个只针对当前终端下生效,如果想要所有的都生效,需要编辑vi/etc/profile 文件 把HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S " 加入到文件里面 vi/etc/profile ``` HOSTNAME=`/usr/bin/hostname 2>/dev/null` HISTSIZE=5000 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S " 加入这一行 if [ "$HISTCONTROL" = "ignorespace" ] ; then export HISTCONTROL=ignoreboth else export HISTCONTROL=ignoredups [[email protected] ~]# vi /etc/profile [[email protected] ~]# source !$ source /etc/profile [[email protected] ~]# ``` - 这时候再打开另一个终端就可以看到生效了 ![mark](http://oqxf7c508.bkt.clouddn.com/blog/20170814/234805048.png?imageslim) ``` [[email protected] ~]# echo $HISTTIMEFORMAT %Y/%m/%d %H:%M:%S [[email protected] ~]# 987 2017/08/14 23:46:55 echo $? 988 2017/08/14 23:46:55 yum list |grep -i apr 989 2017/08/14 23:46:55 yum list |grep -i pcre 990 2017/08/14 23:46:55 yum install -y pcre.x86_64 991 2017/08/14 23:46:55 yum install -y pcre-devel.x86_64 992 2017/08/14 23:46:55 ./configure --prefix=/usr/local/apache2 993 2017/08/14 23:46:55 echo $? 994 2017/08/14 23:46:55 make 995 2017/08/14 23:46:55 echo $? 996 2017/08/14 23:46:55 make install 997 2017/08/14 23:46:55 echo $? 998 2017/08/14 23:46:55 ls /usr/local/apache2 999 2017/08/14 23:46:55 init 0 1000 2017/08/14 23:46:57 clear 1001 2017/08/14 23:47:07 echo $HISTTIMEFORMAT 1002 2017/08/14 23:48:13 history [[email protected] ~]# ``` - 改变命令历史的格式就成功了 - 永久保存命令历史 chattr +a ~/.bash_history ``` [[email protected] ~]# chattr +a ~/.bash_history ``` - 这样运行过的命令都会记录下来, - 但是如果不正常退出,有时候敲了一些命令,但是你没有logout ,exit 退出,而是直接关闭终端,那样就会记录不全,命令就保存的不全。 - 命令 !! 2个!其实就是你运行的 上一条命令(最后一条命令) ``` [[email protected] ~]# ls 111 1_heard.txt 1.txt~ 234 3.txt anaconda-ks.cfg.1 123 1_sorft.txt 1.txt.bak 2.txt.bak 4.txt biji.txt [[email protected] ~]# !! ls 111 1_heard.txt 1.txt~ 234 3.txt anaconda-ks.cfg.1 123 1_sorft.txt 1.txt.bak 2.txt.bak 4.txt biji.txt [[email protected]glinux-01 ~]# ``` - !n 表示运行history里面的第n条命令 ``` [[email protected] ~]# history 8 2017/08/14 23:07:03 history 9 2017/08/14 23:09:09 cat .bash_history 10 2017/08/14 23:10:08 ls -l .bash_history 11 2017/08/14 23:28:55 vi /etc/profile 12 2017/08/14 23:33:10 echo $HISTSIZE 13 2017/08/14 23:34:10 source /etc/profile 14 2017/08/14 23:34:13 echo $HISTSIZE 15 2017/08/14 23:35:40 history 16 2017/08/14 23:39:00 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S " 17 2017/08/14 23:39:15 echo $HISTTIMEFORMAT 18 2017/08/14 23:39:28 history 19 2017/08/14 23:43:15 vi /etc/profile 20 2017/08/14 23:45:50 source /etc/profile 21 2017/08/14 23:51:50 chattr +a ~/.bash_history 22 2017/08/14 23:54:18 history 23 2017/08/14 23:55:50 ls 24 2017/08/14 23:56:13 history [[email protected] ~]# !10 ls -l .bash_history -rw-------. 1 root root 15881 8月 14 23:51 .bash_history [[email protected] ~]# ``` - !word 它会在命令历史里面倒着往上找第一个有word的命令 - 比如运行命令!echo 就是运行命令历史里 倒着数第一个有ehco 相关的命令 ``` [[email protected] ~]# history 8 2017/08/14 23:07:03 history 9 2017/08/14 23:09:09 cat .bash_history 10 2017/08/14 23:10:08 ls -l .bash_history 11 2017/08/14 23:28:55 vi /etc/profile 12 2017/08/14 23:33:10 echo $HISTSIZE 13 2017/08/14 23:34:10 source /etc/profile 14 2017/08/14 23:34:13 echo $HISTSIZE 15 2017/08/14 23:35:40 history 16 2017/08/14 23:39:00 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S " 17 2017/08/14 23:39:15 echo $HISTTIMEFORMAT 18 2017/08/14 23:39:28 history 19 2017/08/14 23:43:15 vi /etc/profile 20 2017/08/14 23:45:50 source /etc/profile 21 2017/08/14 23:51:50 chattr +a ~/.bash_history 22 2017/08/14 23:54:18 history 23 2017/08/14 23:55:50 ls 24 2017/08/14 23:56:13 history [[email protected] ~]# !10 ls -l .bash_history -rw-------. 1 root root 15881 8月 14 23:51 .bash_history [[email protected] ~]# !echo echo $HISTTIMEFORMAT %Y/%m/%d %H:%M:%S [[email protected] ~]# ``` - 命令历史里 关于ehco的命令是 echo $HISTTIMEFORMAT%Y/%m/%d %H:%M:%S,所以 !echo 就是运行这个命令echo $HISTTIMEFORMAT%Y/%m/%d %H:%M:%S # 8.3 命令补全和别名 ![mark](http://oqxf7c508.bkt.clouddn.com/blog/20170815/220451944.png?imageslim) - 按tab一下补全命令,tab按俩下 列出以命令开头的命令 ``` [[email protected] ~]# ls ls lsblk lsinitrd lslocks lsmod lspci lsattr lscpu lsipc lslogins lsns lsscsi [[email protected] ~]# mk mkdict mkfifo mkfs.ext2 mkfs.xfs mknod mkdir mkfs mkfs.ext3 mkhomedir_helper mkpasswd mkdumprd mkfs.btrfs mkfs.ext4 mkinitrd mkswap mke2fs mkfs.cramfs mkfs.minix mklost+found mktemp [[email protected] ~]# mktemp ``` - 运行mk tab俩下就会显示一堆以mk开头的命令,按mkt tab一下就会自动补全mktemp - centos7 里面支持参数补全 1. 需要安装一个包 ``` [[email protected] ~]# systemctl restart network^C [[email protected] ~]# yum install -y bash-completion 已安装: bash-completion.noarch 1:2.1-6.el7 完毕! [[email protected] ~]# ``` 2. 安装完需要重启下系统才可以reboot 或者 init 6 3. 重启系统之后,先看下那个包是否安装,然后输入部分命令尝试按下tab 看看是否会补全 ``` [[email protected] ~]# rpm -qa bash-completion bash-completion-2.1-6.el7.noarch [[email protected] ~]# systemctl res rescue reset-failed restart [[email protected] ~]# systemctl res rescue reset-failed restart [[email protected] ~]# systemctl res rescue reset-failed restart [[email protected] ~]# systemctl restart network network-online.target network.service [[email protected] ~]# systemctl restart network.service [[email protected] ~]# ``` - alias 别名 给名重新起个名字 用alias 把systemctl restart network.service 改为 restartnet ``` [[email protected] ~]# systemctl restart network.service [[email protected] ~]# alias restartnet=‘systemctl restart network.service‘ [[email protected] ~]# restartnet 把系统里所有的alias 都列出来 [[email protected] ~]# 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 restartnet=‘systemctl restart network.service‘ alias rm=‘rm -i‘ alias which=‘alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde‘ [[email protected] ~]# ``` - 取消自定义别名 ``` [[email protected] profile.d]# unalias restartnet [[email protected] profile.d]# restartnet -bash: restartnet: 未找到命令 [[email protected] profile.d]# ``` - 这些alias存在哪里呢 .bashrc , /etc/profile.d ``` [[email protected] ~]# vi .bashrc # .bashrc # User specific aliases and functions alias rm=‘rm -i‘ alias cp=‘cp -i‘ alias mv=‘mv -i‘ # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi ~ ~ ``` 2. 这个/etc/profile.d文件下面的 colorls.sh ,colorgrep.sh 也有 ``` [[email protected] ~]# cd /etc/profile.d [[email protected] profile.d]# ls 256term.csh colorgrep.csh colorls.sh less.csh vim.sh 256term.sh colorgrep.sh lang.csh less.sh which2.csh bash_completion.sh colorls.csh lang.sh vim.csh which2.sh [[email protected] profile.d]# vi colorls.sh ~ ".bashrc" 12L, 176C alias ll=‘ls -l‘ 2>/dev/null alias l.=‘ls -d .*‘ 2>/dev/null INCLUDE= COLORS= for colors in "$HOME/.dir_colors.$TERM" "$HOME/.dircolors.$TERM" "$HOME/.dir_colors" "$HOME/.dircolors"; do [ -e "$colors" ] && COLORS="$colors" && INCLUDE="`/usr/bin/cat "$COLORS" | /usr/bin/grep ‘^INCLUDE‘ | /usr/bin/cut -d ‘ ‘ -f2-`" && break done /alias ``` 3. colorgrep.sh 文件也有 ``` # color-grep initialization /usr/libexec/grepconf.sh -c || return alias grep=‘grep --color=auto‘ 2>/dev/null alias egrep=‘egrep --color=auto‘ 2>/dev/null alias fgrep=‘fgrep --color=auto‘ 2>/dev/null ~ "colorgrep.sh" 7L, 201C ``` # 8.4 通配符 ![mark](http://oqxf7c508.bkt.clouddn.com/blog/20170815/223720549.png?imageslim) - *.txt *表示任何字符 ``` [[email protected] ~]# ls 111 1_heard.txt 1.txt~ 234 3.txt anaconda-ks.cfg.1 123 1_sorft.txt 1.txt.bak 2.txt.bak 4.txt biji.txt [[email protected] ~]# ls *.txt 1_heard.txt 1_sorft.txt 3.txt 4.txt biji.txt [[email protected] ~]# ls *txt 1_heard.txt 1_sorft.txt 3.txt 4.txt biji.txt [[email protected] ~]# ls *txt* 1_heard.txt 1_sorft.txt 1.txt~ 1.txt.bak 2.txt.bak 3.txt 4.txt biji.txt [[email protected] ~]# ls 1* 1_heard.txt 1_sorft.txt 1.txt~ 1.txt.bak 111: 12.tx~ 12.txt 12_txt.swp 222 4913 aming3 123: aminglinux.log yum.log [[email protected] ~]# ``` - ls ?.txt ?表示一个字符 任意的字符 ``` [[email protected] ~]# touch 2.txt [[email protected] ~]# touch 1.txt [[email protected] ~]# ls ?.txt 1.txt 2.txt 3.txt 4.txt [[email protected] ~]# touch a.txt [[email protected] ~]# touch bb.txt [[email protected] ~]# ls ?.txt 1.txt 2.txt 3.txt 4.txt a.txt [[email protected] ~]# ``` - ls [0-9].txt []13.txt 或者的意思 ``` [[email protected] ~]# ls [0-3].txt 1.txt 2.txt 3.txt [[email protected] ~]# ls [123].txt 1.txt 2.txt 3.txt [[email protected] ~]# ls [23].txt 2.txt 3.txt [[email protected] ~]# ls [13].txt 1.txt 3.txt [[email protected] ~]# ls [0-9].txt 1.txt 2.txt 3.txt 4.txt [[email protected] ~]# ls [0-9a-zA-Z].txt 1.txt 2.txt 3.txt 4.txt a.txt [[email protected] ~]# ``` - ls {1,2}.txt ``` [[email protected] ~]# ls {1,2}.txt 1.txt 2.txt [[email protected] ~]# ls {1,2,3,a}.txt 1.txt 2.txt 3.txt a.txt [[email protected] ~]# ``` ## 8.5 输入输出重定向 - [ ] > 正确的输出重定向 cat 1.txt >2.txt - [ ] >> 正确的追加 cat 1.txt >>2.txt - 2> 错误的输出重定向 ls aaa.txt 2>err - 2>> 错误的追加 ls aaa.txt 2>>err ``` [[email protected] ~]# lsaaa -bash: lsaaa: 未找到命令 [[email protected] ~]# lsaaa 2> a.txt [[email protected] ~]# cat a.txt -bash: lsaaa: 未找到命令 [[email protected] ~]# lsaaa 2>>a.txt [[email protected] ~]# cat a.txt -bash: lsaaa: 未找到命令 -bash: lsaaa: 未找到命令 [[email protected] ~]# > >> 2> 2>> >+2> == &>^C [[email protected] ~]# ``` - &> 可以把正确和错误的放一起 ``` [[email protected] ~]# ls [12].txt aaa.txt &> a.txt [[email protected] ~]# cat a.txt ls: 无法访问aaa.txt: 没有那个文件或目录 1.txt 2.txt [[email protected] ~]# ``` - &> 同样也支持追加 ``` [[email protected] ~]# ls [12].txt aaa.txt &>> a.txt [[email protected] ~]# cat a.txt ls: 无法访问aaa.txt: 没有那个文件或目录 1.txt 2.txt ls: 无法访问aaa.txt: 没有那个文件或目录 1.txt 2.txt [[email protected] ~]# ``` - &> 既可以放正确也可以发个错误的输出信息 保存到指定的文件里 ``` [[email protected] ~]# ls [12].txt aaa.txt > 1.txt 2>a.txt [[email protected] ~]# cat 1.txt 1.txt 2.txt [[email protected] ~]# cat a.txt ls: 无法访问aaa.txt: 没有那个文件或目录 [[email protected] ~]# ``` - 输入重定向 把右边的一个文件,文件的内容 给它左边 输入到一个命令里面去 ``` [[email protected] ~]# wc -l < 1.txt 2 [[email protected] ~]# 2.txt < 1.txt -bash: 2.txt: 未找到命令 [[email protected] ~]# ``` - [ ] 左边必须是一个命令,不可以是文件 输入重定向用的比较少,做一个了解
以上是关于8.1 shell介绍 8.2 命令历史 8.3 命令补全和别名 8.4 通配符 8.5 输入输出重定向的主要内容,如果未能解决你的问题,请参考以下文章
五周第三次课 8.1 shell介绍 8.2 命令历史 8.3 命令补全和别名 8.4 通配符 8.
8.1 shell介绍 8.2 命令历史 8.3 命令补全和别名 8.4 通配符 8.5 输入输出重
8.1 shell介绍 8.2 命令历史 8.3 命令补全和别名 8.4 通配符 8.5 输入输出重
8.1 shell 介绍8.2 命令历史8.3 命令补全与别名8.4 通配符8.5 输入输出重定向