shell基础知识
shell、bash、kernel
Bash、Shell、Kernel之间的关系就像我们眼睛、光信号处理、大脑之间的关系
- Kernel:顾名思义,linux 内核,相当于你的大脑
- Shell:相当于可以将眼睛看到的多彩事物处理成大脑能接受的命令程序集的眼睛光信号处理器
- Bash:相当于一个很大且漂亮的眼睛。眼睛有多种(包括zsh等),只是这种大家都喜欢这种
- terminal:终端,相当于你的眼睛的存在表现形式,也就是可以有多个终端。
正式解释:
- Kernel:
内核,其主要模块(或组件)包括以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等,完成对硬件的控制。 - Shell:
俗称壳(用来区别于内核),是机器外面的一层壳用于人机交互,是人与电脑之间交互的接口,“提供使用者使用界面”的软件(命令解析器)它接收用户命令,然后调用相应的应用程序。表现为其作用是用户输入一条命令,shell 就立即解释执行一条。不局限于系统、语言等概念、操作方式和表现方式等。 比如我们平时在黑框框里输入命令,叫 command-line interface (CLI);在屏幕上点点点,叫graphical user interface (GUI) - Bash:
它的名字是一系列缩写:Bourne-Again SHell,顾名思义,再生的Shell所以,Bash是Shell的一种,而且是最常见的shell,Mac 中默认 shell 就是 bash
一般shell脚本为xx.sh,然后推荐的执行方式就是./xx.sh
文件开头:
#!/bin/bash
或者为了兼容不同环境
#!/bin/env bash
所以说,sh文件就只是把用在终端的shell命令打了个包而已,方便调用
shell脚本中$的用法
- $0:Shell 的命令本身。1到9:表示 Shell 的第几个参数
- $*:以一个单字符串显示所有向脚本传递的参数
- $? :显示最后命令的执行情况
- $#:传递到脚本的参数个数
- $$:脚本运行的当前进程 ID 号
- $!:后台运行的最后一个进程的 ID 号
- $-:显示 Shell 使用的当前选项
引用变量时,使用 $ 符号直接来进行引用,以及包括循环变量
[root@localhost ~]# x=1024
[root@localhost ~]# echo $x
1024
变量
本地变量
用户自定义变量,当前进程有效,其它进程及当前进程的子进程无效
环境变量
当前进程有效,并且能够被子进程调用
env
:查看当前用户的环境变量set
:查询当前用户的所有变量(临时变量与环境变量)
export 变量名 = 变量值
或者
变量名 = 变量值 ; export 变量名
#系统中有一个PATH,环境变量
临时性添加:
~$ echo $PATH # 显示当前环境变量
/usr/local/sbin:/usr/local/bin # 显示举例,多个路径中间用“:”隔开
~$ PATH="$PATH:/home/workdir" # 添加“/home/workdir”目录
/usr/local/sbin:/usr/local/bin:/home/workdir # 显示举例,多个路径中间仍用“:”隔开
~$ export PATH
~$ source ~/.bashrc
永久性改变:
# 在相应文件中添加
PATH=$PATH:/home/workdir
全局变量
全局中所有的用户和程序都能使用,且继承、新建的用户也能默认使用
文件名 | 说明 | 备注 |
---|---|---|
~/.bashrc | 当前用户的bash信息,用户登录时读取 | 定义别名,umask,函数等 |
~/.bash_profile | 当前用户的环境变量,用户登录时读取 | |
~/.bash_logout | 当前用户退出当前shell时,最后读取 | 定义用户退出时的执行程序等 |
/ect/bashrc | 全局的bash信息,所有用户都生效 | |
/etc/profile | 全局环境变量信息 | 系统和所有用户都生效 |
在~/.bashrc
中添加shell函数
这里()
有无都可以,然后=
周围不要留空格,缩进要按照它的自动缩进来,否则会报错
function waff() {
ns_root="/opt/ns-allinone-3.32/ns-3.32/"
cd $ns_root && sudo ./waf $*
}
执行时:
waff --run hello-simulator
这样就不用专门到ns-3.32
文件夹下去运行./waf
命令了
编写shell脚本,添加环境变量
这个就是把脚本路径添加到环境变量中,然后通过执行脚本来编译文件
~/.bashrc:
export PATH="/opt/ns-allinone-3.32/wafenv.sh:$PATH"
wafenv.sh:
#!/bin/bash
ns_root="/opt/ns-allinone-3.32/ns-3.32/"
cd $ns_root && sudo ./waf $*
执行:
accelerator@LAB:/opt/ns-allinone-3.32$ wafenv.sh --run hello-simulator
Waf: Entering directory `/opt/ns-allinone-3.32/ns-3.32/build'
Waf: Leaving directory `/opt/ns-allinone-3.32/ns-3.32/build'
Build commands will be stored in build/compile_commands.json
'build' finished successfully (0.735s)
Hello Simulator