• linux基础知识-21


    一、shell的内置命令

    shell自身提供了一些命令,称为内置命令,我们已经接触过一些shell的内置命令。

    比如:

    linux@myccloves:~$ which ls
    /bin/ls
    linux@myccloves:~$ which history cd fc jobs set
    linux@myccloves:~$ 
    

    我们用which查看ls,发现它在/bin/目录里。但查看history, cd, fc, jobs, set等命令,没有查到这些命令所在的位置,因为这些命令在shell程序内部,称为内置命令。

    可以用help查看所有的内置命令

    linux@myccloves:~$ help
    GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
    ......
    
    job_spec [&]                                history [-c] [-d offset] [n] or history >
    (( expression ))                            if COMMANDS; then COMMANDS; [ elif COMMA>
    ......
    

    二、别名

    别名允许用户自定义命令名,允许用户把命令和常用的参数或选项组合在一起。

    (一)定义别名:

    alias 别名=值

    比如经常查看进程,运行: ps aux,但总输入aux太麻烦,能不能只用ps就相当于ps aux的效果? 当然可以:

    linux@myccloves:~$ alias ps='ps aux'
    linux@myccloves:~$ ps
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root         1  0.0  0.1 225292  9124 ?        Ss   09:01   0:02 /sbin/init splash
    root         2  0.0  0.0      0     0 ?        S    09:01   0:00 [kthreadd]
    ......
    

    再比如:能不能用另外一个名字替代一个命令的名字,当然可以:

    linux@myccloves:~$ alias h=head
    linux@myccloves:~$ h -2 /etc/os-release 
    PRETTY_NAME="Deepin 15"
    NAME="Deepin"
    

    既然这样,老陌有很多歌曲放在了一个很遥远的地方,由于deepin音乐播放器总自动停止,所以老陌经常用mplayer在终端播放音乐。但问题是每次进入这个遥远的地方太麻烦了……

    linux@myccloves:~$ cd  /media/linux/database/me/music 
    linux@myccloves:/media/linux/database/me/music$ mplayer dj-1.mp3 
    

    现在有了alias应该可以牛逼一把了吧。

    linux@myccloves:~$ alias music='cd /media/linux/database/me/music'
    linux@myccloves:~$ music
    linux@myccloves:/media/linux/database/me/music$ mplayer dj-1.mp3 
    

    现在老陌想听歌,只要输入music,马上传送到音乐仓库了。 哇哈哈!!

    (二)查看定义了哪些别名

    直接输入alias就可以了。如:

    linux@myccloves:/etc$ alias
    alias ll='ls -l'
    alias ls='ls --color=auto'
    alias music='cd /media/linux/database/me/music'
    

    (三)删除别名

    删除别名用 unalias 命令:

    linux@myccloves:~$ unalias music
    linux@myccloves:~$ alias
    alias ll='ls -l'
    alias ls='ls --color=auto'
    linux@myccloves:~$ 
    

    观察,music别名被删除了。 一个小问题,如果别名和命令名冲突了,先执行谁?

    linux@myccloves:~$ alias ls='cd /etc/samba/'
    linux@myccloves:~$ ls
    linux@myccloves:/etc/samba$ 
    

    看到了吧,以事实说话,执行ls,得到的结果是进入了/etc/samba目录。如果ls 定义删除文件呢?死都不知道怎么死的...

    三、自定义提示符

    提示符就是等待用户输入命令部分。如:

    linux@myccloves:~$ 
    

    常见的提示符有两种:

    • 基本提示符
    • 第二提示符

    我们发现,当输入没有完成时,按下回车之后shell继续等待用户输入,这时给出的提示符 > 就是第二提示符。

    (一) 用PS1和PS2自定义提示符

    这两个环境变量用于定义提示符。PS1对应基本提示符,PS2对应第二提示符。既然提示符是提示输入命令的作用,我们就改一下:

    linux@myccloves:~$ PS1='请输入命令: '
    请输入命令: PS2='继续输入: '
    请输入命令: echo "hello
    继续输入: world
    继续输入: !
    继续输入: 
    

    当我们用 PS1='请输入命令: ' 定义了提示符后,马上提示符就变成了”请输入命令: “。 之后设置第二提示符为:PS2='继续输入: ',我们再次尝试echo "hello输入练习,发现第二提示符也变了。

    好吧,再让我们玩一次:

    linux@myccloves:~$ PS1='love deepin: '
    love deepin: ls /
    bin   etc         initrd.img.old  lib64       mnt   recovery  sbin  tmp  vmlinuz
    boot  home        lastore         lost+found  opt   root      srv   usr  vmlinuz.old
    dev   initrd.img  lib             media       proc  run       sys   var
    love deepin: 
    

    我们可以用一些转义序列定义提示符,下面列出了常用的转义序列:

    序列 说明
    d 显示日期
    T 显示时间
    h 显示主机名
    u 显示用户名
    w 显示路径
    W 显示路径的最后一个目录名
    ! 显示历史记录号
    $ 如果是超级用户显示#, 如果是普通用户显示$

    现在老陌定制一个和centos一样的提示符,因为老陌喜欢他的路径风格,不管路径多长,始终显示最后一个单词。提示符格式如下: [root@localhost ~]#

    PS1='[u@h W]$ '
    

    注意:提示符中有一个字符有着通用的规则:# 表示超级用户,$ 表示普通用户,我们应该记住它。

    四、配置文件立刻生效

    我们经常修改~/.bashrc文件,这个文件在用户登录时会自动调用,但我们修改完不想退出系统再重新登录,此时可以source一下,相当于执行一次,重新配置环境变量。

    [linux@myccloves test]$ echo "alias ld='ls -ld'" >> ~/.bashrc
    [linux@myccloves test]$ source ~/.bashrc
    [linux@myccloves test]$ ld
    drwxr-xr-x 2 linux linux 4096 Jul 21 07:50 .
    

    我们修改了~/.bashrc文件,之后source一下,发现ld命令可以执行了。 与source功能一样的命令,就是在脚本前输入一个点,这个点相当于source。

    [linux@myccloves test]$ . ~/.bashrc
    

    这个方法很好,不用重新登录。当我们重新修改配置文件,想要立刻生效一定不要忘记source。

    五、bash初始化

    bash shell一般分为四类:登录shell,非登录shell,交互式shell, 非交互式shell。
    当登录一台linux,您会看到提示符,这就是就登录shell。如:登录到虚拟终端,远程登录到一台主机等。登录shell又是交互式shell。

    为了区别我们列举一些事例:
    从虚拟控制台登录的, 通过网络登录到远程主机,x初始化的shell,这些都是登录shell,是交互式shell。手动运行bash启动的shell,不是登录shell,但他是交互式shell,在命令替换中的子shell,被圆括号分组的命令使用的子shell,执行脚本时使用的子shell不是登录shell,也不是交互式shell。

    (一)登录shell:

    以redhat系统为例:
    当我们登录系统时,登录shell首先获取文件/etc/profile,这个文件初始化一些全局环境变量,之后获取/etc/profile.d/*.sh相匹配的文件。之后shell会去用户主目录里获取~/.bash_profile配置文件,之后获取 ~/.bashrc配置文件,最后获取/etc/bashrc配置文件。

    注意:/etc/bashrc里面的内容和/etc/profile中的内容很像,但/etc/bashrc中定义的大部分是非登录shell用的环境变量。

    (二)非登录,交互式shell

    启动这个shell会自动获取~/.bashrc, 之后获取文件/etc/bashrc。

    (三)非登录非交互式shell

    不获取任何配置文件。

    注意:只有登录shell才可以获取/etc/profile,~/.bash_profile,而~/.bashrc和/etc/bashrc文件能被所有shell(登录和非登录)获取。一般前两个用于配置环境变量,因为它们只初始化一次,后两个用于自定义变量,如:别名等。

    (四)启动配置文件的介绍

    文件 shell类型 预期功能
    /etc/profile 登录shell 通用的有效环境变量
    /etc/profile.d/*.sh 登录shell 软件包特有的环境变量
    ~/.bash_profile 登录shell 用户特有的环境变量
    ~/.bashrc 所有交互式shell 用户特有的别名,shell功能和shell选项
    /etc/bashrc 所有交互式shell 通用别名,shell功能和shell选项

    (五)退出登录shell

    ~/.bash_logout 用户注销时调用,这个一般很少用。有人用它清理~/.bash_history文件,但这不是好习惯,因为命令历史可以查看用过的命令,提高工作效率。而且系统出现故障可以从命令历史中查看,执行了什么命令导致故障。

    以上配置文件及初始化的步骤是针对redhat系列的linux。对于deepin系统没有/etc/bashrc,与之对应的是/ect/bash.bashrc。而且我还发现deepin中没有~/.bashprofile这个文件,有的是~/.profile 文件,网上查得:若bash是以login方式执行时,读取/.bash_profile,若它不存在,则读取/.bash_login,若前两者不存在,读取~/.profile。

    老陌想为什么不统一一下呢,把老陌都搞晕了~~

  • 相关阅读:
    【数据结构】算法 Minimum Remove to Make Valid Parentheses 移除无效的括号
    【数据结构】算法 Remove Outermost Parentheses 删除最外层的括号
    【数据结构】算法 Valid Parentheses 有效的括号
    for嵌套的那些事
    i++与++i的区别
    初次接触JS 2017/11/27
    鼠标经过图片变大
    bootstrap使用
    ajax的应用原理及基本用法
    ajax实例代码及效果
  • 原文地址:https://www.cnblogs.com/myccloves/p/9348238.html
Copyright © 2020-2023  润新知