it-swarm-es.tech

Alias ​​vs funciones vs scripts

Este sitio dice: "Las funciones de Shell son más rápidas [que los alias]. Los alias se buscan después de las funciones y, por lo tanto, la resolución es más lenta. Si bien los alias son más fáciles de entender, las funciones de Shell se prefieren a los alias para casi todos los propósitos . "

Dado eso (cierto o no), ¿cómo se comparan las funciones de Shell con los scripts de Shell independientes? ¿Tiene uno ventajas particulares sobre el otro o es más adecuado para cierto tipo de tareas?

37
Wolf

La principal diferencia entre los alias y las funciones es que los alias no aceptan argumentos¹, pero las funciones sí. Cuando escribe algo como alias l='ls --color', l foo se expande a ls --color foo; no puede tomar foo en la expansión de alias y hacer algo diferente con él de la forma en que puede hacer con una función. Consulte también ¿Cómo pasar un parámetro a un alias? .

Los alias se buscan antes funciones: si tiene tanto una función como un alias llamado foo, foo invoca la alias. (Si el alias foo se está expandiendo, se bloquea temporalmente, lo que hace que cosas como alias ls='ls --color' trabajo. Además, puede omitir un alias en cualquier momento ejecutando \foo.) Sin embargo, no esperaría ver una diferencia de rendimiento medible.

Las funciones y los scripts independientes tienen en su mayoría capacidades similares; aquí hay algunas diferencias en las que puedo pensar:

  • Una función se ejecuta dentro del entorno Shell; un script se ejecuta en un proceso separado. Por lo tanto, una función puede cambiar el entorno de Shell: definir variables de entorno, cambiar el directorio actual, etc. Un script independiente no puede hacer eso.
  • Una función debe estar escrita en el idioma del Shell en el que desea usarla. Un script puede escribirse en cualquier idioma.
  • Las funciones se cargan cuando se definen. Los scripts se cargan cada vez que se invocan. Esto tiene varias consecuencias:
    • Si modifica un script, obtendrá la nueva versión la próxima vez que lo invoque. Si cambia la definición de una función, debe volver a cargar la definición.
    • Las funciones son más rápidas en sistemas muy cargados.
    • Si tiene muchas funciones que no puede usar, ocuparán memoria. Ksh y zsh, pero creo que no bash, tienen una forma de función de carga automática.

Algo que es intermedio entre una función y una secuencia de comandos independiente es un fragmento de secuencia de comandos que lee con source o . incorporado. Como una función, puede modificar el entorno de Shell y debe estar escrito en el lenguaje de Shell. Como un script, se carga cada vez que se invoca y apenas.

¹ Sí, lo sé, esto no se aplica a tcsh.