linux基础知识-21
Tofloor
poster avatar
老陌
deepin
2018-07-22 06:08
Author
参见老陌博客:https://www.cnblogs.com/myccloves/p/9348238.html

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

比如:

  1. linux@myccloves:~$ which ls
  2. /bin/ls
  3. linux@myccloves:~$ which history cd fc jobs set
  4. linux@myccloves:~$
Copy the Code

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

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

  1. linux@myccloves:~$ help
  2. GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
  3. ......

  4. job_spec [&]                                history [-c] [-d offset] [n] or history >
  5. (( expression ))                            if COMMANDS; then COMMANDS; [ elif COMMA>
  6. ......
Copy the Code

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

(一)定义别名:
alias 别名=值

比如经常查看进程,运行: ps aux,但总输入aux太麻烦,能不能只用ps就相当于ps aux的效果? 当然可以:
  1. linux@myccloves:~$ alias ps='ps aux'
  2. linux@myccloves:~$ ps
  3. USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
  4. root         1  0.0  0.1 225292  9124 ?        Ss   09:01   0:02 /sbin/init splash
  5. root         2  0.0  0.0      0     0 ?        S    09:01   0:00 [kthreadd]
  6. ......
Copy the Code

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

  1. linux@myccloves:~$ alias h=head
  2. linux@myccloves:~$ h -2 /etc/os-release
  3. PRETTY_NAME="Deepin 15"
  4. NAME="Deepin"
Copy the Code

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

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

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

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

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

(二)查看定义了哪些别名
直接输入alias就可以了。如:

  1. linux@myccloves:/etc$ alias
  2. alias ll='ls -l'
  3. alias ls='ls --color=auto'
  4. alias music='cd /media/linux/database/me/music'
Copy the Code

(三)删除别名
删除别名用 unalias 命令:

  1. linux@myccloves:~$ unalias music
  2. linux@myccloves:~$ alias
  3. alias ll='ls -l'
  4. alias ls='ls --color=auto'
  5. linux@myccloves:~$
Copy the Code

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

  1. linux@myccloves:~$ alias ls='cd /etc/samba/'
  2. linux@myccloves:~$ ls
  3. linux@myccloves:/etc/samba$
Copy the Code

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

三、自定义提示符
提示符就是等待用户输入命令部分。如:

  1. linux@myccloves:~$
Copy the Code

常见的提示符有两种:

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



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

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

  1. linux@myccloves:~$ PS1='请输入命令: '
  2. 请输入命令: PS2='继续输入: '
  3. 请输入命令: echo "hello
  4. 继续输入: world
  5. 继续输入: !
  6. 继续输入:
Copy the Code

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

好吧,再让我们玩一次:

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

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


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

  1. PS1='[\u@\h \W]\$ '
Copy the Code

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

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

  1. [linux[url=home.php?mod=space&uid=118602]@myccloves[/url] test]$ echo "alias ld='ls -ld'" >> ~/.bashrc
  2. [linux@myccloves test]$ source ~/.bashrc
  3. [linux@myccloves test]$ ld
  4. drwxr-xr-x 2 linux linux 4096 Jul 21 07:50 .
Copy the Code

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

  1. [linux@myccloves test]$ . ~/.bashrc
Copy the Code

这个方法很好,不用重新登录。当我们重新修改配置文件,想要立刻生效一定不要忘记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
~/.bash_logout 用户注销时调用,这个一般很少用。有人用它清理~/.bash_history文件,但这不是好习惯,因为命令历史可以查看用过的命令,提高工作效率。而且系统出现故障可以从命令历史中查看,执行了什么命令导致故障。

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

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



Reply Favorite View the author
All Replies

No replies yet