Linux回顾【2】shell

依次运行一系列命令

  • 命令列表 pwd; ls; cd ..; pwd 将一组命令组合在一起依次运行。
  • 进程列表 (pwd; ls; cd ..; pwd) 会生成一个子shell来执行括号中的命令组合。
  • 如果不想创建子shell,又想将多个命令分组,使用花括号{pwd; ls; cd ..; pwd}.

特殊变量 $BASH_SUBSHELL

  • 用于显示是否是子shell (pwd ; (echo $ZSH_SUBSHELL)).
  • 对于脚本,常用子shell进行多进程处理;但对于交互式CLI,无法进行真正的多进程处理,因为终端控制了子shell的I/O。

在交互式命令行中的子shell用法

1. 使用与符号& (ampersand)让命令进入后台运行

  • sleep 5 & 返回后台作业号和进程号 [background job id] PID [1] 33711.

    jobs

    • 显示所有后台进程
    • -l 增加显示后台进程的PID

2. 使用与符号和列表将子shell放到后台运行

  • (sleep 2; echo $ZSH_SUBSHELL; sleep 2) & 此命令立即返回[1] 33760,等待2秒,显示➜ ~ 1,再过2秒, 显示[1] + 33760 done ( sleep 2; echo $ZSH_SUBSHELL; sleep 2; ).
  • 再次过程中可以一直输入其他命令,且子shell的I/O也不会受制于终端输入。

3. coproc 协程

  • 在后台生成子shell,并在其中执行命令。
  • coproc sleep 2sleep 2 &等效.

shell的内建命令和外部命令

区分

  • type -a cmd
  • 有些命令既有外部也有内建实现。

外部命令

  • 其存在于shell程序之外,执行时会创建出(fork)一个子进程

内建命令

  • 不需要shell以外的文件执行,不需要子进程来执行。
  • history 显示最近用过的命令列表,历史记录存放于 .bash_history中,保存数量由 HISTSIZE环境变量控制,history -a在退出会话前强制写入历史。
  • alias -p 查看当前所有命令别名;alias li = 'ls -li' 创建新的别称,但仅在其所被定义的shell进程中才有效。

环境变量

1. 显示环境变量

  • env 或者 printenv 命令查看全局环境变量;set 显示所有环境变量(全局、局部、用户自定义)。
  • 显示某个环境变量: env HOME 或者 echo $HOME

2. 自定义环境变量

  • 所有系统环境变量名均用大写字母,所有自定义环境变量名均用小写字母
  • 创建局部自定义环境变量:abc=2, abc=Hello,但当包含空格时,必须用引号:abc="Hello World"
  • 等号两侧不能包含空格
  • 创建全局自定义环境变量: abc="Hello World", export abc.
  • 删除环境变量 unset abc.

3. PATH 环境变量

  • PATH 变量定义了用于进行命令和程序查找的目录,所有在shell中输入的外部命令必须能在PATH中找到才能执行。
  • PATH 中的各个目录用冒号 : 分隔,在添加搜索路径时,需要先引用现有的PATH的值,再在其后添加新的目录:PATH=$PATH:/abc/efg.

4. 环境变量与shell

  • 交互式shell:只会检查 ~/.bashrc 文件,此文件会检查 /etc/bashrc 文件,并提供用户自定义变量的空间。
  • 非交互式shell (脚本): echo $BASH_ENV ,shell脚本启动时,会检查此变量;如果未设置此变量,则继承父shell导出的变量。

5. 数组变量

  • array=(one two three).
  • echo ${array[1]}, echo ${array[*]}
posted @ 2022-04-10 21:08  略略略——  阅读(50)  评论(0编辑  收藏  举报