来源:
第三章
笔记:
-
LSB(Linux Standard Base),FHS(Filesystem Heirarchy Standard):
/boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader,grub)都存放于此目录,一般单独分区 /bin:供所有用户使用的基本命令:不能关联至独立分区,OS启动时即会用到的程序; /sbin:管理类的基本命令:不能关联至独立分区,OS启动即会用到的程序; /lib:基本共享库文件,以及内核模块文件(/lib/modules); /lib64:专用于x86_64系统上的辅助共享库文件存放位置; /etc:配置文件目录 /home/USERNAME:普通用户家目录; /root:管理员的家目录; /media:便携式移动设备挂载点; /mnt:临时文件系统挂载点; /dev:设备文件及特殊文件存放位置: b:块设备,随机访问; c:字符设备,线性访问; /opt:第三方应用程序存放位置; /srv:系统上运行的服务用到的数据; /tmp:临时文件目录; /usr:universal shared,read-only data; bin:保证系统拥有完整功能而提供的应用程序; sbin: lib: lib64: include:C程序的头文件存放目录 local:第三方应用程序的安装位置(取代opt),独立的层级结构: bin、sbin、lib、lib64、include 等。 /var:variable data directory: cache:应用程序缓存数据目录; lib:应用程序状态信息数据;、 local:专用于/usr/local下的应用程序存储可变数据 lock:锁文件; log:日志目录 opt:为opt目录下的应用程序存储可变数据; run:运行中的进程相关的数据;通常用于存储进程的pid文件; spool:应用程序数据池; tmp:保存系统两次重启之间产生的临时数据; /proc:用于输出内核与进程信息相关的虚拟文件系统 /sys:用于输出当前系统上硬件设备相关的虚拟文件系统; /selinux:security enhanced linux,selinux相关的安全策略等信息存储位置;
-
Linux应用程序的组成部分:
二进制程序:/bin,/sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin 库文件:共享库和程序自身的库文件,/lib,/lib64,/usr/lib 等; 配置文件:/etc,/usr/local/etc等 帮助文件:/usr/share/man,/usr/share/doc等;
-
系统管理类命令:关机、重启、用户登录
halt:调用shutdown -h关机 shutdown:执行关闭进程,写入磁盘等系列操作后,init 0关机或init6重启 poweroff:关闭操作系统后,会向电源发送信号,切断电源(指向halt -p) reboot:调用shutdown; init 0: 关机:halt,poweroff,shutdown,init 0; 重启:poweroff --reboot shutdown --reboot reboot init 6 -f:强制关机,不建议选项 -p:切断电源 shutdown time选项: now:立即 0:立即 +#:提交命令后#分钟后关机(默认单位minute) hh:mm:具体时间 用户登录信息:who、whoami,w whoami:当前登录的有效用户 who:当前系统的所有用户会话 w:当前系统的所有用户会话及当前动作
-
bash的基础特性:
1、命令历史(见笔记02) 2、命令补全 3、路径补全 4、命令行展开: ~:展开为用户家目录 ~USERNAME:展开为指定用户家目录 {}:承载一个以逗号分隔的列表,拆分为多个路径 5、命令的执行状态返回结果,0(成功),1-255(错误) bash使用特殊变量$?保存最近一条命令的执行状态结果; 6、命令别名:alias alias:显示当前shell所有可用别名 alias name=‘value’:设定别名;仅对当前shell有效 unalias name:撤销别名 \command:执行命令本身不执行同名的别名 ~/.bashrc:对此家目录的用户有效; /etc/bashrc:对所有用户有效; 7、glob:通配符,用于实现文件名‘通配’ *:任意长度的任意字符; ?:单个的任意字符; 【】:指定范围内的单个字符; 【^】:指定范围外的单子字符; 专用字符集: [[:space:]]:空格 [[:digit:]]:数字 [[:alpha:]]:大小写字母 [[:alnum:]]:大小写字母及数字 [[:lower:]]:小写字母 [[:upper:]]:大写字母 [[:punct:]]:标点符号 8、bash快捷键: ctrl+a、ctrl+e、ctrl+u,ctrl+k 9、bash的I/O重定向及管道: file disctribtion:文件描述符,每个打开的文件都有一个id 标准输入:键盘,0 标准输出:monitor,1 标准错误输出:monitor,2 I/O重定向:改变输入输出的标准位置 输出重定向: 【1】>:标准输出覆盖重定向; >>:标准输出追加重定向; # set -c:禁止将内容覆盖输出至已有文件中; #set +c:允许。。。。 2>:标准错误输出覆盖重定向 2>>: &>:标准输出和标准错误输出覆盖重定向 &>>: 例:command > file1 2> file2 输入重定向:< Here Documentation:<< cat << EOF; 管道: COMMAND | COMMAND2 | COMMAND3 .... 10、提供编程环境: 编程风格 过程式:以指令为中心处理数据,组织代码解决问题; C,C++,java; 代码执行方式:顺序执行、选择执行、循环执行 对象式:以数据为中心,设计数据结构组织数据,并提供此类数据可被允许的处理操作; shell、perl、python; 程序运行方式: 编译型:程序执行前,由编译器先完整编译成可执行的二进制文件; 源代码-->编译器--> 解释型:程序执行前,不进行完整编译,执行时,由解释器边解释边执行; 变量类型约束: 强类型:严格区分变量类型,变量类型不轻易转化;参与运算必须符合类型要求; 调用未声明变量会产生错误; 弱类型:数据类型可以被忽略;默认为字符型,参与运算时会自动进行隐式类型转换; 程序运行时结构: 动态语言:运行时可改变程序结构的语言; 静态语言:运行时不可改变程序结构的语言; 数据类型检查: 动态类型语言:运行时进行数据类型检查; 静态类型语言:编译期间(或运行前)确定数据类型; 库调用方式:?? 动态:编译时,共享库对象不编译进文件;?? 静态:编译时,共享库对象编译进文件;?? shell编程:过程式、解释执行、弱类型 编程语言的基本结构: 数据存储:变量、数组 表达式:算术表达式、比较表达式、逻辑表达式等 语句:if、while、until、for等 格式: shebang:#!/bin/bash #!/usr/bin/python 由于脚本文件是文本格式,cpu无法直接运行,这里指定cpu上真正 运行的解释器程序,而把此文件作为解释器的运行参数(cpu通过 二进制代码的magic number识别要运行程序的格式exe?elf?); 代码: echo “hello world”; 。。。 变量:命名的内存空间 文本数据存储格式:大致分为字符型、数值型; 变量类型的作用: 1、数据存储的格式; 2、数据参与的运算; 3、表示的数据范围; 11、变量种类: 本地变量:只在当前shell进程生效,此shell进程的子进程或其他shell进程无效; 环境变量:当前shell进程及其子进程生效(su - USER会读取指定用户的环境变量,此时不生效) 局部变量:只在shell进程中某代码片段生效(一般指函数); 位置变量:$1,$2,$3,$4。。。 特殊变量:$?,$0(脚本文件名),$#(传递给脚本的参数个数),$@,$* $@,$*:都表示传递给脚本的参数列表,但带有双引号的引用时略有不同: “$@”:所有参数是一个列表,传递给其它命令时是多个参数; “$*”:所有参数当做一个整体,传递给其它命令时是一个整体; shift #:脚本的第#+1及后面的参数成为脚本的参数列表,第#+1个参数位置变更为$1; 本地变量: 变量赋值:name=value 1、name=string;给定字符串 2、name=$(var);把其它变量的值赋值给此变量 3、name=`command`或name=$(command);把命令结果存储为变量; 变量引用:$[var],括号一般情况可省 “$[var]”:弱引用,内容替换为变量值; ‘$[var]’:强引用,内容为$[var]; Note:使用发现,变量引用时: $(var):用于引用命令结果,引用变量时报错; $[var]或${var}:用于引用变量; set:显示所有已设定的变量; unset:撤销已有变量 环境变量: 变量赋值: export name=value declare -x name=value 变量引用:$(var),$var 变量撤销:unset 显示系统环境变量: env、printenv、export 变量命名规则: 1、不要使用程序中的保留字(如if,for,in等);避免跟其他类型或此类型变量重名; 2、有字母、数字和下划线组成,不能以数字开头(也不以_开头,避免跟其他程序的内置变量重名); 3、命名要尽量见名知意; 12、配置文件: 全局配置生效:/etc/bashrc、/etc/profile、/etc/profile.d 个人配置生效:~/.bashrc、~/.bash_profile profile类:为交互式登录的shell提供配置(也有部分为非交互式登录shell提供配置); 1、“su - username”或“su -l username”登录的shell; 2、通过终端输入账户密码登录的shell; 一般在此文件中: 1、定义环境变量;2、定义命令或脚本; 交互式登录shell配置文件读取顺序: /etc/profiel--> /etc/profile.d/*.sh--> ~/.bash_profile--> ~/.bashrc-->/etc/bashrc bashrc类:为非交互式登录的shell提供配置(也有部分为交互式登录shell提供配置); 1、“su username”登录的shell; 2、图形界面打开的模拟终端; 3、执行脚本时打开的shell进程 一般在此文件中: 1、定义本地变量;2、定义命令别名; 非交互式登录shell配置文件读取顺序: ~/.bashrc--> /etc/bashrc --> /etc/profile 13、bash的算术运算:+,-,*,/,%,**等: 实现算术运算: 1、let var=算术表达式;例,let mul=$a*$b; 2、var=$[算术表达式];例,mul=$[$a*$b]; 3、var=$((算术表达式));例,mul=$(($a*$b)); 4、var=$(expr $1 $2 $3 ...);例,mul=$(expr $a \* $b) BASH内建的随机数生成器:$RANDOM $[$RANDOM%30+1]:随机生成1-30的整数; 自增、自减等运算:+=、-=、/=,*=,%= let var+=1 同let var++ let var-=1 同let var-- 14、条件测试:(获取帮助:“man bash”或test命令用法) 测试命令: test EXPRESSION; [ EXPRESSION ]; [[ EXPRESSION ]]; Note:条件表达式的前后必须要有空格; 数值测试: -gt、-eq、-ge、-lt、-le、-ne 字符串测试 ==/=,!=,-z,-n <,>:字符串大小比较(比较ASCII码,很少用) =~:比较左侧的字符串是否匹配右侧的模式,此表达式一般使用“[[ ]]”; 不要求左侧完全匹配右侧,左侧内容有部分匹配即满足条件; Note:用于字符串比较的操作数都应该使用双引号,如: [ “hello” = “hi” ],hello和hi都用使用双引号 文件测试: 存在:-a,-e 类型:-f,-d,-L,-b,-c,-S,-p,-h 权限:-r,-w,-x(注意root用户的特殊性) 特殊权限:-g(sgid),-u(suid),-k(sticky) 大小:-s(非空) 是否打开: -t fd:fd(表示文件描述符)是否已经打开并且与某终端相关; 其他: -N:文件自上一次被读取后是否被修改过;(上次读取文件时是否做过修改操作或者输入重定向到此文件) -ef:是否为同一个文件(可用于硬链接) -nt:new than(比较的是ls -l显示的时间,即文件modify时间) -ot:old than -O:当前有效用户是否为文件属主; -G:属组 组合条件测试: 1、用于语句之间:||,&&,! id user &> /dev/null || useradd user; 2、用于测试表达式内部:-a,-o [ -e file -a -r file ] 示例: [ -e file ] && [ -w file ]; [ -e file -a -w file ]; [ ! -r file -a !-w file ],! [ -r file -o -w file ], [ ! \( -r file -a -w file \) ],[ ! -r file ] && [ ! -w file ]; 15、bash脚本控制语句:exit,return,continue,break exit #:到此语句时立即终止脚本,并返回“#”状态码;如为指定“#”或未定义exit, 则返回脚本最后执行命令的状态码
-
基本命令:mkdir,rmdir,tree、pstree、declare、typeset、export:
mkdir: -p:存在时不报错,不存在时按需创建; -v:显示详细信息; -m MODE:创建目录时直接指定权限; tree: -d:只显示目录; -l #:按指定层级显示; -P pattern:只显示由pattern匹配的路径; rmdir: -v:显示过程; -p:逐级删除空目录;
-
文件查看命令:
cat,tac、more、less、tail、head、touch tail | head: -c #:指定获取前|后#个字节; -【n】 #:指定获取前|后#行; tail -f:持续追踪文件尾部 touch:文件的时间戳管理工具: access time:访问时间,atime,读取文件内容 modify time:修改时间,mtime,指文件有过编辑动作(内容不一定改变) change time:改变时间,ctime,元数据发生改变; 未知?: 访问文件atime发生改变时,ctime未改变; touch修改文件atime时,ctime一同改变 -c:不创建文件,当文件存在时才修改时间戳;
练手:
1、写一个脚本:计算/etc/passwd中第10个用户和第20个用户id之和;
2、写一个脚本:传递两个文件路径给脚本,计算两个脚本中空白行之和;
3、写一个脚本:统计/etc,/var,/usr下共有多少一级子目录和文件;
4、写一个脚本:接受一个用户路径做参数,如果参数个数小于1,则提示并退出;
如果参数个数大于等于1,则统计所有给出文件的空白行之和;
疑问:
1、汇编代码是什么格式的?
2、二进制文件:除由ASSIC码组成的纯文本以外的所有文件;
3、编译器编译后的代码文件格式是二进制文件,是机器代码?汇编代码?还是其他?
描述程序源代码从编译到执行的完整过程?
4、描述解释型语言所编写程序执行的完整过程?
5、编译器或解释器可以完成从源代码到机器代码的直接转化吗?
试答:不行,编译器或解释器是基于系统调用或库或少量机器代码开发的;
从高级编程语言到机器语言的超量工作,基于减少重复工作和明晰结构进行了分工;
汇编语言完成对对应硬件机器代码的转化,并向上层提供较为易用的调用接口;
操作系统(一般为C语言)面向各个硬件的汇编接口,并向上层提供更为易用的系统
调用或库调用接口;
其他高级语言基于操作系统提供的接口进行便捷开发;
会发生少量跨层级的接口调用;
提交到硬件上运行的代码为汇编代码,在硬件内部实现汇编代码到机器代码的转换??
任务:寻找相关书籍,完整地系统性地理解整个代码运行流程
6、动静态语言和动静态类型语言?动静态类型语言和强弱类型语言?
参考资料:
/电子书/fhs-2.3