Solo cubriendo 1) de su pregunta.
Naturalmente, las API siempre pueden cambiar a voluntad de sus creadores y, por lo tanto, romper el software dependiente en cualquier idioma. Dicho esto, la gran idea de las "API" de E / S de las herramientas de Unix es que prácticamente no hay ninguna (tal vez 0x0a
como final de línea). Un buen script filtra los datos con las herramientas de Unix en lugar de crearlos. Eso significa que su secuencia de comandos puede romperse porque la especificación de entrada o salida cambió, pero no porque el formato de E / S (nuevamente, en realidad no hay una) de las herramientas individuales utilizadas en la secuencia de comandos cambió (porque algo que realmente no existe realmente no puede cambiar).
Al revisar una lista de herramientas básicas, hay algunas que también atribuiría productor , en lugar de solo filtrar:
- wc - imprime el número de bytes, palabras, líneas - formato muy simple, por lo tanto absolutamente improbable que cambie, y además no es muy probable que se use en un script.
- diff : han evolucionado diferentes formatos de salida, pero no he oído hablar de ningún problema. Tampoco se usa normalmente sin supervisión.
- fecha : ahora aquí realmente tenemos que cuidar lo que producimos, especialmente en lo que respecta a la configuración regional del sistema. Pero, de lo contrario, el formato de salida es RFC dado que usted no lo especifica exactamente.
- cal - no hablemos de eso, sé que el formato de salida difiere mucho entre sistemas.
- ls , que , w , última - no puedo evitar si se quiere analizar ls, simplemente no estaba destinado a ser. Además, quienes, por último, son más interactivos. Si los usa en un script, debe cuidar lo que hace.
- el tiempo fue señalado en otro post. Pero sí, es lo mismo que con ls. Más para uso interactivo / local. Y el bash incorporado es muy diferente de la versión de GNU, y la versión de GNU ha tenido errores no corregidos durante muchos años. Simplemente no confíes en ello.
Aquí hay herramientas que esperan un formato de entrada particular más específico que ser una secuencia de bytes:
- bc , dc - calculadoras. Ya en el lado más hostil de las cosas (realmente, no los uso en scripts), y presumiblemente en formatos de E / S muy estables.
Hay otra área con un riesgo mucho mayor de rotura, a saber, la interfaz de línea de comandos. La mayoría de las herramientas tienen características diferentes tanto en los sistemas como en la línea de tiempo. Ejemplos son
- Todas las herramientas que utilizan regex : regex puede cambiar el significado en función de la configuración regional del sistema (por ejemplo, LC_COLLATE) y existen muchas sutilezas y particularidades en las implementaciones de expresiones regulares.
- Simplemente no use interruptores elegantes. Puede usar fácilmente,
man 1p find
por ejemplo, para leer la página de manual de búsqueda POSIX en lugar de la página de manual del sistema. En mi sistema, necesito manpages-posix instalado.
E incluso cuando se usan tales interruptores, normalmente no se introducirán errores sutilmente y envenenarán sus datos. La mayoría de los programas simplemente se negarán a trabajar con un interruptor desconocido.
Para concluir, diría que Shell tiene el potencial de ser uno de los lenguajes más portátiles (es portátil cuando se escribe de forma portátil). Compare con sus lenguajes de script favoritos donde ocurren errores sutiles, o su programa compilado favorito que dejará de compilarse.
Además, en los lugares raros donde puede ocurrir la rotura debido a incompatibilidades, probablemente no se deba al tiempo inducido, sino a la diversidad en los diferentes sistemas (es decir, si funciona para usted, lo hizo 20 años antes y lo hará en 20 años). , también). Ese es un corolario de la simplicidad de las herramientas.