如何分辨一个shell命令是程序还是函数?


8

我想知道我们在shell中调用的命令函数还是程序


1
您在“小程序”和“功能”之间有什么区别?
JdeBP

您可以在Shell程序中输入命令,以便对Shell进行编程以使其起作用,并利用Shell编程所使用的函数来执行命令,以从Shell函数中命令其他程序。
txtechhelp

Answers:


15

这取决于。

命令可以分为多个类别:内置函数,别名,函数,可执行文件(搜索路径中的脚本和二进制文件)。

在命令行上,它们占据一个单一的平面命名空间,这使得覆盖成为可能。有多种方法可以区分各种程序:

$ f () { :; }
$ alias a=cat
$ which f
f ()
{ 
    :
}

我们知道这f是一个功能。

$ which a
alias a='cat'
        /usr/bin/cat

我们知道这a是一个别名。

$ which yes
/usr/bin/yes

我们知道这yes是一个程序。

$ builtin echo ; echo $?

0

外壳具有echo内置的...

$ builtin cat ; echo $?
bash: builtin: cat: not a shell builtin
1

……但没有cat。如果存在内置函数或别名,但您坚持要调用该程序,请在命令前加上反斜杠:

$ builtin true | printf "%d\n" $?
0
$ alias true=false
$ true ; printf "%d\n" $?
1
$ \true ; printf "%d\n" $?
0

3
同样,在* nix的一种实现中作为程序的命令很可能在另一种情况下成为内置的shell(=函数)。
jamesqf

1
@jamesqf,是的,shell内置了标准工具,但是内置命令与功能不同。运行例如sh -c 'type true; f() { echo x; }; type f'
ilkkachu

5
请注意,一般而言,对于几乎所有目的,它type都是可取的which。参见unix.stackexchange.com/q/85249/135943
通配符

@ilkkachu:这取决于您对“相同”的定义。当然,它们的实现方式不同,但是对于普通用户键入命令而言,它们在功能上是相同的。
jamesqf

1
@jamesqf,即使普通用户不(不知道如何使用)函数,声称它们与内建函数相同也只是令人困惑。
ilkkachu

4

a的定义function返回单个值,并且不输出任何内容。特别是Shell函数可能非常好,并且可能会产生输出或其他副作用,因为函数的返回值非常有限。

A command是由用户给出的指令,告诉计算机执行某项操作,例如执行单个程序或一组链接程序。

A program是给计算机的指令序列(即命令),计算机的中央处理器(CPU)可以理解。这些说明指示计算机应对一组数据执行的操作。

话虽如此,functions都是程序的逻辑子集。调用一个完全在您的过程中。的command是可以从命令解释程序执行的程序(或内置在一个壳体)。该命令实现执行任务的功能。相反是不正确的。


10
“函数返回一个值,但不输出任何东西” –是的,也许是在数学意义上。但是在命令式编程语言中,“函数”实际上只是指一个子例程,该子例程可以执行任何操作。特别是壳函数可能会产生输出或其他副作用,因为函数的返回值受到限制。
ilkkachu

@ilkkachu。谢谢。我已经更新了答案。请随时修改;-)

3
我认为这些定义来自编程语言环境,而不是外壳环境。是的,我知道shell语言一种编程语言,但是其“函数”的概念与数学或计算机科学定义大不相同-在shell中,所有命令(无论是内置函数,函数,别名,程序还是脚本)都可以起作用相似,并且只是不同类型的实现。
Toby Speight

1
... *主要*类似;内建可以改变壳本身的状态,而外部程序不能调用chdir()setenv()在那就是,对他们来说,明显的父进程的壳。
查尔斯·达菲

1

我想知道我们在Shell中调用的命令是函数还是程序?

是。

具体来说,当您键入一些文本并按时enter,shell必须确定是否为:

  1. alias
  2. 一个功能
  3. 内置命令
  4. 可执行文件。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.