如何判断 shell 命令是程序还是函数?

Aym*_*nTM 8 linux shell

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

phg*_*phg 15

这取决于。

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

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

$ f () { :; }
$ alias a=cat
$ which f
f ()
{ 
    :
}
Run Code Online (Sandbox Code Playgroud)

我们知道这f是一个函数。

$ which a
alias a='cat'
        /usr/bin/cat
Run Code Online (Sandbox Code Playgroud)

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

$ which yes
/usr/bin/yes
Run Code Online (Sandbox Code Playgroud)

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

$ builtin echo ; echo $?

0
Run Code Online (Sandbox Code Playgroud)

外壳有一个echo内置的…

$ builtin cat ; echo $?
bash: builtin: cat: not a shell builtin
1
Run Code Online (Sandbox Code Playgroud)

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

$ builtin true | printf "%d\n" $?
0
$ alias true=false
$ true ; printf "%d\n" $?
1
$ \true ; printf "%d\n" $?
0
Run Code Online (Sandbox Code Playgroud)

  • 请注意,一般来说,对于几乎所有目的,`type` 比 `which` 更可取。见 https://unix.stackexchange.com/q/85249/135943 (5认同)
  • 此外,在 *nix 的一种实现中作为程序的命令很可能在另一种实现中成为 shell 内置(= 函数)。 (3认同)

小智 3

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

Acommand是用户发出的指令,告诉计算机做某事,例如执行单个程序或一组链接的程序。

Aprogram是给予计算机并且可由计算机的中央处理单元(CPU)理解的指令序列(即命令)。这些指令指示计算机应对一组数据执行哪些操作。

话虽如此,functions它们是程序的逻辑子集。呼叫某人完全在您的流程之内。这command是一个可以从命令 shell 执行的程序(或内置 shell)。该命令实现执行任务的函数。反之则不正确。

  • “函数返回单个值,并且不输出任何内容”——嗯,是的,也许是在数学意义上。但在命令式编程语言中,“函数”通常指的是一个可以做任何事情的子例程。特别是 shell 函数很可能有输出或其他副作用,因为函数的返回值非常有限。 (11认同)
  • 我认为这些定义来自编程语言上下文,而不是 shell 上下文。是的,我知道 shell 语言*是*一种编程语言,但它的“函数”概念与数学或计算机科学的定义完全不同 - 在 shell 中,所有命令(无论是内置命令、函数、别名、程序还是脚本) )行为相似,只是不同类型的实现。 (3认同)