Por sus comentarios, parece estar confundido acerca de qué es exactamente un shell . El kernel es responsable de administrar el sistema. Es la parte que realmente carga y ejecuta programas, accede a archivos, asigna memoria, etc. Pero el núcleo no tiene interfaz de usuario; solo puede comunicarse con él utilizando otro programa como intermediario.
Un shell es un programa que imprime un aviso, lee una línea de entrada de usted y luego lo interpreta como uno o más comandos para manipular archivos o ejecutar otros programas. Antes de la invención de la GUI, el shell era la interfaz de usuario principal de un sistema operativo. En MS-DOS, se llamó al shell command.com
y pocas personas intentaron usar uno diferente. En Unix, sin embargo, durante mucho tiempo ha habido múltiples shells entre los que los usuarios pueden elegir.
Se pueden dividir en 3 tipos. Los shells compatibles con Bourne usan la sintaxis derivada del shell Bourne original . Los shells C usan la sintaxis del shell C original . Luego hay shells no tradicionales que inventan su propia sintaxis, o toman prestada una de algún lenguaje de programación, y generalmente son mucho menos populares que los dos primeros tipos.
Un comando incorporado es simplemente un comando que el shell ejecuta por sí mismo, en lugar de interpretarlo como una solicitud para cargar y ejecutar algún otro programa. Esto tiene dos efectos principales. Primero, generalmente es más rápido, porque cargar y ejecutar un programa lleva tiempo. Por supuesto, cuanto más tiempo tarda el comando en ejecutarse, menos significativo es el tiempo de carga en comparación con el tiempo de ejecución general (porque el tiempo de carga es bastante constante).
En segundo lugar, un comando incorporado puede afectar el estado interno del shell. Es por eso que los comandos como cd
deben estar incorporados, porque un programa externo no puede cambiar el directorio actual del shell. Otros comandos, como echo
, pueden estar integrados para la eficiencia, pero no hay ninguna razón intrínseca para que no puedan ser comandos externos.
Los comandos incorporados dependen del shell que esté utilizando. Tendrá que consultar su documentación para obtener una lista (por ejemplo, bash
los comandos integrados se enumeran en el Capítulo 4 de su manual ). El type
comando puede decirle si un comando está incorporado (si su shell es compatible con POSIX), porque POSIX requiere que type
esté incorporado. Si which
no está integrado en su shell, entonces probablemente no sabrá acerca de los complementos de su shell, pero solo buscará programas externos.
Hay tres niveles de utilidades incorporadas:
Algunas utilidades son realmente parte del shell como lenguaje de programación, a pesar de que no son palabras reservadas . Son utilidades de control de flujo (
.
,:
,break
,continue
,return
,trap
,exit
,exec
,eval
), servicios públicos de parámetros relacionados (set
,unset
,shift
,export
,readonly
,local
¹,typeset
¹), alias utilidades (alias
²,unalias
²) ytimes
³. Estas incorporaciones especiales reciben un tratamiento especial:foo=bar utility
tiene un significado diferente: es una asignación de parámetros ordinaria (es decir, equivalente afoo=bar; utility
), en lugar de asignarla al entorno solo durante la duración de la utilidad.Algunas utilidades deben implementarse dentro del shell porque actúan en la configuración interna del shell. Esto incluye:
cd
,dirs
,pushd
,popd
;bg
,disown
,fg
,jobs
,wait
;builtin
,command
,hash
,read
,type
,ulimit
,umask
;fc
,history
,bind
.echo
,printf
,test
,true
,false
.Los shells avanzados como bash , ksh y zsh suelen tener más funciones integradas, a menudo para implementar características no estándar (generalmente para la interacción). El manual de cada shell le dirá qué comandos están incorporados, aunque algunos shells ( zsh , al menos) admiten módulos cargables dinámicamente que pueden proporcionar más incorporaciones.
¹ Desconocido para POSIX, pero especial en ksh y varios otros shells.
² Ordinario en POSIX, pero especial en ksh y varios otros shells.
³ En
ksh
,times
es un contenedor alrededor de latime
palabra clave: es un alias para{ { time;} 2>&1;}
. Tenga en cuenta que POSIX permitetime
ser una utilidad externa con análisis ordinario o una palabra clave que se aplica a una tubería completa (que está en ksh, bash en zsh).fuente
while IFS= read -r line
?read
no es un generador especial, por lo queIFS=read
establece la variable solo durante la duración del comando.Un builtin es un comando proporcionado por el shell, en lugar de un programa externo. Aquí están las listas de
bash
los componentes incorporados (también se enumeran en la página del manual de bash) yzsh
los componentes incorporados .ksh
proporciona una lista ejecutandobuiltin
.Para saber si un comando en particular está integrado, puede ejecutar
type command
. Intentatype for
ytype ls
ver esto.fuente
type
Parece funcionar; gracias por eso ... pero todavía me pregunto qué significa "proporcionado por el shell" ... Tal vez necesito entender mejor cómo se relaciona el shell con el kernel ... pero no a las 2 AM ... Vendré volvamos a esto mañanaCada distribución y shell tiene una colección diferente de comandos frente a las funciones de shell incorporadas. En general, la idea es que los shells incorporen las funciones más comunes y simples para ahorrar tiempo, velocidad e integración con el resto de su conjunto de características. La sobrecarga es mucho menor ya que no tiene que iniciar otro proceso del sistema. Sin embargo, es posible mezclar y combinar. Puede ejecutar un shell que tiene un buildin para algo, pero también tiene ese comando en su sistema. Por lo general, la construcción tendría prioridad, pero podría controlar eso.
Puede averiguar fácilmente si un comando específico está integrado o no ejecutando
type mycommand
. La mayoría de las páginas man de shell también tienen una lista de sus componentes integrados.Editar: se usa
type
para averiguar si un comando está integrado y, si no,which
para saber desde dónde se ejecutará.fuente
=>"/bin/echo" and
type echo=>"echo is a shell builtin", but 'which dd
=> "/ bin / dd" ytype dd
=> "dd is / bin / dd" ... así que estoy a medio camino ....type
es el mejor indicador de lo que se está ejecutando, pero se da cuenta de queecho
está integrado y hay una aplicación con ese nombre. Si su caparazón no tuviera un sistema integrado, se ejecutaría uno.which
no es necesariamente un comando incorporado, y si no lo es, no sabrá acerca de las funciones integradas del shell. POSIX requiere quetype
sea un comando integrado, por lo que siempre sabe sobre las incorporaciones.which
atype
o algún conjunto de opciones por ejemploalias which='type -path'
- esto podría ser la fuente de confusión.which
sea reemplazado portype
. Usé lo que, una y otra vez, sin sabertype
y estaba muy sorprendido de aprender, esowhich
es correcto, si decidía entre programas.