Come configurare smartphone e PC. Portale informativo
  • casa
  • Errori
  • La shell comanda ubuntu. Come automatizzare i backup pianificati

La shell comanda ubuntu. Come automatizzare i backup pianificati

Non appena arriva dispositivo Linux e lavori più o meno professionali con questo OS, negli esempi la riga di comando si pone subito e comincia a dominare. Da cui è facile concludere che questa è l'interfaccia di gestione del sistema principale (e standard) in Linux. Lo stesso lettore perspicace farà probabilmente la domanda: chi sta eseguendo i comandi inseriti in riga di comando? La risposta "sistema" si rivela sbagliata: non esiste un oggetto separato in Linux chiamato "sistema". Un sistema è un sistema costituito da numerosi componenti che interagiscono tra loro.

La risposta corretta, come al solito, risulta essere più complicata. È necessario un sistema operativo, in particolare, in modo che i programmi possano essere scritti senza pensare ai dettagli del dispositivo del computer e ai suoi dettagli, a partire dal processore e dall'hard disk (diciamo, a livello di "file aperto", e non sequenza di comandi per muovere la testa disco rigido). Il sistema operativo controlla l'hardware stesso e i programmi sono dotati di un "linguaggio" di un livello di astrazione abbastanza elevato, che copre tutte le loro esigenze, il cosiddetto. API... Ma un linguaggio del genere non è adatto ai comandi utente, poiché è ancora di livello troppo basso (per risolvere anche l'attività utente più semplice, è necessario eseguire diverse operazioni di questo tipo) e puoi usarlo solo scrivendo un programma (il più delle volte in C). Diventa necessario inventare un linguaggio di controllo del sistema diverso, di livello superiore e più conveniente per l'utente. Tutti i comandi che puoi inserire sulla riga di comando sono formulati in questa lingua.

Da cui è facile per il lettore attento concludere che processare questi comandi, traducendoli nel linguaggio del sistema operativo, dovrebbero essere anche alcuni programma speciale, ed è con lei che l'utente dialoga, lavorando con la riga di comando. Così è: questo programma si chiama interprete della riga di comando o shell di comando("Conchiglia"). Si chiama "shell" proprio perché tutto il controllo del sistema è come se fosse "dall'interno": l'utente comunica con esso in un linguaggio a lui comodo (usando una riga di comando testuale), e comunica con altre parti del sistema in un comodo loro lingua (richiamando le funzioni programmate).

Naturalmente, ci sono diverse shell in Linux. Il più semplice di questi, apparso nelle prime versioni di UNIX, era chiamato sh, o "Bourne Shell", dal nome dell'autore, Stephen Bourne. Nel corso del tempo, è stato - ove possibile - sostituito con un più potente, bash, "Bourne Again Shell" (2) bash supera sh in tutto, specialmente nelle capacità la modifica riga di comando. Oltre a sh e bash, "The Z Shell", zsh, più un potente interprete di comandi oggi (solo uno scherzo, 22mila righe di documentazione), o tcsh, una versione aggiornata e anche molto potente della vecchia "C Shell", la cui sintassi dei comandi è simile al linguaggio di programmazione C.

Sintassi della riga di comando

Quindi cos'è esattamente questo linguaggio più user-friendly? Soprattutto, la comunicazione in questa lingua assomiglia a un dialogo scritto con il sistema - uno scambio alternativo di testi. L'istruzione dell'utente in questa lingua è un comando, ogni comando è una riga separata. Non ancora premuto accedere, la riga può essere modificata, quindi viene passata alla shell. Conchiglia analizza il comando ricevuto - lo traduce nella lingua degli oggetti e delle funzioni di sistema, quindi lo invia al sistema per l'esecuzione.

Il risultato dell'esecuzione di moltissimi comandi è anche un testo che viene visualizzato come "risposta" all'utente. Sebbene non richiesto, il team può svolgere il proprio lavoro in totale silenzio. Inoltre, se si verificano circostanze particolari (ad esempio un errore) durante l'esecuzione del comando, la shell includerà nella risposta all'utente messaggi diagnostici.

Comando e parametri

Il comando più semplice è costituito da una "parola", ad esempio il comando cal, che visualizza il calendario per il mese corrente.

$ cal
giugno 2008
Dom Lun Mar Mer Gio Ven Sab
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

$

Esempio 1... Comando di calibrazione


E se hai bisogno di guardare il calendario per il prossimo mese? È vero, non dovresti inventare un comando separato per questo, cal farà fronte a questo compito abbastanza bene, solo il suo comportamento deve essere leggermente modificato:

$ cal 7 2008
luglio 2008
Dom Lun Mar Mer Gio Ven Sab
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

Esempio 2... Comando di calibrazione con parametri


Si scopre che il comando cal 7 2008 è composto da almeno due parti: il comando cal stesso e "tutto il resto". Questa pausa che segue il comando si chiama parametri(o argomenti), e vengono introdotti per modificare il comportamento del comando. La maggior parte delle volte durante l'analisi della riga di comando primo la parola è considerata il nome del comando e il resto sono i suoi parametri.

Le parole

Durante l'analisi della riga di comando, la shell utilizza il concetto delimitatore(delimitatore). Un separatore è un carattere che separa le parole; quindi la riga di comando è la sequenza parole(che importa) e Delimitatori(che non importa). Per la shell, i delimitatori sono il carattere spazio, il carattere di tabulazione e il carattere di avanzamento riga. Il numero di separatori tra due parole adiacenti non ha importanza.

Per colpire il separatore dentro parole (e la stringa delimitata risultante è stata passata come uno parametro), l'intera sottostringa richiesta deve essere racchiusa tra virgolette singole o doppie: $ echo Uno Due Tre
Uno due tre
$ echo Uno "Due Tre"
Uno due tre
$ echo "Uno
>
> Ah. Allora, qual è il prossimo?
> Oh, ho dimenticato le virgolette!"

Esempio 3... Citando sulla riga di comando


Tutto quanto sopra significa che il comando ha tanti parametri quanti sono parole dal punto di vista della shell, lo segue sulla riga di comando. La prima parola della tripletta è passata al comando come primo parametro, la seconda come secondo e così via.Nel primo caso è stato passato il comando echo tre parametri - "Uno", "Due" e "Tre". Li ha tirati fuori, separandoli con uno spazio. Nel secondo caso, i parametri erano Due: “Uno” e “Due Tre”. Di conseguenza, questi Due anche i parametri sono stati emessi separati da uno spazio. Nel terzo caso, il parametro era solo uno- dall'apostrofo di apertura ""Uno" alla chiusura"...dimenticavo!" ”. Per tutto il tempo che bash digitava, chiedeva cortesemente ">" - come segno che la riga di comando sta ancora digitando, ma nella modalità di inserimento del contenuto delle virgolette.

chiavi

Per risolvere problemi diversi, le stesse azioni devono essere eseguite in modo leggermente diverso. Ad esempio, per sincronizzare i lavori in punti diversi sul globo, è meglio utilizzare la stessa ora per tutti (Greenwich Mean Time) e organizzare la propria giornata lavorativa - ora locale (tenendo conto dello spostamento del fuso orario e della differenza tra l'ora legale e quella invernale). Entrambi gli orari sono mostrati dal comando date, solo per funzionare in Greenwich Mean Time ha bisogno di un parametro aggiuntivo “-u” (aka “--universal”).


Lun 16 giugno 18:03:44 MSD 2008
$ data -u
Lun 16 giugno 14:03:46 UTC 2008

Esempio 4... Comando data con chiave


Questi tipi di parametri sono chiamati modificatori di esecuzione o chiavi(opzioni). La chiave appartiene a questo particolare comando e di per sé non ha senso, in che modo differisce da altri parametri (ad esempio nomi di file, numeri) che hanno possedere il che significa che non dipende da alcun comando. Ogni comando può riconoscere un determinato set di chiavi e modificarne il comportamento di conseguenza. Di conseguenza, "lo stesso" interruttore, ad esempio "-s", può significare cose completamente diverse per comandi diversi.

Non esiste uno standard rigido per il formato della chiave, ma ci sono accordi che non sono più appropriati per rompere questi giorni. Innanzitutto, se il parametro inizia con "-", è - chiave di una lettera... Il "-" è solitamente seguito da un carattere, molto spesso una lettera che indica un'azione o una proprietà che questo tasto assegna a un comando. Ciò semplifica la distinzione delle chiavi da altri parametri, sia per l'utente durante la digitazione della riga di comando, sia per il programmatore, l'autore del comando.

In secondo luogo, è desiderabile che il nome della chiave sia significativo- di norma, questa è la prima lettera del nome dell'azione o della proprietà indicata dal tasto. Ad esempio, la chiave -a nell'uomo e che deriva dalla parola UN ll ”(tutti) e cambia il modo in cui funzionano questi comandi in modo che inizino a mostrare informazioni che di solito non sono coperte. E nel cal e who comanda, il significato dell'interruttore "-m" è diverso:

$ chi -m
methody tty1 20 settembre 13:56 (localhost)
$ cal -m
giugno 2008
Lun Mar Mer Gio Ven Sab Dom
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

Esempio 5... Utilizzo dell'interruttore "-m" in diversi comandi


Per chi, l'interruttore "-m" significa " m e ", cioè," I ", e di conseguenza chi lavora in modo simile a whoami. E per cal, il tasto “-m” è un comando per visualizzare il calendario, considerando il primo giorno Lunedim onday "), come è consuetudine in Russia.

La proprietà di una chiave di essere, da un lato, estremamente breve e, dall'altro, informativa, si chiama abbreviazioni... Non solo le chiavi, ma anche i nomi dei comandi Linux più comuni hanno questa proprietà.

Terzo, a volte un'opzione modifica il comportamento di un comando in modo tale che cambia anche l'interpretazione del parametro che segue questa opzione sulla riga di comando. Sembra una chiave me stessa riceve un parametro, quindi vengono chiamate chiavi di questo tipo parametrico... Di norma, i loro parametri sono nomi di file per varie applicazioni, caratteristiche numeriche e altro. senso che deve essere passato alla squadra. -s 00:00
data: la data non può essere impostata: Operazione non consentita
lun giu 16 00:00:00 MSK 2008
$ data
Lun 16 giugno 18:30:53 MSK 2008

Esempio 6... Usando la data -s


L'opzione -s del comando date consente di impostare ora di sistema al valore specificato come parametro di questa chiave. Tuttavia, in questo esempio questa operazione non è riuscita, come evidenziato dall'output messaggio di errore... Privilegi necessari per modificare l'orologio di sistema amministratore di sistema, e nel nostro esempio, questo comando è stato eseguito come un utente normale. Tuttavia, la data mostrava ancora l'ora che doveva essere impostata, sebbene l'orologio di sistema rimanesse invariato.

Le chiavi sono difficili da abbreviare quando la squadra le ha troppo quantità. Alcune lettere alfabeto latino(ad esempio, "s" o "o") sono usati molto spesso e potrebbero servire come abbreviazione per diversi comandi contemporaneamente, e alcuni (ad esempio "z") sono rari ed è difficile trovare un nome significativo sotto di loro. In tal caso, c'è un altro, lunghezza intera formato: il tasto inizia con Due un segno "-" seguito da completare il nome dell'ente designato. Questo è, ad esempio, l'interruttore "--help" (analogo a "-h"): $ head --help
Utilizzo: head [KEY] ... [FILE] ...
Stampa le prime 10 righe di ogni FILE sullo standard output.
Se vengono forniti più FILE, stampa prima un'intestazione con il nome del file.
Se FILE non è specificato o è specificato come -, legge l'input standard.

Gli argomenti richiesti per le chiavi lunghe sono necessari anche per le chiavi brevi.
-c, --bytes = [-] N stampa i primi N byte di ogni file;
ultimi byte di ogni file
-n, --lines = [-] N stampa le prime N righe di ogni file, non 10;
se N è preceduto da `-", stampa tutto tranne N
ultime righe di ogni file
-q, --quiet, --silent non stampa le intestazioni con i nomi dei file
-v, --verbose stampa sempre le intestazioni con i nomi dei file
--help mostra questo aiuto ed esci
--version mostra le informazioni sulla versione ed esce

N può avere un suffisso moltiplicatore: b 512, k 1024, m 1024 * 1024.

Si prega di segnalare i bug a .

Esempio 7... Chiave – aiuto


Puoi vedere che alcuni tasti della testa hanno sia il formato a lettera singola che a parola intera e alcuni solo a parola intera. Di solito è così: le chiavi usate di frequente sono abbreviate, ma quelle rare no. I valori parametrico lunghezza interaÈ consuetudine passare le chiavi non come parametro successivo della riga di comando, ma utilizzando il "= senso«Subito dopo la chiave.

In quarto luogo, ci sono alcuni accordi meno rigorosi ma popolari su senso chiavi. Il tasto "-h" (" h elp ") di solito (ma, ahimè, non sempre) forza i comandi da impartire riferimento rapido... Infine, a volte è necessario trasmettere alla squadra parametro, non chiave Iniziare con "-". Per fare ciò, è necessario utilizzare il tasto "-": $ head -1 -nomefile-con-
head: opzione non valida - f
Prova `head --help" per ulteriori informazioni descrizione dettagliata.
$ head -1 - -nomefile-con-
Prima riga del file -nomefile-con-

Esempio 8... Il parametro non è una chiave che inizia con "-"


L'opzione "-" (il primo "-" è un segno dell'interruttore, il secondo è l'interruttore stesso) di solito impedisce al comando di interpretare tutti i successivi parametri della riga di comando come opzioni, indipendentemente dal fatto che inizino con "-" o meno . Solo dopo il "-" head ha accettato che -filename-with- fosse il nome del file.

Sinossi

Da tutto quanto sopra, è chiaro che ogni comando ha il suo piccolo linguaggio: consiste nelle chiavi e nei parametri obbligatori e facoltativi che il comando accetta e interpreta. Per dare un'occhiata alle capacità del comando, fornisce varie documentazioni di Linux sinossi- un elenco conciso di tutti i possibili parametri di comando. Sembra così:

Cal [-smjy13] [anno]

Esempio 9... Sinossi per il comando cal


La sinossi dà formalizzato una descrizione di come usare l'oggetto (con in questo caso- come e con quali parametri eseguire il comando cal). I parametri sono elencati nello stesso ordine in cui devono essere immessi nella riga di comando, i parametri opzionali sono generalmente indicati tra parentesi quadre, quelli obbligatori senza parentesi e le chiavi per la compattezza sono raccolte in un parametro, in cui ogni lettera è una chiave a parte... L'esempio sopra recita così: il comando cal no parametri richiesti, ci sono i tasti (opzionali) (-s, -m, ecc.) e un parametro facoltativo anno, preceduto da un mese facoltativo (ma non è possibile specificare un mese senza anno).

Da dove vengono i comandi

Dopo aver letto la sezione precedente, il lettore più attento dovrebbe aver pensato qualcosa del genere: sì, beh, abbiamo capito un po' con i comandi e i parametri (cioè con la grammatica della riga di comando), ora armaci di un elenco di tutti i Linux comandi (in altre parole, un dizionario), e mettiamoci al lavoro. Perché un elenco del genere non viene stampato da nessuna parte? Più precisamente, ci sono molti elenchi diversi di squadre e sono tutti ovviamente incompleti e non sono d'accordo su tutto. Ci sono due parti per la risposta a questa domanda.

Parte 1: comandi e utilità

Shell, l'interprete dei comandi, è una "shell" non solo per l'utente, ma anche per i comandi: lui stesso quasi non esegue alcun comando, passa il sistema. Il suo compito è analizzare la riga di comando, estrarre il comando e i parametri da essa, quindi eseguire utilità- un programma il cui nome è lo stesso del nome del comando.

Se guardi "dall'interno" dell'interprete dei comandi, lavorare con la riga di comando è qualcosa del genere: l'utente inserisce una riga (comando), la shell la legge, a volte - si converte in certe regole, la stringa risultante viene suddivisa in un comando e parametri, quindi esegue l'utilità, passandole questi parametri. L'utility, a sua volta, analizza i parametri, seleziona le chiavi tra di loro e fa quanto richiesto, visualizzando i dati per l'utente durante il percorso, quindi completa. Al termine dell'utilità, l'interprete dei comandi, che è passato in secondo piano, riprende, legge di nuovo la riga di comando, la analizza, richiama il comando ... Questo continua finché l'utente non comanda la shell fine stesso (usando il comando logout o il carattere di controllo Ctrl + D).

Tuttavia, la shell esegue ancora da sola alcuni dei comandi (più piccoli), senza chiamare alcuna utilità. Alcuni comandi, i più utili, sono incorporati in bash, anche se sono disponibili come utilità (come echo). Il comando integrato funziona allo stesso modo, ma poiché impiega molto meno tempo per eseguirlo, la shell lo sceglierà, se possibile. In bash, il tipo di comando può essere determinato utilizzando il comando type. Vengono chiamati i comandi bash nativi integrato(comando integrato) e per le utilità stampa sentiero contenente il nome della directory contenente il file con il programma corrispondente e il nome di questo programma. Il tasto "-a" (" un ll ", ovviamente) fa sì che il tipo venga stampato tutto possibili opzioni per interpretare il comando e l'opzione "-t" - stampa il tipo di comando invece del percorso.

$ digita data
info è / bin / data
$ digita eco
echo è una shell incorporata
$ digita -a echo
echo è una shell incorporata
echo è / bin / echo
$ digita -a -t echo
integrato
file

Esempio 10... Determinazione del tipo di comando


Ci sono pochi comandi nativi nella shell. Fondamentalmente, questi sono gli operatori del linguaggio di programmazione e altri mezzi per controllare l'interprete stesso. Tutti i comandi che svolgono un lavoro significativo per l'utente sono rappresentati in Linux come utenze separate... Ecco la prima parte della risposta alla domanda su tutti Comandi Linux: sono tanti quanti sono i programmi (utility) scritti per Linux. Il loro elenco è un elenco di utilità installate sul sistema e in diversi sistemi sarà diverso.

Parte 2: la tua guida a tutto

Ogni oggetto nel sistema: all servizi di pubblica utilità, tutto demoni Linux, tutte le funzioni kernel e biblioteche, struttura maggioritaria file di configurazione infine, molti concetti speculativi, ma importanti - devono essere necessariamente accompagnati da documentazione che ne descriva lo scopo e le modalità di utilizzo. Pertanto, l'utente del sistema non è tenuto a memorizzare tutte le possibili opzioni per interagire con lei. Abbastanza comprendere i principi di base della sua struttura ed essere in grado di trovare informazioni di riferimento. Einstein l'ha messa in questo modo: "Perché memorizzare ciò che puoi sempre vedere in un libro di riferimento?"

Più diverso informazioni utili sono contenute in pagine di manuale (pagine man). Ogni pagina del manuale (per brevità, solo un "manuale") è dedicata ad un singolo oggetto del sistema. Per visualizzare la pagina di manuale, è necessario eseguire il comando man un oggetto : $ uomo cal
CAL (1) Manuale dei comandi generali BSD CAL (1)

NOME
cal - visualizza un calendario

SINOSSI
cal [-smjy13] [anno]

DESCRIZIONE
Cal visualizza un semplice calendario. Se gli argomenti non sono specificati,
viene visualizzato il mese corrente. Le opzioni sono le seguenti:
. . .

Esempio 11... Visualizza la pagina man


La "pagina man" di solito è più di una pagina schermo... Per rendere più facile la lettura, man esegue meno il programma pagina per pagina. Operare di meno è semplice: le pagine vengono capovolte con uno spazio, e quando ti stanchi di leggere, devi premere “q” (Esci). Puoi girare le pagine usando i tasti Pagina su / Pagina giù, per passare da uno la linea avanti può essere applicata accedere o freccia giù e una riga indietro - freccia su. Il salto all'inizio e alla fine del testo viene eseguito dai comandi “g” e “G”, rispettivamente (Go). Lista completa quello che puoi fare con il testo in meno viene visualizzato con il comando "H" (Aiuto).

La pagina man è composta da campi- sezioni standard che descrivono l'oggetto da diverse parti. Quando leggi per la prima volta il tutorial, dovresti iniziare con i campi NAME (breve descrizione dell'oggetto) e DESCRIZIONE (descrizione dettagliata dell'oggetto, sufficiente per usarlo). Uno dei campi più importanti del manuale è alla fine del testo. Se, durante la lettura di NOME o DESCRIZIONE, l'utente si accorge di non aver trovato ciò che cercava nel manuale, potrebbe voler vedere se c'è Altro manuali o altre fonti di informazioni sullo stesso argomento... L'elenco di tali fonti è contenuto nel campo VEDI ANCHE:

$ uomo uomo
. . .
GUARDA ANCHE
a proposito (1), whatis (1), less (1), groff (1), man.conf (5).
. . .

Esempio 12... VEDI ANCHE Manuale da campo


Nel campo VEDI ANCHE, collegamenti a manuali su less, groff (il formattatore di pagine di manuale), struttura file di configurazione for man, così come i due comandi companion whatis e apropos per aiutarti a trovare il manuale che stai cercando. Entrambi funzionano con un database di campi NAME da tutte le pagine di manuale nel sistema. La differenza tra loro è che whatis cerca solo tra i nomi degli oggetti (in sinistra parti dei campi NAME) e, a proposito, nell'intero database. Di conseguenza, whatis ottiene un elenco brevi descrizioni oggetti con nomi che includono la parola da cercare, mentre a proposito ha un elenco in cui questa parola è menzionato.

Diversi oggetti possono essere trovati nel sistema varie tipo, ma con lo stesso nome. Spesso gli stessi nomi chiamate di sistema(funzioni kernel) e utilità che consentono di utilizzare queste funzioni dalla riga di comando. Quando si fa riferimento al manuale su un oggetto di sistema, è consuetudine mettere il numero della sezione tra parentesi tra parentesi subito dopo il nome dell'oggetto, che contiene il manuale su questo oggetto: man (1), less (1), password (5). Questo formato rende facile capire cos'è la guida.

Il sistema manuale di Linux ha nove sezioni, ciascuna contenente pagine di manuale per gli oggetti di un certo tipo... Tutte le sezioni contengono un manuale denominato "intro", in cui in vista generale e gli esempi mostrano a quale tipo di oggetti sono correlati questa sezione... L'elenco delle sezioni con i titoli può essere ottenuto con il comando whatis intro.

Per impostazione predefinita, l'uomo guarda tutte le sezioni e gli spettacoli primo trovato leadership con nome di battesimo... Per visualizzare il manuale di un oggetto di una sezione specifica, è necessario specificare il numero della sezione come primo parametro del comando man, ad esempio man 8 passwd.

Un'altra fonte di informazioni su Linux e sui suoi programmi costitutivi è il sottosistema info help. La pagina di manuale, nonostante l'abbondanza di link di vario tipo, rimane un testo “lineare”, strutturato solo logicamente. Il documento informativo è un vero e proprio ipertesto, con molti pagine piccole combinati in un albero. In ogni sezione del documento informativo è sempre presente un sommario, dal quale si può passare direttamente alla sottosezione desiderata, da cui si può sempre tornare indietro. Inoltre, il documento informativo può essere letto come continuo testo, quindi ogni sottosezione ha collegamenti alle sottosezioni precedenti e successive. Puoi indovinarlo manuale dettagliato come navigare tra le pagine in info può essere ottenuto dal comando info info. Il comando info, inserito senza parametri, presenta all'utente un elenco di tutti i documenti info installati sul sistema.

Se qualche oggetto di sistema non è documentato né in formato man né in formato info, questo non va bene. In questo caso si può sperare che con lui ci sia Documentazione di supporto, che, ahimè, non ha un formato standard, tanto meno collegamenti a manuali per altri oggetti del sistema. Tale documentazione (così come gli esempi di utilizzo dell'oggetto) è solitamente collocata nella directory /usr/share/doc/. nome_oggetto .

La maggior parte della documentazione è scritta in inglese semplice. Se l'inglese non lo è lingua nativa per l'autore della documentazione, sarà solo più facile. La tradizione di scrivere in inglese deriva da un significativo contributo degli Stati Uniti allo sviluppo informatica in generale e Linux in particolare. Inoltre, l'inglese sta diventando la lingua della comunicazione internazionale in tutti i settori, non solo nel computer. La necessità di scrivere in un linguaggio che sarà più o meno compreso dalla maggior parte degli utenti è dovuta al costante sviluppo di Linux. Non è che la pagina di manuale non possa essere tradotta, ma dovrà essere tradotta. ogni volta quando l'oggetto che descrive cambia! Ad esempio, il rilascio di una nuova versione di un prodotto software è accompagnato da un cambiamento nelle sue capacità e caratteristiche di lavoro e, di conseguenza, una nuova versione della documentazione. Poi traduzione questa documentazione si trasforma in un "bersaglio mobile", opera di Sisifo.

Tuttavia, alcune delle guide più aggiornate esistono in traduzione russa. Le versioni più recenti di tali traduzioni in russo sono raccolte nel pacchetto man-pages-ru - basta installare questo pacchetto e quei manuali per i quali esiste una traduzione, man verranno visualizzati in russo per impostazione predefinita.

Variabili ambientali

Oltre ai parametri passati sulla riga di comando, in Linux c'è un altro modo per modificare il comportamento del programma - per questo usano variabili ambientali... Per spiegare come funzionano le variabili di ambiente, è necessaria una piccola digressione sul modo in cui i processi interagiscono in Linux.

Il programma in esecuzione viene chiamato in Linux processi... Ogni processo avviato è dotato dal sistema di un determinato spazio informativo, che questo processo ha il diritto di modificare a suo piacimento - questo è ambiente(in ambiente inglese). Le regole per l'utilizzo di questo spazio sono semplici: è possibile definire archivi dati denominati ( variabili ambientali), in cui scrivere le informazioni desiderate (assegnare il valore a una variabile d'ambiente), quindi leggere queste informazioni (sostituire il valore della variabile).

I processi sono i principali attori del sistema. Quando l'utente invia i comandi sulla riga di comando, i nuovi processi per l'esecuzione di questi comandi (utilità esterne, ecc.) vengono avviati da un altro processo: la stessa shell che comunica con l'utente e riceve i comandi da lui.

La creazione di un processo da parte di un altro si chiama prodotto del processo e avviene in due fasi: la prima viene creata copia esatta originale, genitore process (la chiamata di sistema fork()), quindi una copia del processo viene sostituita con una nuova, filiale(exec() chiamata di sistema). È importante per noi ora che questa sostituzione conservi tutte le proprietà del processo originale e, in particolare, dell'ambiente.

Torniamo al lavoro dell'interprete dei comandi: quando esegue un comando, avvia l'utilità necessaria come processo figlio, attende il suo completamento (usando un'altra chiamata di sistema, wait()), analizza il risultato e continua il suo lavoro. L'utilità avviata riceve informazioni di due tipi dal processo padre (interprete dei comandi): parametri della riga di comando(non nella forma in cui l'utente li ha inseriti, ma dopo l'elaborazione secondo le regole dell'interprete dei comandi, sotto forma di un elenco sequenziale) e ambiente, ovvero tutte le variabili e i loro valori che sono stati definiti nell'ambiente del processo genitore.

È possibile utilizzare la stessa utilità lo stesso modo, ma in un ambiente cambiato - e produrre risultati diversi. L'utente può modificare esplicitamente l'ambiente per il processo avviato assegnando un valore alla variabile di ambiente sulla riga di comando davanti il nome del comando. La shell, vedendo il "=" all'interno della prima parola della riga di comando, conclude che si tratta di un'operazione di assegnazione, non di un nome di comando, e ricorda come modificare l'ambiente del comando che segue.

$ data
Lun 16 giugno 18:28:30 MSK 2008
$ LC_TIME = C data
Lun 16 giugno 18:28:51 MSK 2008

Esempio 13... L'utilità della data utilizza la variabile d'ambiente LC_TIME


La variabile d'ambiente LC_TIME indica di utilizzare una lingua specifica per la visualizzazione della data e dell'ora e il valore "C" corrisponde alla lingua del "sistema standard" (più spesso l'inglese).

Variabili che la shell bash definisce dopo i lanci non appartengono all'ambiente e quindi non vengono ereditati dai processi figlio. In modo che la variabile bash circondato, è necessario esportare con il comando di esportazione: $ LC_TIME = C
$ data
Lun 16 giugno 18:29:17 MSK 2008
$ export LC_TIME = C
$ data
Lun 16 giugno 18:29:38 MSK 2008

Esempio 14... Esportazione delle variabili della shell nell'ambiente


Durante una sessione utente, la shell ottiene un ambiente abbastanza ricco, al quale aggiunge le proprie impostazioni. La maggior parte delle variabili predefinite viene utilizzata dalla shell stessa o dalle utilità di sistema, quindi modificarle fa sì che la shell o le utilità si comportino in modo leggermente diverso. Visualizza ambiente in bash Puoi usare imposta comandi.

È possibile accedere al valore di qualsiasi variabile in bash per nome: invece di $ nome_variabile la shell sostituirà il valore di questa variabile. Ad esempio, per visualizzare il valore di una variabile, l'utente può immettere il comando echo $ nome_variabile .

Eco $ PATH
/ home / methody / bin: / bin: / usr / bin: / usr / local / bin: / usr / X11R6 / bin: / usr / games

Esempio 15... Uscita a valore variabile


La variabile d'ambiente PATH è piuttosto notevole. Contiene un elenco di directory, le cui voci sono separate da due punti. Se il comando sulla riga di comando non è un comando della shell (come cd) e non è rappresentato come la via al file eseguibile (come /bin/ls o./script), allora la shell cercherà questo comando tra i nomi dei file eseguibili in tutte le directory PATH, e solo in esse. Per questo motivo, i file eseguibili non possono essere avviati semplicemente per nome se si trovano nella directory corrente e la directory corrente non è nel PATH. In tali casi, è possibile utilizzare il percorso più breve possibile, "./" (ad esempio, richiamando lo script. / Script).

Variabili d'ambiente che influenzano il funzionamento diverso ci sono parecchie utilità. Ad esempio, variabili della famiglia LC_ (il loro elenco completo è dato dal comando locale) che determinano la lingua in cui vengono visualizzati i messaggi di diagnostica, gli standard per il formato delle date, le unità di valuta, i numeri, i metodi di conversione delle stringhe, ecc. Se alcune utility richiedono la modifica di un file, questo file viene passato al programma, il cui percorso è memorizzato nella variabile EDITOR (di solito / usr / bin / vi), e se è necessario aprire il file html, molte utility chiameranno il programma specificato nella variabile BROWSER per questo. Infine, alcune variabili come UID, USER o PWD contengono semplicemente informazioni utili che potrebbero essere recuperate in altri modi.

Un insieme di opzioni non standard: chi sono io fa lo stesso di chi -m.

  • Tutorial

Perché e per chi è l'articolo?

Originariamente era inteso come una guida per gli studenti che iniziavano con i sistemi di tipo Unix. In altre parole, l'articolo è rivolto a coloro che non hanno precedenti esperienze di lavoro nella riga di comando unix, ma per un motivo o per l'altro vogliono o devono imparare a interagire efficacemente con esso.

Non ci sarà alcuna rivisitazione di mans (documentazione), e l'articolo non annulla o sostituisce in alcun modo la loro lettura. Parlerò invece delle cose principali (comandi, tecniche e principi) che devono essere comprese fin dall'inizio del lavoro in shell unix in modo che il lavoro sia efficiente e piacevole.

L'articolo tratta di ambienti unix a tutti gli effetti, con una shell completamente funzionante (preferibilmente zsh o bash) e una gamma abbastanza ampia di programmi standard.

Cos'è la conchiglia?

Shell (shell, alias "riga di comando", alias CLI, alias "console", alias "terminal", alias "finestra nera con lettere bianche") è un'interfaccia testuale per comunicare con il sistema operativo (beh, in senso stretto, è programma, che fornisce tale interfaccia, ma ora questa distinzione non è significativa).

In generale, il lavoro attraverso la shell si presenta così: l'utente (cioè tu) inserisce un comando dalla tastiera, preme Invio, il sistema esegue il comando, scrive il risultato dell'esecuzione sullo schermo e attende nuovamente il comando successivo essere inserito.

Vista tipica conchiglia:

Shell è il modo principale per interagire con tutti i sistemi server di tipo Unix.

Dove si verificano i sistemi a riga di comando?

Dove può aspettarti una shell unix, opzioni popolari:
  • MacOS (bash);
  • accesso remoto al server per lavoro o per un progetto web personale;
  • file server domestico con accesso remoto;
  • Ubuntu, PC-BSD su laptop/desktop - sistemi unix-like oggi sono facili da installare e utilizzare.

Quali compiti è ragionevole risolvere con una shell?

Compiti naturali per i quali il guscio è adatto, utile e insostituibile:
  • lavoro interattivo nel terminale:
    • eseguire la compilazione, eseguire attività tramite make;
    • confronto di file di testo;
    • analisi veloce dei dati ad-hoc (numero di ip univoci nel log, distribuzione dei record per ore/minuti, ecc.);
    • azioni di massa una tantum (uccidi molti processi; se lavori con un sistema di controllo della versione, inverti o ripristina un mucchio di file);
    • diagnostica di ciò che sta accadendo nel sistema (semafori, blocchi, processi, descrittori, spazio su disco, ecc.);
  • script:
    • script di installazione, per la cui esecuzione non puoi fare affidamento sulla presenza di altri interpreti - questo non è per i principianti;
    • funzioni per personalizzare la shell interattiva (influenzando il prompt, cambiando la directory, impostando le variabili d'ambiente) - anche non del tutto per principianti;
    • script una tantum come la transcodifica di file di massa;
    • makefile.

Primi passi assoluti

Per iniziare: accedi e esci

Assicurati di sapere esattamente come avviare la shell e come uscirne.

Se sei su una macchina con Ubuntu installato, devi avviare il programma Terminal. Al termine, puoi semplicemente chiudere la finestra.

Su MacOS, avvia anche Terminal.

Per accedere a un server remoto, usa ssh (se hai MacOS, Ubuntu o un altro sistema simile a Unix localmente) o putty (se hai Windows).

Chi sono, dove sono?

Esegui i seguenti comandi:
  • hostname - visualizza il nome della macchina (server) su cui ti trovi attualmente;
  • whoami - mostra il tuo login (il tuo nome nel sistema);
  • tree -d / | less - immagine pseudo-grafica dell'albero delle directory sulla macchina; esci dallo scorrimento - q;
  • pwd - mostra la directory in cui ti trovi attualmente; sulla riga di comando, non puoi essere "proprio così", sei sicuro di essere in qualche directory (= directory corrente, directory di lavoro). La tua directory di lavoro corrente è probabilmente visualizzata al tuo prompt.
  • ls - elenco di file nella directory corrente; ls / home - elenco di file nella directory specificata;

Storia dei comandi (cronologia)

Una proprietà importante di una riga di comando a tutti gli effetti è la cronologia dei comandi.

Esegui diversi comandi: hostname, ls, pwd, whoami. Ora premi il tasto su. Il comando precedente è apparso nella riga di input. Utilizzare i tasti "su" e "giù" per spostarsi avanti e indietro nella cronologia. Quando scorri verso il basso fino al nome host, premi Invio: il comando verrà eseguito di nuovo.

I comandi della cronologia non solo possono essere ripetuti, ma anche modificati. Cerca la cronologia nel comando ls, aggiungi l'opzione -l (si è scoperto ls -l, c'è uno spazio prima del meno, ma non dopo). Premi Invio: il comando modificato verrà eseguito.

Scorrere la cronologia, modificare e rieseguire i comandi sono le azioni più comuni quando si lavora nella riga di comando, abituati.

Copia incolla

La riga di comando è molto incentrata sul testo: i comandi sono testo, i dati di input per la maggior parte dei programmi standard sono testo e il risultato del lavoro è spesso anche testo.

La cosa bella del testo è che può essere copiato e incollato, e questo vale anche per la riga di comando.

Prova il comando date + "% y-% m-% d,% A"
L'hai inserito interamente a mano o l'hai copiato dall'articolo? Assicurati di poterlo copiare, incollare nel terminale ed eseguire.

Dopo aver appreso come usare man, assicurati di poter copiare ed eseguire i comandi di esempio dall'help. Per testare, cerca la sezione EXAMPLES nell'utility date, copia ed esegui il primo esempio mostrato (nel caso in cui: il simbolo del dollaro è non fa parte del comando , questa è un'immagine condizionale del prompt).

Il modo esatto in cui copiare il testo dal terminale e incollarlo nel terminale dipende dal sistema e dalle sue impostazioni, quindi, sfortunatamente, non funzionerà per fornire istruzioni universali. Su Ubuntu prova questo: copia è solo una selezione con il mouse, incolla è il pulsante centrale del mouse. Se non funziona, o se hai un sistema diverso, cerca in Internet o chiedi a conoscenti più esperti.

Tasti e opzioni

Esaminando la cronologia dei comandi, ti sei già imbattuto nel fatto che il comando ls ha un almeno due opzioni. Se lo chiami così, viene visualizzato un semplice elenco:

[e-mail protetta]: ~ / shell-survival-quide> ls Makefile shell-first-steps.md shell-first-steps.pdf shell-survival-quide.md shell-survival-quide.pdf
Se aggiungi l'opzione -l, vengono visualizzate informazioni dettagliate per ogni file:

[e-mail protetta]: ~ / shell-survival-quide> ls -l total 332 -rw-rw-r-- 1 akira akira 198 13 feb 11:48 Makefile -rw-rw-r-- 1 akira akira 15107 14 feb 22:26 shell -first-steps.md -rw-rw-r-- 1 akira akira 146226 13 feb 11:49 shell-first-steps.pdf -rw-rw-r-- 1 akira akira 16626 13 feb 11:45 shell-survival -quide.md -rw-rw-r-- 1 akira akira 146203 13 feb 11:35 shell-survival-quide.pdf
Questa è una situazione molto tipica: se si aggiungono modificatori speciali (tasti, opzioni, parametri) a una chiamata di comando, il comportamento del comando cambia. Confronta: albero / e albero -d /, nome host e nome host -f.

Inoltre, i comandi possono prendere come parametri i nomi di file, directory o semplicemente stringhe di testo. Provare:

Ls -ld / home ls -l / home grep root / etc / passwd

uomo

man è un riferimento per i comandi e i programmi disponibili sulla macchina, nonché per le chiamate di sistema e la libreria standard C.

Prova: man grep, man atoi, man chdir, man man.

Lo scorrimento avanti e indietro si effettua con i pulsanti "su", "giù", "PaginaSu", "PaginaGiù", uscire dalla visualizzazione della guida - con il pulsante q. Cerca un testo specifico in un articolo della guida: premi / (barra), inserisci il testo da cercare, premi Invio. Passa alle occorrenze successive - tasto n.

Tutti gli articoli della guida sono classificati. Il più importante:

  • 1 - programmi eseguibili e comandi della shell (wc, ls, pwd, ecc.);
  • 2 - chiamate di sistema (fork, dup2, ecc.)
  • 3 - funzioni di libreria (printf, scanf, cos, exec).
È necessario indicare da quale categoria deve essere mostrato l'aiuto in caso di coincidenza del nome. Ad esempio, man 3 printf descrive una funzione dalla libreria standard C e man 1 printf descrive un programma console con lo stesso nome.

È possibile visualizzare un elenco di tutte le pagine man disponibili sulla macchina utilizzando il comando man -k. (anche il punto fa parte della squadra).

meno

Quando in una piccola finestra di terminale è necessario visualizzare molto testo lungo(il contenuto di un file, un lungo uomo, ecc.), usa speciali programmi "pager" (dalla parola pagina / pagina, cioè visualizzatori pagina per pagina). Il visualizzatore di pagine più popolare è meno, ed è quello che ti fornisce il capovolgimento quando leggi le pagine man.

Prova a confrontare il comportamento:

Cat /etc/bash.bashrc cat /etc/bash.bashrc | less

Puoi trasferire il file al browser direttamente nei parametri:

Meno /etc/bash.bashrc

Scorrimento su e giù - pulsanti su, giù, PaginaSu, PaginaGiù, esci - pulsante q. Cerca un testo specifico: premi / (barra), inserisci il testo da cercare, premi Invio. Passa alle occorrenze successive - tasto n. (Riconoscete un manuale sull'uomo? Non c'è da stupirsi, less viene utilizzato anche per visualizzare l'aiuto.)

diritti

Un insieme di "diritti" è associato a qualsiasi file o directory: il diritto di leggere il file, il diritto di scrivere sul file, il diritto di eseguire il file. Tutti gli utenti sono divisi in tre categorie: proprietario del file, gruppo del proprietario del file, tutti gli altri utenti.

Puoi visualizzare i permessi del file usando ls -l. Ad esempio:

> ls -l Makefile -rw-r - r-- 1 akira studenti 198 Feb 13 11:48 Makefile
Questo output significa che il proprietario (akira) può leggere e scrivere il file, il gruppo (studenti) può solo leggere e tutti gli altri nell'utente possono solo leggere.

Se ricevi un messaggio di autorizzazione negata mentre lavori, significa che non disponi di autorizzazioni sufficienti per l'oggetto con cui volevi lavorare.

Leggi man chmod per i dettagli.

STDIN, STDOUT, trasportatori (tubi)

Ogni programma in esecuzione ha 3 associati flusso standard dati: flusso di dati di input STDIN, flusso di dati di output STDOUT, flusso per l'output di errori STDERR.

Esegui il programma wc, digita il testo Good day today, premi Invio, digita il testo good day, premi Invio, premi Ctrl + d. Il programma wc mostrerà le statistiche per il numero di lettere, parole e righe nel testo e uscirà:

> wc buona giornata oggi buona giornata 2 5 24
In questo caso, hai fornito un testo di due righe allo STDIN del programma e tre numeri a STDOUT.

Ora esegui il comando head -n3 / etc / passwd, dovrebbe assomigliare a questo:

> head -n3 / etc / passwd root: x: 0: 0: root: / root: / bin / bash daemon: x: 1: 1: daemon: / usr / sbin: / usr / sbin / nologin bin: x: 2: 2: bin: / bin: / usr / sbin / nologin
In questo caso, head non ha letto nulla da STDIN, ma ha scritto tre righe su STDOUT.

Pensala in questo modo: un programma è una pipe in cui scorre STDIN e scorre STDOUT.

La proprietà più importante della riga di comando di Unix è che i programmi pipe possono essere interconnessi: l'output (STDOUT) di un programma può essere passato come dati di input (STDIN) a un altro programma.

Una tale costruzione di programmi collegati è chiamata in inglese pipe (pipe), in russo - un trasportatore o un tubo.

La combinazione di programmi in una pipeline è fatta dal simbolo | (barra verticale)

Esegui il comando head -n3 / etc / passwd | wc, ottieni qualcosa del genere:

> head -n3 / etc / passwd | wc 3 3 117
Ecco cosa è successo: il programma principale ha inviato tre righe di testo a STDOUT, che è andato immediatamente all'input del programma wc, che a sua volta ha contato il numero di caratteri, parole e righe nel testo risultante.

Puoi combinare tutti i programmi che vuoi in una pipeline. Ad esempio, puoi aggiungere un altro programma wc alla pipeline precedente che conta quante parole e lettere c'erano nell'output del primo wc:

> head -n3 / etc / passwd | wc | wc 1 3 24

La composizione di pipeline (pipe) è una cosa molto comune quando si lavora nella riga di comando. Per un esempio di come ciò avviene in pratica, vedere Creazione di una pipeline unifilare.

Reindirizzamento I/O

L'output (STDOUT) di un programma può non solo essere reindirizzato a un altro programma, ma anche semplicemente scritto su un file. Questo reindirizzamento viene eseguito con> (maggiore di segno):

Data> /tmp/today.txt
Come risultato dell'esecuzione di questo comando, il file /tmp/today.txt apparirà sul disco. Guarda il suo contenuto con cat /tmp/today.txt

Se esiste già un file con lo stesso nome, il suo vecchio contenuto verrà distrutto. Se il file non esiste, verrà creato. La directory in cui viene creato il file deve esistere prima dell'esecuzione del comando.

Se non vuoi sovrascrivere il file, ma piuttosto aggiungere l'output alla fine, usa >>:

Data >> /tmp/today.txt
Controlla cosa è scritto ora nel file.

Inoltre, qualsiasi file può essere passato al programma invece di STDIN. Provare:

WC

Cosa fare quando qualcosa non è chiaro

Se riscontri un comportamento del sistema che non capisci, o vuoi ottenere un certo risultato, ma non sai come esattamente, ti consiglio di procedere nel seguente ordine (a proposito, questo vale non solo per le shell):
  • formulare la domanda o il compito nel modo più chiaro possibile: non c'è niente di più difficile che risolvere "non so cosa";
  • ricorda se hai già riscontrato lo stesso problema o un problema simile: in questo caso vale la pena provare la soluzione che ha funzionato l'ultima volta;
  • leggi i man-s appropriati (se sai quali man-s sono adatti al tuo caso) - forse troverai esempi adatti di utilizzo dei comandi, le opzioni necessarie o collegamenti ad altri comandi;
  • pensa: è possibile cambiare un po' il compito? - magari modificando leggermente le condizioni, otterrai un problema che sai già come risolvere;
  • fai la tua domanda chiaramente formulata in un motore di ricerca - forse la risposta può essere trovata su Stack Overflow o altri siti;
Se nessuna delle soluzioni precedenti aiuta, chiedi consiglio a un insegnante, un collega esperto o un amico. E non abbiate paura di fare domande "stupide" - non è un peccato non sapere, è un peccato non chiedere.

Se hai scoperto un problema difficile (da solo, con l'aiuto di Internet o di altre persone), scrivi la tua soluzione nel caso tu o i tuoi compagni abbiate di nuovo lo stesso problema. Puoi scrivere in un semplice file di testo, su Evernote, pubblica sui social media.

Metodi di lavoro

Copia e incolla- da man-s, da articoli su StackOverflow, ecc. La riga di comando è composta da testo, usa questo: copia e usa comandi di esempio, annota le scoperte riuscite come souvenir, pubblicale su twitter e sui blog.

Estrai il comando precedente dalla cronologia, aggiungi un altro comando alla pipeline, esegui, ripeti.Centimetro. Vedere anche Composizione di una pipeline unifilare.

Comandi di base

  • spostandosi in un'altra directory: cd;
  • visualizzazione del contenuto dei file: gatto, meno, testa, coda;
  • manipolazione dei file: cp, mv, rm;
  • visualizzare il contenuto delle directory: ls, ls -l, ls -lS;
  • struttura della directory: albero, albero -d (puoi passare una directory come parametro);
  • cerca file: trova. -nome ...;

Analisi

  • wc, wc -l;
  • sort -k - ordinamento in base al campo specificato;
  • sort -n - ordinamento numerico;
  • diff - confronta i file;
  • grep, grep -v, grep -w, grep "\ ", grep -E - cerca il testo;
  • uniq, uniq -c - unicità della linea;
  • awk - nella variante awk "(print $ 1)" per mantenere solo il primo campo di ogni riga, $ 1 può essere modificato in $ 2, $ 3, ecc.;

Diagnostica di sistema

  • ps axuww - informazioni sui processi (programmi in esecuzione) in esecuzione sulla macchina;
  • top - visualizzazione interattiva dei processi più dispendiosi in termini di risorse;
  • df - spazio su disco utilizzato e libero;
  • du è la dimensione totale dei file nella directory (in modo ricorsivo con le sottodirectory);
  • strace, ktrace - ciò che il sistema chiama il processo esegue;
  • lsof - quali file sta usando il processo;
  • netstat -na, netstat -nap - quali porte e socket sono aperti nel sistema.

Potresti non avere alcuni programmi, devono essere installati in aggiunta. Inoltre, alcune opzioni di questi programmi sono disponibili solo per gli utenti privilegiati (root "y).

Esecuzione di massa e semiautomatica

All'inizio, salta questa sezione, avrai bisogno di questi comandi e costrutti quando arrivi a semplici script di shell.
  • prova - verifica delle condizioni;
  • while read - scorre le righe STDIN;
  • xargs - sostituzione di stringhe da STDIN in parametri del programma specificato;
  • seq - generazione di sequenze di numeri naturali;
  • () - combina l'output di diversi comandi;
  • ; - completare uno per uno;
  • && - esegue a condizione del completamento con successo del primo comando;
  • || - eseguire a condizione di mancato completamento del primo comando;
  • tee - duplica l'output del programma su STDOUT e su un file su disco.

varie

  • data - la data corrente;
  • curl - scarica il documento all'URL specificato e scrive il risultato su STDOUT;
  • touch - aggiorna la data di modifica del file;
  • kill - invia un segnale al processo;
  • true - non fa nulla, restituisce true, utile per organizzare loop eterni;
  • sudo - esegue il comando come root "a.

Composizione di una pipeline a una linea

Diamo un'occhiata a un esempio di un'attività del mondo reale: è necessario terminare tutti i processi task-6-server in esecuzione per conto dell'utente corrente.

Passo 1.
Comprendere quale programma produce approssimativamente i dati richiesti, anche se non nella sua forma pura. Per il nostro compito, vale la pena ottenere un elenco di tutti i processi nel sistema: ps axuww. Correre.

Passo 2.
Guarda i dati ricevuti con i tuoi occhi, trova un filtro che eliminerà alcuni dei dati non necessari. Spesso questo è grep o grep -v. Usa il tasto "Su" per estrarre il comando precedente dalla cronologia, assegnargli il filtro che hai inventato ed eseguirlo.

Ps axuww | grep `whoami`
- solo i processi dell'utente corrente.

Passaggio 3.
Ripeti il ​​passaggio 2 finché non ottieni i dati puliti che desideri.

"
- tutti i processi con il nome desiderato (più, forse, quelli non necessari come vim task-6-server.c, ecc.),

Ps axuww | grep `whoami` | grep "\ "| grep -v vim ps axuww | grep` whoami` | grep "\ "| grep -v vim | grep -v less
- solo processi con il nome richiesto

Ps axuww | grep `whoami` | grep "\ "| grep -v vim | grep -v less | awk" (stampa $ 2) "

Pid di processo richiesti, passaggio 3 completato

Passaggio 4.
Applicare un idoneo manipolatore finale. Usando il tasto "Su", estrai il comando precedente dalla cronologia e aggiungi l'elaborazione che completerà la soluzione del problema:

  • | wc -l per contare il numero di processi;
  • > pids per scrivere pid su un file;
  • | xargs kill -9 kill processi.

Compiti di formazione

Vuoi mettere in pratica nuove abilità? Prova le seguenti attività:
  • ottieni un elenco di tutti i file e le directory nella tua directory home;
  • ottenere un elenco di tutti gli articoli man della categoria 2 (chiamate di sistema);
  • conta quante volte compare la parola grep nel grep man-e;
  • contare quanti processi sono attualmente in esecuzione come utente root;
  • trova quale comando compare nel numero massimo di categorie di aiuto (man);
  • conta quante volte la parola var appare nella pagina ya.ru.
Suggerimento: è necessario trovare, grep -o, awk "(print $ 1)", espressioni regolari in grep, curl -s.

Cosa studiare dopo?

Se inizi a piacerti la riga di comando, non fermarti, continua a migliorare le tue abilità.

Ecco alcuni programmi che ti torneranno sicuramente utili se vivi sulla riga di comando:

  • trova con opzioni complesse
  • a proposito
  • individuare
  • telnet
  • netcat
  • tcpdump
  • rsync
  • schermo
  • zgrep, zless
  • visudo
  • crontab -e
  • inviare una mail
Inoltre, nel tempo vale la pena imparare un linguaggio di scripting come perl o python, o anche entrambi.

Chi ne ha bisogno?

Vale la pena imparare la riga di comando e lo scripting della shell oggi? Ne vale la pena. Ecco alcuni esempi dei requisiti di Facebook per i candidati che desiderano candidarsi per un lavoro presso FB.

=====================================================

LAVORO DI LABORATORIO N. 1 (tempo di esecuzione - 3 ore)

Argomento: "Introduzione aconchiglia

1. Introduzione alla conchiglia

Shell è un interprete di comandi (processore di comandi) che fornisce funzioni di interfaccia tra l'utente e il kernel Unix. Solaris offre tre processori di comando principali:

    La Bourne shell predefinita è / sbin / sh

    C shell - / bin / csh

    Conchiglia Korn - ./bin/ksh

Oltre a questi, Solaris fornisce shell aggiuntive:

    J shell - / sbin / jsh

    Corona ristretta l - / usr / bin / rsh

    T shell - / usr / bin / tcsh

    GNU Bourne Again - / usr / bin / bash

    Z shell - usr / bin / zsh

La scelta del guscio è una questione di preferenza personale.

2. Esecuzione dei comandi

Qualsiasi comando in Unix consiste nel nome del programma (comando) da eseguire, nelle opzioni (interruttori) e negli argomenti passati al programma. Il separatore della riga di comando è spazi o tabulazioni.

Esempio

$ /bin/ping –t 10 192.168.2.13

discussione

prompt della shell

Se il percorso del file eseguibile non viene specificato all'avvio del programma, il sistema operativo esegue la scansione sequenziale delle directory specificate nella variabile PATH. Se nella directory visualizzata è presente un programma con questo nome, viene avviato per l'esecuzione. La directory di lavoro corrente non viene cercata durante la ricerca di programmi a meno che non sia specificata nella variabile PATH.

! Per motivi di sicurezza, si sconsiglia all'amministratore di aggiungere la directory corrente dell'utente e le directory home (personali) alla variabile PATH.

Esempi di

Esecuzione del programma con il percorso completo

$ / usr/ Locale/ bidone/ mio_ programma

Avvio di un programma da una directory genitore (genitore)

$ ../ Locale/ bidone/ mio_ programma

Esecuzione di un programma dalla directory corrente

$ ./ mio_ programma

3. Caratteri speciali nella shell

Alcuni caratteri shell hanno significati speciali.

3.1. Modelli di generazione di nomi di file

? (punto interrogativo) corrisponde a qualsiasi carattere tranne il primo punto;

(parentesi quadre) definire un gruppo di caratteri (un carattere è selezionato dal gruppo);

- (segno meno") definisce l'intervallo di caratteri validi;

! (Punto esclamativo) rifiuta il successivo gruppo di caratteri;

* (simbolo asterisco) corrisponde a qualsiasi numero di caratteri tranne il primo punto.

3.2. Caratteri di reindirizzamento I/O

< - reindirizzamento degli ingressi;

>, >> - reindirizzamento dell'output;

2>, 2>> - reindirizzamento dei messaggi di errore;

| - trasportatore.

3.3. Simboli di sostituzione

$ nome_variabileQ - sostituzione di variabili;

$ (comando) o `comando` - sostituzione di comando;

~ è una sostituzione di tilde.

4. Cerca

Per trovare rapidamente file e directory, utilizzare il comando whereis, per uno più approfondito, utilizzare il comando trova (cerca i file che soddisfano i requisiti specificati;).

5. Editor di testo vi

L'editor di testo vi è un editor versatile che si trova su qualsiasi Unix. Oltre a modificare i file di testo, vi può essere utilizzato per la modifica della riga di comando.

L'editor vi ha 3 modalità di funzionamento (vedi figura).

Entrare nell'editor vi

Uscire da vi

Il simbolo ”~” (tilde) in prima posizione contrassegna le righe vuote (inesistenti) del file.

La modalità principale è la modalità comandi, in cui i comandi vengono immessi premendo una sequenza di tasti (non vengono visualizzati in alcun modo sullo schermo).

Lo spostamento attraverso il testo in modalità comando viene eseguito utilizzando le frecce e i tasti (A sinistra), (giù), (su), (A destra).

Alcuni comandi vi sono elencati nella tabella.

Elimina la riga corrente

Copia la riga corrente negli appunti

Y movimento del cursore

Buffer i caratteri contrassegnati dal cursore

Inserisci una nuova riga in basso

Inserisci una nuova riga in alto

Aggiunta dopo il cursore

Aggiunta dopo la riga corrente

Inserisci prima del cursore

Inserisci prima della riga corrente

Sostituisci un carattere con un carattere della tastiera

Incollare il testo dagli appunti

. (punto)

Ripeti l'ultimo comando eseguito

Annulla l'ultimo comando

Annulla tutte le modifiche alla riga corrente

Eliminare un carattere sopra il cursore

In modalità di input, tutti i caratteri digitati sulla tastiera vengono inseriti nel testo.

In modalità ultima riga, il comando immesso viene visualizzato sull'ultima riga dello schermo.

6. Aiuto

Unix ha un manuale elettronico contenente una descrizione dello scopo dei comandi, la loro sintassi, esempi di utilizzo, ecc. Il manuale viene richiamato con il comando man:

7. Comandi di base della shell

chi- visualizzazione delle informazioni sugli utenti attivi;

eco- output dei messaggi al terminale;

striscione- emissione dei messaggi al terminale in maiuscolo;

uomo- richiamare il sistema di aiuto in linea;

Data - visualizzazione della data corrente;

scrivere- invio di messaggi al terminale di un altro utente;

messaggio- autorizzazione/divieto di visualizzazione di messaggi di altri utenti;

posta- invio/ricezione posta;

notizia- conoscenza delle novità del sistema;

pwd- output del nome di percorso assoluto della directory di lavoro corrente;

cd- modifica della directory di lavoro;

ls- visualizzazione delle informazioni sul contenuto della directory;

mkdir- creazione di una directory;

rmdir- eliminazione di una directory;

tocco- aggiornamento del timestamp del file;

cp- copiare file;

gatto- unire e visualizzare il contenuto dei file;

Di più- visualizzazione pagina per pagina del contenuto del file.

mv - spostare o rinominare un file;

rm- cancellare un file;

alias- creare un alias;

vero- conversione dei caratteri;

Uscita- completamento della corrente conchiglia-un;

tee- intercettazione dei risultati del trasportatore;

taglio - selezione di campi da una riga;

grep- ricerca per modello;

prima- output del file sullo standard output in un formato specificato;

ordinare- ordinamento;

testa- output delle prime righe del file;

coda- output delle ultime righe del file;

WC- contare il numero di caratteri, parole e righe;

leggere, eco - lettura e visualizzazione dei valori delle variabili;

test- valutare il valore di un'espressione;

espr, permettere- calcolo di espressioni aritmetiche;

8. Conchiglia-programmi

Shell consente di salvare una sequenza di comandi in un file e quindi eseguirla. Per eseguire un file con un programma shell per l'esecuzione, è necessario aggiungere il diritto di esecuzione ai diritti di accesso:

$ chmod + x nome_file_programma

La ramificazione nei programmi shell è organizzata utilizzando gli operatori:

se-allora-altrimenti

Operatori di ciclo:

ESERCIZI

1. Quale dei seguenti comandi visualizzerà un messaggio di benvenuto sullo schermo? Cosa non lo sono? Come mai?

$ eco ciao

$ Eco ciao

$ echo CIAO MONDO

$ striscione Ciao

$ BANNER CIAO, MONDO

2. Invia un messaggio da più righe usando i comandi eco e bandiera.

3. Stampa la data in due righe: la prima giorno, mese, anno, la secondal'ora corrente, fornendo all'output un commento.

4. Utilizzo del comando scrivere, invia un messaggio alla console. Invia messaggi a più terminali contemporaneamente.

5. Utilizzo del comando messaggio, determina se i messaggi sono consentiti al tuo terminale. Rifiuta i messaggi. Come reagirà il sistema se qualcuno cerca di inviarti un messaggio?

6. Identifica il tuo nome CASA-directory.

7. Sfoglia la sottostruttura della directory, iniziando dalla directory / export / home usando i comandi cd, ls e pwd.

8 .. Crea nel tuo CASA-directory sottodirectory del modulo:

frutti fiori

mela pera uva rosa viola dente di leone

verde scuro

9. Essere nel tuo CASA-directory, crea le seguenti sottodirectory utilizzando un'unica riga di comando:

LA / B / C / RE

10. Essere nel tuo CASA-directory, elimina tutte le sottodirectory della directory UN.

11. Essere dentro CASA-directory, crea un file macintosh nella directory esistente Mela e più file nelle directory buio e verde... Entra nella directory Fabbassa... Essere nella directory Fabbassa, copia tutte le sottodirectory Fruits insieme ai file in essi contenuti in una directory appositamente creata cestino.

12. Essere nel catalogo Fabbassa, rimuovi la directory Fruits.

13. Leggi il file .profilo usando i comandi gatto e di più.

14. Crea in CASA-directory file di testo il mio file più righe usando il comando gatto. Crea un file di testo mFile, scrivendovi le stesse righe. Quanti file hai ottenuto? Come mai?

15. Visualizza il contenuto del file creato nell'attività 2.2 il mio file... Copia il file il mio file archiviare micopia. Visualizza il contenuto di entrambi i file.

16. Sposta il file mia copia catalogare fiori.

17. Essere in CASA-directory, crea un collegamento mcollegamento per file mia copia situato nella directory fiori... Visualizza il file di collegamento.

18. Aggiungi una riga al file miocollegamento. Quale dei file miocollegamento, miocopia, miofile è cambiato? Come mai?

19. Con quale comando puoi determinare il numero di collegamenti? Determinare il numero di collegamenti per i file miocollegamento, miocopia, miofile.

Elimina il file mia copia... Cosa è successo al file di collegamento? Determinare il numero di collegamenti per i file miocollegamento, miofile.

20. Crea un alias dir che stampa il contenuto della directory corrente in formato esteso.

21. Termina la sessione e registrati nuovamente. L'alias funziona? dir? Cosa si dovrebbe fare per evitare che l'alias venga "perso" tra le sessioni?

22. Crea un alias punto, che stampa un elenco di file nella directory di lavoro che iniziano con un punto.

23. Utilizzo del comando tocco, crea file in una nuova directory con nomi tali che allo stesso tempo:

Modello un* 5 file corrispondenti;

Modello * un corrispondeva a 4 file;

Modello ??.? corrispondeva a 3 file;

Modello * aa* corrispondeva a 2 file;

Modello ??? corrisponde a 1 file.

24. Quale comando deve essere immesso per eseguire le seguenti operazioni:

a) stampare i nomi di tutti i file che iniziano con un punto;

b) stampa i nomi di tutti i file che terminano con ".TXT";

c) visualizzare i nomi di tutti i file contenenti la parola "Mio";

25. Sostituisci tutte le lettere minuscole in un determinato file con lettere maiuscole, nell'altro tutte le lettere maiuscole con lettere minuscole. Escludere eventuali spazi duplicati dal file.

26. Crea un file chiamato * ... Elimina solo questo file. Fai attenzione quando usi i caratteri per generare i nomi dei file!

27. Creare un file con uno spazio nel nome. Come posso eliminare un file del genere?

28.Uso del comando gatto raddoppiare il contenuto del file aggiungendo il contenuto originale alla fine dello stesso file. Vai alla directory fiori... Aggiungi al file spisok elenco dei contenuti della directory fiori. Visualizza il contenuto del file

29. Prova a leggere con il comando gatto fascicolo inesistente. Qual è la reazione del sistema? Fai lo stesso reindirizzando i messaggi di errore a un file errore mio... Cosa vedi sullo schermo? Visualizza il file errore mio.

30. Crea una pipeline per elencare solo i nomi e le autorizzazioni dei file che si trovano attualmente nella directory di lavoro.

31. Modificare la pipeline costruita in modo che l'elenco sia memorizzato in un file spisok Tuo suo CASA-directory e veniva visualizzato solo il numero di file nell'elenco.

32. Visualizza il contenuto del file / etc / passwd ordinati per campo nome utente.

33. Crea un alias loggatoin poi, che visualizzerà un elenco alfabetico dei nomi degli utenti collegati al sistema.

33. Uscita data odierna sullo schermo a caratteri cubitali usando i comandi Data e bandiera.

34. Assegna alla variabile IO SONO Il tuo nome di registrazione. Esegui un altro conchiglia... Vedi questa variabile? Cosa bisogna fare per vederla nel generato conchiglia? Cambia il valore della variabile IO SONO in generato conchiglia... Esci dal generato conchiglia. Guarda il valore di questa variabile nell'originale conchiglia... Spiega il risultato.

35. Scrivi conchiglia-programma Informazioni che chiederà all'utente di inserire un nome, indirizzo, data, mese e anno di nascita e visualizzare queste informazioni in ordine inverso

36. Scrivi conchiglia-programma che visualizzerà un prompt per inserire un numero, salvare il numero inserito in una variabile e stampa un messaggio "Y è maggiore di 7", se il valore più di 7, e “Y isnon maggiore di 7” altrimenti.

37. Scrivere un programma shell che stampi sullo schermo le seguenti statistiche:

a) il tuo nome;

b) il numero di argomenti con cui viene lanciato;

c) stampa ciascuno dei suoi argomenti e la lunghezza dell'argomento in caratteri;

38. Scrivi conchiglia- un programma che determina il numero di argomenti sulla riga di comando ed emette un messaggio di errore se il numero di argomenti non è tre, o gli argomenti stessi, se il loro numero è tre.

39. Scrivi conchiglia-un programma che emetterà un invito per inserire un ID utente, controllare l'ID per la conformità con quelli utilizzati nel sistema e visualizzare nome e cognomeCASA-directory o, in caso di identificatore non valido, emettere un messaggio di errore.

40. Scrivi un programma di shell Ciao, che fornisce la seguente risposta agli argomenti della riga di comando:

Discussione "-D"- il programma eseguirà il comando Data;

Discussione "-L"- il programma visualizzerà il contenuto della directory corrente;

    se non ci sono argomenti o argomenti errati sulla riga di comando, il programma visualizzerà l'aiuto sulle sue opzioni.

41. Scrivi un programma parole che chiederà all'utente di inserire una parola alla volta fino a quando non inserirà una parola fine... Memorizza tutte le parole che hai inserito. Dopo aver digitato una parola fine visualizzare tutte le parole inserite.

42. Modificare il prompt di sistema per contenere il nome di percorso completo della directory di lavoro corrente .

43. Scrivi un programma virus che crea la propria copia eseguibile con un nome diverso e poi si cancella.

44. Scrivi un programma virus2 , che cerca nella directory corrente i programmi in linguaggio di comando e aggiunge un comando per visualizzare le parole Infetto!”.

45. Scrivi un programma virus3 , che aggiunge il proprio codice per infettare altri programmi ai programmi in linguaggio di comando che trova.

46. ​​​​Scrivi un programma virus4 modificando il virus in modo che al momento dell'infezione, il codice infettante venga rimosso dal programma infettante.

47. Scrivi un programma antivirus che troverebbe tutti i programmi shell infetti dal tuo virus.

48. Modificare il programma sviluppato in modo che non solo trovi i programmi infetti nella directory specificata, ma li "cura" anche salvando la versione infetta in un nuovo file con la desinenza . vir e rimuovendo l'attributo di esecuzione da tale file.

49. Scrivi un programma virus5 che:

a) infetterebbe i programmi shell nella directory corrente e nelle sue sottodirectory con un virus solo se l'utente immetteva il comando ls;

b) si comporterebbe come una squadra ls, senza dare nulla sul terminale del suo lavoro.

50. Scrivere un programma virus6 basato su programmi virus2 -virus5 il cui codice infettante non potrebbe essere stato rilevato dal programma che hai sviluppato antivirus, e l'infezione si verificherebbe a qualsiasi valore della variabile SENTIERO.

51. Scrivi un programma supervirus, il cui avvio infetta i tuoi file con il virus sviluppato nell'attività precedente, e ogni volta che accedi al sistema, viene fatto un tentativo di infettare i file dei tuoi compagni. Programma supervirus si cancella da solo dopo la prima esecuzione.

52. Scrivi un programma superantivirus, che rileva e "cura" completamente (se viene specificata l'opzione corrispondente) tutti i file nella directory specificata e nelle sue sottodirectory da tutti i virus sviluppati.

La shell del linguaggio di comando (in traduzione - shell, shell) è in realtà un linguaggio di programmazione di altissimo livello. In questa lingua, l'utente controlla il computer. Di solito, dopo aver effettuato l'accesso, inizi a interagire con la shell. Un'indicazione che la shell è pronta a ricevere comandi è il prompter che emette sullo schermo. Nel caso più semplice, questo è un dollaro ("$"). Shell non è necessaria e l'unico linguaggio di comando (sebbene sia lui che è standardizzato nell'ambito di POSIX, lo standard per i sistemi mobili). Ad esempio, il linguaggio cshell è abbastanza popolare, ci sono anche kshell, bashell e altri. Inoltre, ogni utente può creare il proprio linguaggio di comando. Può funzionare contemporaneamente su una copia del sistema operativo con diversi linguaggi di comando. shell è uno dei tanti comandi UNIX. Cioè, il set di comandi "shell" include il comando "sh", invocando l'interprete "shell". La prima "shell" viene chiamata automaticamente quando si effettua il login e visualizza un prompter. Successivamente, puoi chiamare qualsiasi comando per l'esecuzione, inclusa di nuovo la "shell" stessa, che creerà una nuova shell per te all'interno di quella vecchia. Quindi, ad esempio, se prepari il file "file_1" nell'editor:

Eco Ciao!

quindi sarà un file di testo normale contenente il comando "echo", che, una volta eseguito, visualizza sullo schermo tutto ciò che è scritto a destra di esso. Puoi rendere eseguibile il file "file_1" con il comando "chmod 755 file_1". Ma può essere eseguito chiamando esplicitamente il comando "sh" ("shell"):

Sh file_1

SH< file1

Il file può essere eseguito anche nell'istanza "shell" corrente. Per questo esiste un comando specifico "." (punto), cioè

File_1

Poiché UNIX è un sistema multiutente, puoi anche lavorare su un personal computer in parallelo, diciamo, su 12 schermi (passando da schermo a schermo ALT / tasto funzione), avendo su ogni schermo un nuovo (o lo stesso) utente con la sua shell di comando. Puoi anche aprire un gran numero di finestre in modalità grafica X-Window, e ogni finestra può avere il proprio utente con la propria shell di comando... L'elemento centrale del linguaggio della shell è il comando.

Strutture di comando:

I comandi della shell di solito hanno il seguente formato:

<имя команды> <флаги> <аргумент(ы)>

Ad esempio:

Ls -ls / usr / bin

Dove ls è il nome del comando per visualizzare il contenuto di una directory, -ls sono flag ("-" è un segno di bandiera, l è un formato lungo, s riguarda "file in blocchi), / usr / bin è un directory per la quale viene eseguito il comando. Questo comando visualizzerà il contenuto della directory / usr / bin sullo schermo in formato lungo, aggiungendo informazioni sulla dimensione di ciascun file in blocchi. Sfortunatamente, questa struttura di comando non viene sempre mantenuta. Non sempre viene messo un meno prima dei flag, non sempre i flag sono in una sola parola varietà nella presentazione degli argomenti Tra i comandi che hanno formati esotici ci sono comandi "popolari" come cc - chiama il compilatore C, tar - lavora con gli archivi , dd - copia di un file con trasformazione, trova - ricerca di file e molti altri Di norma, la prima parola viene interpretata dalla shell come un comando.

la prima parola verrà decodificata dalla shell come comando (di concatenazione), che visualizzerà un file chiamato "cat" (seconda parola) nella directory corrente. Reindirizzamento dei comandi Input standard (input) - "stdin" in UNIX OS viene eseguito dalla tastiera del terminale e output standard (output) - "stdout" viene diretto allo schermo del terminale. C'è anche file standard messaggi di diagnostica - "stderr", che verranno discussi un po' più avanti. Il comando che può funzionare con input e output standard si chiama FILTER. L'utente dispone di mezzi convenienti per reindirizzare l'input e l'output su altri file (dispositivi). I simboli ">" e ">>" indicano il reindirizzamento dell'output. ls> file_1 il comando "ls" genererà un elenco di file nella directory corrente e lo posizionerà nel file "file_1" (invece di stamparlo sullo schermo). Se il file "file_1" esisteva in precedenza, verrà sovrascritto con uno nuovo.

Pwd >> file_1

il comando pwd genererà il nome completo della directory corrente e lo posizionerà alla fine del file "file_1", ad es. ">>" viene aggiunto al file se non è vuoto. Simboli"<" и "<<" обозначают перенаправление ввода.

wc -l

conterà e visualizzerà il numero di righe in file_1.

Ed file_2<

creerà il file "file_2" utilizzando l'editor, direttamente dal terminale. La fine dell'input è determinata dal carattere a destra "<<" (т. е. "!"). То есть ввод будет закончен, когда первым в очередной строке будет "!". Можно сочетать перенаправления. Так

wc -l file_4

Wc -l> file_4

vengono eseguite allo stesso modo: viene conteggiato il numero di righe nel file "file_3" e il risultato viene inserito nel file "file_4". Il mezzo che combina lo standard output di un comando con lo standard input di un altro è chiamato CONVEYOR ed è indicato dalla barra verticale "|".

Ls | wc -l

l'elenco dei file nella directory corrente verrà inviato all'input del comando "wc", che stamperà sullo schermo il numero di righe della directory. È possibile combinare più di due comandi con una pipeline, quando tutti, tranne il primo e l'ultimo, sono filtri:

File di gatto_1 | grep -h risultato | ordina | gatto -b> file_2

Questa pipeline dal file "file_1" ("cat") selezionerà tutte le righe contenenti la parola "result" ("grep"), ordinerà ("sort") le righe risultanti, quindi numero ("cat -b") e invia il risultato al file "file_2". Poiché i dispositivi UNIX sono rappresentati da file speciali, possono essere utilizzati nei reindirizzamenti. I file speciali si trovano nella directory "/ dev". Ad esempio, "lp" sta stampando; "console" - console; "ttyi" è il terminale i-esimo; "null" è un file fittizio (vuoto) (dispositivo). Allora, per esempio,

Ls> / dev / lp

stamperà il contenuto della directory corrente e file_1< /dev/null обнулит файл "file_1".

Ordina file_1 | tee / dev / lp | coda -20

In questo caso il file "file_1" verrà ordinato e inviato in stampa e sullo schermo verranno visualizzate anche le ultime 20 righe. Torniamo al reindirizzamento di uscita. I file standard sono numerati:

0 - stdin, 1 - stdout 2 - stderr. Se non vuoi avere un messaggio di errore sullo schermo, puoi reindirizzarlo dallo schermo al file che hai specificato (o anche "buttalo via" reindirizzandolo al file "dispositivo vuoto" - / dev / null) . Ad esempio, quando si esegue il comando

Gatto file_1 file_2

che dovrebbe visualizzare in sequenza il contenuto dei file "file_1" e "file_2", ti darà, ad esempio, quanto segue

111111 222222 cat: f2: nessun file o directory del genere

dove 111111 222222 è il contenuto del file "file_1", e manca il file "file_2", di cui il comando "cat" ha stampato un messaggio sul file di diagnostica standard, per impostazione predefinita, proprio come lo standard output presentato dallo schermo . Se non vuoi un messaggio del genere sullo schermo, puoi reindirizzarlo al file che hai specificato:

Gatto file_1 file_2 2> f-err

i messaggi di errore verranno inviati (come indicato dal reindirizzamento "2>") al file "f-err". A proposito, puoi inviare tutte le informazioni a un file "ff", usando in questo caso la costruzione

Gatto file_1 file_2 >> ff 2> ff

È possibile specificare non solo quale dei file standard reindirizzare, ma anche a quale file standard reindirizzare.

Gatto file_1 file_2 2 >> ff 1> & 2

Qui, prima "stderr" viene reindirizzato (in modalità append) al file "ff", quindi l'output standard viene reindirizzato a "stderr", che a questo punto è il file "ff". Cioè, il risultato sarà simile a quello precedente. La costruzione "1> & 2" - significa che oltre al numero del file standard da reindirizzare, devi mettere "&" davanti; l'intera costruzione è scritta senza spazi.<- закрывает стандартный ввод. >- chiude l'output standard. File di comando. Esistono diverse possibilità per utilizzare un file di testo come comando. Consenti all'editor di creare un file denominato "cmd" contenente una riga del seguente formato:

Data; pwd; ls

Puoi invocare la shell come comando indicato da "sh" e passargli il file "cmd" come argomento o come input reindirizzato, ad es.

$ sh cmd

$ sh

Come risultato dell'esecuzione di uno di questi comandi, verrà visualizzata la data, quindi il nome della directory corrente e quindi il contenuto della directory. Un modo più interessante e conveniente per lavorare con un file batch è trasformarlo in un file eseguibile, ad es. basta renderlo un comando, che si ottiene modificando il codice di sicurezza. Per fare ciò, è necessario consentire l'esecuzione di questo file. Ad esempio,

Chmod 711 cmd

creerà il codice di sicurezza "rwx__x__x". Poi una semplice chiamata

eseguirà gli stessi tre comandi. Il risultato sarà lo stesso se il file con il contenuto

Data; pwd; ls

rappresentato nella forma: date pwd ls poiché il passaggio a un'altra riga è anche un separatore nella sequenza di comandi. Pertanto, i file eseguibili possono essere non solo file ottenuti come risultato della compilazione e dell'assemblaggio, ma anche file scritti nel linguaggio della shell. Vengono eseguiti in modalità interpretazione utilizzando l'interprete di shell.

Debug dei file batch

SHELL utilizza due meccanismi per il debug dei file batch. Il primo è: set -v stampa le righe del file batch mentre le legge. Questa modalità viene utilizzata durante la ricerca di errori di sintassi. Per usarlo, non è necessario modificare il file batch, ad esempio: sh -v proc ... qui proc è il nome del file batch. L'opzione -v può essere utilizzata insieme all'opzione -n, che impedisce l'esecuzione di comandi successivi (il comando set -n blocca il terminale finché non viene immesso il carattere di fine file EOF). Il comando set -x visualizza i comandi man mano che vengono eseguiti e le righe del programma vengono stampate sul terminale e i loro valori vengono sostituiti dalle variabili. Per annullare le opzioni -x e -v, puoi utilizzare il comando set - e per impostarlo, assegna il valore corrispondente alla variabile macro. AMBIENTE SHELL (VARIABILI E PARAMETRI) Nel linguaggio shell è possibile scrivere file di comandi e utilizzare il comando "chmod" per renderli eseguibili. Dopodiché, non sono diversi dagli altri comandi UNIX.

Variabili di shell

Il nome di una variabile di shell è una sequenza di numeri e trattini bassi che iniziano con una lettera. Il valore della variabile shell è una stringa di caratteri. Il fatto che nella shell ci siano solo due tipi di dati: una stringa di caratteri e un file di testo, da un lato, facilita il coinvolgimento di utenti finali che non hanno mai programmato prima, e dall'altro provoca qualche protesta interna da molti programmatori che sono abituati a una maggiore varietà e flessibilità di mezzi linguistici. Tuttavia, è interessante osservare come programmatori altamente qualificati, avendo preso confidenza con le "regole del gioco" della shell, scrivono programmi su di essa molte volte più velocemente che in C, ma, cosa particolarmente interessante, in alcuni casi questi programmi funzionano anche più velocemente di quelli implementati in C. Il nome della variabile è simile al concetto tradizionale di identificatore, ad es. il nome può essere una sequenza di lettere, numeri e trattini bassi, che iniziano con una lettera o un carattere di sottolineatura. L'operatore di assegnazione "=" può essere utilizzato per assegnare valori alle variabili.

Var_1 = 13 - "13" non è un numero, ma una stringa di due cifre. var_2 = "UNIX OS" - le virgolette ("") sono richieste qui perché c'è uno spazio nella stringa.

Sono possibili anche altri modi per assegnare valori alle variabili della shell. Quindi, ad esempio un record,

DAT = `data`

fa sì che il comando "date" venga eseguito per primo (i backtick indicano che il comando racchiuso deve essere eseguito per primo), e il risultato della sua esecuzione, invece di inviarlo allo standard output, viene assegnato come valore della variabile, in questo caso "DATA". È inoltre possibile assegnare un valore a una variabile utilizzando il comando "read", che legge il valore della variabile dal display (tastiera) in modalità di dialogo. Solitamente il comando "read" nel file di comando è preceduto dal comando "echo", che consente di previsualizzare un qualche tipo di messaggio sullo schermo. Ad esempio:

Echo -n "Inserisci un numero di tre cifre:" leggi x

Quando si esegue questo frammento del file batch, dopo aver visualizzato il messaggio

Inserisci un numero di tre cifre:

l'interprete si fermerà e attenderà l'inserimento di un valore da tastiera. Se inserisci, diciamo, "753" questo diventerà il valore della variabile "x". Un comando "read" può leggere (assegnare) valori per più variabili contemporaneamente. Se ci sono più variabili in "read" di quante ne vengono immesse (separate da spazi), alle altre viene assegnata una stringa vuota. Se ci sono più valori passati che variabili nel comando "leggi", quelli extra vengono ignorati. Quando si fa riferimento a una variabile di shell, è necessario inserire il simbolo "$" davanti al nome. Quindi verranno visualizzati i comandi echo $ var_2 echo var_2

Sistema operativo UNIX var_2 Escape

Diamo un'occhiata più da vicino alle tecniche di fuga utilizzate nella shell. Le virgolette (""), le virgolette singole ("") e la barra rovesciata (\) vengono utilizzate come escape. La loro azione è evidente dagli esempi: puoi scrivere diversi compiti in una riga.

X = 22 y = 33 z = $ x A = "$ x" B = "$ x" C = \ $ x D = "$ x + $ y + $ z" E = "$ x + $ y + $ z "F = $ x \ + \ $ y \ + \ $ z

(l'assegnazione G = $ x + $ y fallirebbe a causa degli spazi) Allora

Echo A = $ A B = $ B C = $ C echo D = $ D E = $ E F = $ F eval echo valutato A = $ A eval echo valutato B = $ B eval echo valutato C = $ C

Verrà visualizzato sullo schermo

A = 22 B = $ x C = $ x D = 22 + 33 + 22 E = $ x + $ y + $ z F = 22 + 33 + 22 valutato A = 22 valutato B = 22 valutato C = 22

Ecco alcuni altri esempi relativi all'escape dei feed di riga. Assegniamo alla variabile "stringa" il valore dell'"array" 2x3: abc def Notare che per evitare di assegnare spazi extra, la seconda riga dell'array inizia alla prima posizione della riga successiva: string = "abc def" Allora ci sono tre opzioni per scrivere la variabile nel comando "echo" echo $ string echo "$ string" echo "$ string" darà rispettivamente tre risultati differenti: abc def $ string abc def e la sequenza dei comandi echo "str_1 str_2" > file_1 echo "str_1 str_2"> file_2 cat file_1 file_2 restituirà file identici in sequenza file_1 e file_2: str_1 str_2 str_1 str_2 Nota anche che una barra rovesciata (\) non solo evita il carattere seguente, che consente Simboli speciali proprio come i caratteri che rappresentano se stessi (può sfuggire a se stesso - \\), ma in un file batch, una barra rovesciata ti consente di "combinare le righe in una (evitare la fine di una riga). Ad esempio, l'esempio della riga di comando fornito in precedenza:

File di gatto_1 | grep -h risultato | ordina | gatto -b> file_2

può essere scritto in un file batch, diciamo come

File di gatto_1 | grep -h \ risultato | ordina | gatto -b> file_2

A proposito, il simbolo della pipa fornisce anche l'effetto di continuazione della riga di comando. In questo caso, può dare un risultato migliore, ad esempio:

File di gatto_1 | grep -h risultato | ordina | gatto -b> file_2

Manipolazione con variabili di shell Nonostante il fatto che le variabili di shell in caso generale vengono percepiti come stringhe, ovvero "35" non è un numero, ma una stringa di due caratteri "3" e "5", in alcuni casi possono essere interpretati diversamente, ad esempio come interi. Il comando "expr" ha una varietà di opzioni. Illustriamone alcuni con esempi: Esecuzione di un file batch:

X = 7 y = 2 a = `espr $ x + $ y`; echo a = $ a a = `espr $ a + 1`; echo a = $ a b = `espr $ y - $ x`; echo b = $ b c = `espr $ x" * "$ y`; echo c = $ c d = `espr $ x / $ y`; echo d = $ d e = `espr $ x% $ y`; echo e = $ e

mostrerà

A = 9 a = 10 b = -5 c = 14 d = 3 e = 1

L'operazione di moltiplicazione ("*") deve essere sfuggita, perché nella shell questa icona viene percepita come un carattere speciale, il che significa che qualsiasi sequenza di caratteri può essere sostituita in questo posto. Con il comando "expr" sono possibili non solo operazioni aritmetiche (intere), ma anche su stringhe:

A = `espr" cocktail ":" gallo "`; echo $ A B = `expr" cocktail ":" tail "`; echo $ B C = `expr" cocktail ":" cook "`; echo $ C D = `expr"cock":"cocktail"`; echo $ D

Verranno visualizzati i numeri che mostrano il numero di caratteri corrispondenti nelle stringhe (dall'inizio). La seconda delle righe non può essere più lunga della prima:

4 0 0 0

Esportazione di variabili Nel sistema operativo UNIX, esiste un concetto di processo. Il processo si verifica quando viene lanciato un comando per l'esecuzione. Ad esempio, digitando "p "il processo" p "viene generato. A sua volta," p "può generare altri processi. Supponiamo che" p "chiami" p1 "e" p2 ", che generano in sequenza i processi corrispondenti. Ogni processo ha il proprio ambiente - un insieme di variabili a sua disposizione Ad esempio, prima di eseguire "p" esisteva già un ambiente in cui alcune variabili erano già definite. L'esecuzione di "p" genera un nuovo ambiente, in cui saranno già generati "p1" e "p2". Variabili sono locali al processo in cui sono dichiarati, cioè dove vengono assegnati valori.Per renderli disponibili ad altri processi generati, è necessario passarli esplicitamente utilizzando il comando integrato "export".

Parametri

I parametri possono essere passati al file batch. La shell utilizza parametri posizionali (ovvero, l'ordine in cui appaiono è essenziale). Nel file di comando, le variabili corrispondenti ai parametri (simili alle variabili shell) iniziano con il carattere "$", quindi segue una delle cifre da 0 a 9: Si chiami "examp-1" con il "cock parametri " e "coda". Questi parametri rientrano nel nuovo ambiente con i nomi standard "1" e "2". Una variabile (standard) denominata "0" conterrà il nome del calcolo chiamato. Quando si accede ai parametri, il simbolo del dollaro "$" viene posto prima della cifra (come quando si accede alle variabili): $ 0 corrisponde al nome di questo file di comando; $ 1 è il primo parametro in ordine; $ 2 secondo parametro, ecc. Poiché il numero di variabili a cui possono essere passati i parametri è limitato a una cifra, ad es. 9 ("0", come già notato, ha un significato speciale), quindi per la trasmissione Di più parametri, viene utilizzato il comando speciale "shift". Un approccio unico ai parametri è dato dal comando "set". Ad esempio, il frammento

Imposta una b con echo prima = $ 1 secondo = $ 2 terzo = $ 3

mostrerà

Primo = un secondo = b terzo = c

quelli. il comando "set" imposta i valori dei parametri. Questo può essere molto conveniente. Ad esempio, il comando "date" visualizza la data corrente, ad esempio "Lun May 01 12:15:10 2000", composta da cinque parole, quindi

Imposta `data` echo $ 1 $ 3 $ 5

mostrerà

lun 01 2000

Il comando "set" permette anche di controllare l'esecuzione del programma, ad esempio: set -v visualizza le righe lette dalla shell al terminale. set + v annulla la modalità precedente. set -x stampa i comandi sul terminale prima dell'esecuzione. set + x annulla la modalità precedente. Il comando "set" senza parametri restituisce al terminale lo stato dell'ambiente software.

Sostituzioni di guscio

Prima di interpretare ed eseguire direttamente i comandi contenuti nei file di comando, la shell esegue diversi tipi sostituzioni: 1. SOSTITUZIONE DEI RISULTATI. Tutti i comandi racchiusi tra virgolette vengono eseguiti e il risultato viene sostituito al loro posto. 2. SOSTITUZIONE DEI VALORI DI PARAMETRI E VARIABILI. Cioè, le parole che iniziano con "$" vengono sostituite con i corrispondenti valori di variabili e parametri. 3. INTERPRETAZIONE DEGLI SPAZI. Gli spazi sfuggiti vengono ignorati. 4. GENERAZIONE DI NOMI DI FILE. Le parole vengono controllate per la presenza di caratteri speciali ("*", "?", "") e vengono eseguite le generazioni corrispondenti. Ambiente software Ogni processo ha un ambiente in cui viene eseguito. Shell utilizza una serie di variabili d'ambiente. Se digiti il ​​comando "set" senza parametri, lo schermo visualizzerà le informazioni su una serie di variabili standard create al login (e passate a tutti i tuoi nuovi processi "per ereditarietà"), nonché le variabili create ed esportate dai tuoi processi . Il tipo specifico e il contenuto delle informazioni fornite dipendono in larga misura da cosa Versione UNIX utilizzato e come è installato il sistema.

Il risultato dell'esecuzione del comando set senza parametri (non completo):

HOME = / root PATH = / usr / local / bin: / usr / bin: / bin:.: / Usr / bin / X11: IFS = LOGNAME = sae MAIL = / var / spool / mail / sae PWD = / home / sae / STUDY / SHELL PS1 = $ (PWD): "" PS2 => SHELL = / bin / bash

Commentiamo i valori delle variabili. HOME = / root è il nome della home directory in cui si trova l'utente dopo aver effettuato l'accesso. Cioè, dopo aver digitato correttamente il nome utente e la password, mi ritroverò nella directory "/ root". PATH = /bin:/usr/bin:.:/Usr/local/bin:/usr/bin/X11 - questa variabile specifica la sequenza di file che la "shell" cerca alla ricerca di un comando. I nomi dei file sono qui separati da due punti. La sequenza delle scansioni corrisponde all'ordine dei nomi nel percorso. Ma inizialmente la ricerca avviene tra i cosiddetti comandi integrati. I comandi incorporati includono i comandi più comunemente usati come "echo", "cd", "pwd", "date". Successivamente, il sistema cerca nella directory "/ bin", che può contenere i comandi "sh", "cp", "mv", "ls", ecc. Quindi la directory "/usr/bin" con i comandi "cat", "cc", "expr", "nroff", "man" e molti altri. Inoltre, la ricerca avviene nella directory corrente (".", o un'altra designazione per "vuoto", cioè ""), dove molto probabilmente si trovano i comandi che hai scritto. Dopo aver digitato la riga di comando e premuto "shell" (dopo aver effettuato le necessarie sostituzioni) riconosce il nome che corrisponde al comando e lo cerca nelle directory elencate nel PATH. Se il comando viene posizionato al di fuori di queste directory, non verrà trovato. Se ci sono più comandi con lo stesso nome, verrà chiamato quello che si trova nella directory visualizzata per prima. PATH, come altre variabili, può essere facilmente modificato aggiungendo, riorganizzando o escludendo le directory. IFS = (Internal Field Separator) elenca i caratteri utilizzati per separare le parole (campi). Questi sono "spazio", "tabulazione" e "avanzamento riga", quindi non c'è nulla di visibile a sinistra dell'assegnazione e due righe sono occupate. LOGNAME = root - nome di accesso (utente "nome"). MAIL = /var/spool/mail/root è il nome del file in cui viene ricevuta la posta (email). PWD = / root - nome della directory corrente PS1 = $ (PWD): "" - tipo di promter. In questo caso, il prompter visualizzerà il nome della directory corrente, due punti e uno spazio. Cioè, ci sarà "/ root:". PS2 => - questo promter (qui ">") è usato come invito a continuare a inserire (nella riga successiva) un comando incompiuto. Ad esempio, digita la parentesi aperta "(" e dopo aver premuto v riga successiva vedrai questo suggeritore. Se non sai cosa fare dopo, digita la parentesi chiusa ")" e scomparirà. SHELL = / bin / sh - Questa variabile specifica la shell che l'utente sta usando. In questo caso viene utilizzata la shell standard ("sh"). L'ambiente di origine viene installato automaticamente all'accesso utilizzando file come "/etc/rc" e "/etc/.profile". Uno dei modi per modificare semplicemente l'ambiente (ad esempio, percorso di ricerca dei comandi, tipo di promter, tipo di shell, colore dello schermo, ecc.) consiste nell'inserire queste informazioni nella directory home in un file specializzato ".profile" ($ (HOME ) /.profilo) assegnando valori desiderati variabili ambientali. Cioè, chiama questo file nell'editor e scrivi quello che vuoi). Quindi, ogni volta che accedi, questo file verrà eseguito automaticamente e installerà un nuovo ambiente. Questo file DEVE trovarsi nel tuo Directory HOME(directory di accesso). Nota che i nomi di file che iniziano con un punto generalmente hanno uno stato speciale. Quindi, non vengono visualizzati sullo schermo con un semplice comando "ls" - devi chiamare questo comando con il flag "-a". A proposito, non vengono distrutti indiscriminatamente con il comando "rm *". La shell stessa assegna automaticamente i valori alle seguenti variabili (parametri):? il valore restituito dall'ultimo comando; $ numero di processo; ! numero di processo in background;

  1. il numero di parametri posizionali passati alla shell;
  • elenco dei parametri come una riga;

@ un elenco di parametri, come una raccolta di parole; - flag passati alla shell. Quando si accede a queste variabili (ovvero quando le si utilizza in un file di comando - un programma shell), precedere "$". Un ruolo importante nella creazione di file univoci è svolto dalla variabile speciale "$$", il cui valore corrisponde al numero del processo che esegue questo calcolo. Ogni nuovo calcolo eseguito dal computer avvia uno o più processi che vengono automaticamente numerati in sequenza. Pertanto, utilizzando il numero di processo come nome del file, puoi essere certo che ciascuno nuovo file avrà un nuovo nome (non sovrascriverà quello esistente). Il vantaggio è anche il principale svantaggio di questo modo di nominare i file. Non è noto quali nomi verranno assegnati ai file. E, se nell'ambito di questo processo è possibile trovare un file "senza guardare", ovvero accedendovi utilizzando $$, tali file possono essere facilmente persi. Ciò crea ulteriori problemi durante il debug dei programmi. Richiamo dell'interprete A seguito della registrazione dell'utente nel sistema (tramite il comando login), viene chiamato l'interprete del linguaggio SHELL. Se il manuale di registrazione dell'utente contiene un file .profile, prima di ricevere almeno un comando dal terminale, l'interprete esegue questo file (si presume che il file .profile contenga comandi). Quando richiamato, è possibile specificare le seguenti opzioni: -c stringa I comandi vengono letti dalla stringa specificata. -s I comandi vengono letti dal file di input standard. I messaggi dell'interprete vengono scritti nel file di diagnostica standard. -i Modalità di funzionamento interattiva. Se il primo carattere del parametro "0" è un -, i comandi vengono letti dal file .profile.

STRUTTURE SOFTWARE ===

Come in qualsiasi linguaggio di programmazione, il testo della shell può contenere commenti. Il simbolo "#" viene utilizzato per questo. Tutto ciò che si trova sulla riga (nel file di comando) a sinistra di questo simbolo viene interpretato dall'interprete come commento. Ad esempio,

# Questo è un commento.

Come in tutti linguaggio procedurale la programmazione della shell ha operatori. Numerosi operatori consentono di controllare la sequenza di esecuzione dei comandi. In tali operatori, è spesso necessario verificare la condizione, che determina la direzione della continuazione dei calcoli.

Comando di prova ("")

Il comando test verifica il soddisfacimento di una determinata condizione. Questo comando (incorporato) viene utilizzato per formare la selezione della shell e le istruzioni di ciclo. Due possibili formati di comando:

Condizione di test

[ condizione ]

useremo la seconda opzione, cioè invece di scrivere la parola "test" prima della condizione, racchiuderemo la condizione tra parentesi, che è più familiare ai programmatori. Infatti la shell riconoscerà questo comando dalla parentesi aperta "[" come la parola corrispondente al comando "test". Devono esserci spazi tra le parentesi e la condizione che contengono. Devono esserci spazi tra i valori e un carattere di confronto o operazione.La shell utilizza condizioni di "tipi" diversi. CONDIZIONI PER IL CONTROLLO DEI FILE: -f file file "file" è un file normale; -d file file "file" - directory; -c file file "file" è un file speciale; -r il file ha il permesso di lettura sul file "file"; -w file ha il permesso di scrivere sul file "file"; -s file Il file "file" non è vuoto.

CONDIZIONI DI VERIFICA DELLA LINEA: str1 = str2 stringhe "str1" e "str2" corrispondono; str1! = le stringhe str2 "str1" e "str2" non corrispondono; -n str1 La stringa "str1" esiste (non vuota); -z str1 La stringa "str1" non esiste (vuota). Esempi.

X = "chi è chi"; esporta x; ["chi è chi" = "$ x"]; eco $? 0 x = abc; esporta x; [abc = "$ x"]; eco $? 0 x = abc; esporta x; [-n "$ x"]; eco $? 0 x = ""; esporta x; [-n "$ x"]; eco $? uno

Inoltre, esistono due valori di condizione standard che possono essere utilizzati al posto di una condizione (non sono necessarie parentesi). CONDIZIONI PER IL CONFRONTO DI NUMERI INTERI: x -eq y "x" è uguale a "y", x -ne y "x" non è uguale a "y", x -gt y "x" è maggiore di "y", x -ge y "x" è maggiore o uguale a "y", x -lt y "x" è minore di "y", x -le y "x" è minore o uguale a "y". CONDIZIONI COMPLESSE: Implementato utilizzando operazioni logiche tipiche:! (not) inverte il valore del codice di uscita. -o (or) corrisponde all'OR logico. -a (and) corrisponde all'AND logico.

Dichiarazione condizionale "se"

In generale, l'istruzione "if" ha la struttura

Se condizione, allora elenca

Qui "elif" è un'abbreviazione per "else if" che può essere usata insieme a quella completa, ad es. è consentita la nidificazione di un numero qualsiasi di istruzioni "if" (così come di altre istruzioni). Naturalmente, la "lista" in ogni caso deve essere significativa e valida nel contesto dato. La struttura più troncata di questo operatore

Se condizione, elenca fi

se la condizione è soddisfatta (di norma, questa è una com, viene ricevuto il codice di completamento "0", quindi viene eseguita la "lista", altrimenti viene saltata. Esempi. Si scriva "if-1"

Se [$ 1 -gt $ 2]

poi pwd else echo $ 0: Ciao!

Quindi chiamando if-1 12 11 darà / home / sae / STUDY / SHELL e if-1 12 13 darà if-1: Ciao!

Operatore di chiamata ("caso")

L'istruzione di selezione "caso" ha la struttura:

Stringa del caso in

modello) elenco dei comandi ;; modello) elenco dei comandi ;; ... modello) elenco dei comandi ;;

Qui "case", "in" e "esac" sono parole funzionali. "Stringa" (può essere un singolo carattere) viene confrontata con "schema". Quindi viene eseguita la "lista dei comandi" della riga selezionata. Sembrano insoliti alla fine delle righe di selezione ";;", ma scrivi qui ";" sarebbe un errore. Diversi comandi possono essere eseguiti per ogni alternativa. Se questi comandi sono scritti in una riga, allora il ";" verrà utilizzato come separatore di comandi. Solitamente l'ultima riga della selezione ha il pattern "*", che nella struttura "case" significa "qualsiasi valore". Questa stringa è selezionata se il valore della variabile (qui $ z) non corrisponde a nessuno dei modelli precedentemente scritti, delimitati dalla parentesi ")". I valori vengono cercati nell'ordine in cui sono stati scritti.

Operatore di ciclo enumerato ("for")

L'operatore del ciclo "for" ha la struttura:

Per nome

do elenco di comandi eseguiti dove "for" è una parola funzione che definisce il tipo del ciclo, "do" e "done" sono parole funzione che evidenziano il corpo del ciclo. Lascia che il comando "lsort" sia rappresentato da un file batch

Per i in file_1 file_2 file_3 do proc_sort $ ho fatto

In questo esempio, il nome "i" svolge il ruolo di un parametro di loop. Questo nome può essere visualizzato come una variabile di shell, a cui vengono assegnati in sequenza i valori elencati (i = file_1, i = file_2, i = file_3) e il comando "proc_sort" viene eseguito in un ciclo. Viene spesso utilizzata la forma "for i in *", che significa "per tutti i file nella directory corrente". Lascia che "proc_sort" sia a sua volta rappresentato da un file batch

Gatto $ 1 | ordina | tee / dev / lp> $ (1) _ordinato

quelli. i file specificati vengono ordinati in sequenza, i risultati dell'ordinamento vengono stampati ("/ dev / lp") e inviati ai file file_1_sorted file_2_sorted e file_3_sorted

Operatore di ciclo con condizione vera ("while")

La struttura "while", che prevede anche calcoli, è preferibile quando l'elenco esatto dei valori dei parametri non è noto in anticipo o tale elenco deve essere ottenuto a seguito di calcoli in un ciclo. L'operatore di ciclo "while" ha la struttura:

mentre condizione

do elenco di comandi eseguiti dove "while" è una parola funzione che definisce il tipo di ciclo con una condizione vera. L'elenco dei comandi nel corpo del ciclo (tra "do" e "fatto") viene ripetuto finché la condizione rimane vera (ovvero, il codice di completamento dell'ultimo comando nel corpo del ciclo è "0") o il ciclo non viene interrotto dall'interno da comandi speciali ("break", "continue" o "exit"). Quando si entra nel ciclo per la prima volta, la condizione deve essere soddisfatta. Il comando "break [n]" ti consente di uscire dal ciclo. Se manca "n", è equivalente a "break 1". "n" indica il numero di loop nidificati da cui uscire, ad esempio "break 3" - uscita da tre loop nidificati. A differenza del comando "pausa", il comando "continua [n]" termina solo l'esecuzione del ciclo in corso e torna all'INIZIO del ciclo. Può anche essere con un parametro. Ad esempio, "continua 2" significa uscire all'inizio del secondo ciclo annidato (se si conta dalla profondità). Il comando "exit [n]" permette di uscire completamente dalla procedura con il codice di ritorno "0" o "n" (se è specificato il parametro "n"). Questo comando può essere utilizzato non solo nei cicli. Anche in una sequenza lineare di comandi, può essere utile nel debug per interrompere l'esecuzione del calcolo (corrente) in un dato punto.

Operatore di ciclo con condizione falsa ("fino a")

L'operatore di ciclo "until" ha la struttura:

Fino alla condizione

do elenco di comandi eseguiti dove "until" è una parola di funzione che definisce il tipo di ciclo con una condizione falsa. L'elenco dei comandi nel corpo del loop (tra "do" e "done") viene ripetuto fino a quando la condizione rimane falsa o il ciclo viene interrotto dall'interno da comandi speciali ("break", "continue" o "exit" ). Quando si entra nel ciclo per la prima volta, la condizione non dovrebbe essere soddisfatta. La differenza rispetto all'operatore "while" è che la condizione del ciclo viene verificata per verificare la falsità (per un codice di terminazione diverso da zero dell'ultimo comando del corpo del ciclo) viene verificata DOPO ciascuna (inclusa la prima!) esecuzione dei comandi del corpo del ciclo. Esempio.

Fino a quando non farai falso

leggi x se [$ x = 5] poi echo abbastanza; break else fa eco un po' di più

Ecco un programma con ciclo infinito attende l'inserimento delle parole (ripetendo "ancora" sullo schermo) fino a quando non viene inserito "5". Successivamente, viene emesso "abbastanza" e il comando "break" termina l'esecuzione del ciclo.

Operatore vuoto

Un'istruzione vuota ha il formato

:

Facendo nulla. Restituisce il valore "0". ".

Funzioni della shell

Questa funzione consente di preparare un elenco di comandi di shell per l'esecuzione successiva. La descrizione della funzione è simile a:

Nome () (elenco comandi)

dopodiché la funzione viene chiamata per nome. Quando la funzione viene eseguita, non viene creato alcun nuovo processo. Funziona nell'ambiente del processo corrispondente. Gli argomenti di una funzione diventano i suoi parametri posizionali; il nome della funzione è il suo parametro null. L'esecuzione della funzione può essere interrotta con l'operatore "return [n]", dove (opzionale) "n" è il codice di ritorno.

Gestione delle interruzioni ("trappola")

A volte è necessario proteggere l'esecuzione di un programma dall'interruzione. Molto spesso, devi incontrare i seguenti interrupt, corrispondenti ai segnali: 0 uscita dall'interprete, 1 riagganciare (disconnettere l'utente remoto), 2 interrupt da , 9 distruzione (non intercettata), 15 fine esecuzione. Per proteggersi dagli interrupt, esiste un comando "trap" nel formato:

Trappola i segnali della "lista dei comandi"

Se il sistema incontra degli interrupt i cui segnali sono elencati tramite uno spazio nei "segnali", allora verrà eseguita la "lista comandi", dopodiché (se il comando "esci" non è stato eseguito nella lista comandi) il controllo tornerà a il punto di interruzione e continuare l'esecuzione del file di comando. Ad esempio, se è necessario eliminare i file in "/ tmp" prima di interrompere l'esecuzione di un file batch, è possibile farlo con il comando "trap":

Trappola "rm / tmp / *; uscita 1" 1 2 15

che precede gli altri comandi nel file. Qui, dopo aver eliminato i file, verrà eseguita "l'uscita" dal file batch.

  • Tutorial

Perché e per chi è l'articolo?

Originariamente era inteso come una guida per gli studenti che iniziavano con i sistemi di tipo Unix. In altre parole, l'articolo è rivolto a coloro che non hanno precedenti esperienze di lavoro nella riga di comando unix, ma per un motivo o per l'altro vogliono o devono imparare a interagire efficacemente con esso.

Non ci sarà alcuna rivisitazione di mans (documentazione), e l'articolo non annulla o sostituisce in alcun modo la loro lettura. Invece, parlerò delle cose principali (comandi, tecniche e principi) che devi capire fin dall'inizio del lavoro nella shell unix affinché il lavoro sia efficiente e piacevole.

L'articolo tratta di ambienti unix a tutti gli effetti, con una shell completamente funzionante (preferibilmente zsh o bash) e una gamma abbastanza ampia di programmi standard.

Cos'è la conchiglia?

Shell (shell, alias "riga di comando", alias CLI, alias "console", alias "terminal", alias "finestra nera con lettere bianche") è un'interfaccia testuale per comunicare con il sistema operativo (beh, in senso stretto, è programma, che fornisce tale interfaccia, ma ora questa distinzione non è significativa).

In generale, il lavoro attraverso la shell si presenta così: l'utente (cioè tu) inserisce un comando dalla tastiera, preme Invio, il sistema esegue il comando, scrive il risultato dell'esecuzione sullo schermo e attende nuovamente il comando successivo essere inserito.

Tipico tipo di guscio:

Shell è il modo principale per interagire con tutti i sistemi server di tipo Unix.

Dove si verificano i sistemi a riga di comando?

Dove può aspettarti una shell unix, opzioni popolari:
  • MacOS (bash);
  • accesso remoto al server per lavoro o per un progetto web personale;
  • file server domestico con accesso remoto;
  • Ubuntu, PC-BSD su laptop/desktop: i sistemi unix-like oggi sono facili da installare e utilizzare.

Quali compiti è ragionevole risolvere con una shell?

Compiti naturali per i quali il guscio è adatto, utile e insostituibile:
  • lavoro interattivo nel terminale:
    • eseguire la compilazione, eseguire attività tramite make;
    • confronto di file di testo;
    • analisi veloce dei dati ad-hoc (numero di ip univoci nel log, distribuzione dei record per ore/minuti, ecc.);
    • azioni di massa una tantum (uccidi molti processi; se lavori con un sistema di controllo della versione, inverti o ripristina un mucchio di file);
    • diagnostica di ciò che sta accadendo nel sistema (semafori, blocchi, processi, descrittori, spazio su disco, ecc.);
  • script:
    • script di installazione, per la cui esecuzione non puoi fare affidamento sulla presenza di altri interpreti - questo non è per i principianti;
    • funzioni per personalizzare la shell interattiva (influenzando il prompt, cambiando la directory, impostando le variabili d'ambiente) - anche non del tutto per principianti;
    • script una tantum come la transcodifica di file di massa;
    • makefile.

Primi passi assoluti

Per iniziare: accedi e esci

Assicurati di sapere esattamente come avviare la shell e come uscirne.

Se sei su una macchina con Ubuntu installato, devi avviare il programma Terminal. Al termine, puoi semplicemente chiudere la finestra.

Su MacOS, avvia anche Terminal.

Per accedere a un server remoto, usa ssh (se hai MacOS, Ubuntu o un altro sistema simile a Unix localmente) o putty (se hai Windows).

Chi sono, dove sono?

Esegui i seguenti comandi:
  • hostname - visualizza il nome della macchina (server) su cui ti trovi attualmente;
  • whoami - mostra il tuo login (il tuo nome nel sistema);
  • tree -d / | less - immagine pseudo-grafica dell'albero delle directory sulla macchina; esci dallo scorrimento - q;
  • pwd - mostra la directory in cui ti trovi attualmente; sulla riga di comando, non puoi essere "proprio così", sei sicuro di essere in qualche directory (= directory corrente, directory di lavoro). La tua directory di lavoro corrente è probabilmente visualizzata al tuo prompt.
  • ls - elenco di file nella directory corrente; ls / home - elenco di file nella directory specificata;

Storia dei comandi (cronologia)

Una proprietà importante di una riga di comando a tutti gli effetti è la cronologia dei comandi.

Esegui diversi comandi: hostname, ls, pwd, whoami. Ora premi il tasto su. Il comando precedente è apparso nella riga di input. Utilizzare i tasti "su" e "giù" per spostarsi avanti e indietro nella cronologia. Quando scorri verso il basso fino al nome host, premi Invio: il comando verrà eseguito di nuovo.

I comandi della cronologia non solo possono essere ripetuti, ma anche modificati. Cerca la cronologia nel comando ls, aggiungi l'opzione -l (si è scoperto ls -l, c'è uno spazio prima del meno, ma non dopo). Premi Invio: il comando modificato verrà eseguito.

Scorrere la cronologia, modificare e rieseguire i comandi sono le azioni più comuni quando si lavora nella riga di comando, abituati.

Copia incolla

La riga di comando è molto incentrata sul testo: i comandi sono testo, i dati di input per la maggior parte dei programmi standard sono testo e il risultato del lavoro è spesso anche testo.

La cosa bella del testo è che può essere copiato e incollato, e questo vale anche per la riga di comando.

Prova il comando date + "% y-% m-% d,% A"
L'hai inserito interamente a mano o l'hai copiato dall'articolo? Assicurati di poterlo copiare, incollare nel terminale ed eseguire.

Dopo aver appreso come usare man, assicurati di poter copiare ed eseguire i comandi di esempio dall'help. Per testare, cerca la sezione EXAMPLES nell'utility date, copia ed esegui il primo esempio mostrato (nel caso in cui: il simbolo del dollaro è non fa parte del comando , questa è un'immagine condizionale del prompt).

Il modo esatto in cui copiare il testo dal terminale e incollarlo nel terminale dipende dal sistema e dalle sue impostazioni, quindi, sfortunatamente, non funzionerà per fornire istruzioni universali. Su Ubuntu prova questo: copia è solo una selezione con il mouse, incolla è il pulsante centrale del mouse. Se non funziona, o se hai un sistema diverso, cerca in Internet o chiedi a conoscenti più esperti.

Tasti e opzioni

Quando guardi la cronologia dei comandi, ti sei già imbattuto nel fatto che il comando ls ha almeno due opzioni. Se lo chiami così, viene visualizzato un semplice elenco:

[e-mail protetta]: ~ / shell-survival-quide> ls Makefile shell-first-steps.md shell-first-steps.pdf shell-survival-quide.md shell-survival-quide.pdf
Se aggiungi l'opzione -l, vengono visualizzate informazioni dettagliate per ogni file:

[e-mail protetta]: ~ / shell-survival-quide> ls -l total 332 -rw-rw-r-- 1 akira akira 198 13 feb 11:48 Makefile -rw-rw-r-- 1 akira akira 15107 14 feb 22:26 shell -first-steps.md -rw-rw-r-- 1 akira akira 146226 13 feb 11:49 shell-first-steps.pdf -rw-rw-r-- 1 akira akira 16626 13 feb 11:45 shell-survival -quide.md -rw-rw-r-- 1 akira akira 146203 13 feb 11:35 shell-survival-quide.pdf
Questa è una situazione molto tipica: se si aggiungono modificatori speciali (tasti, opzioni, parametri) a una chiamata di comando, il comportamento del comando cambia. Confronta: albero / e albero -d /, nome host e nome host -f.

Inoltre, i comandi possono prendere come parametri i nomi di file, directory o semplicemente stringhe di testo. Provare:

Ls -ld / home ls -l / home grep root / etc / passwd

uomo

man è un riferimento per i comandi e i programmi disponibili sulla macchina, nonché per le chiamate di sistema e la libreria standard C.

Prova: man grep, man atoi, man chdir, man man.

Lo scorrimento avanti e indietro si effettua con i pulsanti "su", "giù", "PaginaSu", "PaginaGiù", uscire dalla visualizzazione della guida - con il pulsante q. Cerca un testo specifico in un articolo della guida: premi / (barra), inserisci il testo da cercare, premi Invio. Passa alle occorrenze successive - tasto n.

Tutti gli articoli della guida sono classificati. Il più importante:

  • 1 - programmi eseguibili e comandi di shell (wc, ls, pwd, ecc.);
  • 2 - chiamate di sistema (fork, dup2, ecc.)
  • 3 - funzioni di libreria (printf, scanf, cos, exec).
È necessario indicare da quale categoria deve essere mostrato l'aiuto in caso di coincidenza del nome. Ad esempio, man 3 printf descrive una funzione dalla libreria standard C e man 1 printf descrive un programma console con lo stesso nome.

È possibile visualizzare un elenco di tutte le pagine man disponibili sulla macchina utilizzando il comando man -k. (anche il punto fa parte della squadra).

meno

Quando è necessario visualizzare un testo molto lungo in una piccola finestra di terminale (il contenuto di un file, un lungo man, ecc.), vengono utilizzati speciali programmi "cercapersone" (dalla parola pagina / pagina, cioè volantini di pagina) . Il visualizzatore di pagine più popolare è meno, ed è quello che ti fornisce il capovolgimento quando leggi le pagine man.

Prova a confrontare il comportamento:

Cat /etc/bash.bashrc cat /etc/bash.bashrc | less

Puoi trasferire il file al browser direttamente nei parametri:

Meno /etc/bash.bashrc

Scorrimento su e giù - pulsanti su, giù, PaginaSu, PaginaGiù, esci - pulsante q. Cerca un testo specifico: premi / (barra), inserisci il testo da cercare, premi Invio. Passa alle occorrenze successive - tasto n. (Riconoscete un manuale sull'uomo? Non c'è da stupirsi, less viene utilizzato anche per visualizzare l'aiuto.)

diritti

Un insieme di "diritti" è associato a qualsiasi file o directory: il diritto di leggere il file, il diritto di scrivere sul file, il diritto di eseguire il file. Tutti gli utenti sono divisi in tre categorie: proprietario del file, gruppo del proprietario del file, tutti gli altri utenti.

Puoi visualizzare i permessi del file usando ls -l. Ad esempio:

> ls -l Makefile -rw-r - r-- 1 akira studenti 198 Feb 13 11:48 Makefile
Questo output significa che il proprietario (akira) può leggere e scrivere il file, il gruppo (studenti) può solo leggere e tutti gli altri nell'utente possono solo leggere.

Se ricevi un messaggio di autorizzazione negata mentre lavori, significa che non disponi di autorizzazioni sufficienti per l'oggetto con cui volevi lavorare.

Leggi man chmod per i dettagli.

STDIN, STDOUT, trasportatori (tubi)

Esistono 3 flussi di dati standard associati a ciascun programma in esecuzione: il flusso di dati di input STDIN, il flusso di dati di output STDOUT e il flusso di output di errore STDERR.

Esegui il programma wc, digita il testo Good day today, premi Invio, digita il testo good day, premi Invio, premi Ctrl + d. Il programma wc mostrerà le statistiche per il numero di lettere, parole e righe nel testo e uscirà:

> wc buona giornata oggi buona giornata 2 5 24
In questo caso, hai fornito un testo di due righe allo STDIN del programma e tre numeri a STDOUT.

Ora esegui il comando head -n3 / etc / passwd, dovrebbe assomigliare a questo:

> head -n3 / etc / passwd root: x: 0: 0: root: / root: / bin / bash daemon: x: 1: 1: daemon: / usr / sbin: / usr / sbin / nologin bin: x: 2: 2: bin: / bin: / usr / sbin / nologin
In questo caso, head non ha letto nulla da STDIN, ma ha scritto tre righe su STDOUT.

Pensala in questo modo: un programma è una pipe in cui scorre STDIN e scorre STDOUT.

La proprietà più importante della riga di comando di Unix è che i programmi pipe possono essere interconnessi: l'output (STDOUT) di un programma può essere passato come dati di input (STDIN) a un altro programma.

Una tale costruzione di programmi collegati è chiamata in inglese pipe (pipe), in russo - un trasportatore o un tubo.

La combinazione di programmi in una pipeline è fatta dal simbolo | (barra verticale)

Esegui il comando head -n3 / etc / passwd | wc, ottieni qualcosa del genere:

> head -n3 / etc / passwd | wc 3 3 117
Ecco cosa è successo: il programma principale ha inviato tre righe di testo a STDOUT, che è andato immediatamente all'input del programma wc, che a sua volta ha contato il numero di caratteri, parole e righe nel testo risultante.

Puoi combinare tutti i programmi che vuoi in una pipeline. Ad esempio, puoi aggiungere un altro programma wc alla pipeline precedente che conta quante parole e lettere c'erano nell'output del primo wc:

> head -n3 / etc / passwd | wc | wc 1 3 24

La composizione di pipeline (pipe) è una cosa molto comune quando si lavora nella riga di comando. Per un esempio di come ciò avviene in pratica, vedere Creazione di una pipeline unifilare.

Reindirizzamento I/O

L'output (STDOUT) di un programma può non solo essere reindirizzato a un altro programma, ma anche semplicemente scritto su un file. Questo reindirizzamento viene eseguito con> (maggiore di segno):

Data> /tmp/today.txt
Come risultato dell'esecuzione di questo comando, il file /tmp/today.txt apparirà sul disco. Guarda il suo contenuto con cat /tmp/today.txt

Se esiste già un file con lo stesso nome, il suo vecchio contenuto verrà distrutto. Se il file non esiste, verrà creato. La directory in cui viene creato il file deve esistere prima dell'esecuzione del comando.

Se non vuoi sovrascrivere il file, ma piuttosto aggiungere l'output alla fine, usa >>:

Data >> /tmp/today.txt
Controlla cosa è scritto ora nel file.

Inoltre, qualsiasi file può essere passato al programma invece di STDIN. Provare:

WC

Cosa fare quando qualcosa non è chiaro

Se riscontri un comportamento del sistema che non capisci, o vuoi ottenere un certo risultato, ma non sai come esattamente, ti consiglio di procedere nel seguente ordine (a proposito, questo vale non solo per le shell):
  • formulare la domanda o il compito nel modo più chiaro possibile: non c'è niente di più difficile che risolvere "non so cosa";
  • ricorda se hai già riscontrato lo stesso problema o un problema simile: in questo caso vale la pena provare la soluzione che ha funzionato l'ultima volta;
  • leggi i man-s appropriati (se sai quali man-s sono adatti al tuo caso) - forse troverai esempi adatti di utilizzo dei comandi, le opzioni necessarie o collegamenti ad altri comandi;
  • pensa: è possibile cambiare un po' il compito? - magari modificando leggermente le condizioni, otterrai un problema che sai già come risolvere;
  • fai la tua domanda chiaramente formulata in un motore di ricerca - forse la risposta può essere trovata su Stack Overflow o altri siti;
Se nessuna delle soluzioni precedenti aiuta, chiedi consiglio a un insegnante, un collega esperto o un amico. E non abbiate paura di fare domande "stupide" - non è un peccato non sapere, è un peccato non chiedere.

Se hai scoperto un problema difficile (da solo, con l'aiuto di Internet o di altre persone), scrivi la tua soluzione nel caso tu o i tuoi compagni abbiate di nuovo lo stesso problema. Puoi registrare in un semplice file di testo, in Evernote, pubblicare nei social network.

Metodi di lavoro

Copia e incolla- da man-s, da articoli su StackOverflow, ecc. La riga di comando è composta da testo, usa questo: copia e usa comandi di esempio, annota le scoperte riuscite come souvenir, pubblicale su twitter e sui blog.

Estrai il comando precedente dalla cronologia, aggiungi un altro comando alla pipeline, esegui, ripeti.Centimetro. Vedere anche Composizione di una pipeline unifilare.

Comandi di base

  • spostandosi in un'altra directory: cd;
  • visualizzazione del contenuto dei file: gatto, meno, testa, coda;
  • manipolazione dei file: cp, mv, rm;
  • visualizzare il contenuto delle directory: ls, ls -l, ls -lS;
  • struttura della directory: albero, albero -d (puoi passare una directory come parametro);
  • cerca file: trova. -nome ...;

Analisi

  • wc, wc -l;
  • sort -k - ordinamento in base al campo specificato;
  • sort -n - ordinamento numerico;
  • diff - confronta i file;
  • grep, grep -v, grep -w, grep "\ ", grep -E - cerca il testo;
  • uniq, uniq -c - unicità della linea;
  • awk - nella variante awk "(print $ 1)" per mantenere solo il primo campo di ogni riga, $ 1 può essere modificato in $ 2, $ 3, ecc.;

Diagnostica di sistema

  • ps axuww - informazioni sui processi (programmi in esecuzione) in esecuzione sulla macchina;
  • top - visualizzazione interattiva dei processi più dispendiosi in termini di risorse;
  • df - spazio su disco utilizzato e libero;
  • du è la dimensione totale dei file nella directory (in modo ricorsivo con le sottodirectory);
  • strace, ktrace - ciò che il sistema chiama il processo esegue;
  • lsof - quali file sta usando il processo;
  • netstat -na, netstat -nap - quali porte e socket sono aperti nel sistema.

Potresti non avere alcuni programmi, devono essere installati in aggiunta. Inoltre, alcune opzioni di questi programmi sono disponibili solo per gli utenti privilegiati (root "y).

Esecuzione di massa e semiautomatica

All'inizio, salta questa sezione, avrai bisogno di questi comandi e costrutti quando arrivi a semplici script di shell.
  • prova - verifica delle condizioni;
  • while read - scorre le righe STDIN;
  • xargs - sostituzione di stringhe da STDIN in parametri del programma specificato;
  • seq - generazione di sequenze di numeri naturali;
  • () - combina l'output di diversi comandi;
  • ; - completare uno per uno;
  • && - esegue a condizione del completamento con successo del primo comando;
  • || - eseguire a condizione di mancato completamento del primo comando;
  • tee - duplica l'output del programma su STDOUT e su un file su disco.

varie

  • data - la data corrente;
  • curl - scarica il documento all'URL specificato e scrive il risultato su STDOUT;
  • touch - aggiorna la data di modifica del file;
  • kill - invia un segnale al processo;
  • true - non fa nulla, restituisce true, utile per organizzare loop eterni;
  • sudo - esegue il comando come root "a.

Composizione di una pipeline a una linea

Diamo un'occhiata a un esempio di un'attività del mondo reale: è necessario terminare tutti i processi task-6-server in esecuzione per conto dell'utente corrente.

Passo 1.
Comprendere quale programma produce approssimativamente i dati richiesti, anche se non nella sua forma pura. Per il nostro compito, vale la pena ottenere un elenco di tutti i processi nel sistema: ps axuww. Correre.

Passo 2.
Guarda i dati ricevuti con i tuoi occhi, trova un filtro che eliminerà alcuni dei dati non necessari. Spesso questo è grep o grep -v. Usa il tasto "Su" per estrarre il comando precedente dalla cronologia, assegnargli il filtro che hai inventato ed eseguirlo.

Ps axuww | grep `whoami`
- solo i processi dell'utente corrente.

Passaggio 3.
Ripeti il ​​passaggio 2 finché non ottieni i dati puliti che desideri.

"
- tutti i processi con il nome desiderato (più, forse, quelli non necessari come vim task-6-server.c, ecc.),

Ps axuww | grep `whoami` | grep "\ "| grep -v vim ps axuww | grep` whoami` | grep "\ "| grep -v vim | grep -v less
- solo processi con il nome richiesto

Ps axuww | grep `whoami` | grep "\ "| grep -v vim | grep -v less | awk" (stampa $ 2) "

Pid di processo richiesti, passaggio 3 completato

Passaggio 4.
Applicare un idoneo manipolatore finale. Usando il tasto "Su", estrai il comando precedente dalla cronologia e aggiungi l'elaborazione che completerà la soluzione del problema:

  • | wc -l per contare il numero di processi;
  • > pids per scrivere pid su un file;
  • | xargs kill -9 kill processi.

Compiti di formazione

Vuoi mettere in pratica nuove abilità? Prova le seguenti attività:
  • ottieni un elenco di tutti i file e le directory nella tua directory home;
  • ottenere un elenco di tutti gli articoli man della categoria 2 (chiamate di sistema);
  • conta quante volte compare la parola grep nel grep man-e;
  • contare quanti processi sono attualmente in esecuzione come utente root;
  • trova quale comando compare nel numero massimo di categorie di aiuto (man);
  • conta quante volte la parola var appare nella pagina ya.ru.
Suggerimento: è necessario trovare, grep -o, awk "(print $ 1)", espressioni regolari in grep, curl -s.

Cosa studiare dopo?

Se inizi a piacerti la riga di comando, non fermarti, continua a migliorare le tue abilità.

Ecco alcuni programmi che ti torneranno sicuramente utili se vivi sulla riga di comando:

  • trova con opzioni complesse
  • a proposito
  • individuare
  • telnet
  • netcat
  • tcpdump
  • rsync
  • schermo
  • zgrep, zless
  • visudo
  • crontab -e
  • inviare una mail
Inoltre, nel tempo vale la pena imparare un linguaggio di scripting come perl o python, o anche entrambi.

Chi ne ha bisogno?

Vale la pena imparare la riga di comando e lo scripting della shell oggi? Ne vale la pena. Ecco alcuni esempi dei requisiti di Facebook per i candidati che desiderano candidarsi per un lavoro presso FB.

Principali articoli correlati