精华内容
下载资源
问答
  • Linux内建命令 - Shell脚本编程实践

    千次阅读 2020-06-14 23:10:19
    Linux内建命令1.如何确定内建命令:type2.执行程序:“.”(点号)3.别名:aliasalias4.删除别名:unalias5.任务前后台切换:bg、fg、jobs6.改变目录:cd7.声明变量:declare、typeset8.打印字符:echo9.跳出循环:...

    1.如何确定内建命令:type

    不要试图用脑子记住所有的命令,这不可能也不需要。判断一个命令是不是内建命令只需要借助于命令type即可,如下所示:

    # cd命令是内建命令
    [root@banana ~]# type cd
    cd is a shell builtin
    
    # ifconfig命令不是内建命令,而是一个外部文件
    [root@banana ~]# type ifconfig
    ifconfig is /usr/sbin/ifconfig
    

    2.执行程序:“.”(点号)

    点号用于执行某个脚本甚至脚本没有可执行权限也可以运行。有时候在测试运行某个脚本时可能并不想为此修改脚本权限,这时候就可以使用 “.” 来运行脚本。如果没有运行权限的话,用“./”执行就会有报错但是若在其前面使用点号来执行就不会报错,如下所示:

    # 新建HelloWorld.sh,并添加代码
    [root@banana ~]# vim HelloWorld.sh
    echo "HelloWorld"
    
    # 如果脚本没有可执行权限,则会报权限错误
    [root@banana ~]# ./HelloWorld.sh
    -bash: ./HelloWorld.sh: Permission denied
    
    # 使用点号执行没有加执行权限的脚本可以正常运行
    [root@banana ~]# . ./HelloWorld.sh
    HelloWorld!
    

    与点号类似,source命令也可读取并在当前环境中执行脚本,同时还可返回脚本中最后一个命令的返回状态;如果没有返回值则返回0,代表执行成功;如果未找到指定的脚本则返回false

    [root@banana ~]# source HelloWorld.sh 
    HelloWorld!
    

    3.别名:alias

    可用于创建命令的别名,若直接输入该命令且不带任何参数,则列出当前用户使用了别名的命令。现在你应该能理解类似ll这样的命令为什么与ls-l的效果是一样的吧。

    [root@banana ~]# alias
    alias cp='cp -i'
    alias egrep='egrep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias grep='grep --color=auto'
    alias l.='ls -d .* --color=auto'
    alias ll='ls -l --color=auto'
    alias ls='ls --color=auto'
    alias mv='mv -i'
    alias rm='rm -i'
    alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
    

    使用alias可以自定义别名,比如说一般的关机命令是shutdown-h now,写起来比较长,这时可以重新定义一个关机命令,以后就方便多了。使用**alias定义的别名命令也是支持Tab键补全**的,如下所示:

    [root@banana ~]# alias myShutdown='shutdown -h now'
    

    注意,这样定义alias只能在当前Shell环境中有效,换句话说,重新登录后这个别名就消失了。为了确保永远生效,可以将该条目写到用户家目录中的.bashrc文件中,如下所示:

    [root@banana ~]# cat .bashrc 
    # .bashrc
    
    # User specific aliases and functions
    
    alias rm='rm -i'
    alias cp='cp -i'
    alias mv='mv -i'
    
    # 自定义关机命令的别名
    myShutdown='shutdown -h now'
    
    # Source global definitions
    if [ -f /etc/bashrc ]; then
            . /etc/bashrc
    fi
    

    4.删除别名:unalias

    该命令用于删除当前Shell环境中的别名。有两种使用方法:

    • 第一种用法:unalias 命令
    • 第二种用法:unalias -a 命令,删除当前Shell环境中所有的别名

    同样,这两种方法都是在当前Shell环境中生效的。

    # 删除ll别名
    [root@banana ~]# unalias ll
    
    # 删除成功,发现.bashrc的ll别名被删除了。
    [root@banana ~]# ll
    -bash: ll: command not found
    
    # 恢复ll
    [root@banana ~]# alias ll='ls -l --color=auto'
    

    5.任务前后台切换:bg、fg、jobs

    该命令用于将任务放置后台运行,一般会与Ctrl+z、fg、&符号联合使用。典型的使用场景是运行比较耗时的任务。比如打包某个占用较大空间的目录,若在前台执行,在任务完成前将会一直占用当前的终端,而导致无法执行其他任务,此时就应该将这类任务放置后台。

    # 运行打包任务,并使用Ctrl+z组合键暂停前台任务
    [root@banana ~]# tar -zcvf Python3.7.5-2.tgz Python-3.7.5
    ^Z
    [1]+  Stopped                 tar -zcf Python3.7.5-2.tgz Python-3.7.5
    
    # 查看任务状态
    [root@banana ~]# jobs
    [1]+  Stopped                 tar -zcf Python-3.7.5-2.tgz Python-3.7.5
    
    # 继续运行后台任务tar,运行完之后Ctrl+c退出bg
    [root@banana ~]# bg 1
    ^C
    [1]+  Done                    tar -zcf Python-3.7.5-2.tgz Python-3.7.5
    
    # 使用fg把后台任务调至前台运行
    [root@banana ~]# fg 1
    
    # 如果预知某个任务耗时很久,可以一开始就将命令放入后台运行
    
    [root@banana ~]# tar -zcf Python-3.7.5-2.tgz Python-3.7.5 &
    [1] 2215
    

    注意:如果tar命令加了-v参数产生输出,即使后台运行输出也会在打印到前台。此时我们可以使用 > 重定向输出到output文件

    [root@banana ~]# tar -vzcf Python-3.7.5-2.tgz Python-3.7.5 > output &
    [2] 2223
    

    延伸: 一般我们希望断开远程连接时,任务在后台继续执行,比如Web服务之类的任务。此时我们可以使用nohup 命令 &注意,nohup不是内建命令。

    [root@banana ~]# nohup tar -zcf Python-3.7.5-2.tgz Python-3.7.5 &
    

    6.改变目录:cd

    改变当前工作目录。如果不加参数,默认会进入当前用户的家目录。

    7.声明变量:declare、typeset

    这两个命令都是用来声明变量的,作用完全相同。很多语法严谨的语言(比如C语言)对变量的声明都是有严格要求的:变量的使用原则是必须在使用前声明、声明时必须说明变量类型,而Shell脚本中对变量声明的要求并不高,因为Shell弱化了变量的类概念,所以Shell又被称为弱类型编程语言,声明变量时并不需要指明类型。不过,若使用declare命令,可以用-i参数声明整型变量,如下所示:

    # 声明整型变量
    [root@banana ~]# i_num01=1
    # 声明浮点型变量
    [root@banana ~]# f_num01=3.14
    # 声明字符串变量
    [root@banana ~]# str01="HelloWorld"
    # 使用declare声明整型变量
    [root@banana ~]# declare -i i_num02=1
    

    使用-r声明变量为只读,如下所示:

    # -r声明只读变量
    [root@banana ~]# declare -r read_only=100
    # 试图修改变量值,报错
    [root@banana ~]# read_only=200
    -bash: read_only: readonly variable
    

    使用-a声明数组变量,如下所示:

    [root@banana ~]# declare -a arr='([0]="a" [1]="b" [2]="c")'
    [root@banana ~]# echo ${arr[0]}
    a
    [root@banana ~]# echo ${arr[1]}
    b
    [root@banana ~]# echo ${arr[2]}
    c
    

    使用-F、-f显示脚本中定义的函数和函数体,如下所示:

    # 创建脚本fun.sh,内容如下
    [root@banana ~]# cat fun.sh 
    #!/bin/bash
    func_1()
    {
    	echo "Function 1"
    }
    func_2()
    {
    	echo "Function 2"
    }
    echo "declare -F:"
    declare -F
    
    echo "declare -f:"
    declare -f
    
    # 运行该脚本输出效果如下
    [root@banana ~]# bash fun.sh 
    declare -F:
    declare -f func_1
    declare -f func_2
    declare -f:
    func_1 () 
    { 
        echo "Function 1"
    }
    func_2 () 
    { 
        echo "Function 2"
    }
    

    8.打印字符:echo

    echo用于打印字符,典型用法是使用echo命令并跟上使用双引号括起的内容(即需要打印的内容),该命令会打印出引号中的内容,并在最后默认加上换行符。使用-n参数可以不打印换行符

    # 自动换行
    [root@banana ~]# echo "HelloWorld"
    HelloWorld
    
    # -n参数取消换行
    [root@banana ~]# echo -n "HelloWorld"
    HelloWorld[root@banana ~]# 
    

    默认情况下,echo命令会隐藏-e参数(禁止解释打印反斜杠转义的字符)。比如“\n”代表新的一行,如果尝试使用echo输出新的一行,在不加参数的情况下只会将“\n”当作普通的字符若要打印转义字符,则需要通过使用-e参数来允许

    # echo默认禁止打印反斜杠转义的字符
    [root@banana ~]# echo "\n"
    \n		# "\n"被当做普通的字符
    
    # 若要打印转义字符,则需要通过使用-e参数来允许
    # 输出有两行,第一行是输出的新行,第二行的默认的换行符
    [root@banana ~]# echo -e "\n"
    
    
    [root@banana ~]# 
    

    9.跳出循环:break

    从一个循环(for、while、until或者select)中退出。break后可以跟一个数字n,代表跳出n层循环,n必须大于1,如果n比当前循环层数还要大,则跳出所有循环。 下面的脚本演示了使用break和break 2的区别(运行前请将对应的注释符去掉)。

    
    [root@banana ~]# cat break_01.sh 
    #!/bin/bash
    for I in A B C D
    do
    	# echo输出I
    	echo -n "$I:"
    	# J in range(10)
    	for J in `seq 10`
    		do
    			# 如果 J == 5,退出一层循环
    			if [ $J -eq 5 ]; then
    				break
    				# break 2
    			fi
    			# echo输出J
    			echo -n " $J"
    		done
    	# echo默认会输出"\n"
    	echo
    done
    echo
    
    # 当J值为5时,break的输出结果(外层运行了4次)
    [root@banana ~]# bash break_01.sh 
    A: 1 2 3 4
    B: 1 2 3 4
    C: 1 2 3 4
    D: 1 2 3 4
    
    # 当J值为5时,break 2的输出结果(外层仅运行了1次)
    [root@banana ~]# bash break_01.sh 
    A: 1 2 3 4
    

    10.循环控制:continue

    停止当前循环,并执行外层循环(for、while、until或者select)的下一次循环。continue后可以跟上一个数字n,代表跳至外部第n层循环。n必须大于1,如果n比当前循环层数还要大,将跳至最外层的循环。 下面的脚本演示了使用continue和continue 2的区别(运行前请将对应的注释符去掉)。

    # 创建演示脚本continue
    [root@banana ~]# cat continue_01.sh 
    #!/bin/bash
    # [A,B,C,D]
    for I in A B C D
    do
    	# echo输出I
    	echo -n "$I:"
    	# J从1,10
    	for J in {1..10}
    		do
    			# 如果J == 5,退出循环
    			if [ $J -eq 5 ]; then
    				continue
    				# continue 2
    			fi
    			# echo输出J
    			echo -n " $J"
    		done
    	# echo换行
    	echo
    done
    # echo换行
    echo
    
    # 判断J值为5时,continue的输出结果
    [root@banana ~]# bash continue_01.sh 
    A: 1 2 3 4 6 7 8 9 10
    B: 1 2 3 4 6 7 8 9 10
    C: 1 2 3 4 6 7 8 9 10
    D: 1 2 3 4 6 7 8 9 10
    
    # 判断J值为5时,continue 2的输出结果
    [root@banana ~]# bash continue_01.sh 
    A: 1 2 3 4B: 1 2 3 4C: 1 2 3 4D: 1 2 3 4
    

    11.将所跟的参数作为Shell的输入,并执行产生的命令:eval

    # eval用法例一:将字符串解析成命令执行
    # 定义cmd为一个字符串,该字符串为"ls -l /etc/passwd"
    [root@banana ~]# cmd="ls -l /etc/passwd"
    
    # 使用eval,会将之前的字符串解析为命令并执行
    [root@banana ~]# eval $cmd
    -rw-r--r-- 1 root root 1171 Jun 10 22:11 /etc/passwd
    
    
    # eval用法例二:程序运行中根据某个变量确定实际的变量名
    [root@banana ~]# name1=john		# 定义变量name1
    [root@banana ~]# name2=wang		# 定义变量name2
    [root@banana ~]# num=1			# 使用该变量确定真实的变量名name$num
    [root@banana ~]# eval echo "$"name$num
    john	
    
    
    # eval用法例三:将某个变量的值当做另一个变量名并给其赋值
    [root@banana ~]# name1=john
    [root@banana ~]# name2=wang
    [root@banana ~]# eval $name1="$name2"
    [root@banana ~]# echo $john
    wang
    

    12.执行命令来取代当前的Shell:exec

    内建命令exec并不启动新的Shell,而是用要被执行的命令替换当前的Shell进程,并且将老进程的环境清理掉,而且exec命令后的其他命令将不再执行。 假设在一个Shell里面执行了exec echo '‘Hello’'命令,在正常地输出一个“Hello”后Shell会退出,因为这个Shell进程已被替换为仅仅执行echo命令的一个进程,执行结束自然也就退出了。如图11-5所示,命令执行完成后,连接状态是一个红色的断开符。
    在这里插入图片描述
    想要避免出现这种情况,一般将exec命令放到一个Shell脚本里面,由主脚本调用这个脚本,主脚本在调用子脚本执行时,当执行到exec后,该子脚本进程就被替换成相应的exec的命令。注意source命令或者点号,不会为脚本新建Shell,而只是将脚本包含的命令在当前Shell执行。exec典型的用法是与find联合使用,用find找出符合匹配的文件,然后交给exec处理,如下所示:

    # 列出系统中所有以.conf结尾的文件
    [root@banana ~]# find / -name "*.conf" -exec ls -l {} \;
    # 删除系统中所有的.tmp临时文件
    [root@banana ~]# find / -name "*.tmp" -exec rm -f {} \;
    
    展开全文
  • Linux内建命令和外部命令(整理)

    千次阅读 2014-04-21 11:35:19
    Linux命令有内部命令(内建命令)和外部命令之分,内部命令和外部命令功能基本相同,但也有些细微差别。 内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序...

    Linux命令有内部命令(内建命令)和外部命令之分,内部命令和外部命令功能基本相同,但也有些细微差别。

    【内部命令 vs. 外部命令】

    (1)内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留在系统内存中。内部命令是写在bashy源码里面的,其执行速度比外部命令快,因为解析内部命令shell不需要创建子进程。比如:exit,history,cd,echo等。常见的内部命令详细见:bash内部命令 - koko7958的专栏 - 博客频道 - CSDN.NET

    (2)外部命令是linux系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调用内存。通常外部命令的实体并不包含在shell中,但是其命令执行过程是由shell程序控制的。shell程序管理外部命令执行的路径查找、加载存放,并控制命令的执行。外部命令是在bash之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin......等等。可通过“echo $PATH”命令查看外部命令的存储路径,比如:ls、vi等。

    (3)type命令可以分辨内部命令与外部命令

    type: type [-afptP] name [name ...]
        Display information about command type.
        
        For each NAME, indicate how it would be interpreted if used as a
        command name.
        
        Options:
          -a        display all locations containing an executable named NAME;
            includes aliases, builtins, and functions, if and only if
            the `-p' option is not also used
          -f        suppress shell function lookup
          -P        force a PATH search for each NAME, even if it is an alias,
            builtin, or function, and returns the name of the disk file
            that would be executed
          -p        returns either the name of the disk file that would be executed,
            or nothing if `type -t NAME' would not return `file'.
          -t        output a single word which is one of `alias', `keyword',
            `function', `builtin', `file' or `', if NAME is an alias, shell
            reserved word, shell function, shell builtin, disk file, or not
            found, respectively
        
        Arguments:
          NAME      Command name to be interpreted.
        
        Exit Status:
        Returns success if all of the NAMEs are found; fails if any are not found.
    常用的三个参数:-t对应-type,-a对应-all,-p对应-path,使用: type [-a | -t | -p] name 或  type [-all | -type | -path] name。

    (1)没有参数的状况下,它会显示出shell如何解译name做为命令。

    (2)如果有"-type",它将会显示alias、 keyword、function、builtin或file。

             file:表示为外部指令;
             alias:表示该指令为命令别名所设定的名称;
             builtin:表示该指令为 bash 内建的指令功能。

    (3)如果有"-path"的参数,它将会显示该命令的完整档名(外部指令)或显示为内建指令,找不到的话,不显示任何东西。

    (4)如果有"-all"的参数,会将由PATH变量定义的路径中所有含有name指令的路径都列出来,即显示所有可执行name的可能路径。

    例如1:

    holybin@localhost:~$ type cd
    cd is a shell builtin #这里可以看出cd是一个内部命令

    例如2:

    holybin@localhost:~$ type ls
    ls is aliased to `ls --color=auto' # 没有加上任何参数,仅列出 ls 这个指令的最主要使用情况

    holybin@localhost:~$ type -t ls
    alias # -t 参数则仅列出 ls 这个指令的最主要使用情况说明

    例如3:

    holybin@localhost:~$ type -a ls
    ls is aliased to `ls --color=auto'
    ls is /bin/ls # 列出所有信息:这里可以看出ls是一个外部命令。

    【命令与系统调用】

    通常情况下,脚本中的Bash内建命令在运行的时候是不会fork出一个子进程的。但是脚本中的外部或者过滤命令通常会fork出一个子进程。 一个内建命令通常会与一个系统命令同名,但是Bash在内部重新实现了这些命令。比如,Bash的echo命令与/bin/echo就不尽相同,虽然它们的行为在绝大多数情况下都是一样的。

    例如ls命令,如果是内建命令的话应该会引起fork()和exec()这两个系统调用,具体的步骤可以参考:ls命令是怎样实现的,getdents64,linux-2.6.27.5 - 小默 - C++博客,大致的思路就应该是去读取当前文件夹的目录项来获得该目录下的所有文件名。

    其他的命令没有研究过,望研究过的人提示一下。

    【命令与环境变量】

    以pwd命令为例子说明:

    (1)pwd命令用于显示当前工作目录,也可以使用pwd命令来判断目录在文件系统内的位置。pwd指令主要跟三个环境变量:PATH、OLDPWD、PWD有关。

    PATH—执行文件的路径。使用"echo $PATH"显示PATH的内容(PATH前面加$表示后面接的是变量),下同;OLDPWD—前一次的工作目录;PWD—当前的工作目录。

    (2)当我们在shell中输入“man pwd”时可以看到pwd的帮助文档。但是输入“pwd --help”却是如下错误提示:

    holybin@localhost:~$ pwd --help
    -bash: pwd: --: invalid option
    pwd: usage: pwd [-LP]

    但是输入“ /bin/pwd --help”就能正常显示pwd的帮助文档:

    holybin@localhost:~$ /bin/pwd --help
    Usage: /bin/pwd [OPTION]...
    Print the full filename of the current working directory.
    
      -L, --logical   use PWD from environment, even if it contains symlinks
      -P, --physical  avoid all symlinks
          --help     display this help and exit
          --version  output version information and exit
    
    
    NOTE: your shell may have its own version of pwd, which usually supersedes
    the version described here.  Please refer to your shell's documentation
    for details about the options it supports.
    
    
    Report pwd bugs to bug-coreutils@gnu.org
    GNU coreutils home page: <http://www.gnu.org/software/coreutils/>
    General help using GNU software: <http://www.gnu.org/gethelp/>
    For complete documentation, run: info coreutils 'pwd invocation'

    这主要是由于内部命令和外部命令的区别,pwd是内部命令,而/bin/pwd就是外部命令。显示当前目录时,/bin/pwd能更加准确地显示当前工作目录的完整文件路径,比如在多人共享同一台Linux机器时,经常会发现当前目录被别人删除后,pwd命令仍然会显示那个目录,而/bin/pwd则不会。

    (3)进一步地,在root权限下将/bin目录下的ls命令的执行文件移动到别目录中去,例如:mv /bin/ls /root,会发现无论在哪里都无法顺利执行ls命令。原因在于新的目录“/root”并不在PATH指定的路径中,而外部命令必须通过PATH指定的路径来找到命令对应的执行文件。可以使用PATH="$PATH":/root将新的目录“/root”加入PATH环境变量。

    (4)shell命令解释器在执行命令时,先尝试按照内部命令来执行,如果要执行的命令不是内部命令,则按照外部命令去查找对应的执行文件所在的目录,并执行。当要执行的命令不是内部命令时(例如ls),如果有两个ls指令分别在不同的目录中(例如/usr/local/bin/ls和/bin/ls),shell命令解释器就根据PATH里面哪个目录先被查询到,则那个目录下的命令就先被执行。


    参考:区分Linux内建命令和外部命令linux的内建命令和外部命令


    展开全文
  • Linux中,我们通过shell命令与内核进行对话。GNU bash shell为我们经常用的shell。Centos Ubuntu6.10以后版本 RHLE...非内建命令(外部命令) 非内建命令时存在于bash shell之外的程序,他们并不是shell中的是一...

      在Linux中,我们通过shell命令与内核进行对话。GNU bash shell为我们经常用的shell。Centos Ubuntu6.10以后版本 RHLE等常用linux发行版默认shell基本都为bash shell。在bash shell中区分内建命令和非内建命令(又称外部命令)。

    非内建命令(外部命令)

      非内建命令时存在于bash shell之外的程序,他们并不是shell中的是一部分,如果想了解非内建命令具体有哪些,可查看/bin,/usr/bin,/sbin,/user/sbin。如果你想查看你使用的命令是否为外部命令,可使用which命令或type命令进行查看。常见的ps命令就是一个非内建命令

    type命令很清晰的告诉你ps命令的类型并且告诉你所在目录。当非内建命令被执行时,会创建出一个子进程。这种操作被称为衍生。ps命令可以很方便的显示它的父进程以及自己所对应的衍生进程

    从PID和PPID可以清楚的看出进程间的关系。当进程进行衍生操作时。会设置新的子进程运行环境,消耗更多的资源。

    内建命令

       内建命令是bash shell中的一部分工具,不需要外部程序就可执行,当然也不用创建子进程。效率更高,执行速度更快。cd命令就是一个内建命令

    使用type查看可以清楚的告诉你它是shell内建的。

     需要注意的是,有的命令可以多种实现,要查看命令的不同实现可以使用type命令的-a参数。pwd就是既有内建也有非内建,如要使用外部命令,直接指明对应文件即可



    展开全文
  • Linux shell 内建命令和外部命令

    千次阅读 2019-11-11 19:22:24
    在此之前,搞明白shell的内建命令和外部命令非常重要。下面将简要描述什么是内建命令和外部命令? 内建命令 内建命令不需要子进程来执行,它已经和shell编译为一体。作为shell工具的组成部分存在。内建命令不需要...

    前言

    在shell中可执行的命令分为内键命令和外部命令。在此之前,搞明白shell的内建命令和外部命令非常重要。下面将简要描述什么是内建命令和外部命令?

    内建命令

    内建命令不需要子进程来执行,它已经和shell编译为一体。作为shell工具的组成部分存在。不需要借助外部程序文件来运行。而常见shell内建命令有如下命令:

    bind将键盘序列绑定到一个 readline 函数或宏
    cd将当前目录切换为指定的目录
    dirs显示当前存储目录的列表
    echo将指定字符串输出到 STDOUT
    exec用指定命令替换 shell 进程
    export设置子 shell 进程可用的变量
    fc从历史记录中选择命令列表
    fg将作业以前台模式运行
    getopts分析指定的位置参数
    help显示帮助文件
    history显示命令历史记录
    jobs列出活动作业
    kill向指定的进程 ID(PID) 发送一个系统信号
    pwd显示当前工作目录的路径名
    set设置并显示环境变量的值和 shell 属性
    test基于指定条件返回退出状态码 0 或 1
    times显示累计的用户和系统时间
    type显示指定的单词如果作为命令将会如何被解释
    umask为新建的文件和目录设置默认权限
    unset刪除指定的环境变量或 shell 属性
    wait等待指定的进程完成,并返回退出状态码

    可以利用type命令来了解某个命令是否是内建的。

    type echo
    

    在这里插入图片描述

    type cd
    

    在这里插入图片描述

    type ps
    

    在这里插入图片描述

    由此可见,如果是内建命令,会显示 shell 内嵌。则echo、cd 是一个 Shell 内建命令。而ps命令则显示 是位于/usr/bin/中,并不是shell的一部分。

    内建命令的执行速度要更快,效率也更高。

    说到这里要提请一下。有些命令有多种实现。常见的为echo、pwd这两个命令既是内建命令也是外部命令。如果只用type命令不带选项,则只会显示shell 内嵌。上面的例子也测试过 type echo。只会显示shell 内嵌。要查看命令的不同实现,必须使用type -a选项。

    type -a echo 
    

    在这里插入图片描述

    使用history命令

    一个有用的内建命令history命令。bash shell会跟踪你用过的命令,这在开发过程中很重要。可以换回这些命令并重新使用。

    用法:
    要查看最近的用过的命令,可以输入不带选项的history使用。

    histroy
    在这里插入图片描述
    在上面的截图中,因历史记录较多,只截屏了一小段信息。还用一种方法就是在终端输入 !! ,然后按回车键就能够换回刚刚用过的那条命令来使用。

    外部命令
    外部命令有时候被称为文件系统命令,是存在于bash shell之外的程序。它们并不是shell程序的一部分。外部命令通常位于 /bin、/usr/bin、/sbin、/usr/sbin中。

    可以使用which和type命令来找到。假设要找ps命令。

    which ps
    

    在这里插入图片描述

    当然也可以使用type 命令来找:

    在这里插入图片描述

    这里要注意一下:which 命令只显示外部命令的文件。

    外部命令的执行时,会创建一个子进程。这个操作被称为衍生。在执行速度相比内建命令来说,相对要慢些。这也因为外部命令程序通常位于/bin、/usr/bin、/sbin、/usr/sbin查找命令上需要时间。

    外部命令 ps执行会创建子进程。

    ps -f
    

    在这里插入图片描述
    ps命令执行时,创建子进程。从截图信息来看,ps的PID是4231,父PID为3437。而bash shell 父进程PID为3437。当进程必须执行衍生操作时,它需要花费时间和精力来设置新的子进程的环境。

    总结

    外部命令会创建出一个包含全新环境的子进程,而内建命令不会。相比之下,外部命令的使用成本更高。内建命令因为不需要创建新的环境,所以更高效,不会受到环境变化的影响。

    在这里插入图片描述

    扫二维码关注微信公众号,获取技术干货

    展开全文
  • 内建命令执行的时候会直接用当前shell的资源,而不会另fork子进程。 常见的内建命令有: 1.read:从stdin中读取数据。 2.cd :进入某个文件。 3.PWD:显示当前路径。 4.let:命令执行算数操作。 5....
  •  Linux命令有内部命令(内建命令)和外部命令之分,内部命令和外部命令功能基本相同,但是其工作机制相差很大。本文内建命令和外部命令做一下介绍。  一、内部命令(内建命令)  内部命令,实际上是shell程序...
  • jobs命令用于显示Linux中的任务列表及任务状态,包括后台运行的任务。该命令可以显示任务号及其对应的进程号。其中,任务号是以普通用户的角度进行的,而进程号则是从系统管理员的角度来看的。一个任务可以对应于一...
  • Linux内建命令(built-in)与外部命令

    千次阅读 2017-05-18 11:39:24
    Linux命令有内部命令(内建命令)和外部命令之分,内部命令和外部命令功能基本相同,但也有些细微差别。 内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并...
  • Linux-shell内建命令

    千次阅读 2020-06-24 14:33:54
    参考
  • 下面为大家讲解Linux最常用的基本命令linux cd命令。 说linux cd命令linux最常用的命令一点也不为过,我们几乎时时刻刻都需要使用这个命令。 代码: linux cd命令介绍 1.名称:cd  2....
  • 区分Linux内建命令和外部命令——pwd

    万次阅读 2013-09-01 21:25:05
    Linux命令有内部命令(内建命令)和外部命令之分,内部命令和外部命令功能基本相同,但也有些细微差别。 内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并...
  • linux下的内置命令

    千次阅读 2016-04-13 15:54:51
    谈到linux下的内置命令,说实话,在学习shell脚本之前本没有听说过,更不知道它和linux下一般的命令有何不同!解释内置命令之前,先来看一个例子: 建立一个shell脚本,内容如下:#! /bin/bash ls cd .. 在这个...
  • 理解Linux内置命令与外部命令

    千次阅读 2018-12-02 13:34:46
    Linux命令可以分为内部命令和外部命令: 内置命令在系统启动时就调入内存,是常驻内存的,所以执行效率高。 而外部命令是系统的软件功能,用户需要时才从硬盘中读入内存 1、先说说外部命令...
  • Linux shell 内部命令和外部命令

    千次阅读 2019-12-17 10:49:46
    Linux中的命令大致分为两类:内部命令和外部命令,内部命令也称shell内建命令或者内嵌命令,外部命令存放在一个文件中,需要时候在文件中查找,这些文件定义在$PATH中。 首先linux所有的都是文件,我们在操作系统加载...
  • suspend为shell内建指令,可暂停目前正在执行的shell。若要恢复,则必须使用SIGCONT信息。 语法suspend [-f] 参数说明: -f 若目前执行的shell为登入的shell,则suspend预设无法暂停此shell。若要强迫暂停登入的...
  • linux下Oracle常用命令

    2018-10-09 20:39:30
    linux下Oracle常用命令,如启动数据库、启动监听、用户、建表空间等
  • linux mkdir命令详解

    2020-09-15 07:25:09
    Mkdir 是一个用来在 Linux 系统下创建目录的命令。此命令属于内建命令。接下来通过本文给大家分享linux mkdir命令详解,感兴趣的朋友一起看看吧
  • Linux Shell 内建命令 : sh命令详解

    万次阅读 2018-06-15 17:27:30
    Bourne Again Shell (即bash)是自由软件基金会(GNU)开发的一个Shell,它是Linux系统中一个默认的Shell。Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。语法bash [options] [file]选项...
  • Linux命令行与命令

    2021-01-09 13:51:53
    Linux命令是很重要的工具,也往往是初学者大的瓶颈...shell命令可以分为如下几类 1)可执行文件(executable file) 2)shell内建函数(built-in function) ) 别名(alias)。可执行文件为经过编译的程序文件,我们输入这
  • linux内建命令和外部命令

    千次阅读 2014-04-20 23:24:12
    今天室友去笔腾讯,回来问了我一道题,linux的ls命令执行了哪些系统调用,我第一反应是ls是内建命令吗?假如是的话应该会调用fork()和exec(),对于这块有点模糊,特地总结了下。 Linux命令有内部命令(内建命令)...
  • linux 新建文件夹命令

    万次阅读 2018-03-27 11:41:18
    #单个文件夹创建mkdir 文件夹名称#例如:mkdir wenjianjia#多个文件夹创建mkdirs 文件夹1/文件夹2......#例如:mkdirs wenjianjia1/wenjianjia2
  • Linux Shell 内建命令 : builtin 命令详解

    千次阅读 2018-09-21 10:20:19
    builtin命令在使用时,将不能够再使用Linux中的外部命令。当系统中定义了与shell内部命令相同的函数时,使用builtin显式地执行shell内部命令,从而忽略定义的shell函数。 语法 builtin shell-builtin [arguments]...
  • linux创建用户命令

    千次阅读 2021-05-09 08:25:51
    useradd testuser 创建用户testuserpasswd testuser 给已创建的用户testuser设置密码说明:新创建的用户会在/home下创建一个用户目录testuserusermod --help 修改用户这个命令的相关参数userdel testuser 删除用户...
  • enable命令可以用于启动或关闭 shell 的内建指令。 如要执行的文件名称与shell内建指令相同,可用enable -n来关闭shell内建指令。若不加-n参数,enable可重新启动关闭的指令。 注意: linux shell命令执行时,shell....
  • Linux终端自定义命令(超实用技巧)

    千次阅读 2020-08-18 21:27:30
    技巧描述为:linux终端的任何命令都可以替换成其他的字符串来代替。 具体怎么玩呢?逐步往下看,惊喜会越来越多。 比如,我觉得查看GPU运行状态的nvidia-smi太长,每次输入都很麻烦,我想改成"mygpu"。 操作如下...
  • 摘要Linux which命令 通常用于查找文件。本文就为大家介绍下 Linux which 命令 的用法与示例。Linux which命令 通常用于查找文件。本文就为大家介绍下 Linux which 命令 的用法与示例。更多Linux命令详情请看:Linux...
  • 34.笔记go语言——内建函数

    万次阅读 2017-10-06 20:23:25
    34.笔记go语言——内建函数 预定义了少数函数,这意味着无需引用任何包就可以使用它们。 close new paniccomplex delete make recover real len append print imag cap copy println close 用于channel通讯。使用...
  • unset为shell内建指令,可删除变量或函数。 语法 unset [-fv][变量或函数名称] 参数: -f 仅删除函数。 -v 仅删除变量。 实例 删除环境变量 [root@runoob.com ~]# lx=ls -lh //设定环境变量 [root@runoob.com ~]# ...
  • linux创建用户组命令

    千次阅读 2021-05-09 04:05:48
    Linux 系统是下可以通过命令创建用户,当然也可以创建用户组,下面由学习啦小编为大家整理了linux创建用户组命令的相关知识,希望对大家有帮助!linux下创建用户组命令——groupadd命令其格式如下:代码:groupadd ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 129,140
精华内容 51,656
关键字:

linux内建命令

linux 订阅
友情链接: 柔度差.rar