Linux e Shell - Shell è un must?


8

Una domanda da principiante totale.

Perché abbiamo bisogno di una shell in Linux? Ad esempio quando scrivo, trova. -name xy * - Mi è stato detto che la shell accetta questo input e chiama il comando find (assicurandosi che il carattere jolly sia interpretato correttamente e tutto il resto). Non è possibile farlo senza il concetto di shell? ... Se shell tiene traccia dei vari processi, non è possibile farlo senza di essa?

Inoltre, perché posso digitare> ls xy * e ottenere un output corretto mentre devo scappare * con un \ in find - find. -name xy \ * Shell sta espandendo i caratteri jolly per uno e non per l'altro eseguibile?

Grazie.

linux  bash  shell 

9
Usare Linux senza shell è come guidare la Ferrari a 50 km / h nel traffico cittadino. Tutto il divertimento sparirà.
vava,

Risposte:


23

Non è possibile farlo senza il concetto di conchiglia?

Beh no. Hai bisogno di qualcosa che interpreti il ​​tuo intento e invochi il programma appropriato. Quella cosa si chiama conchiglia.

EDIT: per evitare confusione, "shell" non significa "interfaccia a riga di comando". Da http://en.wikipedia.org/wiki/Shell_(computer) :

"Le shell del sistema operativo generalmente rientrano in una di due categorie: riga di comando e grafica. Le shell di riga di comando forniscono un'interfaccia di riga di comando (CLI) al sistema operativo, mentre le shell grafiche forniscono un'interfaccia utente grafica (GUI). categoria lo scopo principale della shell è quello di invocare o "lanciare" un altro programma; tuttavia, le shell hanno spesso funzionalità aggiuntive come la visualizzazione del contenuto delle directory ".

Per quanto riguarda l'altra domanda, la shell sta eseguendo l'espansione con caratteri jolly per entrambi i comandi, ma quando si cercano file utilizzando find si desidera trovare, e non la shell, per eseguire l'espansione, poiché si desidera che venga eseguita nelle posizioni che find sta cercando dentro e non nel luogo da cui è stata invocata; pertanto, si evita il * per interrompere l'espansione della shell, in modo che find possa vederlo.


quindi, dici che in Windows il pulsante Start si chiama shell? :-)

5
Non è un uso comune, ma le GUI sono probabilmente shell (almeno se eseguite al di fuori del kernel). Il pulsante Start è solo una caratteristica della GUI ...
dmckee --- ex-moderator kitten

Il pulsante Start è sicuramente una cosa "che interpreta le tue intenzioni e invoca il programma appropriato". OTOH, la shell Linux può essere appena definita una funzionalità di TUI (Text User Interface).

11
@Paul: Explorer, il programma che fornisce il pulsante di avvio è la shell di Windows. In realtà, è una shell di Windows; può essere sostituito.
Moonshadow,

1
Sì, il pulsante di avvio può essere visto come una shell. Non una shell interattiva ma comunque una shell. In genere però, quando qualcuno dice "shell" intendono un prompt interattivo (ad esempio, il prompt dei comandi su Windows è una shell tradizionale)

5

Ovviamente puoi fare tutto attraverso una GUI. Trova file di Windows (da XP e precedenti) equivale in qualche modo alla GUIsh del comando digitato.

Ora, perché agli utenti UNIX (e Linux) piace la shell? Perché puoi prendere l'output, inserirlo in un altro programma e ottenere un output diverso. Per esempio:

find | grep burek

Questi sono due comandi finde grepuno alimenta l'altro. findelenca tutti i file nelle cartelle correnti e secondarie, una per riga e grepstampa solo quelle righe che contengono burek.

Ora, ci sono altre cose più complesse, come:

ls -R | sort | uniq

ls -Relenca i file nelle cartelle correnti e secondarie e sortordina l'output. uniqquindi ci dà solo linee uniche.

Ora, mentre puoi codificare tutto questo in una GUI, puoi fare rapidamente cose così difficili con la riga di comando che normalmente non puoi fare con la GUI a meno che tu non scriva la tua. In tal caso, è più veloce digitarlo nella riga di comando, non è vero?

Bottomline: se lo chiedi, non ne hai bisogno. La riga di comando è inutile per te come utente normale. La riga di comando è comunque ottima per amministratori di sistema, per sviluppatori e per coloro che vogliono giocare con il proprio computer in modo veloce, veloce e veloce.


1

Sì, puoi eseguire il comando find senza una shell, ma avresti bisogno di un programma per avviarlo e avresti bisogno di un programma per visualizzarne l'output. Molte volte, stai usando le funzionalità della shell e quel comando avrà bisogno di una shell per interpretare l'intento.

es. piping, reindirizzamento e globbing sono una caratteristica della shell e dovranno interpretare una shell. "find. -name myfile" non utilizza alcuna funzionalità di una shell e potrebbe essere eseguito senza shell. "find. -name myfile | sort> output" usa sia il piping che il reindirizzamento e hai bisogno di una shell per interpretarlo.

Per quanto riguarda l'escaping di xy *, c'è poca differenza se è l'input da trovare o l'output di una riduzione, la shell lo espanderà in entrambi i modi.

Se c'è un file chiamato xyz nella directory corrente

trova . -name xy * verrà effettivamente eseguito come find. -name xyz, che probabilmente non è quello che vuoi.

Se lo trovi. -name xy * e non esiste alcun file corrispondente a xy * nella directory corrente, verrà eseguito come find. -name xy *.

Allo stesso modo, se non ci sono file corrispondenti a xy * nella directory corrente ls> xy * creerà un file chiamato xy *. Se c'è una corrispondenza tra i file, ad esempio xyz, significa che ls> xyz. Se ci sono diversi file corrispondenti a xy *, allora ls> xy * fallirà.

Maggiori informazioni http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html


Modalità di lettura dove?
Thomi,

1

I SO non banali non eseguono l'interprete da riga di comando nel kernel.

Viene lanciato come un programma e quel programma è chiamato un guscio. La situazione sulle GUI sembra essere mista, ma almeno alcuni sistemi operativi girano anche al di fuori del kernel.

Ora, non v'è assolutamente alcuna necessità per la shell al lavoro come la shell UNIX, ma si fa bisogno di un'interfaccia.


1

Per rispondere alla tua seconda domanda ... la shell tenterà di espandere tutto ciò che può ogni volta che può, a meno che tu non lo impedisca. L'escape di * impedisce l'espansione, che di solito è necessaria per il comando find.

Per non rispondere a una domanda con una domanda, come faresti a sapere se il comando ls stava elencando i file a causa di un'espansione della riga di comando o perché il comando ls cercava legittimamente l'elenco delle directory dal filesystem? Ad esempio, potrei scrivere una shell per loop in questo modo:

for i in $(ls /home/mydir);

o come

for i in /home/mydir/*;

finiscono per avere lo stesso set.


0
perché posso digitare> ls xy * e ottenere un output corretto mentre
Devo scappare * con un \ in find - find. -name xy \ * Is
shell esegue l'espansione jolly per uno e non per
altro eseguibile?

Il punto di escape di '*' nella ricerca di invocazione è impedire alla shell di fare l'espansione. Sfuggendo, si assicura che find veda gli argomenti: ".", "-Name", "xy *". Se non sfuggissi a '*', find vedrebbe ".", "-Name", "xya", "xyz" (supponendo che la shell espanda "xy *" a "xya xyz", che accadrà se l'unico i file che iniziano xy sono xya e xyz). Quindi la risposta alla tua domanda è no, la shell non espande il '*' nella tua invocazione di find perché l'hai esplicitamente chiesto di non sfuggirlo.


0

Shell in Linux è un modo conveniente e convenzionale per interagire con il file system in Linux ed eseguire comandi con argomenti e rispetto alle variabili di ambiente. Fornisce molte funzioni utili, ad esempio, collegando l'output di un processo all'input dell'altro, reindirizzando flussi di input / output a / da file, FIFO, ecc. Una shell è un buon modo per combinare facilmente diversi piccoli programmi, ognuno di essi fare un compito relativamente piccolo, per fornire qualcosa di utile. Alcuni di questi programmi (come find e ls) sono stati progettati per lavorare con loro in una shell.

Per comprendere l'espansione, ricorda semplicemente che una parola (sequenza limitata di caratteri alfanumerici e -, e alcuni altri simboli), dato che contiene caratteri di modello *o ?, non è sfuggita o inserita tra virgolette ( ") o apostrofi ', è sostituita da una serie di parole delimitate da spazi con nomi di file che corrispondono al modello. Quindi se avessi una parola con un asterisco, dopo l'espansione avrai zero, una o più parole, che saranno trattate da bash come diversi argomenti. Ecco che arriva il design specifico del lscomando: si adatta perfettamente a questo schema quando viene utilizzato ls foo*per visualizzare tutti i file che iniziano con "pippo"! Si espande in qualcosa del genere

ls foobar boobaz

e stampa file da argomenti, controllando l'esistenza e attraversando fiolder ecc.

Ma questa è principalmente la questione della filosofia. In altri sistemi, tutto emerge dal pulsante "Start" e dalla barra delle applicazioni. Alcuni utenti lo stanno bene. Alcuni cercano di installare una shell simile a Linux in tali sistemi. È una questione di gusti, ma per la programmazione di semplici script, che si occupano di file, la shell è estremamente conveniente.


0

Per i comandi interattivi, la shell può essere sostituita dalla GUI.

Ma il punto chiave della shell è che si tratta di un linguaggio di script: è possibile creare interi programmi eseguiti in situazioni specifiche (avvio, apertura della sessione, ogni giorno, ...). Questa funzione non può essere sostituita da altri strumenti.


E ovviamente puoi programmare gli script di shell concron
Wuffers,

0

Ovviamente potresti usare Linux e non usare mai la shell. All'improvviso molte distribuzioni Linux standard offrono all'utente domestico esattamente ciò di cui hanno bisogno se vogliono solo controllare Facebook, guardare le foto e inviare e-mail.

Linux ha molti pro, ma la shell è probabilmente la migliore. La shell consente il reindirizzamento I / O. Questo è ciò di cui la gente parla quando si riferiscono alle pipe ("|"). Per esempio:

Voglio collegarmi a un elenco di macchine ed eseguire un sondaggio su dove esiste un account utente:

for host in `cat hostnames.txt1`; do
echo "Connecting to $host"
ssh $host "cat /etc/passwd | grep -i username"
done

Ci potrebbero essere 0 host in hostnames.txt o potrebbero essercene migliaia. Questo script comprimerà e farà il sondaggio, spandendo le informazioni a stdout.

Lo scripting può diventare molto creativo. Posso usare i caratteri "/ >>" per reindirizzare input / output da e verso i file. Potrei esaminare tutte quelle macchine nello script sopra, produrre il nome del server da qualsiasi utente che ha un file, quindi seguire un altro script che si connette ed esegue alcune attività sull'account utente (blocco / sblocco / ripristino pw / rimuovere / aggiungere gruppo / ecc.).

Imparare. Per. Script. =)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.