Bash

Posted on By ᵇᵒ

motd

/etc/motd

在类 Unix 系统中,/etc/motd 是一个包含“布告栏信息”(message of the day)的文件。 每次用户登录时,/etc/motd 文件的内容会显示在用户的终端。系统管理员可以在文件中编辑 系统活动消息,例如:管理员通知用户系统何时进行软件或硬件的升级、何时进行系统维护等。

比起电子邮件,使用 motd 给所有用户发送消息显得更有效率; motd 缺点是,现在许多用户登录系统时选择自动进入图形界面,所以这些信息往往看不到。

/etc/issue

/etc/issue 文件的使用方法与 /etc/motd 文件相差不大,它们的主要区别在于:当一个网络用户或通过串口登录系统上时, /etc/issue 的文件内容显示在 login 提示符之前,而 /etc/motd 内容显示在用户成功登录系统之后。

定制 motd

默认打开的 Terminal 终端不会显示任何内容,我们可以通过定制 motd,显示相应的问候语之类。

比如 coding 界著名的佛祖:

                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                   O\ = /O
               ____/`---'\____
                .' \\| |// `.
              / \\||| : |||// \
            / _||||| -:- |||||- \
              | | \\\ - /// | |
            | \_| ''\---/'' | |
             \ .-\__ `-` ___/-. /
          ___`. .' /--.--\ `. . __
       ."" '< `.___\_<|>_/___.' >'"".
      | | : `- \`.;`\ _ /`;.`/ - ` : | |
        \ \ `-. \_ __\ /__ _/ .-` / /
 =====`-.____`-.___\_____/___.-`____.-'=====
                   `=---='

 ...........................................
         佛祖保佑             永无BUG

牛牛的问候:

 ________________________________________
/ Hello Bob!                             \  
\ Good to see you ~                      /
 ----------------------------------------
       \   ,__,
        \  (oo)____
           (__)    )\
              ||--|| *

颜色 、动态

motd 内容还可以多彩化和动态化(比如动态显示当前机器 cpu、内存使用情况等)。
// Todo …

PS1

除了 motd,Terminal 终端在输入命令前面会有默认的提示符,提示符显示的内容和格式由 bash 的 PS1(The primary prompt string) 变量控制,在 Terminal 里输入 echo $PS1 可以查看 PS1 的值。
比如 macOS 默认显示的提示符:Mac-mini:~ bob$ ,其 PS1 = \h:\W \u$

我们可以通过修改 bash 的 PS1 变量来改变提示符,对于 macOS,只需要在 ~/.bash_profile 里对 PS1 赋值即可(如下是我自己的 PS1 值):

echo PS1="\[\e[1;32m\]\u\[\e[1;33m\]@\[\e[1;34m\]\h\[\e[1;36m\] \W\[\e[0m\]\$ " >> ~/.bash_profile

如果是 zsh,则使用如下方式:

 # zsh
 autoload -U colors && colors
 PS1="%{$fg[green]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[cyan]%}%~ %{$reset_color%}%% "

PS1 各项参数值的含义,详见 Controlling the Prompt

参数 解释
\d d 代表 date,表示日期
\h h 代表 hostname,表示主机名,仅取主机的第一个名字
\H 完整的主机名
\t t 代表 time,表示时间,24 小时制,格式:HH:MM:SS
\T 时间,12 小时制,格式:HH:MM:SS
\@ 时间,12 小时制,格式:am/pm
\A 时间,24 小时制,格式:HH:MM
\w w 代表 work directory,表示完整的工作路径
\W 工作路径的最后一个目录
\u u 代表 username,表示当前用户名
\v v 代表 version,表示当前 bash 版本
$ 提示字符,root 用户显示 #,普通用户显示 $

颜色定义

开始:”\e[N;Mm”,其中 N 可以指效果或是背景色,M 是前景色
结束:”\e[m”,终止特效

“\e[“, e 代表 escape,Control Sequence Indicator (CSI),转义字符 ESC。由于 ESC 转义字符在 ASCII 码中十进制是27,八进制是033,十六进制是0x1b,所以也可以用八进制”\033”或者十六进制”0x1b”代替。

COLOR TEXT BACKGROUND COLOR TEXT
Black 30 40 Dark Gray 1;30
Red 31 41 Light Red 1;31
Green 32 42 Light Green 1;32
Yellow 33 43 Light Yellow 1;33
Blue 34 44 Light Blue 1;34
Magenta 35 45 Light Magenta 1;35
Cyan 36 46 Light Cyan 1;36
Light Gray 37 47 White 1;37
FORMAT TEXT
reset 0
bold 1
half-bright 2
underline 4
blink 5
inverse 7
conceal 8
normal 22
underline off 24
blink off 25
inverse off 27

PROMPT_COMMAND

如果设置了该变量,其值会作为一个 command 指令执行,且早于 PS1。

shell变量含有空格时的处理方法

// .zshrc or .bash.profile
JDK8=/Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home
alias java8="export JAVA_HOME=$JDK8"

NDROID_STUDIO=/Applications/Android\ Studio.app/Contents
JDK11=$ANDROID_STUDIO/jre/Contents/Home
alias java11="export JAVA_HOME=$JDK11"

如上所示,java8 和 java11 是用于本地快速切换 java 环境的两个别名。 java8 可以正常执行,java11 则会因为含有空格执行失败 export: not valid in this context: Studio.app/Contents/jre/Contents/Home

当 Linux shell 路径变量出现空格时:

  • 若外层无引号,路径变量加上双引号就行啦
  • 若外层有引号,路径变量加上双引号并转义(反斜杠)或者加单引号(推荐)

所以,正确的配置方式如下:

// .zshrc or .bash.profile
JDK8=/Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home
alias java8="export JAVA_HOME=$JDK8"

NDROID_STUDIO=/Applications/Android\ Studio.app/Contents
JDK11=$ANDROID_STUDIO/jre/Contents/Home
alias java11="export JAVA_HOME='$JDK11'"

参考