我们知道,操作系统可以抽象成一个超级软件,协调cpu,内存,主线,其他硬件之间的工作,而shell就是运行在操作系统之上的,一个提供控制操作系统,控制其他软件的一个应用程序,在shell下运行的程序比如常见的通过命令行运行node程序,,运行go程序都是运行在shell进程之下,生成的都是shell的子进程,
unix下常见的shell有 Bourne SHell (sh)、C SHell、K SHell、Bourne Again SHell(简称bash)
我们可以通过检查 /etc/shells 这个文件来查看当前系统可以使用的SHell,各种SHell功能大致相同,语法则有些不同,linux下默认使用的是bash,下面我们先简单介绍下 bash 的一些优点
命令记忆功能
通过按上下键可以使用命令记忆功能,上键自动带入上一次使用命令,下键为下一次的命令,
所有的命令记录记录在主文件夹 ~/.bash_history文件夹下,默认保存1000条记录
命令与文件补全功能
第一个单词下按tab,自动补全命令
第二个单词下按tab,自动补全文件
双击tab自动补全匹配的所有文件和命令
命令别名设置功能
通过alias命令可以为命令设置别名,
alias lm='ls -al'
通过别名可以替代长命令的执行,
多行命令执行
当我们的命令行数过多时我们需要换行来展示的更清晰,此时可以通过 / 来转译enter执行键
cp /user/a /user/b \
/user/c user/d
将abc文件复制到d下。
查询命令来源
我们可以通过type命令来查看某个命令来源于bash内置还是用户自定义
type vue
vue is /usr/local/bin/vue
type cd
cd is a shell builtin
介绍完bash的简单概念我们介绍下环境变量
首先介绍一些内置的环境变量,这些变量可以在任何进程下访问到
我们可以通过 env 或 export 来查看所有的内置变量
TERM_PROGRAM=Apple_Terminal
SHELL=/bin/bash
TERM=xterm-256color
TMPDIR=/var/folders/d9/06mdvmts6lnd33135wkgvfsr0000gn/T/
Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.qXIeIaXifC/Render
TERM_PROGRAM_VERSION=421.1
OLDPWD=/usr/local/lib/node_modules/npm/node_modules
TERM_SESSION_ID=3E95F725-40F4-4490-8372-ABDAF0CE68E3
USER=liuhongwei
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.TpnFcTIA8O/Listeners
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin
PWD=/Users/liuhongwei
LANG=zh_CN.UTF-8
XPC_FLAGS=0x0
XPC_SERVICE_NAME=0
SHLVL=1
HOME=/Users/liuhongwei
LOGNAME=liuhongwei
GOPATH=/Users/liuhongwei/go
_=/usr/bin/env
PATH
重点的内置环境变量为 PATH ,我们所有的命令来源都在这个变量定义的文件夹下查找,如果没有找到就会报 command not found
,
echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin
PATH下多个路径间以 :分割
HOME
HOME 代表当前用户主文件夹, cd ~ 和直接使用 cd 都是回到这个主文件夹
SHELL
SHELL代表我们当前使用的是哪种shell,默认是bash
LANG
LANG 用来设置语言环境
我们可以通过set命令查看所有变量,包含环境变量和自定义变量
下面我们简单介绍几个
PS1
提示符设置,用来设置显示的提示符
\u : 设置是否显示账户名称
\T:显示时间
\W:显示目录名
等等。。
$
代表当前bash的进程id
我们可以通过echo来显示变量值,使用时必须在变量前加上 $ 符,
直接通过 变量名=属性值 的方式来设置变量
通过unset命令来取消变量的设置,
所有这些变量都只在当前bash下生效,如果想要在子进程下生效,需要通过export将变量变为全局变量,可以在当前bash进程和他生成的子进程下生效
我们也可以读取来自键盘输入的变量值
通过read命令,可以等待用户输入来设置值
read [-pt] variable
-p 为提示的内容,-t为等待的时间
read -p 请输入 -t 10000 test
请输入
我们也可以设置数组类型的变量
直接通过数组定义的方式,
test[1]=12
echo ${test[1]}
12
如果在程序代码中读取这些变量,数组类型会变得非常有用
用ulimit设置系统资源限制
通过 ulimit -a
可以查看所有系统资源限制
ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 256
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 709
virtual memory (kbytes, -v) unlimited
因为如果不对这些进行限制,会撑爆系统资源
-c 设置core文件的最大值.单位:blocks
-d 设置一个进程的数据段的最大值.单位:kbytes
-f Shell 创建文件的文件大小的最大值,单位:blocks
-h 指定设置某个给定资源的硬极限。如果用户拥有 root 用户权限,可以增大硬极限。任何用户均可减少硬极限
-l 可以锁住的物理内存的最大值
-m 可以使用的常驻内存的最大值,单位:kbytes
-n 每个进程可以同时打开的最大文件数
-p 设置管道的最大值,单位为block,1block=512bytes
-s 指定堆栈的最大值:单位:kbytes
-S 指定为给定的资源设置软极限。软极限可增大到硬极限的值。如果 -H 和 -S 标志均未指定,极限适用于以上二者
-t 指定每个进程所使用的秒数,单位:seconds
-u 可以运行的最大并发进程数
-v Shell可使用的最大的虚拟内存,单位:kbytes
网友评论