login & nologin shell

系统级

这两个 /etc/profile/etc/.bashrc 是进入 shell 时,执行的

用户级

这两个是登录 shell 时执行的:

~/.bash_profile ~/.bashrc

这两个是离开 shell 时执行:

~/.bash_logout ~/.bash_history , 其中 history 命令是实时更新的,本次 shell 的命令历史存在缓存里面,在退出 shell 时才会写入到 ~/.bash_history 。(注意:如果使用 zsh 的话,则为 ~/.zsh_history

login shell

使用 su - violetu 切换(注意:有 - ),切换/登录 login shell 会执行这四个 /etc/profile/etc/.bashrc~/.bash_profile~/.bashrc ,离开时,

nologin shell

使用 su violetu 切换, 切换/登录 nologin shell,只会执行这两个: /etc/.bashrc~/.bashrc

shell 查看与更改

  1. 查看当前正在使用的 shell

    1. echo $SHELL
    2. ps
    3. echo $0
    4. 输入不存在的命令,查看出错的 shell 提示
  2. 查看系统中安装了哪些 shell cat /etc/shells

  3. 改变当前 shell chsh -s /bin/zsh

GNU/bash shell 特点

  1. Tab 命令自动补齐

  2. 命令历史记忆功能 上下键、、 !string!$!!^R

    下面的有些指令,可能在我们人使用时,价值不大,但是它们写 shell 脚本时,可以发挥作用。

    1. 上下键

    2. !number :跟木 number 显示并执行 history 中对应第几条的命令

    3. !stirng , 找到最近一个以 string 开头的命名,例如: !da 找到你最近执行的、以 d a 开头的命令

    4. !$ 引用上一个命令的最后一个参数

      1
      2
      3
      4
      5
      6
      7
      8
      # violetv at manjaro in ~ [20:59:39]
      $ cd ~/Downloads

      # violetv at manjaro in ~/Downloads [20:59:48]
      $ ll !$

      # violetv at manjaro in ~/Downloads [21:00:00]
      $ ll ~/Downloads

    5. !! 上一个命令

  3. 定义别名

    1. alias、unalias 临时定义/解除定义临时别名

    2. ~/.bashrc~/.zshrc 定义永久的别名

    3. \命令 不使用该命令的别名

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      # violetv at manjaro in ~ [21:19:07]
      $ alias cd="echo this is cd temp alias"

      # violetv at manjaro in ~ [21:19:23]
      $ cd
      this is cd temp alias

      # violetv at manjaro in ~ [21:19:24]
      $ \cd ~/Downloads

      # violetv at manjaro in ~/Downloads [21:19:32]
      $

  4. 快捷键

    详细见:让你提升命令行效率的 Bash 快捷键 [完整版] 常用: Ctrl + a :移到命令行首 Ctrl + e :移到命令行尾 Alt + f :按单词前移(右向) Alt + b :按单词后移(左向) Ctrl + w :从光标处删除至字首 Alt + d :从光标处删除至字尾 Ctrl + r:逆向搜索命令历史 Ctrl + l:清屏 Ctrl + c:终止命令 Ctrl + z:挂起命令 Ctrl + s:阻止屏幕输出(zsh 不适用) Ctrl + q:允许屏幕输出 Ctrl+d: (Terminate input, or exit shell) 一个特殊的二进制值,表示 EOF,作用相当于在终端中输入 exit 后回车;

元字符(通配符)

  • * 匹配任意多个字符 ls ln*rm -rf *rm -rf *.pdffind / -iname "*-eth0"

  • ? 匹配任意一个字符

  • [] 匹配括号中的任意一个字符 [abc] [a-z] [0-9] [^a-z0-9]

  • () 在子 shell 中执行命令,不影响当前 shell。 例如:改变 umask,然后创建文件(只希望它影响创建的那个文件的权限),那就可以在 子 shell 中执行命令。 umask 指定默认的文件权限,两种查看方式:

    umask 返回的是去除的权限,其中文件基数为 666,目录为 777, 即:文件夹权限是 777-其返回结果,文件权限是 666-其返回结果 umask -S 返回文件创建的默认权限的符号化表达。

    1
    2
    3
    4
    5
    6
    7
    # violetv at manjaro in ~/test [8:56:05]
    $ umask
    022

    # violetv at manjaro in ~/test [8:56:12]
    $ umask -S
    u=rwx,g=rx,o=rx
  • {} 集合 逗号:touch test{1,3} 指 test1 和 test3 mkdir ~/{111,333} 指在 home 目录下创建 111 和 333 目录 两个点:touch test{1..3} 指 test1 和 test3

    1
    2
    3
    4
    5
    6
    # violetv at manjaro in ~/test [9:02:13]
    $ touch test{1,3}
    # violetv at manjaro in ~/test [9:02:07]
    $ ll|grep "test[.]*"
    -rw-r--r-- 1 violetv violetv 0 6月 30 09:01 test1
    -rw-r--r-- 1 violetv violetv 0 6月 30 09:01 test3

    复制技巧:

    1
    2
    3
    4
    5
    6
    7
    8
    # violetv at manjaro in ~/test [9:13:56]
    $ cp -rv ~/test/{xx.config,xx.config.old}
    '/home/violetv/test/xx.config' -> '/home/violetv/test/xx.config.old'

    # 再简写
    # violetv at manjaro in ~/test [9:16:19]
    $ cp -rv ~/test/xx.config{,.old}
    '/home/violetv/test/xx.config' -> '/home/violetv/test/xx.config.old'
  • \ 转义字符 以下为转义 * 和转义回车

    1
    2
    3
    4
    5
    6
    7
    8
    # violetv at manjaro in ~/test [9:17:19]
    $ echo \*
    *

    # violetv at manjaro in ~/test [9:17:22]
    $ echo \
    > hello
    hello

参考资料

  1. Difference between 2>&-, 2>/dev/null, |&, &>/dev/null and >/dev/null 2>&1