命令的执行、PATH变量、别名命令

which(查看工具):查找某个(外部)命令(执行文件)的绝对路径(在环境变量$PATH设置的目录中查找)

which -a:将所有由PATH目录中可以找到的命令均列出

   

type(类型):判断给出的命令是内置命令还是外部命令。格式:type [参数] [name]

type -t:"file":外部命令;"alias":别名命令;"builtin":内置命令

type -a:由PATH变量定义的路径中,按顺序列出所有包含name的命令,包含alias

   

命令执行的步骤(可通过type -a命令来查询):

  • 以绝对/相对路径执行命令,例如"/bin/ls"或"./ls"(跳过以下步骤,在目录中查询执行命令);

    (内置命令无法通过路径来执行,如echo;但在RHEL7系统中部分内置命令存在路径(可通过路径执行),如pwd(pwd既是内部命令也是外部命令))

  • 由alias别名找到该命令来执行,再交由步骤③处理判断内置、外部命令;

    (直接输入命令名称时,如直接输入ls,实际执行ls --color=auto命令)

  • 由bash内置的(builtin)命令(内部命令写在bash源码中)来执行,而绝大部分都是外部命令(交由步骤④处理);
  • 通过$PATH变量的顺序(每个路径值之间用冒号:间隔)找到的第一个命令来执行(对PATH变量的修改将会直接影响到bash解释器搜索linux命令的位置)

   

  • 外部命令(文件系统命令):存在于bash shell之外的程序,并不是shell程序的一部分。外部命令程序通常位于/bin、/usr/bin、/sbin或/usr/sbin中。

       

    如ps是一个外部命令(通过type命令查看)

    执行外部命令ps,系统会创建出一个子进程,PID为25204(这种操作被称为衍生)。通过ps -f命令显示出父进程(PPID为23796,对应bash shell)以及自己所对应的衍生子进程。

    (进程间通过发送信号(signaling)来通信)

  • 内置命令:和shell编译成一体,作为shell工具的组成部分存在,不需要借助外部程序文件(子进程)来执行。

       

    如cd和exit命令都内置于bash shell中

   

   

PATH变量(一个环境变量)是由多个目录所组成的,每个目录中间用冒号:隔开,每个目录是有"顺序之分"的。

  • 当我们执行一个(外部)命令,如ls命令的时候,系统会依照PATH的设置去每个PATH定义的目录下查询文件名为ls的可执行文件;
  • 若在PATH定义的目录中含有多个文件名为ls的可执行文件,那么会先查询到的同名命令先被执行;
  • 正是因为有了PATH这个变量,所以我们运行某个命令时不再去输入全局路径,直接输入命令名即可。

不同身份用户默认的$PATH不同,所以默认能够让用户随意执行的命令也不同(若某些特殊命令无法执行(command not found),可以通过修改/增加PATH路径或使用绝对路径来执行(添加路径:PATH=${PATH}:目录;删除路径:对PATH变量重新赋值))

对PATH变量的修改

不同用户的默认PATH变量不同

   

例题:

  • 将ls命令文件由/bin/ls移动到/root/ls(通过"mv /bin/ls /root"命令实现),

    /root(~)目录下直接输入ls执行命令,会提示查询不到ls这个命令。

    可使用绝对路径/root/ls或相对路径./ls(当前目录是在/root目录下)来执行ls命令,

    或将/root加入PATH变量中,可使root用户在任何位置均可直接执行/root目录下ls命令(注意:执行的是"别名命令"ls --color=auto)(最后请把ls放回/bin目录下)。

       

  • 通过不同方式执行"ls"命令

   

不要在$PATHPATH查询的目录)中加入当前目录(.)(PATH="$PATH":.

  • 如果在&PATH中加入当前目录(.)后,可以在一些情况下让用户免去输入命令所在路径的麻烦(能够在命令所在目录进行命令的执行);
  • 但由于工作目录并非固定(经常会使用cd命令来切换不同的目录),因此能够执行的命令会有所变动(因为每个目录下的可执行文件都不相同),这对用户来说并非好事;
  • 另外,如果黑客在比较常用的公共目录,如/tmp目录(每个用户均具有w写入权限)中存放了一个名为"ls""cd"的同名木马文件,那么用户就极有可能错误的执行了。

   

alias(别名):设置命令的别名。格式:alias 命令别名=具体命令

查看目前存在的命令别名:alias

alias lm='ls -l | more'

   

unalias(取消别名):取消命令的别名。格式:unalias 命令别名

   

命令别名与变量的比较:

  • 命令别名是相当于新创一个命令,可以直接执行该命令;
  • 变量需要通过类似"echo"命令才可调用变量的内容。
  • 命令别名、自定义的变量在注销bash后都会失效

   

   

posted @ 2018-03-26 16:42  DayoYan  阅读(375)  评论(0编辑  收藏  举报