操作系统在整个计算机系统中的角色:
Linux 主要是系统调用和内核那两层。当然直观地看,我们使用的操作系统还包含一些在其上运行的应用程序,比如文本编辑器、浏览器、电子邮件等。相对于现在的 Windows 系统,UNIX/Linux 本身是没有图形界面的,我们通常在 UNIX/Linux 发行版上看到的图形界面实际都只是运行在 Linux 系统之上的一套软件。而 Linux 上的这套软件以前是 XFree86,现在则是 xorg(X.Org),而这套软件又是通过 X 窗口系统(X Window System,也常被称为 X11 或 X)实现的!
通常我们在使用 Linux 时,并不是直接与系统打交道,而是通过一个叫做 Shell 的中间程序来完成的,在图形界面下为了实现让我们在一个窗口中完成用户输入和显示输出,Linux 系统还提供了一个叫做终端模拟器的程序(Terminal)。不过要注意的是这里所说的终端(Terminal)和控制台(Console)是有区别的:
终端本质上是对应着 Linux 上的 /dev/tty 设备,Linux 的多用户登录就是通过不同的 /dev/tty 设备完成的,Linux 默认提供了 6 个纯命令行界面的 “terminal”(准确的说这里应该是 6 个 virtual consoles)来让用户登录。
Shell 是指“提供给使用者使用界面”的软件(命令解析器),类似于 DOS 下的 command(命令行)和后来的 cmd.exe 。普通意义上的 Shell 就是可以接受用户输入命令的程序。它之所以被称作 Shell 是因为它隐藏了操作系统底层的细节。
在 UNIX/Linux 中比较流行的常见的 Shell 有 bash、zsh、ksh、csh 等等,Ubuntu 终端默认使用的是 bash,默认的桌面环境是 GNOME 或者 Unity(基于 GNOME)。
bash 是一个为GNU项目编写的Unix shell,也就是linux用的shell。
Shell俗称壳(用来区别于内核),是指“提供使用者使用界面”的软件,就是一个命令行解释器。
BASH是SHELL的一种,是大多数LINUX发行版默认的SHELL,除BASH SHELL外还有C SHELL等其它类型的SHELL。
使用Tab键来进行命令补全;(当然不止补全命令,补全目录、补全命令参数都是没问题的)
使用Ctrl+c键来强行终止当前程序;
使用键盘上的方向上键↑,恢复你之前输入过的命令;
使用通配符进行模糊匹配;(通配符是一种特殊语句,主要有星号(*)(匹配 0 或多个字符)和问号(?)(匹配任意一个字符),用来对字符串进行模糊匹配(比如文件名、参数名))
使用man、help、info在命令行中获取帮助;(如果你知道某个命令的作用,只是想快速查看一些它的某个具体参数的作用,那么你可以使用–help参数)
查看用户
终端输入whoami命令
创建用户
su 可以切换到用户 user,执行时需要输入目标用户的密码,sudo 可以以特权级别运行 cmd 命令,需要当前用户属于 sudo 组,且需要输入当前用户的密码。su - 命令也是切换用户,同时环境变量也会跟着改变成目标用户的环境变量。
sudo adduser XXX新建一个叫XXX的用户;(这个命令不但可以添加用户到系统,同时也会默认为新用户创建 home 目录)->su -l XXX(现在你已经创建好一个用户,并且你可以使用你创建的用户登录了,使用命令切换登录用户)
用户组
Linux 里面查找自己属于哪些用户组:方法一:groups XXX(其中冒号之前表示用户,后面表示该用户所属的用户组,每次新建用户如果不指定用户组的话,默认会自动创建一个与用户名相同的用户组)默认情况下在 sudo 用户组里的可以使用 sudo 命令获得 root 权限。
方法二:查看 /etc/group 文件:cat /etc/group | sort(显示格式为group_name:password:GID:user_list)
将其他用户加入sudo用户组:sudo usermod -G sudo XXX(使用 usermod 命令可以为用户添加用户组,同样使用该命令你必需有 root 权限,你可以直接使用 root 用户为其它用户添加用户组,或者用其它已经在 sudo 用户组的用户使用 sudo 命令获取权限来执行该命令。)
删除用户
sudo deluser XXX --remove-home
文件权限就是文件的访问控制权限,即哪些用户和组群可以访问文件以及可以执行什么样的操作。
Linux 里面一切皆文件,正因为这一点才有了设备文件( /dev 目录下有各种设备文件,大都跟具体的硬件设备相关)这一说。软链接文件:链接文件是分为两种的,另一种当然是“硬链接”(硬链接不常用,而软链接等同于 Windows 上的快捷方式)
一个目录同时具有读权限和执行权限才可以打开并查看内部文件,而一个目录要有写权限才允许在其中创建其它文件
查看文件权限
ls -l列出并显示当前目录下的文件,使用较长格式列出文件;
ls -h更直观的查看文件的大小;
ls -dl <目录名> 查看某一个目录的完整属性,而不是显示目录里面的文件属性;
ls -a查看隐藏文件。
注:参数可以合在一块使用!
变更文件所有者
sudo chown <需要变更到的用户名> <文件名>
修改文件权限
方式一:chmod 777 <文件名>(chmod后面跟三个1-7内的数字)
方式二:**chmod go-rw <文件名>**加减赋值操作,g、o 还有 u 分别表示 group、others 和 user,+ 和 - 分别表示增加和去掉相应的权限。
Linux 是以树形目录结构的形式来构建整个系统的,可以理解为树形目录是一个用户可操作系统的骨架。虽然本质上无论是目录结构还是操作系统内核都是存储在磁盘上的,但从逻辑上来说 Linux 的磁盘是“挂在”(挂载在)目录上的,每一个目录不仅能使用本地磁盘分区的文件系统,也可以使用网络上的文件系统。举例来说,可以利用网络文件系统(Network File System,NFS)服务器载入某特定目录等。
新建空白文件:touch <文件名>
新建目录:mkdir <目录名>(使用 -p 参数,同时创建父目录(如果不存在该父目录),如下我们同时创建一个多级目录,后面的目录路径,以绝对路径的方式表示也是可以的)
复制文件:cp <文件名> <目录名>
复制目录:cp -r <目录名1> <目录名2>(复制目录需要加上 -r 或者 -R 参数,表示递归复制)
删除文件/目录:rm <文件名>(想忽略提示,直接删除文件,可以使用 -f 参数强制删除;要删除一个目录,也需要加上 -r 或 -R 参数)
移动文件与文件重命名:mv <源目录文件> <目的目录> ; mv <旧的文件名> <新的文件名>
查看文件:使用 cat,tac 和 nl 命令查看文件;(前两个命令都是用来打印文件内容到标准输出(终端),其中 cat 为正序显示,tac 为倒序显示,可以加上 -n 参数显示行号;nl 命令,添加行号并打印,这是个比 cat -n 更专业的行号打印命令)
使用 more 和 less 命令分页查看文件;使用 head 和 tail 命令查看文件(关于 tail 命令,不得不提的还有它一个很牛的参数 -f,这个参数可以实现不停地读取某个文件的内容并显示)
查看文件类型:例如file /bin/ls
编辑文件:一般用vim或者vi(比较老了)
要解释环境变量,得先明白变量是什么,准确的说应该是 Shell 变量,所谓变量就是计算机中用于记录一个值(不一定是数值,也可以是字符或字符串)的符号,而这些符号将用于不同的运算处理中。通常变量与值是一对一的关系,可以通过表达式读取它的值并赋值给其它变量,也可以直接指定数值赋值给任意变量。
在 Shell 中如何创建一个变量,如何给变量赋值和如何读取变量的值呢?
使用 declare 命令创建一个变量名为 tmp 的变量->使用 = 号赋值运算符,将变量 tmp 赋值为 shiyanlou->读取变量的值,使用 echo 命令和 $ 符号($ 符号用于表示引用一个变量的值)
有三个与上述三种环境变量相关的命令:set,env,export。这三个命令很相似,都是用于打印环境变量信息,区别在于涉及的变量范围不同。
按变量的生存周期来划分,Linux 变量可分为两类:
永久的:需要修改配置文件,变量永久生效;
临时的:使用 export 命令行声明即可,变量在关闭 shell 时失效。
这里介绍两个重要文件 /etc/bashrc(有的 Linux 没有这个文件) 和 /etc/profile ,它们分别存放的是 shell 变量和环境变量;还有要注意区别的是每个用户目录下的一个隐藏文件 .profile 只对当前用户永久生效,而写在 /etc/profile 里面的是对所有用户永久生效;
一. 添加环境变量
(Bash shell中用export,C shell中用setenv)
1.直接在终端修改:
export PATH= P A T H : s o f t w a r e i n s t a l l a t i o n p a t h / b i n ∗ ∗ 改 修 改 只 对 本 次 进 程 有 效 2. 修 改 用 户 级 在 h o m e / 用 户 / . p r o f i l e 中 添 加 : ∗ ∗ e x p o r t P A T H = PATH:software_installation_path/bin** 改修改只对本次进程有效 2.修改用户级 在home/用户/.profile中添加: **export PATH= PATH:softwareinstallationpath/bin∗∗改修改只对本次进程有效2.修改用户级在home/用户/.profile中添加:∗∗exportPATH=PATH:software_installation_path/bin
保存文件,重启即可(有的系统执行./.profile即可,不需重启;有的系统必须重启)
3.修改系统级
cd /etc/profile
vi profile
export PATH=$PATH:software_installation_path/bin
保存文件,重启即可(有的系统执行./profile即可,不需重启;有的系统必须重启)重启后可查看PATH环境变量看是否更改:echo $PATH(查看 PATH 环境变量的内容)
二. 环境变量改名
echo ${path/old_name/new_name} #变更一个目录名old_name
echo ${path//old_name/new_name} #变更所有目录名old_name
三.环境变量删除
echo ${path#/deletion_name:}
也可以使用 unset 命令删除一个环境变量。
前面我们在 Shell 中修改了一个配置脚本文件之后(比如 zsh 的配置文件 home 目录下的 .zshrc),每次都要退出终端重新打开甚至重启主机之后其才能生效,很是麻烦,我们可以使用 source 命令来让其立即生效。
与搜索相关的命令常用的有 whereis,which,find 和 locate
例1:
第一步:创建hello_shell脚本
touch hello_shell.sh
#!/bin/bash
for ((i=0; i<10; i++));do
echo “hello shell”
done
exit 0
第二步:为文件添加可执行权限:chmod 755 hello_shell.sh
第三步:执行脚本./hello_shell.sh
例2:创建一个 C 语言“ hello world ”程序
vim hello_world.c
#include
int main(void)
{
printf(“hello world!\n”);
return 0;
}
保存后使用 gcc 生成可执行文件:gcc -o hello_world hello_world.c
执行**./hello_world**
在讲 Linux 上的压缩工具之前,有必要先了解一下常见常用的压缩包文件格式。在 Windows 上最常见的不外乎这两种 .zip,.7z 后缀的压缩文件。而在 Linux 上面常见的格式除了以上两种外,还有 .rar,.gz,.xz,.bz2,.tar,.tar.gz,.tar.xz,*.tar.bz2。
压缩,例:zip -r -q -o shiyanlou.zip /home/shiyanlou/Desktop
解压缩,例:将 shiyanlou.zip 解压到当前目录:unzip shiyanlou.zip
使用安静模式,将文件解压到指定目录:
unzip -q shiyanlou.zip -d ziptest
使用 unzip 解压文件时我们同样应该注意兼容问题,不过这里我们关心的不再是上面的问题,而是中文编码的问题,通常 Windows 系统上面创建的压缩文件,如果有有包含中文的文档或以中文作为文件名的文件时默认会采用 GBK 或其它编码,而 Linux 上面默认使用的是 UTF-8 编码,如果不加任何处理,直接解压的话可能会出现中文乱码的问题(有时候它会自动帮你处理),为了解决这个问题,我们可以在解压时指定编码类型。
使用 -O(英文字母,大写 o)参数指定编码类型:unzip -O GBK 中文压缩文件.zip
压缩:tar -zcvf /root/hello.tar /root/a 将root目录下a文件夹打包为hello.tar放在root目录
解压缩:tar -zxvf /root/hello.tar 将其解压缩,tar.gz文件用z;tar文件可以不带z
help命令 help 命令是用于显示 shell 内建命令的简要帮助信息;其实外部命令基本上都有一个参数–help,这样就可以得到相应的帮助。
man命令
man 没有内建与外部命令的区分,因为 man 工具是显示系统手册页中的内容;
info命令
要是你觉得man显示的信息都还不够,满足不了你的需求,那试试 info 命令。
例:sudo apt-get update;sudo apt-get install some-tool;some-tool
例:which cowsay>/dev/null || echo “cowsay has not been install, please run ‘sudo apt-get install cowsay’ to install” (||在这里就是与&&相反的控制效果,当上一条命令执行结果为≠0($?≠0)时则执行它后面的命令)
管道是什么?管道是一种通信机制,通常用于进程间的通信(也可通过socket进行网络通信),它表现出来的形式就是将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)。
例:ls -al /etc | less执行完查询后再执行less查看
grep 命令,在文本中或 stdin 中查找匹配字符串;sort 排序命令;uniq命令可以用于过滤或者输出重复行。
我们需要定期从服务器上下载一个软件包列表,使用 sudo apt-get update 命令来保持本地的软件包列表是最新的(有时你也需要手动执行这个操作,比如更换了软件源),而这个表里会有软件依赖信息的记录,对于软件依赖,我举个例子:我们安装 w3m 软件的时候,而这个软件需要 libgc1c2 这个软件包才能正常工作,这个时候 apt-get 在安装软件的时候会一并替我们安装了,以保证 w3m 能正常的工作。
apt-get 是用于处理 apt包的公用程序集,我们可以用它来在线安装、卸载和升级软件包等,下面列出一些apt-get包含的常用的一些工具:
使用 dpkg 从本地磁盘安装 deb 软件包。
使用dpkg -L查看deb包目录信息:sudo dpkg -L emac24
二进制包的安装比较简单,我们需要做的只是将从网络上下载的二进制包解压后放到合适的目录,然后将包含可执行的主程序文件的目录添加进PATH环境变量即可。
而随着程序的发展越做越大,又会继续细分,从而引入了线程的概念,当代多数操作系统、Linux 2.6及更新的版本中,进程本身不是基本运行单位,而是线程的容器。就像上述所说的,每个部门又会细分为各个工作小组(线程),而工作小组需要的资源需要向上级(进程)申请。
本文总结实验楼学习资源得出;学习资源链接: 实验楼.