[Seminario - Unix Shells, Ambienti] [Douglas Kline - Harvard University] [Questo è CS50. - CS50.TV] Tema di oggi è la shell Unix. Sono Douglas Kline, esperto, o almeno l'uso ragionevolmente competente, del guscio. Una shell è l'interfaccia per l'utente di sistema operativo del computer. Il nome è fuorviante, in quanto, a differenza di guscio di un animale, che è dura e protettiva, il guscio calcolatore permette la comunicazione. Così membrana porosa probabilmente sarebbe una metafora migliore. La scocca originale per Unix è la shell Bourne. Bourne è scritto B-O-U-R-N-E. Bourne è stato uno degli autori originali di Unix, e così il guscio porta il suo nome. Il nome di quel guscio come comando è semplicemente sh. Questo è il comando è possibile eseguire. La shell inizia login. Quando si accede al computer, la shell inizia a correre solo per te, e questo è quello che prende i comandi. Si può iniziare anche in altri momenti. Se si apre una finestra con nessuna altra indicazione, si avvierà una shell per voi. Ecco come è che si può andare a una finestra e iniziare a digitare i comandi e così via, lì anche se non avete accede a quella finestra. Inoltre, se si fa un login remoto, allora inizierà una shell sul computer remoto. Ed è possibile eseguire comandi senza una shell interattiva. Che può significare all'interno della vostra operazione in corso, e può anche significare un funzionamento a distanza. Si può inviare un comando a un altro computer, che comprende l'avvio di una shell. Infatti, essa deve comprendere avviare una shell ci anche se questo non è il vostro scopo finale. Quando qualcosa comincia in questo modo, non necessariamente avviare una nuova shell. Se si apre una nuova finestra, è possibile dire che per aprire un editor o qualche altro comando. In tal caso, l'editor ripartire da zero. Quando l'editor finisce, la finestra si conclude. Questo è un po 'insolita ma può essere fatto. In tali casi, non sarà una shell. Quindi non è necessariamente il caso che una finestra o qualche applicazione, si apre una shell. Shell analizza i comandi. Analisi significa identificare i vari elementi e la loro classificazione. All'interno di un comando, la stringa completa che si digita, ci saranno uno o più singoli comandi da eseguire. Altri elementi possono essere argomenti. Ci possono essere anche caratteri speciali che possono influenzare l'esecuzione di un comando. Possono inviare l'output altrove rispetto allo schermo se il comando sarebbe stato normalmente invia allo schermo. Si può reindirizzare ingresso, ma può fare anche altre cose. Ci sono vari altri simboli, personaggi e così via. Analisi coinvolge rilevare e interpretare le cose. Ora, se non ci sono altre domande, che è piuttosto probabile dal momento che non ci sono più persone, andremo alla mia prossima pagina qui. Ho detto prima che la Bourne shell è la shell iniziale. Ci sono altri. Uno è il C-shell. Il comando è csh. Il nome di C-shell è solo un gioco di parole. Questo guscio è stato introdotto con la Berkeley Unix a metà degli anni 1970. Berkeley Unix era un evento fondamentale nello sviluppo di Unix. E 'stata una rivoluzione enorme e comprendeva l'introduzione di questa shell. La ragione di tale gioco di parole, C-shell, è che il C-shell ha alcune caratteristiche in esso che ricordano il linguaggio C, che la Bourne shell non ha - o non ha avuto in quel momento. C'è anche il TC-shell. Questo è un superset del C-shell. Ha caratteristiche aggiuntive, molte delle quali sono utili per uso interattivo, come ricordando comandi nel meccanismo storia, che descriverò po 'più tardi - in modo semplice, modellato un editor. Ha anche le associazioni che permettono di associare una breve stringa chiave a un comando più lungo. Non stiamo andando a essere sempre in quella di oggi. Ha alcune caratteristiche che sono utili per la programmazione. Tuttavia, la C-shell non viene spesso utilizzato per la programmazione di shell. Programmi di shell, se non avete già sapete, sono programmi che consistono di caratteristiche shell. È possibile eseguire questi programmi. Si scrive un gruppo di comandi di shell in un file ed eseguire il file. Non c'è bisogno di compilarlo. Questo è un linguaggio interpretativo. La frase C-shell è ambiguo in quanto potrebbe indicare solo l'originale C-shell, csh, o per tutti i C-shell, compresi tcsh. E 'un po' ambiguo. Una shell più tardi è la shell Korn, ksh, dal nome del programmatore, Korn. Questo guscio ha tentato di incorporare in uno shell i vantaggi della C-shell per uso interattivo e la Bourne shell per la programmazione. E 'stato usato come una shell interattiva da alcune persone - una minoranza. Più tardi però, c'era un'altra introduzione, la shell Bash, BASH, ancora una volta un gioco di parole, Bourne-again shell. Si tratta di un'estensione della shell Bourne. Korn shell è anche. Entrambi sono. Ha gli stessi obiettivi della Korn shell di amalgama di C-shell ed i vantaggi di Bourne shell in 1 shell. Molti dei miglioramenti della shell Korn sono anche incluse in Bash. Bash, tuttavia, ha più ed è quindi preferibile. La Bourne-again shell e la Korn shell sono chiamati Bourne tipo conchiglie perché includono le caratteristiche della Bourne shell, che sono incompatibili in alcuni aspetti con C-shell. Ci sono altre shell oltre a quelli, alcuni destinati ad uso limitato, forse limitato ad alcuni comandi, forse scopi specialistici, spesso non utilizzati. Va bene >>. Articolo successivo qui. La shell Bash è diventato associato a varie forme di Linux. Non sono sicuro se questo è vero per ogni forma. Ci sono molte forme là fuori e io non li hanno utilizzati, ma in quelli che ho usato è diventato associato con esso. Per quanto ne so, non c'è nulla di Bash che lo rende più compatibile con Linux rispetto a qualsiasi altra combinazione di guscio e sistema operativo. Penso che questo probabilmente riflette solo le inclinazioni dei programmatori. Che è diventato associato a Linux è un altro motivo per preferire Bash a ksh poiché le cose sono suscettibili di essere scritto in esso ed è probabile che si diffonda. Ti darò altre ragioni per che più tardi. Script di Bourne shell dovrebbero essere eseguiti sotto la shell Korn e Bash. Se si scrive qualcosa per la shell Bourne, probabilmente è possibile eseguire sotto ksh o bash. Korn shell script sarà probabilmente eseguito in Bash, ma non posso garantirlo. Più tardi qui, gli script di C-shell dovrebbero funzionare sotto il TC-shell. Il C-shell è stato effettivamente mai ampiamente utilizzata per lo scripting poiché la Bourne shell e poi le shell di tipo Bourne fosse preferibile per tale scopo. In modo che non è poi così importante. Ci sono un sacco di Bourne script di shell che sono state scritte molto tempo fa, prima che la shell Korn o la Bourne-Again Shell sono state introdotte. Quelli sono ancora in uso, parte dei sistemi operativi, e così li troverete se si guarda al sistema operativo o alcuni vecchi pacchetti di programmazione. Bash è in qualche modo diventare una sorta di lingua franca per i sistemi operativi. E 'già stato esteso a Windows e VMS. VMS, nel caso in cui non si conosce, è un sistema operativo proprietario di Digital Equipment Corporation, che è ancora in uso, in gran parte dietro le quinte. E se sta andando ad essere in esecuzione su diversi sistemi operativi, probabilmente le persone tendono a spostarsi per esso. Ma questo sviluppo è relativamente recente. E 'solo all'inizio, quindi non posso prevedere se questo si rivelerà essere davvero quel tipo di lingua franca. Inoltre, poiché percorsi di file e librerie differiscono tra questi diversi sistemi operativi, potrebbe non essere in grado di scrivere uno script Bash su un sistema operativo e poi eseguirlo su un altro. Dovreste essere in grado di spostare tra le diverse Unix, Linux I sistemi operativi Mac OS, ma non necessariamente a Windows o VMS. Potrebbe essere necessario modificare le descrizioni di file nomi di percorso, e alcune librerie potrebbero essere differenti, che possono influenzare il modo in cui alcuni comandi funzionano o come si elaborano gli argomenti e simili. In aggiunta a ciò, un altro cautela qui è che non vi è alcuna garanzia che tutte le varie shell che ho citato - Bourne shell, C-shell, TC-shell, shell Korn, Bourne-again shell - sarà disponibile in qualsiasi Unix o Linux o Mac OS. Essi semplicemente potrebbero non essere lì. Questa è una delle cautele qui. Si tratta di uno sfortunato limitazione qui perché vuoi cose funzionino ovunque, ma purtroppo, non si può fare affidamento su questo. Va bene >>. Uno accanto qui. Diciamo che si desidera scrivere uno script di shell, un programma costituito da comandi di shell. Tu scrivi i comandi, li metti in un file, ed eseguire il file. Che cosa succede se si desidera includere argomenti? Nel caso di operazioni di shell, gli argomenti sono detti parametri o parametri posizionali ed essi saranno chiamati dal simbolo del dollaro e numerale, $ 1, $ 2. Quindi, se lo script ha questo nome, il mio primo argomento potrebbe essere argomento 1 e il mio secondo potrebbe essere argomento 2, e dentro il mio script se voglio fare riferimento a queste cose - cerchiamo di cancellare questo dato che non ho davvero intenzione di farlo funzionare - dentro il mio script potrei avere $ 1 per riferirsi a arg1, $ 2, che uscirà in quel modo, arg2. Così quei simboli sono a disposizione per fare riferimento ad argomenti, e quelli si applicano a tutte le conchiglie. In aggiunta, ci sono altri caratteri. $ * Si riferisce a tutta la lista degli argomenti, tutti loro. $ # Si riferisce al numero di argomenti. Ancora una volta, questo vale per tutti i gusci. Tali simboli * e #, possono essere utilizzati con i significati in altri luoghi anche. Noi non sarà sempre in quello. Linea identificatore Shell. Che cosa è che per? Diciamo che hai scritto una sceneggiatura ed è per una particolare shell e si desidera eseguire. Come fai a sapere che cosa shell del sistema operativo verrà utilizzato per eseguire lo script? A un certo punto si potrebbe supporre che avrebbe eseguito nella shell Bourne se non hai detto altrimenti, ma la gente non stanno scrivendo script nella Bourne shell che tanto più e non si può nemmeno invocare tale più. Quindi qui abbiamo una linea identificatore shell proprio qui. Che specifica Bash. Si noti che specifica nel percorso, / bin / bash. Se un computer ha la shell Bash, ma non nella directory bin, / bin, questo non funzionerà. Questo è un altro qualificatore, un'altra cautela qui. Il cancelletto è il carattere riga di commento. Ciò vale per tutte le shell. Il caso particolare qui, #! all'inizio di uno script, è un caso speciale. Che specifica la shell in cui eseguire lo script. Come dicevo, potrebbe non essere lo stesso luogo / bin. Inoltre, c'è un'altra cosa qui. Se si utilizza il simbolo di cancelletto senza punto esclamativo e il percorso, che dovrebbe indicare un C-shell. Comunque, io non consiglio di farlo perché non sono in grado di garantire che questo sarà sempre funziona. Se si desidera un C-shell, sarebbe meglio dire così. Poi c'è qualcosa piuttosto confuso qui. Se si utilizza una linea shell identificatore come / bin / bash e che la shell non è disponibile qui, non c'è cosa come / bin / bash su quel particolare computer, sia perché non ha Bash o perché è in una posizione diversa, si otterrà un errore che indica che lo script è stato eseguito non esiste. E naturalmente esiste script, in modo che il messaggio di errore è confusa. La ragione per cui il sistema operativo che ti dà errore o, più precisamente, che la vostra shell interattiva in cui si esegue questo dà questo errore, è che riporta il comando che hai usato, che è il nome dello script. Questo comando efficacemente chiamato il guscio con il nome dello script. Ecco dove si ottiene il messaggio di errore confusione. Un altro modo per chiamare script di shell è specificando la shell sulla riga di comando, come qui. Questo è un comando. Questo dice eseguito Bash e quindi eseguire il mio script in Bash. Che avrà la precedenza su una linea identificatore, e questo ha la caratteristica di permettere di fornire per percorsi diversi. Se basta dare un comando, il sistema operativo cercherà quel comando in vari luoghi. Se è disponibile, dovrebbe trovarlo. Il computer troverà Bash ovunque si trova ed eseguirlo, quindi non c'è bisogno poi di essere preoccupato per dove si trova. Ci sono potenzialmente altre preoccupazioni qui, come se ci fosse più di 1 versione di Bash, che è possibile, anche se improbabile. Ecco, questo è un altro modo per affrontare queste cose. Linee Prescrizione possono chiamare qualsiasi shell. Essi possono anche chiamare le cose diverse da conchiglie. Esempi che ho qui sono sed, che è l'editor di flusso; awk, che è un linguaggio di elaborazione del modello; e perl, un linguaggio di scripting molto altamente sviluppata. Se si mette una linea identificatore che indica uno di quei programmi all'inizio, andrà direttamente in quel programma, piuttosto che avviare una shell. Tali programmi hanno dei limiti alle loro capacità. Perl è molto capace. Sed è un editor. Si può fare cose oltre la semplice modifica. Ma può essere difficile da programmare che. Inoltre, il passaggio di argomenti e roba di script è impossibile o confusione. Quindi, in questi casi, con awk o sed, è, almeno nella mia esperienza, preferibile scrivere un guscio sceneggiatura e chiamata awk o sed dallo script di shell piuttosto che chiamare awk o sed come la linea dello script identificatore. Perl è un linguaggio altamente diversificata, come ho detto. Non è possibile eseguire comandi interattivi in ​​perl, il che significa che non è possibile testare parti di script che si sta in via di sviluppo eseguendo interattivamente. Tuttavia, è un linguaggio estremamente capace e si è sviluppato in uno strumento molto diffuso. Questo è solo un po 'di un'osservazione parentesi le linee identificatori. In tutta o la maggior parte delle forme di Linux - ancora una volta, non posso essere sicuro che è tutto - e in Mac OS, se si digita csh si ottiene tcsh, e se si digita sh si ottiene bash. Stavano cercando lì per dare le versioni più avanzate di questi gusci, ma questo può essere fonte di confusione. Se si scrive uno script utilizzando tcsh o Bash caratteristiche durante la chiamata csh o sh e quindi provare a farlo funzionare su un computer che non dispone di tcsh o Bash, si potrebbe ottenere alcuni errori se ci sono comandi in là che quelle conchiglie non riconoscono. Inoltre, si può avere richiamato la vostra shell sul computer locale definendolo come sh o csh e quindi ottenere le conchiglie più avanzate. Si può anche non pensare al fatto che si sta utilizzando la shell più avanzate. Quindi questo è un potenziale problema. Come si determina che, se si digita sh si ottiene Bash, se si digita csh si ottiene tsch? Ci sono cose in questi computer chiamati link che può collegarsi ai nomi dei file per fare riferimento alla stessa cosa. Può essere sia 2 nomi per lo stesso file o un file il cui scopo è quello di fare riferimento a un altro file. Si chiamano hard link e simbolici. Noi non torneremo in più così oggi. Ci possono essere anche file separati - 1 file sh, 1 file Bash - ma entrambi corrono Bash. Poi c'è un altro qualificatore qui. Se stai chiamando uno di questi gusci con un solo nome, si potrebbe pensare che si otterrebbe la stessa funzionalità chiamandolo con un altro nome. Beh, che in realtà non è necessariamente vero. Questi comandi possono esaminare il nome con cui venivano chiamati e possono, sulla base di questo nome, in modo diverso. Ci possono essere problemi di cercare di conformarsi a uno standard. Alcuni di voi avranno sentito parlare di standard POSIX o un altro, forse altre caratteristiche. Questo può essere selezionato a volte dagli argomenti della riga di comando o impostando le variabili di shell. Chiamarlo come sh o bash può effettivamente portare ad un'esecuzione diversa anche se è lo stesso file che si sta eseguendo. Un'altra cosa da considerare è che, anche se un altro computer dispone di tcsh o Bash, se non sono legati come sono sul computer locale se si dispone di un computer locale Linux o Mac OS, poi di nuovo si otterrà il guscio che si chiama sh o csh, non quello che si potrebbe preferire. L'attuale Bourne shell ha miglioramenti minore rispetto a quelli in Bash ma oltre quelli della shell Bourne originale. Come risultato di ciò, anche la shell Bourne corrente, SH, anche quando non è Bash, ricorda il linguaggio C più della C-shell fa. Non era vero quando la C-shell è stato creato, ma si è sviluppato in questo modo. Si potrebbe notare qui che tutti questi nomi shell fatta eccezione per la shell Bourne avere qualcosa a indicare quali shell sono - csh, bash - ma la Bourne shell è solo sh. Perché? Questo era il guscio originale. E 'stata la shell allora, non una shell, e dato che era il guscio, non c'era motivo per distinguerla da un'altra shell. Allora è per questo che ha quel nome e ancora lo fa. Questo top ecco una linea da un database di password di un account lì ho su un altro computer. Io vado a cercare di ottenere quel nome così potete vedere che parte alla fine, il guscio. Il database delle password contiene le caratteristiche di accesso per tutti gli utenti. All'inizio è il nome utente, che potete vedere le ultime 2 lettere di mio momento. I campi qui sono separati da due punti. L'ultimo campo, come potete vedere, è bin / tcsh, la shell. Questo è l'identificatore shell. C'è qualcosa di interessante qui. Quando Unix è stato sviluppato, c'era solo 1 shell, quindi non c'era scelta lì. Allora perché permettono un campo del database delle password per specificare una shell? Non lo so, ma è una fortuna che hanno fatto. E 'piuttosto difficile fare cambiamenti nel formato database delle password perché molti programmi si riferiscono al suo formato e avrebbe dovuto essere riscritto. Si tratta di uno sviluppo felice o fortuito che hanno incluso quel campo. Questo tipo di una linea di file di password viene utilizzato su tutti i computer Unix e Linux per quanto ne so. Il Mac ha il suo sistema. In realtà ha un file di password con le linee in quel formato, ma che non è dove sono definite le caratteristiche degli utenti. Un'altra osservazione parentesi lì. Se stai chiamando una shell, si può chiamare come sub-shell dei vostri conchiglie esistenti. Quindi, se vado qui, Liberiamoci di queste cose. Eccomi nel C-shell. Tale variabile, che identifica con precisione il mio guscio, in realtà non è sempre un modo affidabile per determinare che cosa shell si sta eseguendo, ma in questo caso è. Cosa succede se ho appena digito - Ora sono in Bash. Alcune cose stanno per essere lo stesso. ls mi dice i miei comandi. Se faccio un sospendo di nuovo al mio C-shell, ls stessa. Giusto? fg, primo piano, di nuovo alla mia shell Bash. pwd, directory corrente, di nuovo al C-shell. pwd, diversa directory - in realtà non è una directory diversa in questo caso. E 'la stessa directory. Diciamo che voglio chiamare un comando qui: dove ls. Che cosa fare? Mi dice dove il comando ls quello che mi dà un elenco di directory, si trova a ls. Torniamo alla shell Bash. Proviamo la stessa cosa. Hmm, interessante là dove: command not found. Perché è così? Il cui comando è costruito dentro al C-shell. Questo non è un comando che deve essere letta in memoria da qualche altra parte ed eseguito. Il C-shell gestisce trasferendo l'esecuzione a una parte del proprio codice e non è la shell Bash. Quindi Bash, non avendo un tale comando built-in, lo cerca, non lo trova, e otteniamo un errore. Così ci abbiamo Bash shell in esecuzione con un C-shell, e chiediamo che un sub-shell. E solo nel caso foste curiosi, shell Bash ha il suo modo di localizzare comandi. hash si riferisce al fatto che può essere eseguito più rapidamente, essere trovati più rapidamente. Questo è uno dei miglioramenti incorporati in alcune di queste conchiglie. Bourne tipo gusci sono da preferire per la programmazione. Hanno strutture di controllo come i cicli, istruzioni condizionali, il tipo di comandi che è possibile utilizzare in linguaggi di programmazione come C o qualunque linguaggio. Forse stai programmando in Java o qualsiasi altra cosa. I serbatoi sono quelli troppo. Le Bourne tipo conchiglie, in particolare Bash, hanno più e sono progettati con una maggiore flessibilità. La shell Bash ha matrici. L'originale Bourne shell non lo fa. Di modo che può essere notevolmente vantaggiosa per la programmazione. Il C-shell fa effettivamente array, ma non hanno un sacco di queste altre caratteristiche. Le shell di tipo Bourne verranno eseguiti più velocemente se non hanno le caratteristiche previste per uso interattivo. Si carica le cose per uno scopo e questo li carica giù per un altro scopo. C'è quel trade-off lì. Quelle caratteristiche che sono destinati per l'uso interattivo sono davvero di poca o nessuna utilità per lo scripting. E 'possibile utilizzare un sub-shell interattiva proprio come quella che ho cominciato lì per testare i comandi che si intende utilizzare in uno script. Questo è ciò che non si può fare con perl. Puoi farlo con le conchiglie. Anche le strutture come per i loop e così via possono essere eseguiti in modo interattivo. Essi sono a volte utili per eseguire in modo interattivo, ma più probabilmente si sta usando per sviluppare uno script. Alias. Questo sta per essere circa la C-shell. Meccanismo di Storia dove si arriva di nuovo ai comandi precedenti o parti di esse che hai già eseguito. Anche in questo caso, circa la C-shell, la shell Bourne e Korn shell hanno queste cose, ma io non ho intenzione di entrare in loro. Così qui sono alcuni alias utili che ho. Invece di digitare ls - è un comando comune - basta digitare l e risparmiare 1 carattere. ls con diverse opzioni, tutte quelle di lavoro. Si noti che queste definizioni hanno quotazioni intorno a loro. In questi casi, le virgolette non sono necessarie. Se si può definire tali alias senza virgolette, sarebbe ancora funzionare. Sono consigliate. Ci sono situazioni in cui non è possibile utilizzare il prezzo perché si vuole che accada qualcosa che la citazione impedirebbe. A volte si può citare una parte della definizione, ma non tutto. E 'anche generalmente raccomandato di utilizzare le virgolette singole, piuttosto che doppi apici. Le virgolette doppie hanno effetti sulle definizioni di variabili, particolare causando loro da valutare anziché fermarlo. Perché vorremmo fermare la valutazione? E come le citazioni fanno per noi? Qui è un comando che si potrebbe trovare interessante. 'Ls g *' g *, come probabilmente sapete, è un'espressione jolly per tutti i nomi di file che iniziano con g. Se ho solo scrivere in un comando ls g *, vado a prendere una lista di tutti quei nomi nella mia directory corrente. Se io definisco che alias è qui con le virgolette, verrà eseguito quel comando nella directory corrente in cui si sta eseguendo esso. Ma se si esegue la definizione dell'alias senza le virgolette, valuterà il carattere jolly * g quando viene eseguito questo comando di definizione. Così la definizione dell'alias sarà ls seguito l'elenco dei file nella directory in cui viene eseguito il comando alias, indipendentemente da dove realmente intenzione di eseguire il comando. Questo non è di grande utilità, e gli apici prevenire la valutazione della asterisco. Quindi basta avere la definizione dell'essere LS g *. Poi, quando si esegue l'alias, lgs, poi mette che fuori. Ora non ci sono citazioni, e valuteranno l'asterisco quando si esegue il comando alias. Ecco, questo è una cosa. Virgolette doppie avrebbero lo stesso effetto qui, ma ci sono altri casi in cui virgolette non avrebbe funzionato così bene. Qui è un altro. Si potrebbe sapere il comando grep. Il comando grep può essere utilizzato per eseguire la scansione di un file per le linee che hanno determinate stringhe. Allora andiamo qui e io uscire dal mio guscio Bourne. Ok. Ecco un file. Diciamo che si tratta di stringhe abc grep. Eccolo. Se faccio zddd grep, non ottengo niente. Ok. Così si trova una stringa, riferisce, non lo trova, non segnalarlo. Produce ogni riga che ha quella stringa su di esso. Ci sono tutti i tipi di opzioni qui che potete trovare nella documentazione. Ecco un modo per farlo. Che dire di questo, alias grabc 'grep abc'? Che sta per includere 1 argomento quando l'alias è definito. Quindi, se lo faccio qui, ora se faccio grabc, ora l'alias comprende oltre il semplice comando. Essa ha anche l'argomento. Finora funziona. Ho un altro comando qui, questo, quindi quelli sono diverse stringhe in là e dimostrano che questa non trova niente lì perché non corrisponde. Cosa succede se voglio includere nella definizione alias del file che ho intenzione di cercare e voglio dare come argomento per l'alias la stringa che sto cercando? Potrei voler dire abc come argomento al mio alias, ma l'alias già determinato file. Ed è qui che entra in gioco questa espressione Notate qui abbiamo grep come prima. Abbiamo qui il file, stringhe. \! ^, Una specie di strana espressione, suppongo, se non avete visto prima. Punto esclamativo è parte del meccanismo storia C-shell. Può richiamare comandi precedenti, può richiamare argomenti per i comandi e così via. Il meccanismo storia viene utilizzato come parte di aliasing. Se si specifica una riga dopo il punto esclamativo, si farà riferimento a quella linea nella lista della storia, che non saremo ottenendo in ora visto che è tutto un altro argomento. È possibile specificare una parte di una linea. Così! 03:02 sarebbe il secondo argomento del numero di comando 3. L'accento circonflesso qui, in questa espressione rappresenta il primo argomento. Se non si dà una indicazione di quale comando ti riferisci, si riferisce al comando immediatamente precedente, e il cursore è un simbolo per il primo argomento. Perché è il cursore e non il numero, non è necessario utilizzare il colon, così! ^ significa che il primo argomento del comando precedente. Un po 'confusi qui. In questo caso, quando si utilizza questo come una definizione di alias, il riferimento storico rimanda ai comandi in cui viene utilizzato l'alias. Quindi questo sta andando indietro 1 comando come un'operazione di storia, ma come un'operazione alias si riferisce al comando in cui si digiterà, dire, grstrings_file. Abbiamo le citazioni qui in esso. Qual è il backslash per? In questo caso, come altrove, non vogliamo eseguire il meccanismo storia definendo l'alias. Se non avessimo il backslash lì, la shell tirava nel primo argomento del comando a destra prima si correva il comando alias, che non vogliamo. Vogliamo che questo sia costruito al comando alias per chiamare in un argomento più tardi. Apici singoli non sfuggono un punto esclamativo, il riferimento storico. Forse lei sa la fuga espressione significa cambiare il significato di qualcosa. In questo caso, significa fermare qualcosa da avere un significato speciale. Significato speciale del punto esclamativo è storia. Fuga e non avere quel significato. Quotazioni non lo fanno; backslash fa. Quindi stiamo in realtà con 2 livelli di sfuggire qui. Ho intenzione di spostare questo comando in altra finestra senza digitandola utilizzando queste operazioni di modifica, che si possono trovare utili. Un'altra cosa qui ti faccio vedere. Se basta digitare alias senza argomenti, ti dice tutti i tuoi argomenti. Si tratta di una serie di alias ho già avuto qui oltre a quelli che ho utilizzato qui oggi. Ma se ho appena Type con il nome di un alias, mi dice che cosa significa. Si noti che le citazioni sono andati e il backslash è andato. Questa stringa qui è il risultato di tale definizione alias, e ora ha solo! ^ in esso. Questo sta a guardare nelle corde di file per nulla. Quindi se faccio stringhe grstrings_file, io non ho dato nulla per cercare lì, ma che sta cercando in stringhe. Esso non ha trovato la parola stringhe nelle stringhe di file, ma non trova abc. E non ritiene che. Così qui stiamo dando un argomento che colpisce nella definizione di alias, che viene inserito in esso. È il luogo dove questa espressione viene. È possibile utilizzare più di 1. Il cursore è un simbolo per il primo argomento. Se si volesse utilizzare un secondo argomento, si dovrebbe quindi dire: 2. Non c'è nessun simbolo speciale per il secondo argomento. E perché si sta utilizzando un numero, si dovrebbe usare il colon. Vi è, tuttavia, un'altra scelta qui. Il segno del dollaro rappresenta l'ultimo argomento. E perché questo è un simbolo, è possibile omettere il colon. Quindi sarebbe l'ultimo argomento della lista. E c'è anche quello. Asterisk vuol dire tutto, quindi questo è l'elenco di argomenti completo, e ancora, è possibile omettere i due punti perché non è un numero. Spero che tu stia tutto osservando tutto questo. Il meccanismo storia può tornare a righe precedenti nella lista della storia. Si potrebbe fare questo in una definizione di alias. Non ho mai visto questo fatto. Essa avrebbe l'effetto di tirare i comandi precedenti dalla lista della storia quando si esegue l'alias, che potrebbero essere diversi comandi a seconda di quando e dove lo si esegue. In teoria si potrebbe desiderare di tirare fuori un siffatto riferimento solo sapere che cosa un comando precedente è stato. Non ho mai visto questo accadere. Suppongo che qualcuno potrebbe desiderare, ma questo è molto improbabile. C'è un'altra cosa qui. Se si utilizza il riferimento storico-tipo, poi vengono utilizzati solo gli argomenti per i quali esiste un siffatto riferimento. Se si dispone di una definizione di alias che non utilizza un riferimento di storia-tipo, se diventa solo l'inizio del comando e si dispone di ulteriori argomentazioni, quindi tutto quello che scrivi dopo che sarà aggiunto al comando. In questo caso, l'esempio che ho appena dato lì, abbiamo usato il primo argomento; non abbiamo usato tutti gli altri. Se altri argomenti erano stati dati sulla riga di comando, essi non sarebbero stati utilizzati. Quindi, se si utilizza il riferimento di storia a tutti, quindi è necessario utilizzare per ottenere un qualsiasi argomento. C'è un'altra cosa che qui voglio solo accennare, in parte tra parentesi, vale a dire che questo meccanismo storia con il punto esclamativo risale al C-shell originale. La tcsh ha introdotto operazioni storia che utilizzano i tipi di comandi e stringhe da redattori, sia Emacs o vi. La mia opinione personale è Emacs è molto più facile da utilizzare per questo scopo anche se si utilizza vi per l'editing normale. Ci sono vari comandi Emacs che ora sono adattate per la storia. Controllo P ottiene la riga precedente nella lista della storia. Un altro controllo P otterrà quello prima. La freccia in su fa la stessa cosa. Controllo N ottiene il comando successivo se hai già scorso in indietro qualche modo. Freccia verso il basso lo fa troppo. È possibile spostare da sinistra a destra con le frecce e varie altre cose. Questo può avvalersi del meccanismo di storia molto più facile che utilizzando la sintassi punto esclamativo, ma non si userebbe che in una definizione di alias. Andremo oltre che qualche altra volta. Variabili. Sai cosa sono le variabili nei linguaggi di programmazione. I gusci li hanno. Il C-shell utilizza il comando set per assegnare le variabili, così che imposta la variabile a al valore di b - come ho detto, una definizione inutile, ma un esempio di come questo viene utilizzato. Il comando set creerà una variabile, se non esiste già. I parametri posizionali per script di shell possono essere considerate variabili, ma il loro uso e le regole per loro sono un po 'diverso. Non è possibile assegnare un valore a $ 1 nel corso di uno script. Si dovrà definire una nuova variabile a tal fine, se qualcuno di voi volevano. Digitare set senza argomenti e si ottiene una lista di tutte le variabili attualmente definite. E veniamo al mio altre shell qui e vediamo cosa otteniamo se lo facciamo. Piuttosto un lungo elenco, giusto? Scorrere verso l'alto un po '. Guardate tutto questo. Alcune di queste cose sono definite automaticamente dalla shell. La shell crea la variabile e gli dà un valore. Alcuni di essi sono definiti dalla shell ma poi ridefinito dall'utente secondo le sue preferenze. E alcuni di loro sono creati dall'utente a seconda di quello che sta facendo quel giorno. Questo è solo impostato senza argomenti. C'è una caratteristica strana qui di questa cosa. Ci devono essere sia nessuno spazio tra il segno di uguale e il nome della variabile e il valore o spazi su entrambi i lati del segno uguale, come in questo. Questo non funziona, e questo in realtà è un comando valido ma non farà che cosa si intende. Questo comando funziona perché se hai appena detto di impostare e un nome di variabile senza segno di uguale o impostare e un nome di variabile con un segno di uguale e nessun valore, sarà impostare la variabile su un valore null. Così set a = è un comando valido. Il comando set può definire più di 1 variabile sulla stessa linea. Quindi questo comando qui ha l'effetto di definire sia a e b valori null. Probabilmente non è quello che vuoi. Questo qui, menzionato in precedenza, porterà ad un errore perché = b non è un'espressione valida. Un nome di variabile non può iniziare con il segno di uguale. E ci sono queste altre cose qui. I due punti sono stati utilizzati per selezionare gli argomenti da linee di storia, e possono essere utilizzati - e io non andare in prima - per modificare le cose. Possono anche essere utilizzati per modificare le variabili di shell. Questo qui, $ a, ha un valore. : R decollerà un'estensione. Una proroga sarà nulla in seguito a un punto, un punto e niente seguente alla fine di un file, solo alla fine della lista dopo l'ultima barra. Così ho qui. a è che. Si scenderà il. O. Se non c'è estensione, solo i percorsi dopo l'ultima barra, non avrà alcun effetto. a: h, che espressione variabile, si toglie l'ultimo elemento di una lista di directory, ancora una volta, solo dopo l'ultima barra. Quindi / a / b / c diventa / a / b, ma questo è cambiato perché l'elemento dopo l'elenco è nullo. Qui c'è qualcosa che anche io voglio sottolineare. Queste qualificazioni non cercano l'esistenza di questi file. Sembrano appena per le stringhe. Questi hanno lo scopo di manipolare i nomi di file, nomi di percorso, ma possono essere utilizzati su qualsiasi stringa, anche se non è un nome di file. E loro non guardano per l'esistenza, quindi se non c'è tale file, / a / b / c, questo continuerà a funzionare. Sia che si tratti di qualche utilità è un'altra questione, ma continuerà a funzionare. Le variabili sono diverse shell Bourne. Ci arriveremo più avanti. Segno del dollaro può essere sfuggito come il punto esclamativo e l'asterisco. Segno del dollaro può essere sfuggito con un backslash o le virgolette singole. Virgolette doppie hanno l'effetto strano in tutte le shell di forzare la valutazione di un dollaro segno espressione variabile. Quindi, se si tratta di essere sfuggito a senso unico, le virgolette doppie possono avere l'effetto di farla valutare comunque. Questo è un po 'di confusione. Se ci sono più livelli di fuga, come apici all'interno di doppi apici o doppi apici all'interno virgolette singole, si dovrebbe provare a vedere cosa accadrà a una variabile se si sta utilizzando uno. Quei due situazioni - doppia all'interno di un singolo, unico all'interno della doppia - non necessariamente vi darà lo stesso risultato. Le variabili di ambiente, legati variabili C-shell. Le variabili d'ambiente sono variabili nel C-shell, e sono anche le variabili in altre shell troppo. Nel C-shell, sono insiemi distinti. Le cose che dicevo prima sono circa variabili di shell. Le variabili d'ambiente sono una serie distinta di variabili con l'eccezione di diverse variabili che chiamiamo variabili vincolate, che sono molto importanti e ci arriveremo in quelli più tardi. Le variabili di ambiente vengono passate automaticamente di conchiglie o comandi eseguiti dalla shell. Le altre cose non sono. Le variabili di shell, gli alias non sono. Le variabili di ambiente sono. Ecco perché noi li chiamiamo variabili di ambiente, l'idea è che l'ambiente si estende oltre appena shell corrente. Essi possono essere utilizzati per definire impostazioni per i comandi. Ecco un esempio. STAMPANTE, LPDEST. Entrambe queste variabili può definire una stampante che un comando verrà utilizzato per stampare le cose. Se si dispone di più stampanti in giro, si potrebbe desiderare di mettere quello che ti piace. La ragione per cui abbiamo 2 variabili è che diversi set di comandi sono stati scritti utilizzando queste diverse variabili. Si potrebbe dare loro valori diversi. Molto probabilmente si darà loro sia lo stesso valore. Quelle cose funzionano perché i comandi che fanno la stampa sono stati programmati per esaminare i valori di queste variabili. Se un programma non sono stati scritti in questo modo, se fosse stato scritto per fare qualcosa di diverso, la variabile sarebbe irrilevante. Così il sistema operativo non è in cerca di queste variabili ogni volta che si fa riferimento a una stampante. Un comando che fa la stampa è alla ricerca di queste variabili se programmato in questo modo. Queste variabili sono spesso definiti nei file di inizializzazione ma non necessariamente. Si possono definire sulla riga di comando. Essi possono essere definiti in un comando. Un comando che esegue qualcosa potrebbe avere la propria selezione di variabili - variabili che sono unici per un particolare pacchetto software, per esempio. Essi saranno definiti quando si esegue il pacchetto. Come sono queste variabili passate a un sub-shell? Quando un sub-shell è scritto, non scrive in quella zona. L'area del sub-shell che è dedicato alle variabili di ambiente non è stato scritto da sub-shell, è scritto da copia. Quando si esegue un comando comune, come ad esempio questi comandi per stampare o qualsiasi altra cosa, cominciano con la creazione di una nuova shell. La shell crea una shell e poi sovrascrive parte di esso con il comando che si sta eseguendo, che è un po 'di confusione, ma è così che questi comandi ottenere le variabili d'ambiente che poi riferiscono a seguito. Il comando qui per definire il setenv variabile. Ecco come si definisce. Si tratta di tre elementi: setenv, variabile, valore. Se proprio non SetEnv senza argomenti, cosa si ottiene? Un elenco di tutte queste variabili. Di nuovo, è una bella lista lunga e in questo caso, come negli altri, queste variabili sono definite in gran parte dalla mia operazione di login dalla shell stessa piuttosto che qualsiasi cosa che ho fatto. C'è un altro comando qui, printenv. Che stampa anche l'ambiente. Notate questa ultima cosa qui, EDITOR = vi. Che dice che se sto usando qualcosa che richiama un editor e io non specificare un editor e mi permette la scelta, può darmi vi. Cosa succede se faccio EDITOR printenv? Mi dice quello che è. Proprio prima che ci fosse una variabile, MENO. Queste sono le opzioni di default quando si esegue il comando MENO, che visualizza i file. Quindi, se lo faccio, printenv può prendere 1 argomento o 0 argomenti, non più di 1. Ci sono anche altri comandi, ma non abbiamo intenzione di entrare in tutto questo oggi. Ricordate che ci sono stati i modificatori per le variabili di shell come: h, che cadrà l'ultimo elemento di un percorso, o: r, che cadrà una proroga. Quelli che ora si applicano alle variabili di ambiente troppo. Non hanno abituati. Ha usato essere che non potevano essere modificati. Ora possono essere. E 'uno dei progressi con gli sviluppi dei gusci nel corso degli anni. Dicevo che i gusci come parte degli ambienti e le variabili di shell C-shell sono, con alcune eccezioni, insiemi distinti. È possibile stabilire una variabile di ambiente e di una variabile di shell con lo stesso nome. Saranno diverse variabili, possono avere valori diversi. La modifica del valore di un non cambierà il valore dell'altro. Queste variabili sono tutte valutate con il simbolo del dollaro - $ a, $ qualunque. Così che cosa se avete questo? Sapete quale si ottiene? Nelle mie prove ho avuto la variabile di shell, ma questo non è documentato e non si può fare affidamento su questo. Quindi vi chiedo, è la creazione di shell e ambientali variabili con gli stessi nomi una buona idea? No. Va bene. Quali sono queste le principali eccezioni in cui le variabili ambiente e shell sono collegati gli uni agli altri? Ci sono questi 4. Capitale lettera variabile d'ambiente TERM, variabile di shell termine in lettere minuscole, tipo di emulazione di terminale. Sto solo andando ad andare qui e ho intenzione di fare l'eco, un comando utile qui, $ Termine TERM $. E lì. xterm è un tipo di terminale per finestre visualizzate in X Window System. xterm-color è una variante di quella che consente diversi colori. Perché definiamo queste? Che cosa è questo bene per? I comandi che riorganizzano lo schermo come l'editor inviare particolari sequenze, dette sequenze di escape, ad un terminale o una finestra per riorganizzare esso e così via. Tali sequenze sono differenti per differenti tipi di terminali. Questo dice che quelli da usare. A volte ci sono problemi lì. Si potrebbe desiderare di cambiare la situazione. Se le cose non funzionano, a volte il tipo di terminale è impostato male, si può essere in grado di risolvere il problema ridefinendo la variabile termine. In questi casi, cambiando una variabile, la variabile o la variabile shell, dovrebbe cambiare l'altro. Ho scoperto attraverso l'esperienza che cambia TERM in lettere maiuscole non cambia sempre shell variabile termine in lettere minuscole. Questo è un bug. Non so se questo è sempre vero. Il più delle volte non è vero, ma può essere. Quindi, se si apporta una modifica, basta controllare che fuori. Non capita spesso che è necessario modificare quel valore, ma una volta ogni tanto si fa. Ambiente USER variabile. Ancora una volta, variabile di ambiente in lettere maiuscole, variabile di shell in lettere minuscole. Questo è il vostro nome utente. E 'solo in circostanze del tutto eccezionali che si vorrebbe cambiare la situazione. Se il nome utente è qualcun altro, può gettare ogni sorta di cose fuori. Home directory, directory home dell'utente. Anche in questo caso, non si vuole cambiare la situazione. Si noti in tutti questi casi e quello che vi stiamo per coprire la variabile di percorso, variabile di ambiente è in lettere maiuscole e la variabile legata scocca è in lettere minuscole. Se si modifica uno, si dovrebbe cambiare l'altro. Questo tipo di legame non può essere stabilita come non è possibile associare 2 variabili, Oltre a queste 4, e l'associazione di queste variabili non possono essere annullate, non è possibile separarli. Quindi questi 4 coppie di variabili sono vincolati. Essi saranno sempre. Nessuno altri saranno. Inoltre, sarebbe possibile creare variabili con gli stessi nomi dei tipi opposti. Si potrebbe fare un periodo variabile di shell in minuscolo o una variabile d'ambiente TERM in lettere maiuscole. Tali variabili sarebbero indipendente di queste coppie di variabili e sarebbero indipendenti l'uno dall'altro. Non riesco a immaginare il motivo per cui si dovrebbe farlo se non si vuole confondere la gente. Questo qui, variabile percorso, questo è uno davvero importante. Un'altra cosa è che ci possono essere casi di variabili con coppie di nomi simili che non sono legati gli uni agli altri. Ci possono essere variabili, SHELL e shell, in lettere maiuscole e minuscole. Sulla base di tale nome, non si sa se tale variabile è una variabile di shell o una variabile di ambiente, e sono non legati l'uno all'altro. Quindi, questo tipo di coppie di nomi non implica variabili legate. La variabile percorso, che stavo mostrando prima, è un elenco di percorsi in cui la shell cerca i comandi. Andiamo verso la finestra qui e noi penseremo echo $ PATH, lettere maiuscole - variabile d'ambiente - echo $ PATH, lettere minuscole - variabile di shell. Si noti che l'elenco delle directory è la stessa. Questi sono vincolati. Cambiare, di cambiare l'altro. Nella variabile di ambiente gli elementi sono separati da due punti. Si noti che. Le variabili di shell sono separati da spazi. Questa variabile di ambiente è una singola stringa. La variabile di shell è un array. La Bourne shell non hanno matrici. Bash fa, ma questa è già una parte fissa del guscio. Si tratta di una singola stringa e non un array. Il C-shell sempre avuto array. Gli array sono molto più facili da lavorare. È possibile fare riferimento a parti di esso. $ Path Quindi echo [1] e ottengo / usr / bin, il primo elemento. Ancora una volta, ricordate segno del dollaro rappresenta l'ultimo elemento della lista della storia. Che cosa succede lì? Ha cercato di trovare il segno del dollaro come simbolo variabile. Io sfuggire. Oops. Non ci sarebbe voluto nemmeno questo. Alcune di queste cose non funzionano così bene. Forse ci lasciamo che fuori. Asterisk si riferisce a tutta la cosa, ma questo è quello che si ottiene se non si specifica un elemento. Un altro modo che le variabili di matrice possono essere manipolati, numero di elementi là, 7 elementi. Qui abbiamo messo il cancelletto prima del nome della variabile. Ecco un altro. Mettere un punto interrogativo lì. Questo è un valore logico. Ciò indica che la variabile esiste. E 'un altro modo di lavorare con le variabili. Che, tra l'altro, non deve essere una variabile di matrice. Questo potrebbe essere qualsiasi variabile. E se lo faccio, non c'è tale variabile e ottengo uno 0. Un'altra piccola cosa lì circa le valutazioni variabili. Torna a questa qui, se per qualche motivo si voleva lavorare con questo piuttosto che lavorare con la matrice, la variabile di shell, ci sono comandi che possono separare queste cose basato sul colon. Infatti, se avete intenzione di fare questo nella shell Bash, eventualmente, una specie di copione, che sarebbe probabilmente come si dovrebbe fare. Ma nel C-shell è molto più facile da usare l'array. Nel Bourne shell, le variabili vengono assegnati da una sola espressione come questo, come il modo in cui è possibile assegnare una variabile in un linguaggio di programmazione, e qui non ci devono essere spazi. E 'necessario che si tratti solo 1 stringa. Nelle shell di tipo Bourne, tutte le variabili sono variabili di shell. Le variabili d'ambiente sono un sottoinsieme delle variabili di shell. Si distinguono dalle variabili non-ambiente esportando. Il comando per farlo è quello di esportazione, come l'esportazione STAMPANTE. Se dovessimo definire una tale variabile, se volevamo un comando di stampa da trovare, sarebbe dovuto essere una variabile di ambiente, ed è così che facciamo uno. Qui c'è qualcosa tipo di confusione. Questa espressione, l'esportazione verso l'ambiente, deriva da questo concetto shell Bourne, e tuttavia tale espressione è utilizzata in descrizioni del C-shell, dove non esiste tale comando come esportazione. Se hai appena detto esportazione di per sé, si ottiene una lista di esportato - Quindi, se io proprio non esportare qui, nulla di simile. Ok, ce ne andiamo. Queste cose, tra l'altro, sono anche definiti dalla shell. Non mi definisco uno di questi da me. La shell fa un sacco di cose da sé. Si dovrebbe fare automaticamente le cose. In Bash e Korn shell, è possibile eseguire un comando come questo, che sia dare una variabile un valore ed esportarlo in 1 comando. Nella shell Bourne devono essere comandi separati come export a. Ecco un altro aspetto che è confusa. Il comando set nella C-shell definisce le variabili e senza argomenti ti dice quali sono i valori delle variabili sono. Nella shell Bash, il comando set senza argomenti fa la stessa cosa, ma con argomenti che fa qualcosa di molto diverso. Quindi questi sono i vari argomenti qui. Alcuni di questi sono variabili di ambiente, alcuni di loro sono variabili di shell. Tutti loro sono variabili di shell davvero. Alcuni di questi sono variabili d'ambiente. Il comando set con argomenti può essere utilizzato per azionare sui parametri posizionali a uno script, che è un modo di farli tutti in una volta. Non possiamo davvero andare in quella di oggi. Può anche essere utilizzato per modificare il comportamento shell. In particolare in Bash ci sono variabili che determineranno come la shell si comporta. Poi anche solo questo comando che si potrebbe vedere, questo comando. Comporre seguita da variabili e tipi di variabili è usato nei gusci Korn e Bash. Non è obbligatorio ma può essere utilizzato per limitare i valori delle variabili, che può essere utile per evitare errori, ed è abbastanza comune. Così sto solo ricordare che nel caso in cui si vede da qualche parte. Il comando dove. Ricordati ho detto in precedenza il cui comando nella C-shell, che può dire la posizione di un percorso di comando. Ecco la sostituzione di comando. Si dovrebbe trovare sulla tastiera da qualche parte un personaggio che assomiglia a questo. La posizione sulla tastiera sta andando a variare. Abbiamo chiamavamo backquote. E 'circa le dimensioni di un preventivo. Si va dall'alto a sinistra al basso a destra. Qui sulla mia tastiera Mac è nell'angolo superiore sinistro. Tale carattere può essere utilizzato per eseguire un comando all'interno di un comando. Se si dispone di un'espressione all'interno apici, che l'espressione è un comando, è eseguito. L'output di tale comando viene poi sostituito per l'intera espressione backquote all'interno di un comando più che poi viene eseguito con tale uscita come parte della sua serie di argomenti e così via. Ecco un comando che utilizza tale. Facciamo dimostrano l'operazione qui. Andiamo qui, togliere le apici. Controllo A me arriva all'inizio della riga con la sintassi di editing di Emacs. Finora l'percorsi è quello in cui lo fa, ma quando lo faccio in questo modo, si inserisce poi in quella lista di nomi di percorso al posto di tale espressione backquote intero e corre ls-l su di essi. Tipo di comodo, eh? Ecco, questo è una cosa semplice. Ecco come apici funzionano. Ora andiamo giù un po 'oltre. Questi sono gli alias. Io in realtà uso questi. Cercherò di ottenere questo con 1 operazione di editing. Ok. Ora vediamo come queste due definizioni è venuto fuori. alias LWH dirmi come è definito. Si noti che è solo questo, ma le citazioni esterne sono state prese fuori e il punto esclamativo è decollato. ! *, Elenco completo di tutti gli argomenti. In una definizione di alias che si applica di nuovo a dove io uso questo. LWH ksh bash. Ok. Vedi come funziona? Mi fa risparmiare qualche digitazione. Andiamo un po 'tanto per citare un altro qui. Notate qui queste diverse conchiglie. Avrei detto prima. Il csh ha un 2 qui e così fa / bin / tcsh. Potremmo stabilire con altri mezzi che coloro che sono in realtà lo stesso file. Ricordo che stavo dicendo se si digita sh si ottiene bash. Digitare questo e si ottiene questo. Ma quelli non sono collegati. Quelli sono quelli singoli lì. E questo non è il tipo di file di cui può chiamare un altro. Quindi questi sono file separati, quelli C-shell sono lo stesso file. Torna qui, l'altro qui, questo alias, notare che è l'esecuzione di questo comando, file. Che alias corre questo. File indica il tipo di file. Così FWH bash ksh. Ok. Questo è l'output del comando file. Non so se sapete cosa significa questo qui, Mach-O binario universale con 2 architetture. Ci sono due possibili tipi di processore a Mac, e alcuni programmi sono stati scritti per essere in grado di funzionare con entrambi, e il comando file può stabilire che, così questo è ciò che questo significa. Entrambi questi file sono stati scritti in questo modo. Così vediamo come funziona l'alias, vediamo come funziona il backquote, vediamo come funziona ls file effettivo o file. Questo potrebbe non funzionare. Prova "dove dove" e "LLA dove". Ok, proviamo questo. dove dove. dove è un guscio built-in. Ricordate che in precedenza abbiamo dimostrato che Bash non aveva dove. Se si digita dove nella shell Bash, si ottiene un messaggio di errore. E 'solo una parte del guscio piuttosto che essere un comando separato. Cosa succede se digito LLA cercando dove? Vedere cosa succede lì. Ran dove dove, preso questa uscita, e poi ha cercato di eseguire ls come l su cui è un guscio incorporato. dove è lì, ma non esistono gli altri. Nessuno di questi esiste, in realtà. In modo che non sempre funziona, e illustra anche come alcune cose non fare tutto ciò che si potrebbe pensare. Scendiamo un po 'più qui. Questo qui è in Bash. Questa è anche la sostituzione di comando come il backquote. Ma a differenza di backquote, utilizza questo stile variabile. Ci sono una serie di espressioni che iniziano con il simbolo del dollaro, e mentre questi non sono variabili, hanno preso in prestito l'uso del segno del dollaro per indicare un'espressione di qualche tipo. Che può essere circondati da parentesi o parentesi o doppie parentesi, che ha uno scopo differente. Tra parentesi singole qui sono una sostituzione di comando, proprio come apici. Le doppie parentesi è in realtà un'operazione aritmetica. Ci sono altre sintassi, altre operazioni. Sintassi backquote è disponibile in Bash. Tuttavia, questo è preferibile. E 'molto più facile da leggere e consente la nidificazione. Si può avere all'interno $ (comando) un altro comando, qualcosa di simile - Ho un elenco di lì. Che avrebbe funzionato se ho avuto anche la backquote. Cosa succede se voglio fare qualcosa di simile - Probabilmente non sarebbe in realtà usare questo comando, ma questa sostituzione comando interno riecheggia i nomi di tutti i file che iniziano con un allora questo esegue ls-l su quei file, e poi questa eco solo l'uscita. Probabilmente non sarebbe fare questo, devi solo fare l'eco o LS, ma questo illustra come funziona la nidificazione dei comandi. Quindi, solo un'altra caratteristica qui.  Ne ho parlato in precedenza, che quando si ha dove nel C-shell, digitare opere nelle shell di tipo Bourne per la localizzazione dei comandi. Comandi integrati, proprio quello che stavo dicendo che c'è. I comandi sono parte della shell, come dove. Quando la shell esegue un comando come ls, individua attraverso il percorso, lo trova in una directory da qualche parte, legge che in memoria, crea una nuova shell, legge i comando ls o qualsiasi altra cosa nella shell dove le variabili di ambiente si trovano già, e poi si trasferisce l'esecuzione ad esso. Built-in comando, il codice per quel comando si trova all'interno del guscio, così il guscio inizia proprio eseguendo parte del proprio codice. dove è un tal ordine. In realtà diventa più veloce. Non deve leggere qualcosa in memoria, è già in memoria. Comandi incorporati hanno sempre la precedenza sui comandi con lo stesso nome. I comandi che si trovano nella directory nel percorso possono avere lo stesso nome, comandi in diverse directory, i file in diverse directory. Quello che si verifica in precedenza nel percorso è quello che si otterrà. Se vi è un comando built-in, si ottiene sempre esso. Non c'è modo per dare una precedenza inferiore rispetto a un comando nel percorso. Se si vuole ottenere che il comando percorso, è possibile digitare il percorso completo. Se ci fosse un comando in cui nel percorso qualche parte, è possibile digitare / bin / dove e desideri farlo. Se non si desidera digitare l'intero percorso, è possibile definire un alias. In realtà, se ti ha dato l'alias lo stesso nome del comando built-in, che avrebbe funzionato perché la definizione di alias viene valutata prima che la shell determina che si tratta di un comando built-in che dovrebbe essere eseguito. Allora questo diventa un po 'più complicato con alcuni comandi qui. Il caso di alcuni comandi sono effettivamente incorporati nei comandi e nel percorso. Uno di questi è l'eco, il comando ho solo usato un po 'di tempo fa, in questi esempi. Echo è un comando nel percorso e in ogni shell. Non necessariamente comportano sempre allo stesso modo. In origine era un comando solo nel percorso. E 'stato costruito per i gusci più tardi. Poiché ci sono opzioni che dipendono dall'ambiente e le opzioni della riga di comando, i comandi incorporati sono stati scritti per funzionare lo stesso del comando che era stato nel percorso, è improbabile che sarebbero state scritte in quel modo se il comando non fosse già stato scritto per il percorso. Quindi questo ha effetti collaterali. La sua storia ha effetti qui. Ci sono opzioni lì. C'è anche un'opzione definita da una variabile nella tcsh chiamato echo_style. Questa è una di queste variabili che possono cambiare il modo in cui eco funziona. Ci sono altri casi in cui è possibile assegnare una variabile che cambia il modo che l'operazione shell, compreso un comando incorporato, funziona. Esso non inciderebbe altro dal momento che altri comandi non hanno accesso alle variabili di shell, solo le variabili di ambiente. Ma le operazioni di shell può leggere le variabili di shell. Che non funzionerà per csh. Questa è solo tcsh. Questo è uno dei miglioramenti. Analisi ha sequenze quando si valuta metacaratteri, quando valuta le variabili, alias, riferimenti di storia. C'è una sequenza particolare per queste cose. Se lo fa le cose in una particolare sequenza e arriva a qualcosa che è espressione di una sorta che è già stato valutato, ma non valuterà nuovamente. Se si ottiene, allora sarà sufficiente passare sui personaggi. Quindi, se la valutazione di alcune espressioni come la sostituzione di comando o variabile o qualsiasi altra cosa dà luogo ad una espressione che si vorrebbe essere valutati, che funzionerà soltanto se la valutazione avviene più tardi nella sequenza. Spero di essere chiaro lì. Tale sequenza parsing, un'operazione nel C-shell, non è lo stesso per i comandi incorporati come lo è per non integrati nei comandi. Io non sono sicuro di Bash lì. Ad esempio, se una variabile shell prodotto un riferimento storia, probabilmente non sarebbe tornare indietro nella storia. Sarebbe solo ottenere il punto esclamativo. In realtà, possiamo solo provare che fuori proprio ora. set a = e dovremo mettere questo in là. Oh, aspetta. Scusi. Ho fatto questo in Bash. Volevo farlo qui. Vedere, quindi non ha valutato che il riferimento della storia perché era già passato il punto di valutazione di espressioni storia quando ha valutato la variabile. Ecco, questo è uno effetto di parsing. E ancora, i comandi incorporati non sono fatte allo stesso modo. Bene. Andiamo alla prossima qui. Questo è destinato ad essere 1 linea, ma è rendere più facile la lettura. Che cosa fare? Si può ricordare che possiamo valutare asterischi come caratteri jolly filename, e ci sono altri jolly filename come il punto di domanda e le espressioni staffa. Questo tipo di valutazione è chiamato globbing. impostare noglob all'inizio di questo comando dice di non farlo. noglob unset dice che tornare a farlo. Si noti che insieme glob non avrebbe questo effetto. Nel linguaggio comune, glob impostare o noglob disinserito sembrano essere equivalenti, ma qui non lo è. E 'noglob disinserito. Ora tset. tset stava per set terminale. Non è usato spesso ora, ma prima di sistemi a finestre sono resi disponibili e hai avuto un unico terminale, potrebbe essere necessario determinare il tipo. E se qualcosa stava over Ethernet o dalla rete, si potrebbe desiderare di dire che è una vt100. VT100 è una specie di uno standard nel settore terminale. Proviene dal terminale dicembre. Se solo fare dialup - notare che? Questo risale a modi, eh? Quindi, se abbiamo appena facciamo TSET qui, se io faccio solo tset, è il ripristino mio terminale, ma non hai visto niente. Essa in realtà non cambia nulla. -S Ok. TERM setenv xterm-color. Sappiamo già che il termine è stato fissato in quel modo, in modo che non cambiava. Questo è il modo in cui vorremmo farlo. Ma si noti che questo comando, Tset-s, appena uscita questi comandi. E non li ha eseguito. Non ha eseguito questi comandi, ma l'uscita di loro. Quindi questo è destinato a produrre i comandi che poi verranno eseguiti. Vi ricordate il comando in quel file ho appena mostrato tu avessi una Q in esso. Allora facciamolo. Il Q sopprime qualche uscita, ma questo non ha importanza qui, come potete vedere. Sto solo facendo quello di mostrare che non aveva importanza. Questo è nella sintassi backquote. Notare il backquote qui, backquote qui. Sto omettendo queste cose qui. Questi sono i casi di raccontare che cosa fare in caso di particolari tipi di terminali - Ethernet, rete, accesso remoto, quello che hai. Non importa qui perché non stiamo effettivamente facendo una qualsiasi di queste cose. Sto solo illustrando il comando. Se faccio questo con il backquote, cosa posso ottenere? Notate anche qui che questo incluso il noglob set e il noglob impostata, così quelli sono ormai obsolete nella definizione. Questo non è sempre vero, ma ora sono incluse in questo comando. Ma vediamo cosa succede se lo faccio e andare all'inizio della linea con controllo di A e lo faccio. Okay, impostare: Command not found. Questo è un po 'strano, non è vero? set è un comando noto. E 'parte della shell. set: Command not found? Perché è così? Hmm. Bene, pensiamo a questo. E 'esecuzione di una sostituzione di comando backquote, e che avviene ad una certa parte della sequenza di parsing del comando. set è un comando incorporato. Così, il tempo che fa che la sostituzione di comando, è già ottenuto oltre il punto di identificare comandi incorporati. Così tratta impostato come se fosse un comando nel percorso. Inutile dire che non lo trova e si ottiene un errore. Bene. C'è un esempio di sequenza di parsing. E cosa facciamo di questo? Notate questo comando molto interessante, eval. Mi chiedo cosa che fa. Se si guarda al manuale - e cerchiamo di fare solo quello per mostrare come confusione di questi manuali sono - uomo tcsh, manuale confusa, trovare le cose qui non è facile. Qui andiamo, eval arg, così possiamo avere uno o più argomenti e c'è una lista di cose lì. Tratta argomenti come input per la shell ed esegue i comandi risultanti nel contesto della shell corrente. Questo è di solito utilizzato per eseguire comandi generati come risultato di comando o sostituzione delle variabili perché l'analisi si verifica prima queste sostituzioni. Molto bene. E qui si riferiscono anche al comando tset per un uso del campione come quella che ho appena mostrato. Ora devo ottenere la finestra di nuovo ad un posto utile. Andiamo qui e vedremo che eval viene utilizzato poco prima che. Quindi cerchiamo di vedere cosa succede se mettiamo - qui andiamo con le frecce per quel comando e Controllo A all'inizio, eval. Va bene, così funziona. Quando si esegue eval, si prende quello che viene dopo e lo rende un comando. Ciò consente di analizzare essenzialmente due volte. La sezione qui esegue il comando all'interno degli apici rovesciati, ottiene l'uscita. Uscita dovrebbe essere eseguito come quei comandi qui come questi a questa e questa. Quindi tali comandi sono ora qui in questa sequenza, ma questi sono integrati nei comandi e non può ottenere subito. Quindi andiamo a eval, eval prende che fino, inizia il tutto di nuovo, e funziona. Un esempio entrambi backquoting, eval, analisi, le conseguenze di parsing, e un comando che probabilmente è di uso molto poco per voi oggi. Ok. Va bene, umask. Diamo un'occhiata a questo comando qui, umask 022. Mi chiedo cosa che fa. Diciamo solo digitare umask con niente dopo di esso. 22. Ok. 022 e farlo di nuovo. Come si può immaginare, umask senza argomenti si racconta la corrente della maschera; umask con argomenti rende tale, ma che era quello che avevo già. Cosa vuol dire 022? Questi sono qui le protezioni di un file. Essi determinano chi può leggere o scrivere o eseguire il file. Protezioni sono anche chiamati autorizzazioni. La R sta per la lettura, la w per la scrittura, e il x, che non vi è presente, significa eseguire. Ci sono 3 categorie di là. Gli ultimi 3 elementi sono nella categoria di utenti. Coloro che si applicano a me, l'utente. Questi 3 qui si applicano al gruppo. Il file appartiene al gruppo 1, l'utente può appartenere a più gruppi, ma se l'utente è nel gruppo a cui appartiene il file, quindi queste protezioni si applicano a lui se non è l'utente. E questo è chiunque altro. Queste categorie si escludono a vicenda. Le protezioni utente si applicano a lui, le protezioni del gruppo si applicano ai membri del gruppo diverse dall'utente, e le altre protezioni si applicano solo a persone diverse dall'utente ed i membri del gruppo. Se c'è un r o aw o un x, significa che la protezione è concesso. Se c'è un trattino, significa che non lo è. In realtà ci sono altre cose che possono essere messi in qui oltre a questi, che non voglio entrare adesso. La umask definisce un valore predefinito per i file creati. E come una maschera, in fondo si dice che i bit che non impostate. Come è diventato questo bit? Se si pensa di ciascuno di questi come un numero ottale, questo è il bit 1s, questo è il 2s, questo è il 4s. Così da 0 a 7 descriverà quale combinazione di R, W e X di che hai per questi 3 e quindi un numero simile per questi e poi per questi. Quindi 022 significa 0 per altro, per il gruppo 2, 2 per l'utente. Ma questa è una maschera. La maschera è quello che non hai. Mi dispiace. Ho appena dato le cose nell'ordine sbagliato. E 'la prima 3. Questi 3 sono l'utente, questi 3 sono il gruppo, questi 3 sono l'altro. Ci dispiace che ti ho dato questi nell'ordine sbagliato. Lo 0, che è il primo di quelli, non visualizza il valore, ma se un numero non è lì, è uno 0. Ciò significa che sarebbe stato concesso tutti e 3 di questi. Si noti che in questo particolare la x non è consentito. La ragione è che il guscio è in grado di determinare se un file deve essere eseguito o meno. Poiché questo non è un file eseguibile, non ha impostato la x. I due mezzi che scrivono autorizzazione, la seconda categoria qui, quello nel mezzo, è negato. Quindi, di nuovo, queste sono le cose che ha negato. Beh, x è consentito, ma non è qui perché non è eseguibile e analogamente per gli altri. Ecco, questo è un umask comune. Un altro comune è 700 - darsi tutto e nessun altro nulla. E ci sono altre possibilità. Tornerò a quello. Utilizzando la storia posso cercare indietro per questo, LLA a lì. Ok. Così qui, questi sono i gusci. Bash, il proprietario, che è l'account di sistema, può fare tutto. Gruppo e tutti gli altri possono fare di leggere o eseguire ma non scrivere. Questo non ha nemmeno consentire al proprietario di scrivere ad esso. Se il proprietario ha voluto scrivere su di esso, l'account di sistema, avrebbe dovuto cambiare prima la protezione. Ma ancora una volta, la umask imposta il default mascherarlo, indicando i bit che non sono impostate. Questo è in genere in uno dei file di inizializzazione, che è l'. Cshrc per la C-shell o il profilo per le shell di tipo Bourne.. Può essere altrove anche se ci sono altri file di inizializzazione del sistema. Comunque, questo è umask. C'è qualcosa di un po 'strano qui, e che è, perché c'è un unico comando per questo? Se dovessi scrivere questo, vorrei fare una variabile, umask = certo valore. Perché c'è un comando intero solo per questo scopo? La ragione è questa solo risale alle origini di Unix. Unix era solo un progetto di programmazione ai Bell Labs nei primi anni 1970. La gente semplicemente si sono riuniti per il programma. Non hanno mai destinato a diventare un sistema operativo a livello mondiale. Diverse persone hanno scritto diverse parti senza pensarci molto di come stavano andando per essere utilizzati - piuttosto impreciso. E ne è venuto insieme come questo, ed è ancora così in alcuni aspetti. In modo che riflette la storia, e ci sono ancora queste incongruenze e gli elementi dispari di esso. Ok. Uno accanto qui. Come ho scritto in precedenza, la C-shell non è usata molto per la programmazione, anche se può essere. Esegue più lentamente, di nuovo il trade-off tra l'uso interattivo, che ha più di elaborazione coinvolti di velocità, che può fare a meno della trasformazione. Le caratteristiche supplementari aggiunte alla shell Bourne dalla Korn e Bourne-Again shell Non sembra di rallentarli, e non so perché. Potrebbe essere solo una migliore programmazione, ma io non sono in grado di sapere. Accelerare qui in realtà non è un grande affare, anche se è menzionato. La ragione è che gli script di shell effettivamente ottenere abbastanza veloce. Se c'è un sacco di comandi come in un programma calculational, probabilmente non farlo in uno script di shell. Le operazioni sono abbastanza semplice e lineare. Quelli che ho vissuto che sono troppo lenti coinvolgere ripetute applicazioni di comandi lenti. In precedenza ho accennato stream editor sed. Questo comando è lento. Se si esegue sed molte volte, si otterrà uno script lento, ma non è il guscio che è lento. L'esecuzione nella Bourne shell non sarà molto più veloce di esecuzione nel C-shell, anche se non c'è forse alcuni vantaggi lì. Le funzionalità di programmazione supplementari, invece, sono ragioni importanti per cui si dovrebbe usare le shell di tipo Bourne. C-shell ha caratteristiche dispari ad esso - il fatto che non si sa se una variabile è una variabile shell o una variabile di ambiente. Può essere molto confusa. Non è così facile scrivere solo sulla base di esperienza di programmazione in altre lingue. Penso che si possono trovare le shell di tipo Bourne più coerente con la vostra esperienza. Alcuni script, però, possono essere migliaia di righe di lunghezza. Quelli che ho visto sono utilizzati per la patch dei sistemi operativi. Quelli possono eseguire molto lentamente, ma non si esegue quelli molto spesso. E 'solo quando si sta facendo patching, ed è solo il responsabile del sistema che fa queste cose, quindi non è davvero molto più di un problema. Quelli che sono centinaia di linee lungo effettivamente execute abbastanza rapidamente. Menzionare questo qui, quali sono questi miglioramenti? Ho già detto alcuni di loro - Array, calcoli, i $ () di espressione per i calcoli nella shell Bash, l'altro tipo di sostituzione di comando. Ci sono diversi tipi di comandi di prova con cui è possibile fare dei test condizionali sull'esistenza di un file o di altre cose. Ultimo qui, questo comando qui. Cosa fa questo, e perché qualcuno dovrebbe usarlo? variablename printenv. Sappiamo cosa printenv fa. Ci dice il valore di una variabile. E variablename printenv non ci dirà molto, perché non c'è tale variabile. Blank. Ma diamogli qualcosa di significativo. Che non è neanche lì. Ok. Credo che non ho mai definito tale. Diciamo solo controllare il mio ambiente. Questo è un altro comando con il quale è possibile controllare il proprio ambiente. Vi è una buona EDITOR vecchio, quello che abbiamo visto prima. Che cosa fare? Qui abbiamo una espressione backquote. Ricordate che questa è la C-shell. Così EDITOR printenv ci darà un valore di EDITOR. E 'vi. E poi sarà impostare tale valore alla variabile a, il comando set. Così ora se faccio echo $ a, ottengo vi. Non mi sembra terribilmente utile. Tuttavia, ha in realtà avere uno scopo. Dal momento che non sappiamo se una variabile è una variabile shell o una variabile d'ambiente utilizzando la sintassi di valutazione simbolo del dollaro, possiamo usare printenv per assicurarsi che si tratta di una variabile di ambiente. Quindi, se ci fosse un editor di variabili di shell, ciò non avrebbe ottenuto esso. Questo funziona solo con la variabile di ambiente. Se ci fosse una variabile di shell e io volevo il suo valore, Avrei dovuto trovare un altro modo per farlo. Un modo per farlo sarebbe da fare insieme e tubazioni. Questo è uno dei metacaratteri, caratteri speciali. Si invia l'output di set a qualcos'altro. Vediamo cosa potremmo trovare lì. Niente. Ok. Diciamo solo vedere cosa c'è dentro tutti insieme. Era echo_style, quello che ho detto prima. Va bene, facciamolo. Ricorda ho detto prima, echo_style determina il modo in cui verrà eseguito il comando echo. bsd sta per Berkeley Standard Distribution. Questo è il Berkeley Unix dal 1970. Questo è uno dei modi che riecheggiano in grado di eseguire. Impostazione echo_style a quel valore nel TC-shell farà eco a comportarsi in quel modo. Così set che fa, ma impostare ottiene solo variabili di shell. Non sarebbe trovare Editor, che non è una variabile di shell. Niente. Ecco, questo è un modo di distinguerli. Ma il fatto che si deve passare attraverso qualche strana comando simile distinguere tra variabili di shell o variabili d'ambiente mostra il tipo di natura pratico della C-shell per alcuni scopi. E ora, l'ultima e forse meno, questo è le pagine man. Quelli di chi si può sapere, l'uomo è breve comando di manuale. Le pagine man per i gusci sono difficili da leggere. Sono molto lungo. Sono organizzati in un modo che può rendere difficile trovare quello che stai cercando. Quindi, se siete alla ricerca di qualcosa con uno scopo, Non si può sapere se tale scopo è una variabile di shell o qualcos'altro, quindi non si può sapere dove cercarlo. È possibile cercare varie stringhe, ma le stringhe sono spesso ripetuta. Quindi è generalmente difficile da leggere. Abbiamo appena guardato la pagina man TC-guscio un po 'prima di trovare il comando eval. Alcune cose vanno più veloci. Un approccio è quello di cercare una stringa. È possibile utilizzare il cercapersone. Cercapersone ha la barra per cercare un comando o una stringa all'interno di una operazione di cercapersone. Uomo di default userà cercapersone, sia più o meno. Non so se si ha familiarità con quelli, ma quelli in grado di visualizzare i file, bit per bit. Sto usando MENO per visualizzare questi file particolari che abbiamo qui. È possibile cercare là dentro. È possibile provare a utilizzare diverse stringhe di ricerca. Anche le pagine man in diversi sistemi operativi possono non essere gli stessi. Possono essere pagine separate per csh e tcsh. Sono non sono sul Mac, ma potrebbero essere se queste sono comandi separati. Se sh in realtà non chiama Bash, probabilmente ci sarebbe una pagina man separata. Alcuni sistemi hanno pagine man separati solo per i comandi incorporati in C-shell. A volte, se si vuole leggere una descrizione di un comando built-in che è anche nel percorso, come eco, è necessario leggere la pagina man su quel comando su echo per determinare come funzionerà come un comando incorporato anche se non stai chiamando il comando built-in. Questo è un inconveniente del sistema operativo in generale, non solo per le conchiglie, anche se per i gusci in particolare alle pagine man sono piuttosto lunghi, in parte perché hanno aggiunto caratteristiche utili per loro, che può essere un positivo. Ok. Ci sono domande? Eventuali argomenti che si desidera far apparire? Nulla di rilevante qui? Beh, è ​​stato molto bello parlare a tutti voi. Spero che tu hai qualcosa di questo seminario che sarà utile per voi nei vostri sforzi futuri. [CS50.TV]