Linux && bash简介
目的
便于大家了解linux bash,便于大家的trouble shooting~
linux 简介
(copied from wikipedia)
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
Linux操作系统诞生于1991 年的10 月5 日(这是第一次正式向外公布的时间)。Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。
历史
创始人Linus Benedict Torvalds(1969年~),发展和成长过程始终依赖着五个重要支柱:UNIX 操作系统、MINIX 操作系统、GNU 计划、POSIX 标准和Internet 网络。
- 1981 年IBM公司推出微型计算机IBM PC。
- 1991年,GNU计划已经开发出了许多工具软件,最受期盼的GNU C编译器已经出现,GNU的操作系统核心HURD一直处于实验阶段,没有任何可用性,实质上也没能开发出完整的GNU操作系统,但是GNU奠定了Linux用户基础和开发环境。
- 1991年初,林纳斯·托瓦兹开始在一台386sx兼容微机上学习minix操作系统。1991年4月,林纳斯·托瓦兹开始酝酿并着手编制自己的操作系统。
- 1994年3月,Linux1.0发布,代码量17万行,当时是按照完全自由免费的协议发布,随后正式采用GPL协议。
内核
内核指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。使用linux内核的操作系统,统称为linux。linux内核主要包括以下功能:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。
核心的开发和规范一直是由Linux社区控制着,版本也是唯一的。
目前内核版本是3.
发行版
Linux发布版指的就是通常所说的“Linux操作系统”,它可能是由一个组织,公司或者个人发布的。Linux主要作为Linux发布版(通常被称为"distro")的一部分而使用。通常来讲,一个Linux发布版包括Linux内核,将整个软件安装到计算机上的一套安装工具,各种GNU软件,其他的一些自由软件,在一些特定的Linux发布版中也有一些专有软件。发布版为许多不同的目的而制作,包括对不同计算机硬件结构的支持,对一个具体区域或语言的本地化,实时应用,和嵌入式系统。目前,超过三百个发布版被积极的开发,最普遍被使用的发布版有大约十二个。较为知名的有SUSE、RedHat、Fedora、Debian、Ubuntu、CentOS、Gentoo
一个典型的Linux发布版包括:Linux内核,一些GNU库和工具,命令行shell,图形界面的X窗口系统和相应的桌面环境,如KDE或GNOME,并包含数千种从办公包,编译器,文本编辑器,小游戏,儿童教育软件,到科学工具的应用软件。
bash介绍
Bash(GNU Bourne-Again Shell)是许多Linux平台的内定Shell,事实上,还有许多传统UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh等等。目前linux上默认的shell环境都是bash
兄弟们
/bin/sh (已經被 /bin/bash 所取代)
/bin/bash (就是 Linux 預設的 shell)
/bin/ksh (Kornshell 由 AT&T Bell lab. 發展出來的,相容於 bash)
/bin/tcsh (整合 C Shell ,提供更多的功能)
/bin/csh (已經被 /bin/tcsh 所取代)
/bin/zsh (基於 ksh 發展出來的,功能更強大的 shell)
文件权限
常见错误
[l-djb2c2][zhenbao.zhou][/home/q][20][0][15:30:31] $ less nohup.out nohup.out: Permission denied [l-djb2c2][zhenbao.zhou][/home/q][21][1][15:30:37] $ ll nohup.out -rw------- 1 root root 5167 Nov 28 2012 nohup.out
User, Group及Others
在Linux里面,任何一个文件都具有『User, Group及Others』三种身份的个别权限.
文件属性
- 第一个字符代表这个文件是『目录、文件或链接文件等等』:
当为[ d ]则是目录,例如上表档名为『.gconf』的那一行;
当为[ - ]则是文件,例如上表档名为『install.log』那一行;
若是[ l ]则表示为连结档(link file);
若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。 - 接下来的字符中,以三个为一组,且均为『rwx』 的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。
- 第二栏表示有多少档名连结到此节点(i-node):
每个文件都会将他的权限与属性记录到文件系统的i-node中,不过,我们使用的目录树却是使用文件名来记录, 因此每个档名就会连结到一个i-node!这个属性记录的,就是有多少不同的档名连结到相同的一个i-node号码去就是了。 关于i-node的相关数据我们会在第八章谈到文件系统时再加强介绍的。 - 第三栏表示这个文件(或目录)的『拥有者账号』
- 第四栏表示这个文件的所属群组
在Linux系统下,你的账号会附属于一个或多个的群组中。举刚刚我们提到的例子,class1, class2, class3均属于projecta这个群组,假设某个文件所属的群组为projecta,且该文件的权限如图2.1.2所示(rwxrwx--), 则class1, class2, class3三人对于该文件都具有可读、可写、可执行的权限(看群组权限)。 但如果是不属于projecta的其他账号,对于此文件就不具有任何权限了。
- 第五栏为这个文件的容量大小,默认单位为bytes;
- 第六栏为这个文件的建档日期或者是最近的修改日期:
权限
r | 可获得这个文件的内容 | 可以看到这个目录里的文件以及这些文件对应的权限 |
w | 可以编辑或者修改此文件内容(但不可以删除此文件) | 可以对目录的内容进行修改。(移动目录里的文件等 ) |
x | 可以被系统执行 | 某个用户可以进入此目录 |
权限修改
- chown(需要root用户)
修改文件/目录的user - chgrp(需要root)
修改文件/目录的group$ sudo chgrp tomcat jenkins.war $ ll jenkins.war -rw-r--r-- 1 tomcat tomcat 49190379 Nov 28 2012 jenkins.war
- chmod
修改文件属性$ ll jenkins.war -rw-r--r-- 1 zhenbao.zhou tomcat 49190379 Nov 28 2012 jenkins.war $ chmod 755 jenkins.war $ ll jenkins.war -rwxr-xr-x 1 zhenbao.zhou tomcat 49190379 Nov 28 2012 jenkins.war*
好用的命令
帮助命令
help
grep --help
man
查询manual页
man grep
info
某些软件会有info页,也可以用这个查看
文件查看命令
cat
查看文件
tail
查看文件末尾
tail -f filename
less
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。less 的用法比起 more 更加的有弹性。在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less 时,就可以使用 pageup pagedown 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。
ps aux|grep less
查看方法
- 空格 向前一屏幕
- b 向回一屏幕
- q 退出less
- G 移动到末尾
- g 移动到开头
- h 帮助
- ? 往回查找
- / 向前查找
grep/zgrep
grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.
zgrep 可以直接扫描 gzip文件
vim / emacs
文本编辑工具
rm
删除文件
查找文件
which
查造某个可执行文件的路径
[l-djb2c2][zhenbao.zhou][/home/q/zhenbao.zhou][69][0][16:07:06] $ which java /usr/bin/which: no java in (/opt/qt/bin/:/usr/local/pgsql/bin/:/home/zhenbao.zhou/apache-ant-1.8.4/bin:/opt/perl/bin/:/usr/lib64/qt-3.3/bin:/opt/pg92/bin:/home/q/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/opt/pg90/bin/:/home/zhenbao.zhou/emacs/bin:/usr/local/apache-maven-2.2.1/bin/:/home/zhenbao.zhou/bin)
find
强大的查找工具
$ find . -name "*.java" ./emacs-lib/sqlformat/SqlBeautify.java ./emacs-lib/cedet-1.0pre7/semantic/tests/scopetest.java ./emacs-lib/cedet-1.0pre7/semantic/tests/testjavacomp.java
locate / updatedb
更强大的搜索工具
$ locate zhenbao.zhou123123123 [l-djb2c2][zhenbao.zhou][/home/q/zhenbao.zhou][77][1][16:09:11]
查看系统状态
ps
查看目前进程
ps auxxx|grep java
top
展示系统信息
netstat
Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态
-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态
-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。
$ netstat -anlp | grep 8000 (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN $ sudo netstat -alnp | grep 8000 tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 13575/java
lsof
命令的原始功能是列出打开的文件的进程,但LINUX下,所有的设备都是以文件的行式存在的,所以,lsof的功能很强大!
$ sudo lsof $ sudo lsof -i :8000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 13575 tomcat 29u IPv4 156048599 0t0 TCP *:irdmi (LISTEN $ sudo lsof tts.sh COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME less 32288 zhenbao.zhou 4r REG 252,7 35677 1712552 tts.sh
free
查看系统目前内存情况
df
查看系统磁盘大小
du
统计某一个目录的情况
w
查看登录情况
uname
查看系统的内核、机器类型等等
$ uname -a Linux l-djb2c2.vc.dev.cn6 2.6.32-220.el6.x86_64 #1 SMP Tue Dec 6 19:48:22 GMT 2011 x86_64 x86_64 x86_64 GNU/Linux
网络命令
scp/rsync
文件传输
curl / wget
在当前环境启动一个web服务器
( 这是bash范畴的命令)
python -mSimpleHTTPServer 8912
重定向
- > 输出重定向到一个文件或设备 覆盖原来的文件
- >! 输出重定向到一个文件或设备 强制覆盖原来的文件
- >> 输出重定向到一个文件或设备 追加原来的文件
- < 输入重定向到一个程序
- 2> 将一个标准错误输出重定向到一个文件或设备
ls > /tmp/4 ls aasdfasd > /tmp/4 ls asdfasdf 2> /tmp/12 ls asdf > /dev/null
管道
使用 "|"连接各个命令的输出
ls | less
脚本调试方法
echo
打印变量名
echo $AAA
sh
执行某个文件
sh -x aaa.sh