¿Cómo saber si un comando de shell es programa o función?

8

Me gustaría saber si los comandos que llamamos en el shell son funciones o programas .

AymenTM
fuente
1
¿Qué distinción haces entre "pequeño programa" y "función"?
JdeBP
Puede ingresar comandos en un programa de shell que le permite programar el shell para que funcione y tomar el comando utilizando funciones con las que se programó el shell para ordenar otros programas desde las funciones del shell.
txtechhelp

Respuestas:

15

Depende.

Los comandos pueden clasificarse en múltiples categorías: incorporados, alias, funciones, ejecutables (scripts y binarios en la ruta de búsqueda).

En la línea de comando, ocupan un espacio de nombres único y plano que hace posible la anulación. Existen numerosas formas de diferenciar los tipos de programas:

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

Sabemos que fes una función.

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

Sabemos que aes un alias.

$ which yes
/usr/bin/yes

Sabemos que yeses un programa.

$ builtin echo ; echo $?

0

El caparazón tiene un echo...

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

... pero ninguno para cat. Si hay un alias incorporado o un alias pero insiste en llamar al programa, prefija el comando con una barra diagonal inversa:

$ builtin true | printf "%d\n" $?
0
$ alias true=false
$ true ; printf "%d\n" $?
1
$ \true ; printf "%d\n" $?
0
phg
fuente
3
Además, un comando que es un programa en una implementación de * nix bien podría convertirse en un shell incorporado (= función) en otra.
jamesqf
1
@jamesqf, sí, los shell tienen herramientas estándar incorporadas, pero los comandos incorporados no son lo mismo que las funciones. Ejecutar, por ejemplosh -c 'type true; f() { echo x; }; type f'
ilkkachu
55
Tenga en cuenta que, en general, typees preferible whichpara casi todos los propósitos. Ver unix.stackexchange.com/q/85249/135943
Comodín el
@ilkkachu: Eso depende de tu definición de "lo mismo que". Por supuesto, se implementan de manera diferente, pero para el usuario común que escribe un comando, son funcionalmente iguales.
jamesqf
1
@jamesqf, incluso si su usuario ordinario no (sabe cómo) usar las funciones, afirmar que son las mismas que las incorporadas es simplemente confuso.
ilkkachu
4

La definición de a functionestá devolviendo valores individuales y no genera nada. Las funciones de shell en particular pueden muy bien y podrían tener una salida u otros efectos secundarios, ya que el valor de retorno de las funciones es muy limitado.

A commandes una instrucción dada por un usuario para decirle a una computadora que haga algo, por ejemplo, ejecutar un solo programa o un grupo de programas vinculados.

A programes una secuencia de instrucciones (es decir, comandos) que se entregan a una computadora y que la unidad central de procesamiento (CPU) de la computadora puede entender. Estas instrucciones indican qué operaciones debe realizar la computadora en un conjunto de datos.

Dicho esto, functionsson un subconjunto lógico del programa. Llamar a uno está completamente dentro de su proceso. Se commandpuede ejecutar un programa (o un shell incorporado) desde el shell de comandos. El comando implementa funciones que realizan una tarea. Lo contrario no es correcto.


fuente
10
"una función devuelve un valor único y no genera nada", bueno, sí, en el sentido matemático tal vez. Pero en los lenguajes de programación imperativos, es realmente común que "función" signifique solo una subrutina, una que podría hacer cualquier cosa. Y las funciones de shell en particular pueden muy bien tener salida u otros efectos secundarios, ya que el valor de retorno de las funciones es muy limitado.
ilkkachu
@ilkkachu. Gracias. He actualizado la respuesta. Por favor, siéntase libre de revisar ;-)
3
Creo que estas definiciones provienen de un contexto de lenguaje de programación, no de un contexto de shell. Sí, sé que el lenguaje shell es un lenguaje de programación, pero su idea de una "función" es bastante diferente a la definición matemática o informática: en shell, todos los comandos (ya sean incorporados, funciones, alias, programas o scripts) actúan por igual, y son simplemente diferentes tipos de implementación.
Toby Speight
1
... * principalmente * por igual; Los componentes integrados pueden cambiar el estado del shell en sí, mientras que los programas externos no pueden llamar chdir()o setenv()en el shell que es, para ellos, un proceso padre distinto.
Charles Duffy el
1

Me gustaría saber si los comandos que llamamos en el shell son funciones o programas.

Si.

Específicamente, cuando escribe un texto y presiona enter, el shell debe determinar si es:

  1. una alias,
  2. Una función,
  3. un comando incorporado,
  4. Un archivo ejecutable.
RonJohn
fuente