Visualizzazione post con etichetta unix. Mostra tutti i post
Visualizzazione post con etichetta unix. Mostra tutti i post

2014-10-14

Il 16 Agosto 2014 ed il particolare orario in Unix / Linux

$ date --date='@1408160542'
Sat Aug 16 05:42:22 CEST 2014
$ date --date='@1408160542' +%y%m%d%H%M
1408160542


In questo orario che ho indicato ho trovato la particolare combinazione per cui il numero dei secondi passati dal 1 Gennaio 1970 ha lo stesso aspetto della data e ora riportati nel formato anno (di due cifre) mese giorno ore e minuti.
L'ho provato con la versione 8.23 del comando date (GNU coreutils), con versioni più recenti non è permesso fornire la data da visualizzare con il formato preceduto da @ ma si può eseguire il comando nel modo inverso:
$ date --date='Sat Aug 16 05:42:22 CEST 2014' +%s
1408160542

2011-09-14

Comandi vim per gestione testo racchiuso

Con Vim si possono effettuare agevolmente modifiche di testo racchiuso da particolari delimitatori com parentesi oppure apici. Per eseguire la modifica di una stringa delimitata da virgolette ( doppi apici ) ci si può posizionare in uno qualsiasi dei caratteri della stringa e, in modalità comando, digitare ci" ed inserire il nuovo testo da inserire nella stringa. Allo stesso modo se si vogliono modificare i parametri passati ad una funzione, posizionarsi all'interno delle parentesi tonde, digitare ci( e digitare i nuovi parametri per la funzione.
Lo stesso funziona per l'apice singolo, le parentesi graffe e quadre ed i caratteri < e > molto usati nei linguaggi di markup. Il testo da modificare può essere anche posizionato su più righe.
Oltre alla modifica questo sistema di selezione del testo può essere utilizzato per la cancellazione utilizzando la d invece della c oppure per la copia con y per poi incollarlo con p dalla posizione del cursore.

Vedere anche gli altri post che riguardano vim.

2011-07-11

Qualcuno ha cancellato e ricreato la directory corrente? Niente paura!

In Unix la cancellazione di un file aperto da qualche processo è permessa perché consiste sono nell'eliminazione del suo riferimento in una directory ma il file seguita ad esistere fino a quando qualche directory ha un suo riferimento oppure qualche processo lo mantiene aperto. Anche una directory può essere cancellata se qualche processo ce l'ha come directory corrente, se provate a creare una directory di prova /tmp/prova, vi ci spostate e provate a cancellarla vi viene permesso e tentando di leggere il contenuto della directory con ls non si ottiene nulla* Nella shell corrente il percorso corrente rimane impostato, anche se in una directory inesistente, ma se ricreiamo la directory il problema permane in quanto quello che è stato memorizzato è il file della directory corrente precedente che non esiste più. A questo punto si dovrebbe rieseguire il comando cd per riposizionarsi nella nuova directory. Tornare indietro di una non si può, il comando cd .. non può funzionare in quanto non esiste più il riferimento nella directory corrente, va rieseguito il comando cd con il percorso assoluto e se si tratta di un lungo percorso può essere noioso. In questa condizione possiamo eseguire ancora il comando pwd per reperire il percordo della directory corrente, la shell risponde in maniera corretta. Quindi una soluzione comoda è eseguire il comando cd $(pwd) che costringe il comando cd a ripercorrere tutto il percorso necessario da / per riposizionarsi ma non siamo costretti a digitare di nuovo tutto quanto.

* i comportamenti variano tra le diverse implementazioni e versioni di Unix.

2011-06-29

Sequenze di comandi con la shell

Da sempre la shell Unix ha permesso di impartire sequenze di comandi che avessero qualche correlazione tra di loro, le correlazioni sono molteplici e proverò con questo post a descriverle.
Il primo modo per impartire una serie di comandi è di digitare i comandi uno di seguito all'altro terminando ognuno con ENTER, con la shell interattiva il comando successivo viene eseguito al termine del comando precedente ma non prima di aver premuto il tasto ENTER che lo sottomette. Per evitare il tempo di attesa tra la fine del primo comando e la pressione del tasto ENTER per il successivo si può iniziare a digitare il comando anche prima della comparsa del prompt da parte della shell ma non sempre si riesce ad essere sufficientemente veloci; a tal proposito si possono digitare i comandi separati da punto e virgola ( ; ) e premere ENTER solo alla fine dell'ultimo. In questo modo i comandi verranno eseguiti uno di seguito all'altro senza attese. Esempio per consultare l'orario prima e dopo l'esecuzione di una copia di directory:
date ; cp -a src_dir dst_dir ; date
L'esecuzione dei comandi successivi può essere condizionata in base all'esito del precedente: separando con && due comandi si condiziona l'esecuzione del secondo in base all'esito del primo, se il primo si conclude positivamente allora viene eseguito anche il secondo. Ricordo che per esito positivo si intende che l'exit code del programma deve essere 0 ( zero ), l'exit code di un programma può essere verificato con la shell utilizzando la variabile predefinita $? . La sequenza di comandi può essere lunga a piacere. Esempio di comando condizionato dal precedente, se la compilazione si completa positivamente si può eseguire il programma:
cc -o prova prova.c && ./prova

Il condizionamento di esecuzione può essere anche invertito con || in modo tale da eseguire il secondo solo se il primo è fallito ( quindi exit code diverso da zero ). Esempio di comando alternativo eseguendo telnet se ssh fallisce, si sa che è preferibile ssh a telnet ma in sua assenza...:
ssh server || telnet ssh
I programmi possono essere eseguiti anche contemporaneamente separandoli con & che permette di eseguire il secondo appena iniziata l'esecuzione del primo, senza attenderne la fine. Esempio di esecuzione contemporanea di cancellazione di un file grande e la copia di un altro:
rm /tmp/grande_file & cp /tmp/altro_file /altrove/altro_file
Terminando con & l'ultimo ( o l'unico ) comando si ottiene di nuovo il prompt appena avviato il comando in modo da poter interagire subito di nuovo con la shell.
Un altro modo molto utilizzato per definire una sequenza di comandi è quello che redirige l'output ( che normalmente finirebbe sullo schermo ) come input ( normalmente la tastiera ) del comando seguente, per fare ciò si separano i due comandi con | ed i due programmi verranno eseguiti contemporaneamente con il sistema operativo che passa i dati in uscita dal primo nell'ingresso del secondo. Esempio di calcolo di occupazione di spazio su disco dei file o directory in ordine crescente di occupazione:
du -s * | sort -n

2011-05-07

Eseguire comandi esterni con vim l'editor

Quando si sta editando un file capita di dover eseguire qualche comando da shell, in questo vim viene in aiuto con alcuni comandi, se va aperta una shell per eseguire una serie di comandi si può digitare:
:sh<INVIO>
e viene presentato il prompt della nuova shell nella quale eseguire i comandi, per tornare a vim va fatta terminare la shell con exit oppure <Ctrl>D.

bc - calcolatrice a linea di comando per Unix / Linux

bc è un programma presente in Unix dal 1975 e sviluppato da due programmatori dei Bell Labs, nella versione iniziale bc era un front-end al programma dc, ovvero ne semplificava l'utilizzo mettendo a disposizione una sintassi simile al linguaggio C.
Il progetto GNU ne ha realizzato una versione che non si basa più su dc ed implementa nuove funzioni.
bc essendo un calcolatore permette anche di eseguire semplici somme, sottrazioni, moltiplicazioni e divisioni, sembra strano ricorrere alla linea di comando per eseguire dei calcoli quando ormai, tutte le distribuzioni mettono a disposizione calcolatrici con interfaccia grafica che possono soddisfare le esigenze di calcolo che si presentano quotidianamente. Personalmente sono rimasto fedele a bc da quando il mio accesso ai sistemi Unix era limitato ai terminali a carattere.
I calcoli semplici sono di immediata formulazione, riporto un esempio di utilizzo di bc con esempi di semplici calcoli ( in grassetto i comandi digitati ):
$ bc
3*6
18
45+30
75
.+10
85 
scale=2
22/7
3.14

quit
$
Si può notare che bc non presenta un prompt e quello che viene digitato viene interpretato al momento in cui si preme INVIO ed il risultato viene mostrato nella riga seguente. se la sintassi è sbagliata o si verifica un altro tipo di errore viene indicato con il relativo messaggio; per uscire viene mostrato nell'esempio il comando quit ma un semplice <Ctrl>D è sufficiente per chiudere bc.

2011-05-05

Esecuzione del comando precedente con sudo in bash

Se vi capita spesso di amministrare un sistema Unix/Linux e, come è giusto, non avete effettuato il login come root, potrebbe succedervi, come succede a me, di dimenticare di aggiungere sudo prima di un comando che necessita dei permessi di superuser, in questo caso l'operazione più noiosa sarebbe quella di scrivere un nuovo comando iniziando con sudo e poi riscrivere interamente il comando precedente, spero per voi che non facciate in questo modo, ci sono metodi un po' più veloci, se il comando da ripetere è breve potrebbe essere accettabile ma molti comandi sono lunghi, complessi e nascondo insidie da evitare.

2011-05-02

Evidenziare la ricerca con vim l'editor

Con vim per effettuare una semplice ricerca si usa il comando / ( slash ), se la ricerca ha esito positivo il cursore si posiziona all'inizio della stringa trovata, inoltre, può essere utile evidenziare tutte le stringhe trovate e, se non è già abilitata dalla configurazione predefinita, si può attivare tale funzione con :set hlsearch ( abbreviato: :se hls ), in tal modo verrà visualizzata in colori inversi in modo da essere evidenziata rispetto al resto del testo. La funzione che evidenzia la ricerca può essere disattivata, quando non serve, con :set nohlsearch ( abbreviato: :se nohls ).

2011-04-29

Copia di righe con vim l'editor

Vi o nella versione "improved" vim, va ammesso che può risultare un po' ostico. Ho usato un eufemismo? Ebbene si! Vediamo oggi come si possono copiare una serie di righe da un punto ad un altro di un file di testo con vim (l'ostico).

Supponiamo di voler prendere le righe nell'intervallo da 12 a 18 e copiarle dopo la linea 30.
I modi per poter eseguire la copia in vim sono molteplici, provo ad elencarli sperando di non risultare troppo noioso, premessa: tutte le modalità vanno eseguite partendo dalla modalità COMANDO, nel dubbio premete il tasto <ESC>

2011-04-22

Unix e la sua storia

Girando per blog mi sono imbattuto nel post Storia di UNIX: Ma che cosa è UNIX esattamente? in Ubuntulandia.  Lo trovo molto interessante, riassume la storia di Unix e suoi derivati, mi sembrava il caso di segnalarlo dopo aver segnalato pochi giorni fa il sito per consultare i sorgenti storici di Unix.

Aprire due file contemporaneamente con vim - gestione finestre

Il classico editor di testo vi, il mio preferito in ambienti Unix, ha un degno successore: vim che ha ampliato di molto le funzionalità messe a disposizione dell'utente.
Una caratteristica che ritengo molto utile é quella che permette di aprire due o più file e vederli nello stesso schermo che viene diviso, da righe orizzontali, per separare visivamente i contenuti dei diversi file, uno per ogni finestra.
Se all'apertura di vim si conoscono già i nomi dei file da aprire si possono fornire come parametri aggiungendo l'opzione -o; se la necessità si presenta quando la sessione di editing del primo file è già avviata si può eseguire il comando :split .

2011-04-19

Ricerca di un comando precedente con bash - Il punto esclamativo (!)

Nel post Ricerca di un comando precedente con bash - Ctrl-R ho accennato, in un tuffo nel passato, a qualche utilizzo dei comandi per ricercare e ripetere comandi precedentemente digitati; ce ne sono tanti altri ed alcuni anche poco immediati e difficilmente memorizzabili. Ritengo che un comando per essere utilizzabile debba essere facile da ricordare, velocizzare notevolmente l'esecuzione dell'attività in corso e utilizzabile di frequente.
Come dicevo ci sono molti comandi ! o meglio il comando della shell è uno e si chiama history, con questo comando si possono ottenere gli ultimi comandi memorizzati dalla shell, davanti ad ogni comando viene riportato un numero che identifica univocamente il comando precedente.
Il carattere ! viene descritto nella sezione History Expansion della documentazione di bash in particolare ma anche di altre shell.

2011-04-08

Unix alle origini

Oggi, cercando informazioni per il post precedente sulla Bourne shell mi sono imbattuto nei sorgenti delle prime versioni di Unix.

All'indirizzo: http://minnie.tuhs.org/cgi-bin/utree.pl sono leggibili i sorgenti e manuali di alcune delle vecchie versioni di Unix e suoi derivati, i primi risalgono a Novembre 1971, sono i primi sviluppati da Ken Thompson e Dennis Ritchie per il PDP-11 e sono solo in Assembly perchè il C arrivò nel 1972 proprio per velocizzare lo sviluppo ed aumentare la portabilità di Unix; nella directory man sono presenti anche le pagine dei manuali da cui si può ad esempio evincere lo stato primordiale dei programmi e le scarse funzionalità disponibili; dopo tutto il motto era: "poche cose ma fatte bene".

Ricerca di un comando precedente con bash - Ctrl-R

Bash è una delle shell testuali più diffuse, fa parte del progetto GNU ed è l'evoluzione della Bourne shell, dal quale deriva il nome di cui "bash" è l'acronimo: "Bourne Again SHell".
Oggi per bash voglio affrontare l'argomento della ricerca di un vecchio comando se ci si ricorda almeno una parte di esso e non si vuole riscrivere tutto.
Esiste la combinazione -R che attende che si inizi a digitare qualche carattere e viene visualizzato l'ultimo comando che contiene la serie di caratteri digitati, quando il comando visualizzato è quello desiderato si può battere per rieseguirlo senza correzioni oppure battendo la freccia verso sinistra o verso destra si entra nella modalità di correzione che permette di modificare il comando prima di sottometterlo.

2011-01-18

Link in unix/linux - 4 - utilizzi

Nei post precedenti ho descritto i link nelle piattaforme unix-like poi ho distinto i link tra fisici e simbolici ed ho riportato le differenze tra i due tipi.
Ora passiamo a descrivere qualche utilizzo dei link.

2011-01-10

Link in unix/linux - 2 - i link fisici / hard link

Per analizzare la differenza tra i due tipi di link, che ricordo essere fisici o simbolici, riprendiamo l'output della prima serie di comandi del post precedente, i primi due file file1 e file2 oltre ad avere la stessa dimensione hanno anche il numero 2 nel secondo campo in cui il comando ls -l riporta solitamente il numero 1, difficilmente si nota questo campo e molti non ne conoscono nemmeno il significato.

2011-01-09

Link in unix/linux - 1


In Linux, unix e tutti i sistemi da essi derivati i link rivestono un ruolo molto importante, per questo è bene conoscerne le caratteristiche ed il comportamento.
Esistono due tipi di link, quelli fisici (o hard nella terminologia inglese) e quelli simbolici (o symbolic). I due tipi si differenziano principalmente nella natura e di conseguenza hanno comportamenti e vincoli diversi, il comando da eseguire per creare dei link dalla shell è ln, senza opzioni per i link fisici e con l'opzione -s per quelli simbolici; i parametri da fornire sono il file origine del collegamento ed il nuovo file che sarà collegato al primo, per esempio:
echo "contenuto del file originale" >file1
ln file1 file2
ln -s file1 file3
ls -l file*
ogni singolo comando viene eseguito senza generazione di output ad eccezione dell'ultimo che mostrerà l'effetto dei primi tre ovvero file1 che il comando echo tramite la direttiva di redirezione ha creato con la stringa fornita come parametro. file2 che ha la stessa identica dimensione di file1 e come vedremo in seguito lo stesso contenuto.
file3 di dimensione di soli 5 byte.

2010-12-24

Screen utility per condivisione shell


screen è un utility che ricordo aver usato circa 25 anni or sono.
Si tratta di un comando che permette di attivare numerose sessioni contemporanee sulla stessa console, si passa da una sessione (che viene sospesa) ad un'altra e si riottiene la schermata che si aveva al momento in cui è stata sospesa.
L'intera sessione di lavoro può essere sospesa e ripresa in seguito riottenendo tutte le sessioni aperte.