Mi considero un felice utente Bash. Tuttavia, quando ho iniziato a esplorare Unix, era su un sistema Unix proprietario che forniva tcsh per impostazione predefinita, quindi le mie prime esperienze con la shell erano su una versione moderna della shell C (csh). Si è rivelato un fortunato incidente perché tcsh era anche il guscio preferito dello studio cinematografico dove ho lavorato più avanti nella mia carriera.
Più risorse Linux
- Comandi Linux cheat sheet
- Cheat sheet sui comandi avanzati di Linux
- Corso online gratuito:Panoramica tecnica RHEL
- Cheat sheet della rete Linux
- Cheat sheet di SELinux
- Cheat sheet dei comandi comuni di Linux
- Cosa sono i container Linux?
- I nostri ultimi articoli su Linux
Ad oggi, ci sono diversi compiti che associo a tcsh, anche se non c'è una correlazione logica lì. Uso ancora tcsh su almeno un sistema, se non altro per rimanere in pratica. Lo tengo anche installato su tutti i miei sistemi per mantenere la compatibilità con i miei script tcsh e per assicurarmi di poterlo avviare quando devo scrivere uno script che preferisco avere in tcsh.
La differenza tra C shell e Bash
Tcsh è la continuazione moderna di csh. Quando la shell C è stata rilasciata nel lontano 1978, gli utenti erano entusiasti della sua sintassi simile al C. Il C all'epoca era un nuovo linguaggio di programmazione e, cosa più importante, era ciò in cui era stato scritto Unix, quindi la maggior parte degli utenti Unix si sentiva più a suo agio con il C che con un linguaggio di scripting arbitrario. Ad esempio, in Bash, questo if
loop effettua una chiamata "segreta" al test
binario per valutare l'istruzione condizionale (la parte tra parentesi):
v=1
if [ $v -gt 0 ]
then
echo "verbose"
fi
Ecco la stessa istruzione in csh o tcsh, senza una chiamata esterna a test
perché l'istruzione condizionale (il codice tra parentesi) utilizza la valutazione incorporata di csh:
set v=1
if ($v > 1) then
echo "verbose"
endif
Questo dimostra alcune cose, sia buone che cattive. Ad esempio, è naturale per un programmatore C digitare un condizionale tra parentesi ed è desiderabile dal punto di vista di un programmatore avere una valutazione matematica integrata nell'eseguibile. D'altra parte, il if
la sintassi del ciclo ha più cose in comune con Lua rispetto a C, che usa le parentesi graffe come delimitatori:
// this does not work in Csh
if ( v>1 ) {
printf("verbose");
}
In un certo senso, questo riassume bene csh:è pulito, efficiente e familiare per alcuni, ma bizzarro e incoerente.
Allora perché usarlo?
Tcsh per precisione
Scrivo più codice C++ e Java che C, quindi il mio interesse per tcsh condivide poco con la sua storica pretesa di fama. Tuttavia, mi piace Lua e, in un certo senso, penso a tcsh e ad altre shell come penso a Lua e Python o persino a Markdown e Docbook. Entrambe le conchiglie hanno dei meriti ed è facile indicare quella più popolare, ma c'è molta chiarezza sull'altra. In effetti, ritengo che tcsh abbia una precisione che manca a molte altre shell.
Variabili
Non hai il lusso delle variabili digitate nelle shell, ma con tcsh puoi almeno dichiararle con una parola chiave. Stranamente, ci sono diverse parole chiave che puoi utilizzare per l'attività, ma quella su cui ho deciso era set
:
> set var=foo
> echo $var
foo
Puoi espandere le variabili digitando il nome della variabile (var
in questo esempio) e quindi premendo Ctrl+X seguito da $ chiave (dollaro). L'esempio sopra imposta var
a foo
.
Come con molte altre shell, puoi elencare tutte le variabili impostate usando set
da solo senza argomenti:
> set
term xterm
tty pts/2
uid 1000
user seth
var foo
[...]
Puoi annullare l'impostazione di una variabile utilizzando unset
comando:
> unset var
> set | grep var
>
Le funzioni mancanti sono una caratteristica
Forse hai visto righe come questa in uno script:
var=GitLab
${var,,}
La seconda riga è una funzione incorporata per trasformare il contenuto di var
in minuscolo.
Sebbene funzioni extra come queste siano infinitamente utili, a volte sento che sono un invito all'offuscamento. Lo scripting della shell è come l'HTML della programmazione; è uno dei pochi linguaggi seri che puoi insegnare a te stesso semplicemente leggendo il codice di altre persone. Questo non è necessariamente un ottimo motivo per rinunciare a funzioni utili, ma è il motivo per cui cerco di evitare alcune delle criptiche abbreviazioni popolari in varie lingue. Quando scrivo in tcsh, non ho la possibilità di usare la stessa abbreviazione, quindi le operazioni complesse sulle stringhe devono essere eseguite con strumenti Unix di base piuttosto che con scorciatoie integrate. Credo che si traduca in un codice più facile da leggere e questo fa una grande differenza per i futuri contributori e per il futuro, smemorato me .
Matematica integrata
Una delle cose che amo di tcsh è il suo @ integrato scorciatoia matematica. Come la maggior parte degli utenti autodidatti di Unix, mi sono imbattuto in bc e da allora me ne sono pentito. Non per colpa sua, bc viene spesso insegnato agli utenti come calcolatore da riga di comando quando in realtà è più adatto come linguaggio di calcolo . Le soluzioni alternative includono un'incredibile calcolatrice a 300 righe in puro Bash o let comando in Bash o il @ comando in tcsh.
> @ n = ( 1 + 1 / 2 )
> echo $n
1
Per una matematica molto complessa, potrebbe valere la pena imparare bc o una buona libreria matematica Python.
Tutto l'essenziale
Per me, tcsh trova un perfetto equilibrio tra la semplicità assoluta e le caratteristiche essenziali. Non è una shell per tutti gli utenti, o anche per tutti gli scopi, ma se stai cercando di semplificare la tua visione del tuo mondo basato su testo, tcsh potrebbe fornire un'interessante alternativa.