命令:which、whereis、who和w
开始
命令搜索的顺序
- 在shell function中查找,有则调用,无则下一步;
- 判断命令是否为bash内置命令,有则调用,无则下一步;
- 在$PATH中搜索该命令,有则调用,无则报错。
判断命令类型
bash中有一个内置命令叫做type,可用于判断命令的类型(内置命令或者外部命令)。内置命令就是bash内置的、自带的,外部命令一般是由程序包提供。
命令结果中显示shell builtin的话表示shell内置命令,显示命令为某个路径下的文件时,为外部命令。
[root@C7 ~]# type kill
kill is a shell builtin
[root@C7 ~]# type lvcreate
lvcreate is /usr/sbin/lvcreate
获取命令帮助
内置命令一般使用命令help获取帮助。
[root@C7 ~]# help kill
kill: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Send a signal to a job.
Send the processes identified by PID or JOBSPEC the signal named by
SIGSPEC or SIGNUM. If neither SIGSPEC nor SIGNUM is present, then
SIGTERM is assumed.
Options:
-s sig SIG is a signal name
-n sig SIG is a signal number
-l list the signal names; if arguments follow `-l' they are
assumed to be signal numbers for which names should be listed
Kill is a shell builtin for two reasons: it allows job IDs to be used
instead of process IDs, and allows processes to be killed if the limit
on processes that you can create is reached.
Exit Status:
Returns success unless an invalid option is given or an error occurs.
外部命令一般使用命令man获取帮助。
KILL(1) User Commands KILL(1)
NAME
kill - terminate a process
SYNOPSIS
kill [-s signal|-p] [-q sigval] [-a] [--] pid...
kill -l [signal]
...
注意:命令kill,应该是bash有内置了,外部命令同时还提供了。
[root@C7 ~]# which kill
/usr/bin/kill
[root@C7 ~]# rpm -qf /usr/bin/kill
util-linux-2.23.2-52.el7.x86_64
[root@C7 ~]# type kill
kill is a shell builtin
外部命令还有一种获取帮助的方式是info命令,使用info命令就像在阅读一本书籍一样,有不同的章节,因此info命令提供的帮助信息的内容量较大、较详细。
命令 which
简介
显示命令(shell)的完整路径。
语法
which [options] [--] programname [...]
描述
命令可以带上多个参数。which的工作原理是在环境变量PATH路径下使用和bash相关的算法去搜索可执行文件或脚本。
选项
--all, -a:打印所有被匹配到的可执行程序,不仅仅是只打印第一个。
[root@C7 ~]# touch /usr/local/sbin/zwl.sh /usr/local/bin/zwl.sh
[root@C7 ~]# chmod a+x /usr/local/sbin/zwl.sh /usr/local/bin/zwl.sh
[root@C7 ~]# which zwl.sh
/usr/local/sbin/zwl.sh
[root@C7 ~]# which -a zwl.sh
/usr/local/sbin/zwl.sh
/usr/local/bin/zwl.sh
--read-alias, -i:从标准输入中读取别名,这样子使得which可以获取到命令的别名。
[root@C7 ~]# alias | /usr/bin/which --read-alias ls
alias ls='ls --color=auto'
/usr/bin/ls
[root@C7 ~]# /usr/bin/which ls
/usr/bin/ls
基于此选项的特性,很适合将which自身也做成别名,系统自身已经帮我们做好了。
[root@C7 ~]# alias | grep 'which'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@C7 ~]# which grep
alias grep='grep --color=auto'
/usr/bin/grep
--skip-dot:跳过PATH中以“.”开头的目录。
--skip-tilde:跳过PATH中以“~”开头的目录和家目录下的可执行程序。
--show-dot:与--skip-dot相反,不跳过,但是不会显示完整的路径,而是显示“./programname”。
--show-tilde:当目录匹配为家目录的时候输出一个波浪号。如果which是以root用户执行的话,则此选项会被忽略。
[zwl@C7 bin]$ pwd
/home/zwl/bin
[zwl@C7 bin]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/zwl/.local/bin:/home/zwl/bin
[zwl@C7 bin]$ which zwl.sh
~/bin/zwl.sh
命令 whereis
简介
根据给出的命令名,查找对应的二进制程序,源代码和man手册。
语法
whereis [options] [-BMS directory... -f] name...
描述
给出的命令名首先会被剥夺掉路径名和任何形式的扩展名。比如/PATH/TO/COMMAND.exe,剥夺后剩下COMMAND。由源代码控制所产生的“s.”前缀也会被处理。然后whereis会尝试在Linux的标准位置和PATH和MANPATH环境变量所指定的位置定位程序。
选项
-b:仅查找二进制文件。
-m:仅查找man手册文件。
-s:仅查找源代码文件。
-B:限制whereis查找二进制文件所使用的目录,多个目录使用空格分隔。
-M:限制whereis查找man手册文件所使用的目录,多个目录使用空格分隔。
-S:限制whereis查找源代码文件所使用的目录,多个目录使用空格分隔。
-f:终止目录列表并标志文件的开始。当-B、-M或者-S选项有被使用的时候,此选项必须被使用。
-u:只会显示那些具备不寻常(unusual)条目的命令的名字。当一个命令在每个明确的请求类型下,不是只有一个(即没有或者有多个)条目的时候,该命令会被认为是不寻常的。因此'whereis -m -u *'命令会查找当前目录中的那些没有文档的或者文档条目不止一个的文件。这种用法,一般我们都是会进入到某个bin目录底下,这样子就可以使得文件名即命令名了。
-l:输出whereis命令所使用的有效查找路径。当-B、-M或者-S选项均没有被使用的时候,该选项会输出命令可以在系统上找到的whereis程序代码所写死的(写死,即硬编码,hard coded)路径。
示例
不带选项,输出二进制程序文件、配置文件、man手册。
[root@C7 bin]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man5/passwd.5.gz /usr/share/man/man1/passwd.1.gz
查找/usr/bin中的所有命令,找出那些在/usr/man/man1中没有帮助手册的,或者在/usr/src下没有源码文件的。
$ cd /usr/bin
$ whereis -u -ms -M /usr/man/man1 -S /usr/src -f *
文件搜索路径
默认情况下,whereis尝试从写死的路径中查找文件,写死的路径是通过glob模式被定义的。
默认情况下,whereis也会从环境变量PATH和MANPATH的值中查找文件。
如果想要知道whereis在本次查找中到底查找了哪些路径,可以使用选项-l。有意思的一点是/usr/src/底下的两个源码目录,都是空的。
[root@C7 ~]# whereis -l
bin: /usr/bin
bin: /usr/sbin
bin: /usr/lib
bin: /usr/lib64
...
man: /usr/share/man/man7
man: /usr/share/man/man5
man: /usr/share/man/man1
man: /usr/share/man/man8
...
src: /usr/src/debug
src: /usr/src/kernels
man手册中说“选项-B、-M和-S带来的影响也会被-l显示出来”,但是我测试不出来,不知道是否是自己敲的命令的问题,不深究,pass。
命令 who
简介
显示已登录的用户。
[root@C7 ~]# who
root pts/0 2018-10-22 09:47 (192.168.17.1)
root pts/1 2018-10-22 15:33 (192.168.17.1)
语法
who [OPTION]... [ FILE | ARG1 ARG2 ]
选项
-b, --boot:显示系统上次引导(开机)的日期和时间。
[root@C7 ~]# who -b
system boot 2018-10-22 09:47
-d, --dead:打印死亡进程。
-l, --login:打印系统登录进程。
-p, --process:打印由init所spawn出来的活跃进程。
-r, --runlevel:打印当前运行级别。
[root@C7 ~]# who -r
run-level 5 2018-10-23 09:23
-t, --time:打印上次系统时钟变化。
-T, -w, --mesg:添加用户的消息状态(+, -, ?)。
- +:表示允许写消息;
- -:表示禁止写消息;
- ?:表示无法找到终端设备。
[root@C7 ~]# who -T
root + pts/0 2018-10-23 09:36 (192.168.17.1)
root + pts/1 2018-10-23 09:38 (192.168.17.1)
-u, --users:列出已登录的用户,与不带选项的who有些许不同,可以看到登录shell的PID。
[root@C7 ~]# who
root pts/0 2018-10-23 09:36 (192.168.17.1)
root pts/1 2018-10-23 09:38 (192.168.17.1)
[root@C7 ~]# who -u
root pts/0 2018-10-23 09:36 00:25 1999 (192.168.17.1)
root pts/1 2018-10-23 09:38 . 2082 (192.168.17.1)
-a, --all:等同于-b -d --login -p -r -t -T -u。
[root@C7 ~]# who -a
system boot 2018-10-23 09:23
run-level 5 2018-10-23 09:23
root + pts/0 2018-10-23 09:36 00:26 1999 (192.168.17.1)
root + pts/1 2018-10-23 09:38 . 2082 (192.168.17.1)
如果省略FILE的话,则使用/var/run/utmp。常见的可以将/var/log/wtmp作为FILE来使用,这个文件主要是可以用于查看过去登录的用户信息。
ARG1和ARG2一般是“am i”或者“mom likes”,表示显示当前自己的登录信息。等同于-m选项。
命令 w
命令w是命令who的延展,除了有who的作用以外,还会显示额外的头部信息。
[root@C7 ~]# who
root pts/0 2018-10-23 09:36 (192.168.17.1)
root pts/1 2018-10-23 09:38 (192.168.17.1)
[root@C7 ~]# w
11:36:06 up 2:12, 3 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.17.1 09:36 26:06 0.09s 0.02s less -s
root pts/1 192.168.17.1 09:38 6.00s 0.09s 0.00s w
在头部信息中,从左往右分别表示:
- 当前时间;
- 系统运行时间;
- 当前登录的用户数,不过这个值好像会+1;
- 过去1、5和15分钟,CPU的负载情况。
下面的条目信息中,有几个需要说明:
- JCPU:依附在tty上的所有进程所使用的时间。不包含过去后台作业(job),但包含当前正在运行的后台作业。
- PCPU:当前进程所使用的时间,即WHAT显示的进程。
- WHAT:用户当前正在运行的进程。
命令:which、whereis、who和w的更多相关文章
- liunx命令之whereis、which、find的区别和联系
liunx命令之whereis.which.find的区别和联系
- 每天一个linux命令(17):whereis
1.命令简介 whereis (whereis) 命令用来定位指令的二进制程序.源代码文件和man手册页等相关文件的路径. whereis命令只能用于程序名的搜索,而且 ...
- linux常用命令:whereis 命令
whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. 和find相比,whereis查找的速度非 ...
- linux 命令——17 whereis(转)
whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. 和 find相比,whereis查找的速度 ...
- 每天一个Linux命令:whereis(18)
whereis whereis命令用来定位指令的二进制程序.源代码文件和man手册页等相关文件的路径. whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数- ...
- linux命令:whereis
1.命令介绍: whereis用来查找二进制文件,源代码文件和帮助说明文件,whereis是在系统的数据库文件中查找,所以速度非常快,但是系统的文件数据库不是实时更新的,默认一个星期更新一次. 2.命 ...
- Linux 查找文件命令 find whereis locate
Linux 有三个查找文件的命令:find, whereis, locate 其中find 不常用,whereis与locate经常使用,因为find命令速度较慢,因为whereis与locate是利 ...
- Linux 命令 which whereis locate find
which: 查询某指令的完整路径 $ which [-a] command -a: 将所有在PATH目录中可以找到的指令均列出. 注意:只搜索PATH下的路径. whereis: 只搜索几个特定目录 ...
- linux的查找命令 find whereis locate
Linux 有三个查找文件的命令:find, whereis, locate 其中find 不常用,whereis与locate经常使用,因为find命令速度较慢,因为whereis与locate是利 ...
- Linux 常用命令——which, whereis, locate, find
转载请注明出处:http://blog.csdn.net/drecik__/article/details/8455399 1. which 查找使用命令所在的位置 2. whereis 搜索文件,跟 ...
随机推荐
- <eq>标签
链接:http://document.thinkphp.cn/manual_3_2.html#taglib <eq name="menu.id" value="1& ...
- js正则匹配数字字母汉字
1,匹配所有字母数字汉字:^[A-Za-z0-9\u4e00-\u9fa5]+$2,清空某项:$('#id').empty()3,某项功能关闭,不再执行:$('#id').off()4,查看数据类型: ...
- HDU 3065 病毒侵袭持续中 (AC自动机)
题目链接 Problem Description 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的"万恶之源".这是一个庞大的病毒 ...
- Ubuntu 通过 Live CD 更新grub恢复引导Boot Menu
工作需要更换主板,但是不想重装电脑. 怎么办呢? 其实并不需要重装电脑,只需要回复boot menu即可. 1. 首先用u盘制作一个ubuntu的live CD(请自行百度),然后通过u盘启动, 选择 ...
- 2018ICPC青岛赛区J题
题目链接:http://acm.zju.edu.cn/onlinejudge/showRuns.do?contestId=1 这题真的坑,为什么要买0本书的时候,书架里面刚好有价格为0的时候输出&qu ...
- glut glew区别
GLEW是一个跨平台的C++扩展库,基于OpenGL图形接口.使用OpenGL的朋友都知道,window目前只支持OpenGL1.1的涵数,但 OpenGL现在都发展到2.0以上了,要使用这些Open ...
- JavaScript常用数组方法
JavaScript数组方法有以下这些: forEach() 方法对数组的每一个元素执行一次提供的函数. map() 方法创建一个新数组,其结果是该数组都执行一次函数,原函数保持不变. filter( ...
- 小白欢乐多——记ssctf的几道题目
小白欢乐多--记ssctf的几道题目 二哥说过来自乌云,回归乌云.Web400来源于此,应当回归于此,有不足的地方欢迎指出. 0x00 Web200 先不急着提web400,让我们先来看看web200 ...
- Python之 Lambda表达式
标签(空格分隔): Python进阶 Lambda是一种匿名函数,当我们需要重复调用某一函数,又不想写那么多代码时可以使用lambda表达式来代替. lambda的通用格式: lambda argum ...
- Spark RDD 窄依赖研究
1.. 简介 spark从RDD依赖上来说分为窄依赖和宽依赖. 其中可以这样区分是哪种依赖:当父RDD的一个partition被子RDD的多个partitions引用到的时候则说明是宽依赖,否则为窄依 ...