笔记03:HFS、基本命令、bash特性

来源:

第三章

笔记:

  • 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

猜你喜欢

转载自blog.csdn.net/a904441024/article/details/86009181