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.
Respuestas:
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) :
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.
fuente
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:
Estos son dos comandos
find
ygrep
uno alimenta al otro.find
enumera todos los archivos en las carpetas actuales y secundarias, una por línea, egrep
imprime solo las líneas que contienenburek
.Ahora, hay otras cosas más complejas, como:
ls -R
enumera los archivos en las carpetas actuales y secundarias, ysort
ordena la salida.uniq
entonces 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.
fuente
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
fuente
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 sí necesita una interfaz.
fuente
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:
o como
terminan resultando en el mismo conjunto.
fuente
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.
fuente
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 dells
comando: ¡se adapta perfectamente a este esquema cuando se usals foo*
para mostrar todos los archivos que comienzan con "foo"! Se expande en algo comoy 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.
fuente
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.
fuente
cron
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. =)
fuente