Linux基础操作
目录
- GNU官方的C函数库
- GCC/G++
- 命令帮助
- Linux 常用命令
- 通配符
- 正则表达式
- 组合命令
- 终端界面控制
- linux解压缩
- linux软件安装
- 文件和磁盘系统简述
- 文件操作
- linux系统各目录的作用
- 档案与目录权限
- 挂载
- BASH
- 例行性工作(crontab)
- 其它或待整理
GNU官方的C函数库
GCC/G++
- 一步编译链接
gcc -o hello hello.c或者 gcc hello.c -o hello . 这里的一步编译链接等价于后续的-c -o两个步骤,即gcc -c hello.c和gcc -o hello hello.o(或者写成 gcc hello.o -o hello也可以),推荐使用高亮的一步编译或两步编译命令 - ./hello param1(可选) param2(可选)…
- -Wall 打开常用警告, 例 gcc -Wall main.c -o abcd, 还有-I -L -O0 -O1 -O2 -O3等参数 例子 gcc -Wall -O1 -L/usr/lib -I/usr/include -c main.c
我们用gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录:例: gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld 上面这句表示在编译hello.c时: -I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include-->/usr/include-->/usr/local/include -L /home/hello/lib表示将/home/hello/lib目录作为第一个寻找库文件的目录,寻找的顺序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib,一般和-l搭配使用,-L指定目录,-l指定文件名 -lworld表示在上面的lib的路径中寻找libworld.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件) - 在.c 源文件中所包含的头文件路径需要使用 gcc 的“ -I”选项来指定, -L指定库文件的搜索路径
- 使用-g选项加入调试信息
- 使用-c选项 生成目标二进制代码 .o文件 (只激活预处理,编译,和汇编;gcc的编译流程分为四个步骤:预处理 编译 汇编 链接)gcc [options] -c main.c
- 链接阶段将二进制文件与其它的机器代码文件和库文件汇集成一个可执行的二进制代码文件。就是最终的可执行文件了 gcc hello.o -o hello 或者 gcc -o hello hello.o
- 如果用-DNDEBUG选项重新编译程序, 断言功能将被排除在编译结果之外。例:cc -o main -DNDEBUG main.c
命令帮助
- (LINUX命令查询网址 http://man.linuxde.net/):可用info命令查询命令,info 和 man 的用途其实差不多, 但info page 是文本模式的网页显示数据
- 在只记得部分命令关键字的场合,我们可通过man -k来搜索;
- 需要知道某个命令的简要说明,可以使用whatis;
- 查看命令在哪个位置,我们需要使用which;
- 显示命令的可执行程序、它的源文件及其man page的路径: whereis
- 而对于命令的具体参数及使用方法,我们需要用到强大的man,看懂man手册
- man指令主要分为这几个部分
NAME 简短的指令、数据名称说明
SYNOPSIS 简短的指令下达语法(syntax)简介
DESCRIPTION 较为完整的说明,这部分最好仔细看看
OPTIONS 针对 SYNOPSIS 部分中,有列举的所有可用的选项说明
COMMANDS 当这个程序(软件)在执行的时候,可以在此程序(软件)中下达的指令
FILES 这个程序或数据所使用或参考或连结到的某些档案
SEE ALSO 可以参考的,跟这个指令或数据有相关的其他说明
EXAMPLE 一些可以参考的范例
BUGS 是否有相关的臭虫
1、Standard commands (标准命令,如cd, chmod,mkdir)
2、System calls (系统调用,functions provided by the kernel, 如intro和chmod,)
3、Library functions (库函数,C库函数)
4、Special devices (设备说明)
5、File formats (文件格式,如apt.conf、dpkg.cfg、hosts)
6、Games and toys (游戏和娱乐)
7、Miscellaneous (杂项,如ascii和utf-8)
8、Administrative Commands (管理员命令,如mount、shutdown)
9、其他(Linux特定的), 用来存放内核例行程序的文档
- man是按照手册的章节号的顺序进行搜索的,比如:man sleep只会显示sleep命令的手册, 如果想查看库函数sleep,就要输入: man 3 sleep
- man中可用的按键: 首先, 如果要向下翻页的话,可以按下键盘的空格键,也可以使用[Page Up]不[Page Down]来翻页。同时,如果你知道某些关键词的话, /pattern 向后查找包含pattern的行; ?pattern 向前查找包含pattern的行; n 查找下一个pattern行; N 查找上一个pattern行.
- ubuntu默认是没有安装c语言的库函数man手册的,所以你在man perror 和sendto之类的函数时会显示没有相关文档的问题,解决方法:sudo apt-get install manpages-dev
Linux 常用命令
awk
- 相较于 sed 常常作用于一整个行的处理, awk 则比较倾向于一行当中分成数个『字段』来处理,awk 是『 以行为一次处理的单位』, 而『 以字段为最小的处理单位』
- awk 运作的模式
- 通常模式:
awk '条件类型 1{动作 1} 条件类型 2{动作 2} ...' filename- 示例:
cat /etc/passwd | awk 'BEGIN {FS=":"} $3<10{print $1 "\t " $3}' # $0代表这一整行。$1代表分隔符分开的第1栏,$2代表第二栏,依此类推。
- 示例:
- 另一种模式是(相比上面的模式只是多了-F而已)
awk [-F field-separator] 'commands' filename- 示例:
cat /etc/passwd |awk -F ':' '{print $1"\t"$7}'
- 示例:
- 通常模式:
- 整个awk的处理流程是:
- 读入第一行,并将第一行的资料填入 $ 0, $1, $2… 等参数当中;
- 依据 “条件类型” 的限制,判断是否需要进行后面的 “动作”;
- 做完所有的动作与条件类型;
- 若还有后续的『行』的数据,则重复上面 1~3 的步骤,直到所有的数据都读完为止。
- awk的内建变量
| 变量名称 | 含义 |
|---|---|
| NF | 每一行($0)拥有的字段总数 |
| NR | 目前awk处理的是第几行数据 |
| FS | 目前的分隔字符,默认是空格键 |
| FILENAME | awk浏览的文件名 |
| OFS | 默认也是空格,可以改为制表符等输出字段分隔符 |
| ORS | 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕 |
| RS | 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入) |
# awk 示例
# 统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容
awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
- awk编程
- awk中的循环语句借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同,awk的条件语句if-else也和C相同
- 变量和赋值,除了awk的内置变量,awk还可以自定义变量。示例
awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd #统计/etc/passwd的账户人数
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}' #统计某个文件夹下的文件占用的字节数 - 数组,因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。值和关键字都存储在内部的一张针对key/value应用hash的表格里。示例,
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
- 更详细的awk介绍
- NOTICE:
- 与bash shell 的变量不同,在 awk 当中,变量可以直接使用,不需加上 $ 符号。
- awk 的指令间隔:所有 awk 的动作,亦即在 {} 内的动作,如果有需要多个指令辅助时,可利用分号『;』间隔, 或者直接以 [Enter] 按键分隔开每个指令
- awk中同时提供了print和printf两种打印输出的函数,printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂
grep
#命令格式是 grep [OPTION]... PATTERN [FILE]...
#示例
#grep bzip *.txt # 在所有txt文件中搜索字符串 bzip
#grep -E 'SDKPLATE|NEW_ENERGY' $file
其它详见man grep
sed
- sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,
- 如果我们想要sed直接在文件中更改,只需要添加-i选项 例
sed -i 's/Old/New' My_File.txt#sed命令的基本格式是 sed [OPTION]... {script-only-if-no-other-script}[input-file]... echo "front" | sed '1s/front/back/' #替换front为back,输出为back sed '2,$d' fileName #删除第二行到最后一行 sed -n '1,2p' fileName #显示第一行到第二行 #增加一行或多行字符串 sed '1,3a drink tea' fileName #第一行到第三行后都增加字符串"drink tea" #代替一行或多行 sed '1c Hi' ab #第一行代替为Hi #替换一行中的某部分格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串可以用正则表达式, 可使用#或%或;替换/来作为分隔符), sed -n '/ruby/p' ab | sed 's/ruby/bird/' #将每一行的第一个ruby替换为bird,只会替换选定行的第一个匹配项,如果要匹配选定行所有的匹配项,应写成's/ruby/bird/g' sed -n '/ruby/p' ab | sed 's/ruby/bird/g' #将每一行所有的匹配项ruby替换为bird sed -n '/ruby/p' ab | sed 's/ruby//g' #删除所有行的所有ruby #其它示例 sed '2d;$s/a/A/g' fileName #2d表示删除第二行,;分隔了两个命令,第二个命令开始的$表示后续命令只操作最后一行 #If you want to modify a particular pattern that is not the first one on the line, you could use "\(" and "\)" to mark each pattern, and use "\1" #to put the first pattern back unchanged. This next example keeps the first word on the line but deletes the second: sed 's/\([a-zA-Z]*\) \([a-zA-Z]*\) /\1 /' #将文件中的格式为 MM/DD/YYYY的日期修改为格式为 YYYY-MM-DD的形式 sed 's/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/' fileName
find
- find不需要依赖数据库且功能更多,但速度慢,locate 程序只能依据文件名来查找文件,而 find 程序能基于各种各样的属性来查找文件
# 搜索家目录下的普通文件并计算文件数目, 会查找所有子目录 find ~ -type f | wc -l # 查找所有文件名匹配通配符模式“ *.JPG”和大于 1M 的文件并输送到标准输出 find ~ -type f -name "\*JPG" -size +1M -print # 查找权限不是 0600 的文件和权限不是 0700 的目录 find ~ \(type f -not -perm 0600 \) -or \(-type d -not -perm 0700 \) # 使用 find 命令来删除符合一定条件的文件 find ~ -type f -name '*.BAK' -delete # 对搜索到的每个文件执行命令, 如果使用 -ok 代替 -exec,在执行每指定的命令之前,会提示用户 find -type f -name 'foo.*' -exec ls -l '{}' ';' # ';'也可写成 \; # 通过把末尾的分号改为加号,将把搜索结果结合为一个参数列表,然后执行一次所期望的命令 find ~ -type f -name 'foo*' -exec ls -l '{}' + # 对搜索到的每个文件执行命令的另一种方法是通过xargs find ~ -type f -name 'foo\*' -print | xargs ls -l # find 命令的输出被管道到 xargs 命令,反过来, xargs 会为 ls 命令构建参数列表,然后执行 ls 命令 # To find all the files which are modified more than 50 days back and less than 100 days. find / -mtime +50 -mtime -100 # -regex 利用正则表达式查找 find . -regex '.*[^-\_./0-9a-zA-Z].*' - 更详细的find命令网址
文本查看、处理与比较
- 将文件拼接至标准输出设备,
cat file1 file2; 将文件与其它文件拼接,cat file1 file2 > file3 - less
less file1, 分屏显示文件,先显示后面的文件,适用于显示的文本多于屏幕所能显示的数目 - 还有more,head(用于查看文件的开始部分),tail(用于查看文件的末尾部分),详细用法见man
- wc, 打印文件中换行符,字,和字节个数
- tr, tr 程序被用来更改字符。我们可以把它看作是一种基于字符的查找和替换操作, 只能是单个字符,例
echo "lowercase letters" | tr a-z A-Z输出为LOWERCASE LETTERS - diff, diff 程序被用来监测文件之间的差异,例,diff -u file1.txt file2.txt
- patch, patch 程序被用来把更改应用到文本文件中。它接受从 diff 程序的输出,并且通常被用来把较老的文件版本转变为较新的文件版本。准备一个 diff 文件供 patch 程序使用, GNU 文档(查看下面的拓展阅读部分)建议这样使用 diff 命令:
:
diff -Naur old_file new_file > diff_file#old file 和 new file 部分不是单个文件就是包含文件的目录。这个 r 选项支持递归目录树。一旦创建了 diff 文件,我们就能应用它,把旧文件修补成新文件。patch < diff_file#注意我们没有必要指定一个要修补的目标文件,因为 diff 文件(在统一模式中)已经在标题行中包含了文件名
切换用户
- 变更到其他用户: su username
- 变更到其他用户,包括其环境变量: su -l username
- 设置或修改root密码:sudo passwd 您的使用者名称
监视系统资源
- 查看运行中的所有进程, ps -aux ; 查看特定程序,ps -aux | grep [f]irefox ; 终结特定进程,kill pid
- 查看正在运行的进程的动态更新列表,top ; 如果想在top命令中关闭程序,只需按k键,然后输入pid,最后输入信号编号
- 显示系统的RAM信息,free
- 显示文件系统的磁盘使用情况, df
- 报告某个目录使用的空间大小,du
通配符
- 通配符共三种,分别为 *,?和[ ]
*可以匹配0个或多个任意字符, 例*the*- ?匹配单个任意字符,例
pic?匹配任意pic开头后接一个字符的文件 [ ]可以匹配一组单个字符,例 test[1-3]匹配test1、test2、test3; test[3]匹配test3- 在任何涉及到文件的场合均可使用通配符,如ls ~/videos/.mp4 , cp ~/pix/pic.jpg ~/pictures
正则表达式
POSIX字符集

- 注意: 字符类的语法是**
[[:space:]], 而非 ****[:space:]** - 示例,
ls /usr/sbin/[[:upper:]]*, 显示所有以大写字母开头的文件和目录
基本正则表达式(BRE)


扩展的正则表达式(ERE)
- GUN 版本的 grep 程序支持扩展的正则表达式,方法为使用 -E 选项

- BRE和ERE的区别:在 BRE 中,字符“ (”,“ )”,“ {”,和“ }”用反斜杠转义后,被看作是元字符, 相反在 ERE 中,在任意元字符之前加上反斜杠会导致其被看作是一个文本字符
- 注意事项:
!在正则表达式中并不是特殊字符, 如果想要方向选择利用^,插入字符如果是中括号表达式中的第一个字符的时候,才会唤醒否定功能;否则,它会失去它的特殊含义,变成字符集中的一个普通字符。 示例[^a-z]
组合命令
- 一次执行多个命令可通过 shell script 撰写程序化脚本去执行, 也可通过** ; && ||** 等符号来处理
- cmd ; cmd (不考虑命令相关性的连续命令下达) 例 sync; sync; shutdown -h now
- cmd1 && cmd2
- 若 cmd1 执行完毕且正确执行($?=0),则开始执行 cmd2。
- 若 cmd1 执行完毕且为错误 ($?≠0),则 cmd2 不执行。
- cmd1 || cmd2
- 若 cmd1 执行完毕且正确执行($?=0),则 cmd2 不执行。
- 若 cmd1 执行完毕且为错误 ($?≠0),则开始执行 cmd2。
- 在shell中,后台运行一个程序的语法是在原本命令后加一个“&”;
- **$ ()**是接受一个命令的输出,并将它插入到另一个命令中。例 mkdir $(data “+%Y-%m-%d”),在这个例子中首先执行的是data “+%Y-%m-%d”,然后mkdir用这个命令的输出来作为新目录的名称
- 常常有把命令行中第一个程序的输出作为下一个程序的输入的情况,可通过 | (管道符)来实现,由管道符连接起来的命令(可以包含任意多的命令),称为一个管线。 例, ls -l | less
终端界面控制
-
Ctrl + C 中断目前程序 Ctrl + D 代表着: 『键盘输入结束,它也可以用来取代 exit 的输入,例如你想要直接离开文字接口,可以直接按下[Ctrl]-d 就能够直接离开了(相当于输入 exit ) Ctrl + Z 暂停目前的命令 Ctrl + S / Ctrl + Q 暂停屏幕的输出 / 恢复屏幕的输出 Ctrl + A / Ctrl+E 移动光标到行首 / 移动光标到行尾 Ctrl + K / Ctrl +U 剪切从光标位置到行尾的文本 /剪切从光标位置到行首的文本(清除已经输入的命令) exit 退出终端
linux解压缩
-
bar.bz2 用 -j tar.gz 用 -z # 压缩 tar -cvf jpg.tar *.jpg # 将目录里所有jpg文件打包成tar.jpg tar -czf jpg.tar.gz *.jpg # 将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压 缩过的包,命名为jpg.tar.gz tar -cjf jpg.tar.bz2 *.jpg # 将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2 压缩过的包,命名为jpg.tar.bz2 tar -cZf jpg.tar.Z *.jpg # 将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个 umcompress压缩过的包,命名为jpg.tar.Z rar a jpg.rar *.jpg # rar格式的压缩,需要先下载rar for linux zip jpg.zip *.jpg # zip格式的压缩,需要先下载zip for linux # 解压 tar -xvf file.tar //解压 tar包 tar -xzvf file.tar.gz //解压tar.gz tar -xjvf file.tar.bz2 //解压 tar.bz2 tar -xZvf file.tar.Z //解压tar.Z unrar e file.rar //解压rar unzip file.zip //解压zip # 解压jdk到指定文件夹: tar -xzvf jdk-8u131-linux-x64.tar.gz -C /usr/local/java # 总结 #1、*.tar 用 tar -xvf 解压 #2、*.gz 用 gzip -d或者gunzip 解压 #3、*.tar.gz和*.tgz 用 tar -xzf 解压 #4、*.bz2 用 bzip2 -d或者用bunzip2 解压 #5、*.tar.bz2用tar -xjf 解压 #6、*.Z 用 uncompress 解压 #7、*.tar.Z 用tar -xZf 解压 #8、*.rar 用 unrar e解压 #9、*.zip 用 unzip 解压 - 仅解开单一档案方法 :
- 先找到我们要的档名(如果已经知道可省略),假设解开shadow档案好了:
tar -jtvf /root/etc.tar.bz2 | grep 'shadow' #-r----------- root/root 1257 2008-09-29 02:21:25 etc/shadow < == 这是我们要的 - 然后将该档案解开语法为
tar -jxvf 打包档.tar.bz2 待解开档名这里输入tar -f/root/etc.bar.bz2 etc/shadow即可只解压shadow
- 先找到我们要的档名(如果已经知道可省略),假设解开shadow档案好了:
linux软件安装
- 主要分 .bin tarball .deb apt .rpm yum 等安装方式,其中apt 和 yum是在线安装方式,按命令主要分为六种方式(dpkg, rpm, gcc&make, apt, yum, chmod u+x); .rpm和yum是基于rpm的linux使用的安装方法,.deb和.apt是基于debian的linux系统(如ubuntu)使用的安装方法.
- .deb的安装方法:dpkg -i [package] , 例 dpkg -i skype_1.2.0-1_i386.deb ; 删除通过.deb 安装的软件:dpkg -r [package],例:dpkg -r skype ;
- apt 方法(适用于基于debian的linux系统)(需要以root用户或sudo?):
- 安装软件: apt-get update , apt -get install [package] 例 apt-get install sshfs;
- 删除软件: apt-get remove [package], 例,apt-get remove sshfs, 如果要删除跟包相关的配置文件,则 apt-get --purge remove sshfs
- 升级所有软件: apt-get update && apt-get upgrade
- 查找可供下载的软件包(不需要root权限):apt-cache search , 例apt-cache search notepad
- 清除不需要的安装包源文件:apt-get clean
- 考虑未来的反安装步骤,最好可以将每个软件单独的安装在/usr/local 底下,为安装到单独目录的软件子man page加入 man path搜寻: 如果安装的软件放置到/usr/local/sofrware/ , 那么man page 搜寻的设定中,可能就要在/etc/man.config内的40~50行左右,写入如下的一行: MANPATH /usr/local/software/man 这样才可以使用man来查询该软件的在线文件
- 如果希望改变软件安装目录,见鸟哥私房菜P791
- 在相邻两个版本之间升级,可通过下载patch文件实现,见鸟哥私房菜P791 利用patch更新原始码(只针对tarball安装方式)
- ldd 命令可以列出软件的动态函式解析,即需要哪些动态库
文件和磁盘系统简述
- linux文件系统格式是Ext2,Ext2 是索引式文件系统,基本上不太需要进行碎片整理。文件系统通帯会将这两部分的数据分别存放在不同的区块,权限与属性放置到 inode中,至于实际数据则放置到 data block 区块中。 另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。 inode 与 block 区块关系用图解来说明一下,如下图所示,文件系统先格式化出 inode 与block 的区块,假设某一个档案的属性不权限数据是放置到 inode 4 号(下图较小方格内),而这个 inode 记录了档案数据的实际放置点为 2, 7, 13, 15 这四个 block 号码,此时我们癿操作系统就能够据此来排列磁盘的阅读顸序,可以一口气将四个 block 内容读出来

- **hard link(硬链接或实体链接) **是在某个目录下新增一笔档名链接到某 inode 号码的关连记录而已。举个例子来说,假设我系统有个 /root/crontab 他是 /etc/crontab 的实体链接,也就是说这两个档名连结到同一个 inode , 自然这两个文件名的所有相关信息都会一模一样.
- Symbolic Link (符号链接,亦即是忚捷方式): Symbolic link 就是在建立一个独立的档案,而这个档案会让数据的读取指向他 link 的那个档案的档名!由于只是利用档案来做指向的动作, 所以,当来源档被删除之后,symbolic link 的档案会『开不了』 , 会一直说『无法开启某档案!』。实际上就是找不到原始『档名』而已
- linux支持多种格式的文件系统,整个 Linux 的系统都是透过一个名为** Virtual Filesystem Switch(VFS)** 的核心功能去读取filesystem 。 也就是说,整个 Linux 的 filesystem 其实都是 VFS 在进行管理,我们使用者并不需要知道每个 partition 上头癿的filesystem 是什么
- 挂载就是把设备连接到文件系统树中,(我的理解:当插入设备时,在/dev下会显示设备,如果需要查看其中的内容,需要将设备挂载到文件系统树中才能查看的内容)mount命令被用来挂载文件系统,输入mount将会显示一系列当前挂载的文件系统,mount用法示例详见command line 16.2节(P183)
- fdisk 程序允许我们直接在底层与类似磁盘的设备(比如说硬盘驱动器和闪存驱动器)进行交互。使用这个工具可以在设备上编辑,删除,和创建分区。详见command line 16.5(P190)
- 用 mkfs 命令创建一个新的文件系统,如将FAT32格式的U盘转化为ext3文件系统,参见command line 16章
- 更多关于存储设备相关命令参见command line第16章
文件操作
- 文件操作分为系统调用和标准库调用,标准库其实也是通过系统调用来实现对文件的操作。
- 系统调用的缺点:使用系统调用会影响系统的性能,硬件会限制对底层系统调用一次所能读写的数据块大小,推荐使用标准库调用
- wrire、read、open、ioctl用法
- 文件操作、文件权限操作、文件内容操作
linux系统各目录的作用
- Linux 对数据文件(.mp3、.bmp),程序文件(.c、.h、 *.o),设备文件(LCD、触摸屏、鼠标),网络文件( socket ) 等的管理都抽象为文件,使用统一的方式方法管理。一切皆是文件

档案与目录权限
- 如何改变文件属性和权限:
- r:4 w:2 x:1
- chmod u g o a ±= rwx
- chown mail:mail test.txt 所有者和群组均变为mail , 还有chown mail: chown mail chown :mail格式
- chgrp mail test.txt 将所属群组改为 mail
- 新建一个新的档案或目录时,它的默认权限会是什么?
- 当创建一个文件时, umask 命令控制着文件的默认权限。umask 命令使用八进制表示法来
- 表达从文件模式属性中删除一个位掩码。root和非root下的umask是不一样的,要查看umask数值直接输入命令umask
挂载
- 为什么需要挂载:linux支持不只一种类型的文件系统,通过vfs来管理,所以你的块设备需要指定一个文件系统类型,否则linux不知道如何去识别。
- 挂载就是把设备放在一个目录下,让系统知道怎么管理这个设备里的文件,了解这个存储设备的可读写特性之类的过程。
BASH
- linux distributions 的标准shell, bash是一种shell, 并且是linux默认的shell, linux还有好几种shell
- 环境配置
-
bash的启动时读取配置文件,有两种 shell 会话类型:一个是登录 shell 会话,另一个是非登录 shell 会话。 登录 shell 会话会提示用户输入用户名和密码。
-
登录shell会话的启动文件如下:

-
不登陆shell会话(开机后在Ubuntu中打开的bash由于不需要输入密码,所以属于不登陆shell会话)会读取以下启动文件,除了读取下述文件,非登录 shell 会话也会继承它们父进程的环境设置,通常是一个登录 shell

-
source 读入环境配置文件的命令,对于文件.bashrc 的修改不会立即生效,需要关闭终端会话,再重新启动一个新的会话,因为.bashrc 文件只是在刚开始启动终端会话时读取。可通过source命令来使得 bash 重新读取修改过的.bashrc 文件,命令为: source .bashrc
-
printenv , 打印部分或所有的环境变量 ,例,printenv | less
-
- 如何确定命令是否内置在bash还是外部命令, type -a commandName 会显示命令路径 详见man type
例行性工作(crontab)
- 仅执行一次的工作排程:
- at ,详见 man at
- 并不是所有的人都可以进行 at 工作排程,详见鸟哥私房菜
- 空闲时执行使用batch 或者at -b, at工作管理使用atq和atrm 或者at -l 与at -r
- 循环执行的工作排程:
- crontab,详见man crontab
- 输入crontab -e 后就可以编辑自己的例行性命令了,会进入vi的编辑画面,然后以一个工作一行来编辑,每行的格式都是具有六个字段,分别为分钟,小时,日期,月份,周,指令。
- 如果是系统的例行性任务,只需编辑/ect/crontab这个档案就可以,与contab -e不同,/ect/crontab的档案的每行设定分为七栏,分别为分、时、日、周、执行者、指令
- anacron 配合/etc/anacrontab 的设定,可以唤醒停机期间系统位进行的crontab 任务,如果要确定 anacron 是否开机时会主动的执行,你可以下达下列指令:chkconfig --list anacron
其它或待整理
- 文件访问底层函数(系统调用):write、read、open、close、ioctl等,直接使用这些底层系统函数调用的一个问题是效率低,为此,linux发行版提供了标准函数库,就是stdio.h
- 磁盘的第一个扇区主要记录了两个重要的信息,分别是:
- 主要启动记录区(Master Boot Record, MBR):可以安装开机管理程序的地方,比较小
- 分割表(partition table):记录整颗硬盘分割的状态,有 64 bytes MBR 是很重要的,因为当系统在开机的时候会主动去读取这个区块的内容,这样系统才会知道你的程 序放在哪里且该如何进行开机
参考资料
- 《鸟哥的Linux私房菜》





