Mi consejo:
bash
(y sus características) no son lenguajes de programación de propósito general. Si bien es posible lograr algunos scripts sofisticados bash
, no es la mejor manera de aprender programación en general. Es la forma más natural de realizar tareas de administración de sistemas que giran principalmente en torno a la ejecución de otros programas, el manejo de sus archivos de datos y directorios y la organización de entradas y salidas hacia y desde ellos. Si bash
es un martillo, resérvelo para problemas que realmente se parecen a las uñas. Aprender a hacer cualquier cosa que no sea trivial bash
será considerablemente más fácil si aprende algunos subconjuntos muy pequeños de ( sed
y awk
dado que la manipulación de cadenas bash
se inspira en gran medida en la sintaxis de operaciones similares en estos "pequeños" lenguajes).
- Para la programación de propósito general en Linux, escuchará muchos argumentos apasionados. Los dos mejores contendientes son Perl y Python . Ambos son lenguajes de scripting de muy alto nivel que tienen un propósito general, que exponen suficiente funcionalidad de bajo nivel para realizar casi cualquier operación que sea accesible para cualquier proceso de espacio de usuario en su sistema, y con enormes colecciones de módulos y bibliotecas preescritas disponibles.
Yo te recomiendo que lea un texto introductorio sobre C y pasar algún tiempo en marcha del strace
y ltrace
comandos en algunos comandos simples como servicios públicos ls
y mkdir
y /bin/echo
etc (en realidad en estos días me gustaría sugerir ltrace -S
en lugar de strace
, pero incursiones en la salida de ambos comandos y en la ltrace
salida aumentada por la -S
opción será extremadamente educativa).
C es el lenguaje de programación principal en el que se escriben el kernel de Linux y la libc de GNU. (Las piezas pequeñas están en ensamblaje). Casi todos los programas en un sistema Linux (u otro sistema similar a UNIX) están vinculados con las bibliotecas C (libc). Los principales intérpretes de Perl y Python (y la mayoría de los otros lenguajes de scripting) también están escritos en C. Estos programas (el núcleo, las bibliotecas comunes del sistema y los diversos intérpretes de scripting language) están escritos por programadores en C, su diseño y características están fuertemente influenciadas por sus implementaciones subyacentes. Por lo tanto, una comprensión más profunda de cualquiera de estos eventualmente implica comprender C. No necesita saber nada sobre C ++ ni Java para comprender la programación a este nivel. (Es posible que cada uno sea interesante y necesario por derecho propio según el parche de su carrera,
Entonces, si está de acuerdo con mis premisas hasta ahora, lo hemos reducido a una elección entre Perl y Python.
Aquí es donde comienzan las verdaderas guerras de llamas.
Mi consejo es centrarse primero en Python (2.x). Python tiene una sintaxis relativamente simple y consistente. Puede aprender los conceptos básicos de la sintaxis de Python en unas pocas horas y esa es la gran mayoría de la sintaxis que encontrará. Hay solo unas pocas características (comprensión de listas, expresiones generadoras, decoradores) que son arrugas a la sintaxis básica. Por lo tanto, la mayor parte de su esfuerzo en aprender Python se dedicará a aprender las extensas bibliotecas estándar y tratar de encontrar la "mejor" manera de usarlas (y descubrir cuáles son los conjuntos específicos de excepciones que vale la pena manejar para hacer que sus programas sean robustos) y, lo más importante, en el aprendizaje de los conceptos subyacentes.
Creo que las bibliotecas extensas de Python y su sintaxis relativamente simple tienen dos desventajas distintas.
En primer lugar, a medida que aprende a hacer cosas en un nivel muy alto en Python, puede ser tedioso pensar en tener que trabajar en un nivel inferior. Donde trabajo Perl es el estándar. Prototipo mi trabajo en Python, donde sé que puedo hacer que funcione mucho más rápido y confiable que en Perl; entonces temo tener que pasar y portarlo a Perl para mis colegas. (Fui razonablemente bueno en Perl años antes de usar Python, así que no es una cuestión de simple familiaridad).
La otra desventaja es que a veces es difícil encontrar la forma de más alto nivel para realizar una tarea determinada en Python. Por ejemplo, para buscar una página web, puede intentar hacerlo inicialmente con sockets de bajo nivel ... lo que funcionará. Sin embargo, estaría duplicando bastante código que ya puede encontrar incluido en los módulos urllib
y / o urllib2
. El hecho mismo de que las bibliotecas estándar, a partir de 2.7.1, incluye ambos, hace mi punto. Donde sea posible, los mantenedores de Python han extendido los módulos y API más antiguos de manera transparente; Sin embargo, hay docenas de casos en los que Python retiene dos o tres módulos donde la extensión transparente no fue posible por alguna razón. (Para otro ejemplo usted podría mirar a las opciones para analizar las opciones de línea de comandos: argparse
, optparse
ygetopt
. Hay poco daño al escribir sus programas usando getopt
(el más antiguo de estos). Para utilidades muy simples con pocas opciones y una convención de llamada rígida (utilizada solo por un pequeño grupo de personas, por ejemplo), entonces no hay nada inherentemente malo en caminar sobre sys.argv
ti mismo. Sin embargo, por lo general, vale la pena leer los documentos detenidamente y seguir los enlaces en la parte inferior de los módulos de nivel anterior o inferior que describen las características disponibles más nuevas o de nivel superior.
Mi consejo se basa en mi opinión de que desea centrarse en conceptos más profundos y no tener que gastar gran parte de su tiempo y esfuerzo en cuestiones sintácticas y específicas del idioma. Comprender cuándo usar un subproceso, frente a un hilo, o las funciones de procesamiento múltiple que se incluyen con Python tiene relativamente poco que ver con el lenguaje y todo lo que tiene que ver con el dominio de la programación, independientemente del idioma. (En el punto en el que pueda comprender los argumentos sobre el modelo impulsado por eventos de Twisted en comparación con el subprocesamiento y el multiprocesamiento, entonces probablemente habrá dominado Python y estará listo para programar en cualquier lenguaje).
El argumento contrario, para Perl, es simple y práctico. Hay bastantes trabajos más que requerirán, específicamente, habilidades con Perl. Perl es un lenguaje poderoso y tiene bibliotecas extremadamente extensas. (El núcleo de Perl que se distribuye con la mayoría de los sistemas Linux cubre una gama de funcionalidades más pequeña que las bibliotecas Python estándar; se supone que habrá instalado un número significativo de paquetes adicionales desde su distribución o a través de CPAN --- el archivo completo de Perl Red). (Por el contrario, hay menos módulos y paquetes de Python que tengo que buscar por separado ... están disponibles en PyPI --- el Índice de paquetes de Python).
Por lo tanto, si aprende Perl, tendrá una ventaja para encontrar trabajos, en particular trabajos de administrador de sistemas, a corto plazo. Sin embargo, la sintaxis de Perl es ... bueno ... en palabras de algunos de sus propios entusiastas ... "patológicamente ecléctico". Perl puede ser extremadamente conciso y su código está lleno de bastante puntuación. Quienes lo aman argumentarán sin cesar que es "fácil" y tiene mucho sentido --- y tendrán infinitas oportunidades para hacerlo en foros que están llenos de confusión sobre cómo exactamente se interpretó un fragmento de código. La sintaxis y el lenguaje utilizado en la documentación y por aquellos que la apoyan en foros públicos están matizados hasta el punto de que puede dedicar un esfuerzo considerable para aprenderlos.
Ahora, tenga en cuenta que este comentario anterior es subjetivo y sesgado. Es posible que pruebe Perl y descubra que su sintaxis es intuitiva y agradable. Si es así, más poder para ti. Sin embargo, personalmente encuentro que mi comprensión de las idiosincrasias de Perl decae muy rápidamente. Los fundamentos que conservo, pero encuentro que es una lucha cada vez que tengo que volver a usarlo por más de unas pocas líneas de código.
Hay muchos otros idiomas que estudiaría, Java, Lisp y Scheme, TCL, Scala, etc. Sin embargo, sugeriría comenzar con uno que ofrezca el mejor equilibrio entre utilidad y simplicidad.