对于程序员来说,命令行是常用的工具,在Mac和Linux系统中,命令行使用的是Shell语言,对于常用的工具,我都喜欢选把它研究透彻,本文就是我在学习Shell语言时收集和总结的文档,为了方便大家,现分享如下:
Linux命令格式
command [options] [arguments]
其中,各符号的表示的含意如下:
-
command
:命令 -
options
:选项;有2种表示法:-
--
单词:由前面2个-
和2个(包含2个)以上的字母组成; -
-
单字:前面1个-
和1个字母组成;
-
-
argument
:参数
在查看命令帮助时,会出现[],<>,|
等符号,它们的含义如下:
-
[]
:表示是可选的; -
<>
:表示是可变化的; -
x|y|z
:表示只能选择一个; -
-abc
:表示三个参数(或任何二个)的混合使用; -
/
:或者;
帮助命令
help <Command>
适用于内部命令
<Command> –help/-h
适用于外部命令
man <Command>
查看命令描述或手册页(Manual);
备注:
manual 手册是分章节的;man # Command
(#表示章节号)
各个章节的所讲的内容如下:
- 所有用户可以使用的命令
- 系统内核调用,不是每个命令都有系统调用(如:
man 2 read
) - 库调用
- 特殊文件,如:
/dev/tty1
- 文件格式(命令配置文件的语法,如:
man 5 passwd
) - 游戏相关
- 杂项
- 管理员命令,如:
fdisk
man命令查询操作参考《vi,vim用法》中的命令模式
man命令格式符意义:
-
[]
:可选内容; -
<>
:必须给出内容; -
a|b|c
:多选一; -
…
:可以有多个;
info <Command>
有超链接的文档,info 提供信息页,提供作者、版本,什么时候发布等更详细信息,man手册是告诉你怎么用;
README
绝大多数程序都有相应的帮助文档,保存在 /usr/share/doc
文件夹中;
Shell的启动配置文件
当我们登录系统后,启动 bash 程序,并且会读取一系列称为启动文件的配置脚本,这些文 件定义了默认的可供所有用户共享的 shell 环境。然后是读取更多位于我们自己主目录中的启 动文件,这些启动文件定义了用户个人的 shell 环境。精确的启动顺序依赖于要运行的 shell 会 话类型。有两种 shell 会话类型:一个是登录 shell 会话,另一个是非登录 shell 会话。
登录 shell 会话会提示用户输入用户名和密码;例如,我们启动一个虚拟控制台会话。当我 们在 GUI 模式下运行终端会话时,非登录 shell 会话会出现。
登录 shell 会读取一个或多个启动文件,正如表 12 - 2 所示:
非登录 shell 会话会读取以下启动文件:
除了读取以上启动文件之外,非登录 shell 会话也会继承它们父进程的环境设置,通常是一个登录 shell。
浏览一下你的系统,看一看系统中有哪些启动文件。记住-因为上面列出的大多数文件名 都以圆点开头(意味着它们是隐藏文件),你需要使用带 -a
选项的 ls 命令。
在普通用户看来,文件 ∼/.bashrc
可能是最重要的启动文件,因为它几乎总是被读取。非 登录 shell 默认会读取它,并且大多数登录 shell 的启动文件会以能读取 ∼/.bashrc
文件的方式 来书写。
Mac系统的Shell的配置文件
打开mac终端,输入:
echo $SHELL
如果输出的是:csh 或者是 tcsh,那么你用的就是 C Shell。
如果输出的是:bash,sh,zsh,那么你的用的可能就是 Bourne Shell 的一个变种。
Mac OS X 10.2之前默认的是C Shell。
Mac OS X 10.3之后默认的是Bourne Shell。
在这里只介绍Bourne Shell(sh)关于配置文件的等级介绍。
在Bourne Shell下有三种配置文件,如下:
/ect/profile
/ect/bashrc
~/.bash_profile
注意:
- 有些文章说:Linux里边是
.bashrc
而MAC 是.bash_profile
,所以Mac下只需要设置profile
和.bash_profile
,但是我发现mac下也有/ect/bashrc
配置文件;
它们的作用如下:
/ect/profile
(一般不建议修改这个文件)
全局(公有)配置,不管是哪个用户,登陆是都会读取该文件。-
~/.bash_profile
- 一般在这个文件中添加用户级环境变量;
- 若bash shell是以login方式执行时,才会读取此文件。该文件仅仅执行一次默认情况下,他设置一些环境变量。
- 在
.bash_profile
中设置的配置信息只有在打开终端的时候执行有效,终端关闭后,之前的设置的命令则无效;
-
/ect/bashrc
(mac没有此配置文件)- 全局(公有)配置,bash shell执行时,不管是何种方式,都会读取此文件。
- 可以加入mysqlstart、mysql和mysqladmin命令的别名,保证每一个用户都可以使用这3个命令。
应该使用哪个配置文件
按照通常的规则,添加目录到你的 变量或者是定义额外的环境变量,要把这些 更改放置到 文件中(或者其替代文件中,根据不同的发行版。例如,使用文件)。对于其它的更改,要放到 文件中。除非你是系统管理员,需要为系统 中的所有用户修改默认设置,那么则限定你只能对自己主目录下的文件进行修改。当然,有可 能会更改 目录中的文件,比如说 文件,而且在许多情况下,修改这些文件也是明智 的,但是现在,我们要安全起见。
命令的查找目录
当在终端直接输入命令时,如:guobinyongMac:~ guobinyong$ ls
,系统会在一些指定的目录中查找相应命令的可执行文件,然后执行查找到的可执行文件;如果命令的可执行文件不在默认的目录中,则需要在输入命令时写出命令的路径,如:
假设我需要执行命令 gby
,而 gby
文件在目录./PATH/
下,则需要这样输入命令:
guobinyongMac:~ guobinyong$ ./PATH/gby
这样是不太方便的,如果不想输入命令的路径,则可以把命令的所在目录配置为终端的命令查找目录;
如何配置呢?通过PATH变量!
PATH变量中保存的是命令查找路径的列表,目录之间用冒号 :
分隔;配置方法如下:
在终端的配置文件 ~/.bash_profile
(如果不存在,则创建该文件)中添加如下代码:
export PATH=$PATH:新的路径 //把您要添加的路径写在$PATH:后面
常用命令
export命令
export命令Shell内建命令 export命令用于将shell变量输出为环境变量,或者将shell函数输出为环境变量。
一个变量创建时,它不会自动地为在它之后创建的shell进程所知。而命令export可以向后面的shell传递变量的值。当一个shell脚本调用并执 行时,它不会自动得到原为脚本(调用者)里定义的变量的访问权,除非这些变量已经被显式地设置为可用。export命令可以用于传递一个或多个变量的值到任何后继脚本。
语法:
export(选项)(参数)
选项:
-
-f
:代表[变量名称]中为函数名称; -
-n
:删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中; -
-p
:列出所有的shell赋予程序的环境变量。
参数:
- 变量:指定要输出或者删除的环境变量。
alias命令
Shell内建命令 alias命令用来设置指令的别名。我们可以使用该命令可以将一些较长的命令进行简化。使用alias时,用户必须使用单引号''将原来的命令引起来,防止特殊字符导致错误。
alias命令的作用只局限于该次登入的操作。若要每次登入都能够使用这些命令别名,则可将相应的alias命令存放到bash的初始化文件/etc/bashrc中。
语法:
alias(选项)(参数)
选项:
-
-p
:打印已经设置的命令别名。
参数:
命令别名设置:定义命令别名,格式为命令别名='实际命令'
。
示例:
alias 的基本使用方法为:
alias 新的命令='原命令 -选项/参数'
例如:alias l='ls -lsh'
将重新定义ls命令,现在只需输入 l
就可以列目录了。直接输入 alias 命令会列出当前系统中所有已经定义的命令别名。
备注:
要删除一个别名,可以使用 unalias 命令,如 unalias l。
问题解决方案
输出目录层级结构
find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'
多个命令在一行中执行
为了方便用户一键操作,经常会有将多个命令写在一行的需求;这种需求的实现方式有多种,如下:
方式1:命令之间用;
(分号)隔开
语法
命令 ; 命令
命令会依次执行;
方式2:命令之间用&&
隔开
语法
命令 && 命令
&&
是具有短路特性的逻辑与运算符;
应用在两个命令语句间表示:只有在前一个命令执行成功后,才会执行下一个;
方式3:命令之间用||
隔开
语法
命令 || 命令
||
是具有短路特性的逻辑或运算符;
应用在两个命令语句间表示:只有在前一个命令执行失败后,才会执行下一个命令;
方式4:用()
包裹
语法
(命令1;命令2)
开启一个子Shell环境来执行括号中的命令。
方式5:用{}
包裹
语法
{ 命令1;命令2; }
在当前的Shell中执行 {}
中的命令;
()
和{}
的区别
相同点:
-
()
和{}
都是把一串的命令放在括号里面,并且命令之间用;
号隔开
不同点:
-
()
只是对一串命令重新开一个子shell进行执行,{}
对一串命令在当前shell执行 -
()
最后一个命令可以不用分号,{}
最后一个命令要用分号 -
()
里的第一个命令和左边括号不必有空格,{}
的第一个命令和左括号之间必须要有一个空格 -
()
和{}
中括号里面的某个命令的重定向只影响该命令.但括号外的重定向则影响到括号里的所有命令