• bash功能——命令行编辑、内部命令 外部命令、命令补全 、命令历史、文件名通配符、命令别名


    命令行编辑:

      Ctrl + a : 跳转到当前编辑行首

      Ctrl + e:跳转到当前编辑行尾

    # mkdir /home/dira /home/diab

    像这种命令,/home/dira 和 /home/diab 属于单词,如果想删掉单词,可以用backspace慢慢删除,也可以快捷键 Ctrl + w

    比如光标此时在如下位置,想删除光标后所有内容,Ctrl + k 。反之删除光标以前所有内容 Ctrl + u

    当xshell界面显示内容较多时,使用 clear 或者 Ctrl + l 可以清屏。(WIndows下可以cls)

    内部命令 外部命令

    内部命令 shell程序自带的命令

    外部命令 在系统的某个路径下的可执行程序

    外部命令查找 依赖于 PATH变量 

    查看外部命令搜索路径 查看PATH变量

    # echo $PATH
    /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

    type pwd查看pwd是内部命令还是外部命令

    # type pwd
    pwd is a shell builtin

    which命令查看命令所在的目录

    # which ping
    /bin/ping
    # which ifconfig
    /sbin/ifconfig

    命令补全 

    命令补全 连按tab键 列出所有可能的命令。

    注意:这里说命令补全并不是什么情况下都可行。比如我以root身份新建一个脚本demo1.sh,默认情况下权限是644,即rw-r--r--。(这个是怎么算的参考:Linux命令——umask、setuid、setgid、sticky bit、chmod、chown 这样的权限是不可执行的。虽然文件后缀是sh,shell脚本道理上可以执行。但是Linux下面又不是根据后缀名区分文件是否可执行,Windows才那么干。这时候你再输入命令./dem,然后tab是没办法补全的,因为他跟就不是一个可执行文件。但是如果把demo1.sh作为ls命令参数,则是可以对demo1.sh进行补全的。接下来执行命令chmod +x demo1.sh,赋予demo1.sh执行权限,现在。/dem就可以补全了。

    hash表缓存命令所在位置

    # hash
    hits    command
       2    /bin/rm
       7    /usr/bin/yum
       1    /bin/cp
       1    /usr/bin/man
       9    /bin/ls

    hash –d ls 删除ls命令的缓存

    hash –r 清空缓存表

    # hash
    hits    command
       2    /bin/rm
       7    /usr/bin/yum
       1    /bin/cp
       1    /usr/bin/man
       9    /bin/ls
    # hash -d ls
    # hash
    hits    command
       2    /bin/rm
       7    /usr/bin/yum
       1    /bin/cp
       1    /usr/bin/man
    # hash -r

    有了hash缓存,就不用每次输入命令都搜寻$PATH变量了,只在第一次使用命令时搜寻$PATH。但是这里可能会有个问题,在上面rm在/bin/rm下面,如果我把rm移动到/usr/bin下面,再次使用rm时,就会提示“没有哪个文件 或 目录”。解决办法就是使用hash -d rm删除rm这条缓存,在执行一遍rm命令,这样hash回生成一个新位置的缓存。

    help hash可以查看hash使用方法

    命令历史

    命令历史文件 和 命令历史缓存

    用户在登陆OS的时候加载命令历史文件,此时执行history看的是命令历史文件内容。如果用户后续又执行了相关操作,再次使用history会看到之前的操作,但新纪录是保存在命令历史缓存里面的。只有当用户退出bash的时候才保存到命令历史文件。同一用户不同终端登陆时,对命令历史文件的操作是追加写的。

    缓存多少条命令

    # echo $HISTSIZE  
    1000

    命令历史文件能够保存多少条命令

    #  echo $HISTFILESIZE
    1000

    查看命令历史文件

    # echo $HISTFILE       
    /root/.bash_history

    查看保存命令历史

    # cat /root/.bash_history 
    ip addr show
    ping www.baidu.com
    ping 192.168.80.2
    shutdown -h now

    将缓存的新命令(连接Linux以后,相较命令历史文件新增加的命令) 追加到历史文件 history -a  如果是-w就是覆盖写。

    # history -a
    # cat /root/.bash_history 
    ip addr show
    ping www.baidu.com
    ping 192.168.80.2
    shutdown -h now
    hash
    history
    man history
    help history
    history
    cd /
    history
    echo $HISTSIZE  
     echo $HISTFILESIZE
    echo $HISTFILE       
    cat /root/.bash_history 
    history –a  
    history
    history –a
    help history
    history -a

    查看$HISTCONTROL变量的值

    # echo $HISTCONTROL
    ignoredups

    $HISTCONTROL取值

    ignoredups     不记录后面重复的命令 只记录第一个

    ignorespace     不记录以空格开始的命令

    ignoreboth      不记录以空格开始命令 也不记录后面重复的命令

    执行以前的命令

    !!执行上一条命令

    history查看命令历史

    6 可以执行命令历史中第6行命令

    -1 可以执行命令历史中的倒数第一个命令

    上下键可以翻命令历史

    当前命令 调用上一条命令的最后一个参数

    第一种方法

    ESC松开 再按 .

    第二种方法 输入!$

    History命令参数

    -c 清空命令历史

    -w 保存命令历史到历史文件

    -a 附加命令历史 到历史文件

    -d 4 删除命令历史的第4条命

    -r:将历史命令文件中的命令读入当前历史命令缓冲区;

    文件名通配符

    通配符 特殊的字符 不表示字符的表面意义 而是能够匹配符合指定特征的字符

    * 代表任意长度的字符

    ? 代表任意单个字符

    [] 代表指定范围的单个字符

    使用专门的方法标识特定字符

    [[:space:]] 空格

    [[:digit:]]    [0-9]

    [[:lower:]]   [a-z]

    [[:upper:]]   [A-Z]

    [[:alpha:]]   [a-Z]

    命令别名

    语法:

    alias cmdalias=’command [option] [argument]’

    查看当前用户可用的别名

    [root@51cto ~]# alias
    alias cp='cp -i'
    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'
    View Code

    查看alias是内部命令还是外部命令

    [root@51cto ~]# type alias
    alias is a shell builtin
    View Code

    试着定义以一个别名alias if1='ifconfig eth0'

    [root@51cto ~]# alias if1='ifconfig eth0'
    [root@51cto ~]# alias
    alias cp='cp -i'
    alias if1='ifconfig eth0'
    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'
    [root@51cto ~]# if1
    eth0      Link encap:Ethernet  HWaddr 00:0C:29:82:AA:8B  
              inet addr:192.168.80.222  Bcast:192.168.80.255  Mask:255.255.255.0
              inet6 addr: fe80::20c:29ff:fe82:aa8b/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:388 errors:0 dropped:0 overruns:0 frame:0
              TX packets:270 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:34208 (33.4 KiB)  TX bytes:38144 (37.2 KiB)
    View Code

    可否定义的别名与原来命令一样呢??  可以,但是若想使用定期前的命令就要再命令前加

    切换目录也可以定义成别名,Redhat网卡配置文件路径在/etc/sysconfig/network-scripts/,可以定义成别名cdnet

    [root@51cto /]# alias cdnet='cd /etc/sysconfig/network-scripts/'
    [root@51cto /]# cdnet
    [root@51cto network-scripts]# ls
    ifcfg-eth0   ifdown-ippp  ifdown-routes  ifup-bnep  ifup-plip    ifup-sit          network-functions
    ifcfg-lo     ifdown-ipv6  ifdown-sit     ifup-eth   ifup-plusb   ifup-tunnel       network-functions-ipv6
    ifdown       ifdown-isdn  ifdown-tunnel  ifup-ippp  ifup-post    ifup-wireless
    ifdown-bnep  ifdown-post  ifup           ifup-ipv6  ifup-ppp     init.ipv6-global
    ifdown-eth   ifdown-ppp   ifup-aliases   ifup-isdn  ifup-routes  net.hotplug
    View Code

    像这种修改别名的方式,别名只在一个shell周期内有效,关闭shell在登陆就没了。

    要想永久生效可以更改当前用户家目录下面的.bashrc文件

    [root@51cto network-scripts]# cd /
    [root@51cto /]# cd ~
    [root@51cto ~]# l.
    .  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .cshrc  .tcshrc
    [root@51cto ~]# pwd
    /root
    View Code

    增加一条cdnet

    [root@51cto ~]# cat .bashrc 
    # .bashrc
    
    # User specific aliases and functions
    
    alias rm='rm -i'
    alias cp='cp -i'
    alias mv='mv -i'
    alias cdnet='cd /etc/sysconfig/network-scripts/'
    # Source global definitions
    if [ -f /etc/bashrc ]; then
        . /etc/bashrc
    fi
    View Code

    .bashrc只对当前用户生效,若要对所有用户生效,可以修改/etc/bashrc,在这里面添加别名对所有用户都生效。

    删除别名unalias

    [root@51cto network-scripts]# alias
    alias cdnet='cd /etc/sysconfig/network-scripts/'
    alias cp='cp -i'
    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'
    [root@51cto network-scripts]# unalias cdnet
    [root@51cto network-scripts]# alias
    alias cp='cp -i'
    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'
    [root@51cto network-scripts]# cd /
    [root@51cto /]# cdnet
    -bash: cdnet: command not found
    View Code

    由于我这个别名cdnet是写道配置文件.bashrc的,现在删除别名只是暂时删除,断开shell在登陆cdnet还可以使用。

  • 相关阅读:
    PHP
    PHP
    密码修改机制
    PHP
    PHP
    PHP
    PHP
    Java并发编程:进程和线程的由来(转)
    Java获取文件大小的正确方法(转)
    J2EE开发中常用的缓存策略
  • 原文地址:https://www.cnblogs.com/kelamoyujuzhen/p/9087723.html
Copyright © 2020-2023  润新知