shell接受键盘书输入的命令,传递给操作系统来执行,几乎所有的Linux都提供shell程序。
在终端仿真器中(Terminal Emulator)写shell命令。
在终端不要尝试ctrl-c或者ctrl-v,对于shell而言,鼠标中键是粘贴键。
简单的shell命令:
data //显式日期
cal //显示当月日历
df //当前磁盘的可用空间
free //显示可用内存
clear //清屏
exit //结束终端
介绍文件导航系统:
pwd //查看当前工作目录
cd //改变目录
.
代表当前目录,符号..
代表当前目录的父目录。cd .. //回到当前目录的父目录
cd bin //当前目录的bin子目录
cd ./bin //和上面的命令作用一样
常见的cd快捷方式:
cd //将当前目录转向主目录
cd - //将工作目录改编成先前的额工作目录
ls //列出目录内容
file //确定文件类型
less //查看文件内容
ls命令可以查看当前目录下的一系列子目录和文件:
ls(选项)(参数)
参数:要显示的目录,或者文件,可以是多个。
选项:
-l //输出长格式显示
-a //列出所有文件,包括以点号开头的
-d //查看目录的详细信息而非内容,常与-l连用
-F //添加类型指定符
-h //长格式列出, 显示文件大小
-r //逆序
-S //文件大小排序
-t //修改时间排序
长格式:
-rwxrwxr-x 1 xxx xxx 9216 Jun 23 19:41 test
-rwxrwxr-x //对文件的访问权限
1 //硬链接的数目
xxx //文件所有者用户名
xxx //文件所属用户组的名称
9216 //字节数大小
Jun 23 19:41 //上一次修改时间
test //文件名
filel和less命令:
file filename //打印文件内容的说明
less filename //查看文件内容,按q退出
less命令中查看文件内容:
page up或者b //后翻一页
page down或者Space //前翻一页
向上箭头 //向上一行
向下箭头 //向下一行
* 匹配代表任意多个字符
? 匹配单个字符
[characters] 匹配一个属于该字符集的字符
[!characters] 匹配一个不属于该字符集的字符
[[:class:]] 匹配一个指定字符类的字符
常用的字符类:
[:alnum:] 匹配一个字母或者数字
[:alpha:] 匹配一个字母
[:digit:] 匹配一个数字
[:lower:] 匹配一个小写字母
[:upper:] 匹配一个大写字母
例如:
[![:digit:]]* 不以数字开头
*[[:lower:]123] 以小写字母或者数字1,2,3任意一个结尾
尽量避免使用类似于[A-Z]
或者[a-z]
,这些在早期的Linux版本有效,现在不一定。
mkdir dir...
...
代表参数可以重复,下文统一这样约定。
例如:
mkdir dir1 dir2 dir3 //创建3个目录
cp item1 item2 //将文件或者目录item1复制到文件或者目录item2
cp item... directory //将多个项目(文件或者目录)复制进一个目录
cp常见的选项:
-v, --verbose //复制时,显示消息
-i, --interactive //复制已经存在的文件,提示
-r, --recursive //用于目录复制
-a, --archive //复制所有权限
-u, --update //只复制更新的文件
例如:
cp -r dir1 dir2 //将dir1目录复制到dir2,如果dir2不存在,先创建之
cp dir1/* dir2 //dir1总所有文件复制到dir2,dir2必须存在
mv item1 item2
mv item... directory
mv选项:-i, -u, -v
,含义和cp一样。
5. rm:删除文件或者目录
rm item...
rm选项-i, -r, -v, -f
,-f
–force。
6. ln:创建链接
链接包括:符号链接(symbolic link)和硬链接(hard link)。
符号链接类似于windows中的快捷方式,本质是文本文件,里面存放的是位置信息。
硬链接通过索引节点来进行连接,硬链接和源文件公用一个索引节点。每一个文件均有一个硬链接,为文件起名,每当创建一个硬链接,也就为文件创建了一个额外的目录条目。硬链接有两个局限性:
- 不能引用不在同一磁盘分区的文件
- 无法引用目录
基本格式:
ln file link //创建硬链接
ln -s item link //创建符号链接,可以是目录
例如:
ln file1 file2 //硬链接
ln -s file1 file3 //符号链接
删除file1,对file2无影响,file3失效;
删除file2,对file1和file3都无影响;
删除file3,对file1和file2都无影响;
删除file1和file2,文件被真正删除。
type, which
type command //显示command的类型
which command //显示command的位置,只适用于可执行程序,不适用内置命令和别名
例如:
type ls //ls is aliased to `ls --color=auto'
which ls //bin/ls
help command //
command --help //只有一些可执行程序支持--help
man: 显示程序的手册页
man program //program是需要查看的命令名称
手册被分为多个部分:
1 //用户命令
2 //内核函数调用的程序接口
3 //c库函数程序接口
4 //特殊文件
5 //文件格式
6 //游戏和娱乐
7 //其它杂项
8 //系统管理命令
例如:
man 5 passwd //
apropos: 显示合适的命令,通过搜索参考手册列表
apropos floppsy //
whatis: 显示命令的简要描述
whatis ls //ls (1) - list directory contents
info: 显示程序的info目录
info页面可以通过info阅读器来显示。
4. 使用别名 alias 来创建自己的命令
多条命令可以用分号隔开:
command1; command2; command3
使用别名前最好type来验证是否被使用:
type foo
alias foo = 'cd /usr; ls; cd -'
foo //执行三个命令
使用unalias删除别名:
unalias foo
I/O重定向:从文件获取内容,输出结果重定向到文件。
1. 标准输入,标准输出和标准错误
>
和>>
表示输入,前者表示从文件的开头重写,后者表示从文件的末尾开始写入。方式如下:
command > file
command >> file
例如:
ls -l > ls-output.txt //命令ls -l不再输出到屏幕,而是写入文件ls-output.txt
> ls-output.txt //将文件清空或者创建一个空文件
ls -l >> ls-output.txt
文件描述符:in-0, out-1, err-2
ls -l 2 > ls-error.txt
使用&>
将标准输出和标准错误重定向到同一个文件
ls -l &> ls-output.txt
处理不想要的输出,把输出丢弃:
ls -l 2> /dev/null //但是还是显示了,不知道为什么
标准输入重定向:
cat: 合并文件,cat读取一个或者多个文件,并把它们复制到标准输出文件中。
格式:
cat file...
cat ls-output.txt //作用和type一样
假设我们有文件:file001,file002,file003
cat file00* > file //将文件连接在一起
直接写cat
cat
看起来什么都没发生,实际正等待从键盘输入内容,完成后按ctrl+d,表示输入完毕,就会显示刚刚键盘输入。
cat > flie
上述命名执行后等待从键盘写入,ctrl+d完成写入。
cat还接受标准输出:
cat < file //输出file的内容
|
可以把一个命令的标准输出传送到另外一个命令的标准输入。command1 | command2
例如:
ls -l | less
过滤器:管道功能经常对数据执行复杂的操作,也可以把多条命令合在一起构成一个管道,这种方式中用到的命令也称为过滤器。
ls | sort | less //排序并使用less读取内容
uniq:忽略文件中重复的行:
ls | sort | uniq | less //排序并删除重复行,然后使用less读取内容
wc: 打印行数,字数和字节数
例如:
wc output.txt //
grep: 打印匹配行
grep pattern file...
例如:
ls | sort | uniq | grep zip //搜索文件名中包含zip
选项:
-i //忽略大小写
-v //只输出和模式不匹配行
head/tail: 打印文件的开头部分或者结尾部分
有时候只需输出前几行或者倒数几行,需要-n选项:
head -n 5 output.txt //打印前5行
tail -n 10 output.txt //打印倒数10行
这些命令也可以用在管道上:
ls | tail -n 5
tail还可以用来刷新日志,使用-f选项监视文件,一旦添加了新行,就会立即显示在屏幕上:
tail -f logfile
tee: 从stdin读取数据,同时输出到stdout
ls | tee ls.txt | grep zip
echo: 显示一行文本
echo this is a test //屏幕输出this is a test
ech * //等价于命令ls,将*扩展为当前目录下的所有文件名
路径名扩展:
ls //
echo D* //输出以D开头的文件名
echo *s //输出以s结尾的文件名
echo [[:upper:]]*
echo /usr/*/share
波浪线(~)扩展:如果将其用在一个单词的开头,那么它将被扩展为指定用户的主目录名;如果没有指定用户名,则扩展为当前用户的主目录。
算术扩展:表达式
$((expression))
常见的操作符:
+, -, *, /, %, ** //前五个和C一样,**代表取幂
例如:
echo $((2 ** (3 - 1))) //输出4
花括号扩展
例如:
echo F{A,B,C}B //输出FAB FBB FCB
echo {Z..A} //输出Z Y ... C B A
花括号还支持嵌套:
echo a{A{1,2}, B{3,4}}b //输出aA1b aA2b aB3b aB4b
应用:创建一系列文件或者目录
参数扩展:
echo $(USER)
命令替换:将一个命令的输出作为一个扩展模式使用:
echo $(ls) //
双引号:除了美元符号$
,反斜杠\
和反引号'
其它特殊字符都失去特殊含义。因此,参数扩展,算术扩展和命令替换在双引号中依然有效,例如:
echo "$((2 + 2)) this is" //4 this is
单引号: 抑制 所有扩展,例如:
echo "$((2 + 2)) this is" //$((2 + 2)) this is
转义字符
\\
\&
\$
\!
Ctrl+A //移动光标到行首
Ctrl+E //移动光标到行尾
Ctrl+F //光标向前移动一个字符
Ctrl+B //光标向后移动一个字符
Alt+F //光标向前移动一个字
Alt+B
Ctrl+L //等价于clear,但是不会清除当前正在输入的字符
Ctrl+D //删除光标处的字符
Ctrl+T //使光标处的字符和前面的字符对调
Alt+T //使光标处的字和前面的字符对调
Alt+L //从光标到字尾的字符转换成小写
Alt+U //从光标到字尾的字符转换成大写
Ctrl+K //剪切从光标到行尾的文本
Ctrl+U //剪切从光标到行首的文本
Alt+D //剪切从光标到当前词尾的文本
Alt+Backspace //剪切从光标到词头的文本,如果光标在词头,则剪切这个单词
Ctrl+Y //粘贴文本
自动补齐功能:在输入命令时,按TAB键将自动触发自动补齐功能。
使用历史命令:
history | less
history | grep /usr/bin //搜索并打印 /usr/bin目录下的命令
bash也支持以递增的方式搜索历史纪录,按下Ctrl+R,接着输入你要查找的内容,选定查找好的内容,按下enter表示执行该命令,按下Ctrl+J则表示把选定好的内容复制到当前命令行,要退出搜索按下Ctrl+C或者Ctrl+G即可。
Ctrl+P //移动到前一条历史命令,等价于向上箭头
Ctrl+N //移动到后一条历史命令
Ctrl+R //逆向递增搜索
Alt+P //逆向非递增搜索,输入待搜索的字符,按下enter才执行
Alt+N //向前非递归搜索
Ctrl+O //执行列表中的当前项,执行完后跳到下一项
历史纪录扩展:
使用! string
来重复历史命令
!! //重复最后一个执行的命令
!number //重复历史类记录中第number行的命令
!string //重复最近以string开头的历史命令
!?string //重复以string开头的历史命令
用户群组与权限:
每一个用户(user)都有一个唯一的用户标识符(uid),放在/etc/passwd中,为了用户间共享文件或者资源,引入了群组(group)的概念,Linux中的每个用户都属于群组,每一个群组都有一个群组标识符(gid),每个用户至少有一个同名的群组,当然也可以加入到其它群组。
一般用户只能访问自己的文件和同群组中其它成员共享的文件,不能访问其它群组的成员的文件,root用户则不受此限制,root用户具有最高权限。
在Ubuntu系统中:
id //uid=1000(user) gid=1000(user) groups=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare)
使用ls -l
命令得到的前十个字符表示文件的属性:
文件属性 | 所有者权限 | 组权限 | 其它用户权限 |
---|---|---|---|
- | rwx | rw- | r– |
文件属性分类:
- //普通文件
d //目录
l //符号链接,剩下的属性总是rwxrwxrwx
c //字符设备文件
b //块设备文件
剩下的九个字符表示文件模式:
r //允许打开和读取文件
w //允许写入和阶段文件
x //允许把文件当作程序一样执行
例如:
-rwx------ //普通文件,文件所有者具有读取、写入和执行权限,其它没有任何访问权限
chmod: 改变文件模式,通常使用八进制来表示:
八进制 | 二进制 | 文件模式 |
---|---|---|
0 | 000 | |
1 | 001 | –x |
2 | 010 | -w- |
3 | 011 | -wx |
4 | 100 | r– |
5 | 101 | r-x |
6 | 110 | rw- |
7 | 111 | rwx |
使用方式:
chmon 600 file //将文件file的文件模式改为600即rw-------
符号表示法:
u //user简写
g //文件所属群组
o //other,其它所有用户
a //all u,g,o三者组合
用法:
chmod u-x file //删除file文件的文件所有者的可执行权限
chmod +x file //等价于chmod a+x
chmod go-rw file //
umask:设置默认权限。
我的Ubuntu使用umask命令后得到的是:0002
。四个数字,第一个数字代表特殊权限,后面三个数字都是八进制,假设是xyz
,那么目录的权限为(7-x)(7-y)(7-z)
,文件的默认权限为(6-x)(6-y)(6-x)
,例如:
ls -l foo.txt //-rw-rw-r-- (664)
更改身份:
su:以root用户来运行shell,常见如:
su - //提示输入密码后,进入root权限,$变成#
exit //退出root权限
su -c 'command' //
sudo:受限制的su,切换到root,命令执行完成后退回当前用户,不需要启动一个新的shell环境。
chown:更改文件所有者和所属群组,格式:
chown [owner] [:[group]] file...
例如:
sudo chown janet: ~tony/myfile.txt //改变文件的所属者
chgrp:改变文件的所属群组。
更改密码:passwd命令。