Linux y Shell: ¿es obligatorio Shell?

8

Una pregunta novata total.

¿Por qué necesitamos un shell en Linux? Como ejemplo cuando escribo - find. -name xy *: me dijeron que el shell toma esta entrada y llama al comando find (asegurándose de que el comodín se interprete correctamente y todo eso). ¿No se puede hacer esto sin el concepto de un shell? ... si el shell realiza un seguimiento de los diversos procesos, ¿no se puede hacer sin él?

Además, ¿por qué puedo escribir> ls xy * y obtener un resultado adecuado mientras necesito escapar * con un \ in find - find. -name xy \ * ¿Shell está haciendo la expansión de comodín para uno y no para el otro ejecutable?

Gracias.


fuente
99
Usar Linux sin shell es como conducir Ferrari 50 km / h por el tráfico de la ciudad. Toda la diversión se irá.
vava

Respuestas:

23

¿No se puede hacer esto sin el concepto de un caparazón?

Bueno no. Necesita algo que interprete su intención e invoque el programa apropiado. Esa cosa se llama un caparazón.

EDITAR: Para evitar confusiones, "shell" no significa "interfaz de línea de comandos". De http://en.wikipedia.org/wiki/Shell_(computing) :

"Los shells del sistema operativo generalmente se dividen en una de dos categorías: línea de comandos y gráficos. Los shells de línea de comandos proporcionan una interfaz de línea de comandos (CLI) al sistema operativo, mientras que los shells gráficos proporcionan una interfaz gráfica de usuario (GUI). En la categoría, el propósito principal del shell es invocar o "iniciar" otro programa; sin embargo, los shells con frecuencia tienen capacidades adicionales como ver el contenido de los directorios ".

En cuanto a su otra pregunta, el shell está haciendo una expansión comodín para ambos comandos, pero cuando está buscando archivos usando find, quiere encontrar, y no el shell, para hacer la expansión, ya que desea que se haga en las ubicaciones que find está buscando en y no en la ubicación desde la que se invocó; por lo tanto, escapa del * para detener el shell expandiéndolo, para que find pueda verlo.

sombra de Luna
fuente
Entonces, ¿dices que en Windows el botón Inicio se llama shell? :-)
55
No es un uso común, pero las GUI son posiblemente shells (al menos si se ejecutan fuera del núcleo). El botón de Inicio es solo una característica de la GUI ...
dmckee --- ex-moderador gatito
El botón de inicio es definitivamente una cosa "que interpreta su intención e invoca el programa apropiado". OTOH, el shell de Linux puede llamarse una característica de TUI (Text User Interface).
11
@Paul: Explorer, el programa que proporciona el botón de inicio es el shell de Windows. De hecho, es un shell de Windows; Se puede reemplazar.
moonshadow
1
Sí, el botón de inicio puede verse como un shell. No es un shell interactivo sino un shell, no obstante. Por lo general, sin embargo, cuando alguien dice "cáscara" que significa un símbolo interactivo (por ejemplo, el símbolo del sistema de ventanas es un shell tradicional)
5

Por supuesto, puede hacer todo a través de una GUI. Buscar archivos de Windows (desde XP y versiones anteriores) es un equivalente GUIsh del comando que escribió.

Ahora, ¿por qué a los usuarios de UNIX (y Linux) les gusta shell? Debido a que puede tomar la salida, alimentarla en otro programa y obtener una salida diferente. Por ejemplo:

find | grep burek

Estos son dos comandos findy grepuno alimenta al otro. findenumera todos los archivos en las carpetas actuales y secundarias, una por línea, e grepimprime solo las líneas que contienen burek.

Ahora, hay otras cosas más complejas, como:

ls -R | sort | uniq

ls -Renumera los archivos en las carpetas actuales y secundarias, y sortordena la salida. uniqentonces nos da solo líneas únicas.

Ahora, si bien puede codificar todo esto en una GUI, puede hacer rápidamente cosas tan difíciles con la línea de comandos que normalmente no puede hacerlo con la GUI a menos que vaya a escribir la suya propia. En ese caso, es más rápido escribirlo en la línea de comando, ¿no?

En pocas palabras: si preguntas esto, no lo necesitas. La línea de comando es inútil para usted como usuario habitual. Sin embargo, la línea de comandos es excelente para los administradores de sistemas, para los desarrolladores y para aquellos que desean jugar con su computadora de una manera rápida, rápida, rápida.

Ivan Vučica
fuente
1

Sí, puede ejecutar el comando find sin un shell; sin embargo, necesitaría algún programa para iniciarlo y necesitaría algún programa para mostrar su salida. Muchas veces, estás usando características del shell, y ese comando necesitará un shell para interpretar la intención.

por ejemplo, la tubería, la redirección y el globbing es una característica del shell, y necesitará un shell para interpretar. "find. -name myfile" no utiliza ninguna característica de un shell, y podría ejecutarse sin un shell. "find. -name myfile | sort> output" usa tuberías y redireccionamiento y necesita un shell para interpretar eso.

En cuanto a escapar de xy *, hay poca diferencia si es la entrada para encontrar o la salida de una redicción, el shell lo expandirá de cualquier manera.

Si hay un archivo llamado xyz en el directorio actual

encontrar . -name xy * realmente se ejecutará como find. -name xyz, que probablemente no sea lo que quieres.

Si lo encuentras. -name xy * y no hay ningún archivo que coincida con xy * en el directorio actual, se ejecutará como find. -nombre xy *.

Del mismo modo, si no hay un archivo que coincida con xy * en el directorio actual, ls> xy * creará un archivo llamado xy *. Si hay una coincidencia de archivo, digamos xyz, significará ls> xyz. Si hay varios archivos que coinciden con xy *, ls> xy * fallará.

Leer más http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html

nos
fuente
Modo de lectura donde?
Thomi
1

Los sistemas operativos no triviales no ejecutan el intérprete de línea de comandos en el núcleo.

Corren como un programa, y que el programa se llama un shell. La situación en las GUI parece ser mixta, pero al menos algunos sistemas operativos también se ejecutan fuera del núcleo.

Ahora, no es absolutamente necesario que el shell funcione como el shell de Unix, pero necesita una interfaz.

dmckee --- gatito ex moderador
fuente
1

Para responder a su segunda pregunta ... el shell intentará expandir todo lo que pueda siempre que pueda, a menos que lo evite. Escapar de * evita la expansión, que generalmente es necesaria para el comando find.

Para no responder una pregunta con una pregunta, ¿cómo saber si el comando ls estaba enumerando los archivos debido a una expansión de la línea de comandos o porque el comando ls buscó legítimamente la lista de directorios del sistema de archivos? Por ejemplo, podría escribir un shell para el ciclo como este:

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

o como

for i in /home/mydir/*;

terminan resultando en el mismo conjunto.

KFro
fuente
0
¿Por qué es que puedo escribir> ls xy * y obtener una salida adecuada mientras
Necesito escapar * con un \ in find - find. -name xy \ * Is
shell haciendo la expansión comodín para uno y no para el
otro ejecutable?

El punto de escapar de '*' en la invocación de búsqueda es evitar que el shell realice la expansión. Al escapar, se asegura de que find vea los argumentos: ".", "-Name", "xy *". Si no escapó del '*', find vería ".", "-Name", "xya", "xyz" (suponiendo que el shell expanda "xy *" a "xya xyz", lo que sucederá si solo los archivos que comienzan xy son xya y xyz). Entonces, la respuesta a su pregunta es no, el shell no expande el '*' en su invocación de find porque explícitamente le pidió que no lo hiciera al escapar.

William Pursell
fuente
0

Shell en Linux es una forma conveniente y convencional de interactuar con el sistema de archivos en Linux y ejecutar comandos con argumentos y con respecto a las variables de entorno. Proporciona muchas funciones útiles, por ejemplo, conectar la salida de un proceso a la entrada de otro, redirigir flujos de entrada / salida a / desde archivos, FIFO, etc. Un shell es una buena manera de combinar fácilmente varios programas pequeños, cada uno de ellos haciendo una tarea relativamente pequeña, para proporcionar algo útil. Algunos de estos programas (como find y ls) fueron diseñados para trabajar con ellos en un shell.

Para entender la expansión, simplemente recuerde que una palabra (secuencia delimitada por espacios de caracteres aplhanumeric y -, y algunos otros símbolos), dado que contiene *o ?caracteres de patrones, no se escapó o poner dentro de las comillas ( ") o apóstrofes ', se sustituye con una serie de palabras delimitadas por espacios con nombres de archivo que coinciden con el patrón. Entonces, si tuviera una palabra con un asterisco, después de la expansión tendrá cero, una o varias palabras, que bash tratará como varios argumentos. Aquí viene el diseño específico del lscomando: ¡se adapta perfectamente a este esquema cuando se usa ls foo*para mostrar todos los archivos que comienzan con "foo"! Se expande en algo como

ls foobar boobaz

y ls simplemente imprime archivos a partir de argumentos, verificando la existencia y atravesando archivos de relleno, etc.

Pero esa es principalmente la cuestión de la filosofía. En otros sistemas, todo emerge del botón "Inicio" y la barra de tareas. Algunos usuarios están bien con eso. Algunos intentan instalar un shell similar a Linux en dichos sistemas. Es cuestión de gustos, pero para programar scripts simples, que tratan con archivos, Shell es extremadamente conveniente.

P Shved
fuente
0

Para comandos interactivos, el shell puede ser reemplazado por GUI.

Pero el punto clave del shell es que es un lenguaje de script: puede crear programas completos que se ejecutan en situaciones específicas (arranque, apertura de sesión, todos los días, ...). Esta característica no puede ser reemplazada por otras herramientas.

Mouviciel
fuente
Y, por supuesto, se puede programar scripts de shell concron
Wuffers
0

Por supuesto, podrías ejecutar Linux y nunca usar el shell. Desde el primer momento, muchas distribuciones estándar de Linux ofrecen a los usuarios domésticos exactamente lo que necesitan si solo quieren revisar Facebook, mirar fotos y enviar correos electrónicos.

Linux tiene muchas ventajas, pero el shell es probablemente el mejor. El shell permite la redirección de E / S. Esto es de lo que la gente habla cuando se refieren a tuberías ("|"). Por ejemplo:

Quiero conectarme a una lista de máquinas y realizar una encuesta sobre dónde existe una cuenta de usuario:

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

Podría haber 0 hosts en hostnames.txt o podría haber miles. Este script se deslizará y realizará la encuesta, escupiendo la información a stdout.

Las secuencias de comandos pueden ser muy creativas. Puedo usar los caracteres "/ >>" para redirigir la entrada / salida desde y hacia los archivos. Podría examinar todas esas máquinas en la secuencia de comandos anterior, generar el nombre del servidor de cualquiera que tenga el usuario en un archivo, luego seguir con otra secuencia de comandos que se conecte y realice alguna tarea en la cuenta del usuario (bloquear / desbloquear / restablecer pw / eliminar / agregar grupo / etc).

Aprender. A. Guión. =)

HayekSplosivos
fuente