Me considero un usuario feliz de Bash. Sin embargo, cuando comencé a explorar Unix, estaba en un sistema propietario de Unix que proporcionaba tcsh de forma predeterminada, por lo que mis primeras experiencias con el shell fueron en una versión moderna del shell C (csh). Eso resultó ser un accidente afortunado porque tcsh también era el caparazón elegido en el estudio de cine donde trabajé más adelante en mi carrera.
Más recursos de Linux
- Hoja de trucos de los comandos de Linux
- Hoja de trucos de comandos avanzados de Linux
- Curso en línea gratuito:Descripción general técnica de RHEL
- Hoja de trucos de red de Linux
- Hoja de trucos de SELinux
- Hoja de trucos de los comandos comunes de Linux
- ¿Qué son los contenedores de Linux?
- Nuestros últimos artículos sobre Linux
Hasta el día de hoy, hay varias tareas que asocio con tcsh, aunque no hay una correlación lógica allí. Todavía uso tcsh en al menos un sistema, aunque solo sea para mantenerme en la práctica. También lo mantengo instalado en todos mis sistemas para mantener la compatibilidad con mis propios scripts tcsh y para asegurarme de poder iniciarlo cuando necesito escribir un script que prefiero tener en tcsh.
La diferencia entre C shell y Bash
Tcsh es la continuación moderna de csh. Cuando se lanzó el shell C en 1978, los usuarios estaban entusiasmados con su sintaxis similar a C. C era un nuevo lenguaje de programación en ese momento y, lo que es más importante, era en lo que estaba escrito Unix, por lo que la mayoría de los usuarios de Unix se sentían más cómodos con C que con un lenguaje de secuencias de comandos arbitrario. Por ejemplo, en Bash, este if
loop hace una llamada "secreta" a test
binario para evaluar la declaración condicional (la parte entre paréntesis):
v=1
if [ $v -gt 0 ]
then
echo "verbose"
fi
Aquí está la misma declaración en csh o tcsh, sin una llamada externa a test
porque la declaración condicional (el código entre paréntesis) usa la evaluación integrada de csh:
set v=1
if ($v > 1) then
echo "verbose"
endif
Esto demuestra algunas cosas, tanto buenas como malas. Por ejemplo, es natural que un programador de C escriba un condicional entre paréntesis, y es deseable desde la perspectiva de un programador tener una evaluación matemática integrada en el ejecutable. Por otro lado, el if
la sintaxis de bucle tiene más en común con Lua que con C, que usa llaves como delimitadores:
// this does not work in Csh
if ( v>1 ) {
printf("verbose");
}
En cierto modo, esto resume muy bien csh:es limpio, eficiente y familiar para algunos, pero peculiar e inconsistente.
Entonces, ¿por qué usarlo?
Tcsh para precisión
Escribo más C++ y Java que código C, por lo que mi interés en tcsh comparte poco con su fama histórica. Sin embargo, disfruto de Lua y, en cierto modo, pienso en tcsh y otros shells como pienso en Lua y Python o incluso en Markdown y Docbook. Ambos proyectiles tienen mérito, y es fácil señalar el que es más popular, pero el otro es estrictamente claro. De hecho, creo que tcsh tiene una precisión de la que carecen muchos otros proyectiles.
Variables
No puede darse el lujo de escribir variables en shells, pero con tcsh, al menos puede declararlas con una palabra clave. Extrañamente, hay varias palabras clave que puede usar para la tarea, pero la que me decidí fue set
:
> set var=foo
> echo $var
foo
Puede expandir las variables escribiendo el nombre de la variable (var
en este ejemplo) y luego presionando Ctrl+X seguido del $ (dólar) clave. El ejemplo anterior establece var
a foo
.
Al igual que con muchos otros shells, puede enumerar todas las variables establecidas usando set
solo sin argumentos:
> set
term xterm
tty pts/2
uid 1000
user seth
var foo
[...]
Puede desarmar una variable usando unset
comando:
> unset var
> set | grep var
>
Las funciones que faltan son una función
Tal vez hayas visto líneas como esta en un script:
var=GitLab
${var,,}
La segunda línea es una función integrada para transformar el contenido de var
en minúsculas.
Si bien las funciones adicionales como estas son infinitamente útiles, a veces siento que son una invitación a la ofuscación. Shell scripting es como el HTML de la programación; es uno de los pocos lenguajes serios que puedes aprender solo leyendo el código de otras personas. Esa no es necesariamente una buena razón para renunciar a funciones útiles, pero es la razón por la que trato de evitar algunas de las taquigrafías crípticas populares en varios idiomas. Cuando escribo en tcsh, no tengo la opción de usar tanta taquigrafía, por lo que las operaciones de cadenas complejas deben realizarse con herramientas básicas de Unix en lugar de atajos integrados. Creo que da como resultado un código que es más fácil de leer, y eso marca una gran diferencia para los futuros contribuyentes, y para el futuro yo olvidadizo. .
Matemáticas integradas
Una de las cosas que me encantan de tcsh es su @ integrado. atajo de matemáticas. Como la mayoría de los usuarios autodidactas de Unix, me topé con bc y me he arrepentido desde entonces. Sin culpa propia, bc a menudo se enseña a los usuarios como una calculadora de línea de comandos cuando en realidad es más adecuado como un lenguaje de cálculo. . Las soluciones alternativas incluyen una increíble calculadora de 300 líneas en Bash puro, o let comando en Bash, o @ comando en tcsh.
> @ n = ( 1 + 1 / 2 )
> echo $n
1
Para matemáticas muy complejas, puede valer la pena aprender bc o una buena biblioteca matemática de Python.
Todo lo esencial
Para mí, tcsh logra un equilibrio perfecto entre la simplicidad absoluta y las características esenciales. No es un shell para todos los usuarios, ni siquiera para todos los propósitos, pero si está buscando simplificar su visión de su mundo basado en texto, tcsh podría proporcionarle una alternativa interesante.