# At (Unix)

at è un comando dei sistemi operativi Unix e Unix-like, e più in generale dei sistemi POSIX, che permette di far eseguire uno o più comandi in un dato momento nel futuro, senza che sia richiesta la presenza dell'utente. Usando ripetutamente il comando at è possibile accodare più gruppi distinti di comandi, da eseguirsi in momenti diversi.
L'eventuale output prodotto dai comandi (lo standard output e lo standard error), se non specificato diversamente, verrà inviato tramite email all'utente che li ha accodati. Quest'ultimo può anche farsi notificare via email del completamento dell'esecuzione dei comandi.
Il comando batch è una variante del comando at che usa impostazioni predefinite diverse tali da eseguire quanto prima i comandi usando una priorità inferiore a quella normalmente usata da at. Di fatto equivale al comando at -m -q b now, che esegue i comandi non appena il sistema non ha altre operazioni urgenti da eseguire e che notifica via email anche il completamento dell'esecuzione.
L'ambiente in cui i comandi sono eseguiti è reso per quanto possibile simile a quello in cui essi sono stati specificati. In altre parole, oltre ai comandi stessi, sono memorizzati anche:
* l'utente che ha specificato i comandi;
* la directory corrente;
* le variabili d'ambiente;
* il valore di umask.
Se non specificato diversamente, at legge la sequenza dei comandi da eseguire dallo standard input (un comando per linea) fino all'esaurimento dei dati (nell'uso interattivo in un terminale è tipicamente possibile indicare ciò con la sequenza Ctrl-D).
Un gruppo di comandi accodati prende il nome di at-job (un job di at), a cui il sistema assegna un identificativo univoco che permette di farvi riferimento in seguito, ad esempio per annullare una esecuzione.

## Uso

Il comando at può essere invocato in più modi a seconda che si vogliano accodare comandi da eseguire, elencare i comandi accodati oppure annullare un gruppo di comandi accodati.

### Accodare comandi

In questo caso esistono due modi di invocare il comando che differiscono solo nel modo in cui viene specificato l'istante in cui eseguire i comandi.
La prima forma è la seguente:
L'istante data_e_ora viene specificato secondo il formato che segue (che è lo stesso usato nel comando touch):
* anno a quattro oppure due cifre (facoltativo);
* mese a due cifre;
* giorno a due cifre;
* ore a due cifre;
* minuti a due cifre;
* un punto seguito dai secondi a due cifre (facoltativo)
Ad esempio, per esprimere le 15:30:23 del 22 luglio 2009, si può usare -t 200907221530.23.
La seconda forma è invece la seguente:
L'istante è specificato tramite il parametro timespec, composto di più parti:
* ore e minuti, opzionalmente seguiti da AM o PM se si usa il formato a 12 ore ed eventualmente anche dal nome di un fuso orario se non si vuole usare quello corrente. I formati riconosciuti sono:
** H o HH: ore, a una o due cifre (es. 14);
** HHMM: ore a due cifre e minuti a due cifre (es. 1403);
** HH:MM: ore a una o due cifre e minuti a una o due cifre (es. 14:3);
** midnight: mezzanotte;
** noon: mezzogiorno;
** now: l'ora corrente;
* data (facoltativa). Se viene omessa, si intende la data corrente, o quella del giorno successivo se l'ora indicata è già trascorsa. I formati riconosciuti sono:
** MMM DD: il nome (abbreviato o meno) del mese seguito dal numero del giorno (es. mar 15 per indicare il 15 marzo). Se il giorno è già trascorso, si intende lo stesso giorno dell'anno successivo;
** MMM DD,YYYY: il nome (abbreviato o meno) del mese seguito dal numero del giorno e dall'anno (es. mar 15,2031 per indicare il 15 marzo 2031);
** DDD: nome del giorno della settimana. Viene considerata la settimana corrente, o quella successiva se il giorno è già trascorso;
** today: il giorno odierno;
** tomorrow: l'indomani;
* scostamento (facoltativo): specifica un intervallo di tempo da aggiungere alla data e ora specificate in precedenza.
** + N minutes: N minuti dopo l'istante indicato;
** + N hours: N ore dopo l'istante indicato;
** + N days: N giorni dopo l'istante indicato;
** + N weeks: N settimane dopo l'istante indicato;
** + N months: N mesi dopo l'istante indicato;
** + N years: N anni dopo l'istante indicato;
Tra le opzioni che possono essere specificate vi sono:

#### -f file

    Legge i comandi da eseguire dal file avente il nome specificato anziché dallo standard input.

#### -m

    Notifica l'utente anche del completamento dell'esecuzione dei comandi accodati (utile nel caso i comandi non producano alcun output).

#### -q coda

    Specifica a quale coda di esecuzione vanno aggiunti i comandi. Il parametro coda è tipicamente una singola lettera, e se l'opzione non è specificata il comportamento predefinito prevede di usare la coda a se si usa il comando at, e la coda b se si usa il comando batch. In generale, quanto presente nella coda di esecuzione a sarà eseguito con priorità maggiore rispetto a quanto presente nella coda di esecuzione b, e così via fino alla lettera z (ad esempio, nell'implementazione presente nei sistemi GNU/Linux viene usato un valore di nice tanto maggiore quanto più ci si avvicina alla lettera z).

### Elencare i comandi accodati

In questo caso vi sono due forme:
elenca informazioni sugli at-job dell'utente corrente che sono accodati nella coda specificata.
elenca informazioni sugli at-job dell'utente corrente identificati dai parametri job_id. Se non è specificato alcun job_id, elenca tutti quelli presenti al momento.
In alcuni sistemi, tra cui ad esempio Debian GNU/Linux, esiste anche il comando atq, che equivale al comando at -l.

### Annullare comandi

In questo caso la sintassi è la seguente:
Il parametro job_id è l'identificativo assegnato dal sistema al gruppo di comandi che si vuole annullare.
In alcuni sistemi, tra cui ad esempio Debian GNU/Linux, occorre specificare l'opzione -d anziché l'opzione -r, ed esiste il comando equivalente atrm.

## Esempi

Esegue dopo venti minuti i comandi cd /tmp e ls -l:
Esegue il comando mpg123 urlo.mp3 alle 02:30 del 1º novembre:
Elenca i comandi accodati per l'utente corrente:
Elimina i comandi programmati per il 1º novembre, che hanno identificativo 11: