shell学习

绝对路径

绝对路径开始于根目录,紧跟着目录树的一个个分支,一直到所期望的目录或文件。例子:/home/alex
意味着从根目录(用开头的“/”表示)开始有个叫home的目录包含了目录alex

相对路径

相对路径开始于工作目录,文件系统树中用...来表示相对位置,符号.指的是工作目录,..指的
是工作目录的父目录。

type

显示命令的类型,可用来检测命令是否存在。

alex@Veronica:~$ type ls
ls 是 'ls --color=auto' 的别名
which

显示命令所在的位置

alex@Veronica:~$ which ls
/bin/ls
help

得到命令的帮助文档

man

显示程序手册页

apropos

模糊匹配,搜索可能的命令

alex@Veronica:~$ apropos mkdi
gvfs-mkdir (1)       - Create directories
mkdir (1)            - make directories
mkdir (2)            - create a directory
mkdirat (2)          - create a directory
whatis

非常简洁的命令说明

alex@Veronica:~$ whatis ls
ls (1)               - list directory contents
alias命令别名

在命令alias输入命令的名字,紧接着是一个等号,等号之后是一串引号包裹的字符串,字符串的内容赋值给name

alex@Veronica:~$ alias webstorm='cd /home/alex/下载/WebStorm-171.3780.21//bin; ./webstorm.sh'
alex@Veronica:~$ type webstorm
webstorm 是 'cd /home/alex/下载/WebStorm-171.3780.21//bin; ./webstorm.sh' 的别名

重定向

一般来说标准输出和标准错误连接到屏幕,标准输入来自键盘,通过I/O重定向,我们可以做出改变。

重定向符

使用重定向符>后接文件名可以把标准输出和标准错误输出到屏幕以外的另一个文件。

重定向标准输出
alex@Veronica:~/桌面/bash$ ls .. -l > ls-output.txt
alex@Veronica:~/桌面/bash$ file ls-output.txt
ls-output.txt: UTF-8 Unicode text

重定向符会重写整个文件,因此只使用重定向符而没有命令在它之前会删除已存在文件的内容或创建一个空文件。

使用'>>'操作符可以把输出内容追加到文件末尾。

重定向标准错误

shell内部用文件描述符0,1,2分别对应标准输入,标准输出,标准错误。

alex@Veronica:~/桌面/bash$ ls 不存在的目录 -l 2>ls-output.txt
alex@Veronica:~/桌面/bash$ file ls-output.txt
ls-output.txt: UTF-8 Unicode text
重定向标准错误和标准输出到同一个文件

传统的方法:两次重定向,先将标准输出重定向,再将文件描述符2重定向到文件描述符1。注意两次重定向
的顺序。

alex@Veronica:~/桌面/bash$ ls 不存在的目录 -l >ls-output.txt 2>&1
alex@Veronica:~/桌面/bash$ file ls-output.txt
ls-output.txt: UTF-8 Unicode text

第二种方法:使用表示法&>重定向标准输出和错误

alex@Veronica:~/桌面/bash$ ls 不存在的目录 -l &>ls-output.txt
alex@Veronica:~/桌面/bash$ file ls-output.txt
ls-output.txt: UTF-8 Unicode text
处理不需要的输出

不需要的输出重定向到dev/null,这个文件是系统设备,叫位处理桶。

cat - 连接文件

cat命令读取一个或多个文件然后复制他们到标准输出。
使用cat读取多个文件可以将他们连接起来。

管道线

命令从标准输入读取数据并送到标准输出的能力被管道线利用,使用管道操作符|,一个命令的标准输出可以通过
管道送到另一个命令的标准输入。

alex@Veronica:~/桌面/bash$ ls .. -l | less
过滤器

过滤器接受输入,然后改变它,再输出它

  1. sort排序
  2. uniq忽略或输出重复行(使用-d参数)。
  3. wc打印行数、字数和字节数。
  4. grep打印匹配行。
  5. head/tail打印文件开头部分/结尾部分。(使用-n参数可以调整打印的行数)
  6. tee从标准输入读取数据,并且同时复制数据到标准输出和一个或多个文件。
波浪线展开
  1. 不带参数时波浪线展开为当前用户的家目录
  2. 带参数时,如果参数为存在的用户名,则展开为该用户的家目录
alex@Veronica:~$ echo ~
/home/alex
alex@Veronica:~$ echo ~root
/root
alex@Veronica:~$ echo ~不存在的
~不存在的
算数表达式展开

格式:
$((expression))

算数表达式展开只支持整数

alex@Veronica:~$ echo $((1+1))
2
alex@Veronica:~$ echo $((3/2))
1
花括号展开

可以用花括号展开一次性创建多个文本字符串,花括号展开模式可能包含一个被称为报头的开头部分和一个被称为
附言的结尾部分。

花括号展开不能嵌入空白字符

alex@Veronica:~$ echo front--{A,B,C}--back
front--A--back front--B--back front--C--back
# 嵌套的展开
alex@Veronica:~$ echo {A{1,2},B{3,4}}
A1 A2 B3 B4
参数展开
alex@Veronica:~$ echo $USER
alex
# 输入错误的变量名会返回空字符串
alex@Veronica:~$ echo $asdfsadfasfdasdf

命令替换

可以把一个命令的输出作为一个展开使用

alex@Veronica:~$ echo $(ls)
examples.desktop node-v6.9.2 Steam 公共的 模板 视频 图片 文档 下载 音乐 桌面
# 一个更为复杂的例子
alex@Veronica:~$ file $(ls /usr/bin/* | grep zip$)
/usr/bin/funzip:   ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=06412c648a6927c4a14c751fe2412db3425ecd0f, stripped
/usr/bin/gpg-zip:  POSIX shell script, ASCII text executable
/usr/bin/mzip:     symbolic link to mtools
...

通过引用控制展开

双引号

使用双引号包裹文本,文本中的shell使用的特殊字符都会被当做普通字符。例外:$,\(反斜杠),和`(反引号)。
这意味着单词分割、路径名展开、波浪线展开和花括号展开都将失效,而参数展开、算数展开和命令行替换仍然有效。

单引号

使用单引号会禁止所有展开

转义字符

引用单个字符时可以在字符之前加上一个反斜杠来禁止展开。

alex@Veronica:~$ echo "the balance for user: $USER is :\$55.0"
the balance for user: alex is :$55.0

权限

chmod

更改文件模式(权限),只有文件的拥有者可以更改。

权限属性
属性 文件 目录
r 允许打开并读取文件内容 允许列出目录中的内容(目录必须设置了可执行属性)。
w 允许写入,删改文件内容,不负责控制文件的新建、删除和重命名,文件的新建、删除和重命名由目录属性控制 允许在目录下新建、删除或重命名文件(目录必须设置了可执行属性)。
x 允许将文件当做程序执行 允许进入目录
用八进制数控制权限
八进制数 二进制数 文件模式
0 000 ---
1 001 --x
2 010 -w-
3 011 -wx
4 100 r--
5 101 r-x
6 110 r-x
6 110 rw-
7 111 rwx
alex@Veronica:~/桌面/bash$ ls -ld test
drwxrwxr-x 2 alex alex 4096 3月  20 08:45 test
alex@Veronica:~/桌面/bash$ chmod 000 test/
alex@Veronica:~/桌面/bash$ ls -ld test
d--------- 2 alex alex 4096 3月  20 08:45 test
chmod符号表示法
u "user"的简写,表示文件或目录的拥有者
g "group"的简写,表示用户组
o "others"的简写,表示其他所有人
a "all"的简写,表示"u","g","o"三者

没有指定字符是默认使用"all"。执行的操作可能是"+",表示加上指权限;"-"表示删除制定权限;"="设置权限为指定权限,删除其余权限。

su 以其他用户身份和组ID运行一个shell

语法:su [-[l]] [user]

如果包含"-l"选项,会启动一个需要登录的shell,不指定用户名时默认打开超级用户。

alex@Veronica:~/桌面/bash$ su
密码:
root@Veronica:/home/alex/桌面/bash# echo 'haha'
haha
root@Veronica:/home/alex/桌面/bash# exit
exit
alex@Veronica:~/桌面/bash$
chown改变文件拥有者和用户组

这个命令需要超级用户权限,语法:chown [owner][:[group]]

示例:

参数 结果
bob 将文件的拥有者改为bob
bob:users 将文件的拥有者改为bob,用户组改为users
:users 用户组改为users,文件所有者不变
bob: 所有者改为bob,用户组为bob登录时所属的用户组

进程相关

  • ps-输出当前进程快照
  • top-显示任务
  • jobs-列出活跃的任务
  • bg-把一个任务放到后台执行
  • fg-把一个任务放到前台执行
  • kill-给一个进程发送信号,参数可以是PID或工作序号
  • killall-杀死指定名字的进程

使用键盘组合键ctrl+z可以把前台运行的进程停止,此时可以使用bg命令加一个百分号和工作序号使进程
返回后台继续执行。

在命令后加上&即可把命令放到后台执行,使用fg命令加一个百分号和工作序号可以让一个进程返回前台

alex@Veronica:~$ xlogo &
[1] 21617
alex@Veronica:~$ fg %1
xlogo

你可能感兴趣的:(shell学习)