Como saber se um comando shell é programa ou função?

8

Gostaria de saber se os comandos que chamamos no shell são funções ou programas .

AymenTM
fonte
1
Que distinção você está fazendo entre "pequeno programa" e "função"?
JdeBP # 13/18
Você pode inserir comandos em um programa shell que permite programar o shell para funcionar e assumir o comando utilizando funções com as quais o shell foi programado para comandar outros programas a partir das funções do shell.
Txtechhelp 14/09/19

Respostas:

15

Depende.

Os comandos podem se dividir em várias categorias: builtins, aliases, funções, executáveis ​​(scripts e binários no caminho de pesquisa).

Na linha de comando, eles ocupam um espaço de nome único e plano que possibilita a substituição. Existem várias maneiras de diferenciar tipos de programas:

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

Sabemos que fé uma função.

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

Sabemos que aé um apelido.

$ which yes
/usr/bin/yes

Sabemos que yesé um programa.

$ builtin echo ; echo $?

0

A concha possui um echo

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

... mas nenhum para cat. Se houver um alias interno ou um alias, mas você insistir em chamar o programa, prefixe o comando com uma barra invertida:

$ builtin true | printf "%d\n" $?
0
$ alias true=false
$ true ; printf "%d\n" $?
1
$ \true ; printf "%d\n" $?
0
phg
fonte
3
Além disso, um comando que é um programa em uma implementação do * nix pode se tornar um shell embutido (= função) em outra.
Jamesqf # 13/18
1
@ jamesqf, sim, o shell possui ferramentas padrão integradas, mas os comandos embutidos não são os mesmos que funções. Execute por exemplosh -c 'type true; f() { echo x; }; type f'
ilkkachu 13/09/18
5
Observe que, em geral, typeé preferível a whichquase todos os fins. Consulte unix.stackexchange.com/q/85249/135943
Wildcard
@ilkkachu: Isso depende da sua definição de "o mesmo que". É claro que eles são implementados de maneira diferente, mas para o usuário comum digitando um comando, eles são funcionalmente iguais.
jamesqf
1
@ jamesqf, mesmo que o usuário comum não use (saiba como) usar funções, alegar que é o mesmo que builtins é apenas confuso.
Ilkkachu # 14/18
4

A definição de a functionestá retornando valores únicos e não produz nada. As funções do shell, em particular, podem muito bem e podem ter uma saída ou outros efeitos colaterais, uma vez que o valor de retorno das funções é muito limitado.

A commandé uma instrução dada por um usuário para instruir um computador a fazer algo, por exemplo, executar um único programa ou um grupo de programas vinculados.

A programé uma sequência de instruções (ou seja, comandos) fornecidas a um computador e compreensíveis pela unidade central de processamento (CPU) do computador. estas instruções indicam quais operações o computador deve executar em um conjunto de dados.

Dito isto, functionssão subconjuntos lógicos do programa. Chamar um é inteiramente dentro do seu processo. O commandé um programa (ou um shell embutido) pode ser executado a partir do shell de comando. O comando implementa funções que executam uma tarefa. O oposto não está correto.


fonte
10
"uma função retorna um único valor e não produz nada" - bem, sim, talvez no sentido matemático. Mas em linguagens de programação imperativas, é realmente comum "função" significar apenas uma sub-rotina, uma que poderia fazer qualquer coisa. E as funções de shell em particular podem muito bem ter saída ou outros efeitos colaterais, uma vez que o valor de retorno das funções é muito limitado.
ilkkachu
@ilkkachu. Obrigado. Eu atualizei a resposta. Sinta-se livre para revisar ;-)
3
Eu acho que essas definições são de um contexto de linguagem de programação, não de um contexto de shell. Sim, eu sei que a linguagem shell é uma linguagem de programação, mas sua ideia de uma "função" é bem diferente da definição matemática ou da ciência da computação - no shell, todos os comandos (sejam builtins, funções, aliases, programas ou scripts) agem iguais e são simplesmente diferentes tipos de implementação.
21418 Toby Speight
1
... * principalmente * iguais; builtins podem alterar o estado do próprio shell, enquanto programas externos não podem chamar chdir()ou setenv()no shell que é, para eles, um processo pai distinto.
Charles Duffy
1

Gostaria de saber se os comandos que chamamos no shell são funções ou programas?

Sim.

Especificamente, quando você digita algum texto e pressiona enter, o shell deve determinar se é:

  1. um alias,
  2. uma função,
  3. um comando embutido,
  4. um arquivo executável.
RonJohn
fonte