一. 为什么文件的起始权限都是664,目录都是775?
文件: 默认创建没有执行权限
目录: 默认有执行权限 --> 因为目录没有没有执行权限,就不能切换到目录中
-rw-rw-r-- 1 gec gec 66 Feb 25 18:40 project.c
drwxrwxr-x 2 gec gec 4096 Mar 8 01:34 abc
- 文件/目录起始权限计算公式
无论是目录还是文件,都跟系统的一个东西 “umask” 有关
gec@ubuntu:~$ umask
0002 -> 决定所有文件/目录起始权限
-> 第一个0是无效位,后三位才是真正位数!
文件起始权限=666-当前系统umask的值=666-002=664
目录起始权限=777-当前系统umask的值=777-002=775
-
umask掩码值如何修改?
1)临时修改umask --> 重启终端无效
gec@ubuntu:~$ umask 0000 --> 使用umask命令直接修改
gec@ubuntu:~$ umask
0000
2)永久修改umask --> 重启终端还有效
思路: 终端在启动都会先执行一个脚本文件“~/.bashrc”,我们的思路应该是把命令写在脚本中
1. 编辑脚本
gec@ubuntu:~$ gedit .bashrc
2. 把需要执行的命令加在脚本的最后,保存退出!
fi
export PATH=$PATH:/usr/local/arm/bin
umask 0000
3. 重新加载脚本文件 / 重启终端
gec@ubuntu:~$ source ~/.bashrc
3)如果在代码执行过程中需要修改掩码值 --> umask函数 --> man 3 umask
#include <sys/stat.h>
mode_t umask(mode_t cmask);
mode_t: 八进制权限数据类型
cmask: 修改之后掩码值,例如: 0002
返回值:
当前掩码值
注意: 1. umask()只是在代码运行时修改掩码值,并没有永久修改系统中umask。
2. 当程序结束后,umask会还原回系统的值。
二. 文件/目录权限对文件/目录影响
文件:
r: 如果没有读权限,不能使用gedit/vi/cat命令查看文件内容
gec@ubuntu:~$ cat project.c
cat: project.c: Permission denied
w: 如果没有写权限,则不能修改文件的内容
x: 如果没有执行权限,则执行文件时会提示权限拒绝
gec@ubuntu:~$ ./project
bash: ./project: Permission denied
目录:
r: 如果没有读权限,则不能使用ls命令查看目录下的内容 readdir()执行失败
gec@ubuntu:~/abc$ ls
ls: cannot open directory .: Permission denied
w: 如果没有写权限,则不能在这个目录下创建任何内容
gec@ubuntu:~/abc$ touch abc.txt
touch: cannot touch `abc.txt’: Permission denied
x: 如果没有执行权限,则不能使用cd命令切换到目录
gec@ubuntu:~$ cd abc/
bash: cd: abc/: Permission denied
三. linux下文件的种类
1. 在windows下,是如何区分文件种类?
是使用文件的后缀进行区分,不同后缀会决定以不同的方式对文件进行解析!
例子: 1.mp3 --> 就以mp3文件格式来解析文件的内容
2.c --> 就使用C语言语法!
2. 在linux中,如何区别文件种类?
不能通过颜色区分文件种类,不是通过后缀进行区分,只能通过文件属性进行查看。
-rwxrwxrwx 1 gec gec 0 Mar 8 01:34 abc.c --> 不要看后缀,看前面的类型,只要是-,就一定是一个普通文件
drwxrwxrwx 2 gec gec 4096 Mar 10 20:00 abc.txt --> 不要看后缀,看前面的类型,只要是d,就一定是一个目录文件
3. linux下,一共7种文件类型
1)普通文件"-" --> touch命令
2)目录文件"d" --> mkdir命令
3)链接文件"l" --> ln -s命令
如何创建链接文件?
已知abc.c,需要创建一个链接文件link指向它!
创建命令: ln -s abc.c link
4)管道文件"p" --> 在系统编程进程之间通信方式之有名管道
5)套接字文件"s" --> 网络编程TCP/UDP协议套接字
6)字符设备文件"c" --> 硬件模块驱动文件,红外,温湿度
7)块设备文件"b" --> 储存设备驱动文件,U盘,SD卡,nandfalsh
四. 根目录文件
gec@ubuntu:/$ ls /
bin dev home lost+found opt run srv usr
boot initrd.img media proc sbin sys var
cdrom etc lib mnt root selinux tmp vmlinuz
注意: linux与windows不一样,某些文件一定要存放在固定的目录才会生效。
常用目录:
bin: 存放linux命令与可执行程序
dev: 主要字符设备文件/块设备文件 -> linux硬件驱动文件
home: 存放所有普通用户的家目录
usr: 第三方程序安装头文件,库文件,可执行程序,帮助文档,目标源程序
头文件:
/usr/include
/usr/local/include
库文件: --> 第三方程序安装进来linux的库文件
/usr/lib
/usr/local/lib
可执行程序:
/usr/bin
/usr/local/bin
boot: 存放linux系统镜像文件
lrwxrwxrwx 1 root root 32 Jun 27 2013 initrd.img -> boot/initrd.img-3.5.0-23-generic 文件系统
lrwxrwxrwx 1 root root 29 Jun 27 2013 vmlinuz -> boot/vmlinuz-3.5.0-23-generic 系统内核
proc: 存放linux进程的相关信息 ID=1000进程的信息存放名字为1000目录下
sbin: 存放超级用户才能使用的linux命令
etc: linux配置文件 配置开机启动脚本,网络配置…
lib: linux系统自带的库文件
mnt: 挂载到linux系统目录,例如: 共享目录 / U盘挂载
root: 超级用户root的家目录
不常用目录:
lost+found:系统奔溃,会产生一些碎片存放到此目录,当系统重启时,系统修复碎片
opt:功能性代码,可选程序
run:系统运行时产生信息存放目录
srv:系统服务日志
media:多媒体设备挂载点
sys:系统运行时产生信息存放目录
var:存放系统运行时需要改变的数据
cdrom: 光驱挂载目录
selinux:加固系统目录
tmp:临时文件存放的目录
五. 环境变量
环境变量存在于linux系统中一种变量,不同于C语言中语法变量。
- 查看当前linux系统下环境变量
gec@ubuntu:~$ env
环境变量名字=需要赋的值
SHELL=/bin/bash --> linux命令解析器
–> 只要终端启动了,就会执行该文件
OLDPWD=/sys --> 保存上一次的工作路径 ("cd -"切换到的路径)
USER=gec --> 命令: whoami 查询当前的用户名
PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/bin
//当我们需要使用ls命令时,正常来讲,系统会在当前目录下寻找ls这个程序,如果系统在当前目录下没有找到ls命令,系统就会在PATH这个环境变量下的路径寻找ls。如果找到了,则可以在任何的路径下都使用ls命令。
PWD=/home/gec --> 当前所在的工作路径 ("cd ."切换到的路径)
HOME=/home/gec --> 家目录路径 (“cd”/"cd ~"切换到的路径)
- 如何修改环境变量PATH这个值?
1)不在原来的基础上修改PATH,直接给PATH赋新的值
gec@ubuntu:~$ export PATH=/home/gec --> 环境变量PATH只等于家目录,系统在寻找可执行程序,只会在家目录下寻找
gec@ubuntu:~$ ls
Command ‘ls’ is available in ‘/bin/ls’ //ls这个程序其实是在/bin有效
The command could not be located because ‘/bin’ is not included in the PATH environment variable.//因为/bin不在环境变量PATH下
ls: command not found
2)在原来的基础上添加一个新的路径
PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin/:/usr/games:/usr/local/arm/bin
引用原来PATH的变量: $PATH
$PATH等价于/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/bin
例子: 临时在系统PATH环境变量基础上添加家目录命令:
gec@ubuntu:~$ export PATH=$PATH:/home/gec
3)永久修改: 把命令写在.bashrc脚本中。
练习1: 永久添加/home/gec/project/到环境变量PATH
1)在家目录创建project目录
mkdir /home/gec/project
2)把该路径添加到PATH中
export PATH=$PATH:/home/gec/project
3)永久修改只需要把这句话添加到~/.bashrc就可以
4)重启终端 / source ~/.bashrc
练习2: 写一个helloworld程序project.c,使用环境变量,使得可以在任何的路径下都可以执行该文件。
1)在任意的路径下写一个helloworld程序
/home/gec/aaa/bbb project.c --> project
2)把该路径添加到PATH中
export PATH=$PATH:/home/gec/aaa/bbb/ //正确
export PATH=$PATH:/home/gec/aaa/bbb/project //错误
3)可以在任何的路径下都可以执行该文件
gec@ubuntu:~$ project
helloworld!
gec@ubuntu:/$ project
helloworld!
gec@ubuntu:~/aaa/bbb$ project
helloworld!
4)如果不小心把环境变量修改错误,怎么办?
1. 修改脚本,提示gedit所在的路径
gec@ubuntu:~$ gedit .bashrc
Command ‘gedit’ is available in ‘/usr/bin/gedit’
The command could not be located because ‘/usr/bin’ is not included in the PATH environment variable.
gedit: command not found
2. 使用gedit绝对路径打开脚本
gec@ubuntu:~$ /usr/bin/gedit .bashrc
3. 修改脚本内容:
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
系统可执行程序常用路径:
/bin
/sbin
/usr/bin
/usr/sbin
/usr/local/bin
/usr/local/sbin
4. 重启终端
六. linux shell命令功能
- 查看历史命令 – 方向键"上"“下”
1). 使用方向键查看历史写过linux命令
gec@ubuntu:~$ history --> 查看最近使用的1000条
1626 env
1627 ls
1628 gedit .bashrc
1629 /usr/bin/gedit .bashrc
1630 source .bashrc
1631 env
1632 ls
1633 history
2). 所有写过的命令都会保存在~/.bash_history下
想清除历史记录,删除该文件中的内容即可。
-
linux命令与文件名补齐 – Tab键
gec@ubuntu:~$ mk
–> 按一下Tab键,提示当前目录下所有以mk开头的文件名,如果只有一个mk开头的文件,则直接补齐。
–> 按两下Tab键,提示当前系统中所有以mk开头的linux命令 -
给linux命令取别名 --> alias命令
系统脚本中已经有存在取别名:
some more ls aliases
alias ll=‘ls -l’
alias la=‘ls -la’
alias l=‘ll’
alias c=‘clear’ --> "c"命令 等价于 "clear"命令
练习: "p" 代替 "pwd"
七. man手册(linux中的新华字典)
当我们在linux系统中遇到一些我们不懂的函数/命令时,就可以查阅man手册,所以用户不用刻意记住命令参数,函数的参数,返回值,头文件。我们只需要学会如何区查询函数/命令用法即可!
- 查看man自身的用法
gec@ubuntu:~$ man man
–> 第一个man: 使用man这个命令
–> 第二个man: 查看的内容
手册数 手册内容的简单描述
1 Executable programs or shell commands --> 可执行程序/linux命令
2 System calls (functions provided by the kernel) --> 系统调用函数 open() read()
3 Library calls (functions within program libraries) --> 库调用函数 printf() scanf() -> 标准C库
-
man命令所在路径
gec@ubuntu:~$ which man
/usr/bin/man -
man命令如何查看内容?
使用格式:
1)man 查询的手册数 需要查看的内容
man [[section] page …] …
2)查询man的手册数
man -f [whatis options] page …
例子:查看printf函数用法:
1)已知printf手册数:man 3 printf
2)未知printf手册数:
gec@ubuntu:~$ man -f printf
printf (1) - format and print data --> printf命令
printf (3) - formatted output conversion --> printf函数 --> man 3 printf