[Seminario - cáscaras de Unix, Entornos] [Douglas Kline - Harvard University] [Este es CS50. - CS50.TV] El tema de hoy es la shell de Unix. Estoy Douglas Kline, experto, o al menos razonablemente usuario competente, de la cáscara. Un shell es la interfaz para el usuario para el sistema operativo del ordenador. El nombre es engañoso ya que, a diferencia de la concha de un animal, que es duro y de protección, la cáscara ordenador permite la comunicación. Así membrana porosa, probablemente sería una mejor metáfora. La cáscara original para Unix es el shell Bourne. Bourne se escribe B-O-U-R-N-E. Bourne fue uno de los autores originales de Unix, por lo que la cáscara se nombra después de él. El nombre de esa concha como un comando es simplemente sh. Ese es el comando que se puede ejecutar. La cáscara se inicia al iniciar la sesión. Al iniciar sesión en el ordenador, el shell sólo comienza a funcionar para usted, y eso es lo que lleva a sus órdenes. Se puede comenzar en otras ocasiones también. Si abre una ventana sin ninguna otra indicación, se iniciará una concha para usted. Eso es cómo es que usted puede ir a una ventana y empezar a escribir los comandos y así sucesivamente allí a pesar de que no se registró a esa ventana. Además, si usted hace un inicio de sesión remoto, a continuación, se iniciará un shell en el equipo remoto. Y es posible ejecutar comandos sin un shell interactivo. Eso puede significar dentro de su operación actual, y también puede significar una operación remota. Usted puede enviar un comando a otro equipo, que incluye la puesta en marcha de una concha de allí. De hecho, tiene que incluir la puesta en marcha una cáscara hay incluso si ese no es su objetivo final. Cuando algo se pone en marcha como esta, no se inicia necesariamente un nuevo shell. Si abre una nueva ventana, es posible decir que para que aparezca un editor o algún otro comando. En ese caso, el editor se iniciará a partir de cero. Cuando termina el editor, la ventana termina. Esto es un poco inusual, pero se puede hacer. En esos casos, no será una cáscara. Así que no es necesariamente el caso de que una ventana o alguna aplicación se abrirá un shell. Shell analiza los comandos. Parsing significa identificar los distintos elementos y su clasificación. Dentro de un comando, la cadena completa que escribe, habrá 1 o más comandos individuales para ser ejecutados. Otros elementos pueden ser argumentos. También puede haber caracteres especiales que afectan a la ejecución de un comando. Pueden enviar la salida en alguna parte que no sea la pantalla si el comando ordinariamente enviarlo a la pantalla. Puede redirigir la entrada, sino que puede hacer otras cosas también. Hay varios otros símbolos, caracteres, etc. Parsing implica detectar e interpretar las cosas. Ahora bien, si no hay más preguntas, lo cual es bastante probable, ya que no hay más gente, vamos a pasar a mi próxima página aquí. Dije antes que el shell Bourne es el intérprete de comandos inicial. Hay otros. Uno es el C-shell. El comando es csh. El nombre de C-shell es sólo un juego de palabras. Esta cáscara se introdujo con Berkeley Unix a mediados de la década de 1970. Berkeley Unix era un acontecimiento fundamental en el desarrollo de Unix. Fue una gran revolución e incluyó la introducción de esta concha. La razón de que el juego de palabras, C-shell, es que el C-intérprete tiene algunas características en lo que se asemejan el lenguaje C, que el shell Bourne no tiene - o no tenía en ese momento. También está el TC-shell. Este es un superconjunto de la C-shell. Tiene características adicionales, muchos de los cuales son útiles para el uso interactivo, como recordando los comandos en el mecanismo de la historia, que voy a describir un poco más tarde - de una manera sencilla, el modelo de un editor. También tiene enlaces que le permiten enlazar una cadena de clave de corto a un comando más. No vamos a entrar en eso hoy. Tiene algunas características que son útiles para la programación. Sin embargo, el C-shell no se usa a menudo para la programación del shell. Programas de Shell, si usted no supiera ya, son programas que consisten en las características de shell. Puede ejecutar estos programas. Usted escribe un montón de comandos de la shell en un archivo y ejecutar el archivo. No es necesario para compilarlo. Este es un lenguaje interpretado. La frase C-shell se convierte en ambiguo ya que puede referirse sólo a la original C-shell, csh, oa todos los C-conchas, incluyendo tcsh. Es un poco ambiguo. Una concha más tarde es el shell Korn, ksh, llamado así por el programador, Korn. Esta cáscara intentó incorporar en 1 cáscara las ventajas de la C-shell para uso interactivo y el shell Bourne para la programación. Se ha utilizado como un shell interactivo por algunas personas - una minoría. Más tarde, sin embargo, hubo otra presentación, el shell Bash, BASH, de nuevo un juego de palabras, Bourne-again shell. Es una extensión del shell Bourne. Korn también. Ambos son. Tiene los mismos objetivos del shell Korn de la fusión de la C-shell y ventajas de Bourne shell en shell 1. Muchas de las mejoras del shell Korn también se incluyen en Bash. Bash, sin embargo, tiene más y por lo tanto es preferible. The Bourne-again shell y el shell Korn se llaman conchas de tipo Bourne ya que incluyen las características del shell Bourne, que son incompatibles en algunos aspectos con los C-conchas. Hay otras conchas, además de ellos, unos destinados al uso restringido, tal vez limitado a algunos comandos, tal vez con fines especializados, no se utilizan a menudo. Okay. Siguiente artículo aquí. El intérprete de comandos se ha asociado con varias formas de Linux. No estoy seguro de si eso es cierto de todas las formas. Hay muchas formas por ahí y no todos ellos han utilizado, pero en los que he usado se ha convertido en asociados. Hasta donde yo sé, no hay nada acerca de Bash que hace que sea más compatible con Linux que cualquier otra combinación de cáscara y el sistema operativo. Creo que esto probablemente sólo refleja las inclinaciones de los programadores. Que ha llegado a ser asociado con Linux es otra razón para preferir Bash para ksh ya que las cosas son susceptibles de ser escrito en él y es probable que se propague. Te voy a dar otras razones de eso más adelante. Scripts de shell Bourne deben ejecutarse bajo la shell Korn o bash. Si usted escribe algo para el shell Bourne, Probablemente se puede ejecutar bajo ksh o bash. Scripts de shell Korn probablemente se ejecutarán bajo Bash, pero no puedo garantizarlo. Más tarde aquí, los scripts de C-shell se deben ejecutar en el marco del TC-shell. El C-shell fue en realidad nunca se utiliza ampliamente para el scripting desde el shell Bourne y más tarde las conchas de tipo Bourne eran preferibles para ese propósito. Así que realmente no es tan importante. Hay un buen montón de Bourne shell scripts que fueron escritos hace mucho tiempo, antes de que el shell Korn o el shell Bourne-Again fueron introducidas. Los que aún están en uso, que forma parte de los sistemas operativos, y así que usted los encontrará si nos fijamos en el sistema operativo o algunos paquetes de programación de edad. Bash es hasta cierto punto convirtiéndose en una especie de lengua franca para los sistemas operativos. Ya se ha extendido a Windows y VMS. VMS, por si no lo sabe, es un sistema operativo propietario de Digital Equipment Corporation, que todavía está en uso, en gran parte detrás de las escenas. Y si va a estar en ejecución en varios sistemas operativos diferentes, probablemente las personas tienden a pasar por ello. Pero este desarrollo es relativamente reciente. Esto es sólo el comienzo, así que no puedo predecir si esto va a llegar a ser realmente ese tipo de lingua franca. Asimismo, dado que las rutas de acceso de archivos y bibliotecas difieren entre estos diferentes sistemas operativos, usted podría no ser capaz de escribir un script bash en un sistema operativo y luego ejecutarlo en otro. Usted debe ser capaz de moverlo entre distintos Unix, Linux Sistemas operativos Mac OS, pero no necesariamente para Windows o VMS. Puede que tenga que cambiar las descripciones de archivos nombre de ruta, y algunas bibliotecas pueden ser diferentes, lo que puede afectar la manera en que algunos comandos funcionan o cómo se procesan los argumentos y similares. Además de eso, otra precaución aquí es que no hay ninguna garantía que todas las diferentes conchas que he mencionado - Bourne shell, C-shell, TC-shell, Korn, Bourne-Again Shell - estará disponible en virtud de cualquier Unix o Linux o Mac OS. Ellos simplemente no pueden estar allí. Esa es una de las precauciones aquí. Es una triste limitación en este caso ya que desea que las cosas funcionen en todas partes, pero, por desgracia, no se puede confiar en eso. Okay. Siguiente una aquí. Digamos que usted desea escribir un script de shell, un programa que consta de comandos de shell. Usted escribe sus comandos, ponerlos en un archivo y ejecutar el archivo. ¿Qué pasa si usted quiere incluir argumentos? En el caso de operaciones de shell, los argumentos se denominan parámetros o parámetros posicionales y que van a ser convocadas por un signo de dólar y el número, $ 1, $ 2. Así que si el guión tiene este nombre, mi primer argumento podría ser el argumento 1 y mi segundo podría ser el argumento 2, y dentro de mi script si quiero referirme a estas cosas - Vamos a borrar esta ya que no estoy realmente va a ejecutarlo - dentro de mi guión que podría tener $ 1 para referirse a arg1, $ 2, que saldrá de esa manera, arg2. Así que esos símbolos están disponibles para hacer referencia a los argumentos, y los que se aplican a todas las conchas. Además, hay otros caracteres. $ * Se refiere a toda la lista de argumentos, todos ellos. $ # Se refiere al número de argumentos. Una vez más, esto se aplica a todas las conchas. Esos símbolos, * y #, se pueden utilizar con los significados en otros lugares también. No vamos a entrar en esa. Línea especificador Shell. ¿Qué es eso? Digamos que usted ha escrito un guión y es un shell determinado y desea ejecutarlo. ¿Cómo sabes qué shell del sistema operativo utilizará para ejecutar la secuencia de comandos? En un momento se podía suponer que iba a ejecutar en el shell Bourne si usted no dijo otra cosa, pero las personas no están escribiendo scripts en el shell Bourne que mucho más y ni siquiera se puede confiar en eso. Así que aquí tenemos una línea especificador shell aquí. Que especifica Bash. Tenga en cuenta que se especifican en el nombre de ruta, / bin / bash. Si un equipo tiene el intérprete de comandos, pero no en el directorio bin, / bin, esto no funcionará. Ese es otro calificador, otra precaución aquí. El signo es el signo de comentario de línea. Eso se aplica a todas las conchas. El caso particular aquí, #! al principio de una secuencia de comandos, es un caso especial. Que especifica el shell en el que se ejecute el script. A lo que iba, que podría no ser el mismo lugar / bin. Además, hay otra cosa aquí. Si usted sólo tiene que utilizar el signo de número sin signo de exclamación y el nombre de ruta, que debe indicar un C-shell. Sin embargo, no recomiendo hacer eso porque no soy capaz de garantizar que siempre que va a funcionar. Si quieres un C-shell, sería mejor decir que sí. Entonces hay algo bastante confuso aquí. Si utiliza una línea especificador shell como / bin / bash y que la cáscara no está disponible allí, no hay tal cosa como / bin / bash en ese equipo en particular, ya sea porque no tiene Bash o porque está en una ubicación diferente, obtendrá un error que indica que la secuencia de comandos se ejecutó no existe. Y, por supuesto, existe la secuencia de comandos, por lo que el mensaje de error es confuso. La razón de que el sistema operativo le da ese error o, más exactamente, que el shell interactivo en el que se está ejecutando esta da ese error, es que muestra el comando que utilizó, que es el nombre del script. Ese comando llama efectivamente la cáscara con el nombre de la secuencia de comandos. Ahí es donde usted consigue ese mensaje de error confuso. Otra forma de llamar al script de shell es mediante la especificación de la concha en la línea de comandos, como en este caso. Este es un mandamiento. Esto dice ejecutar Bash y luego ejecutar mi script en Bash. Eso tomará precedencia sobre una línea especificador, y esto tiene la característica de que le permite ofrecer a diferentes rutas de acceso. Si usted acaba de dar una orden, el sistema operativo buscará ese comando en varios lugares. Si está disponible, debe encontrarlo. El equipo se encuentra Bash allí donde se encuentra y ejecutarlo, por lo que no es necesario entonces que preocuparse por donde lo encuentra. Hay potencialmente otras preocupaciones aquí, como si hay más de 1 versión de Bash, que es posible, aunque poco probable. Esa es otra manera de lidiar con estas cosas. Líneas Prescripción pueden llamar a cualquier shell. También pueden llamar a las cosas distintas de conchas. Ejemplos que tengo aquí son sed, que es el editor de flujo; awk, que es un lenguaje de procesamiento de patrones; y Perl, un lenguaje de script muy desarrollado. Si usted pone una línea especificador indica uno de esos programas, al principio, irá directamente a ese programa en lugar de iniciar un shell. Esos programas tienen límites de sus capacidades. Perl es muy capaz. Sed es un editor. Se pueden hacer cosas más allá de la simple edición. Pero puede ser difícil de programar que. Además, el paso de argumentos y esas cosas a la escritura es imposible o confuso. Así que en esos casos, con awk o sed, que es, al menos en mi experiencia, preferible escribir un guión y el llamado awk o sed shell desde el script de shell en lugar de llamar awk o sed como la línea especificador guión. Perl es un lenguaje muy diversificada, como ya he dicho. No se puede ejecutar comandos interactivos en perl, lo que significa que no se puede probar partes de secuencias de comandos que usted está en desarrollo ejecutándolos de forma interactiva. Sin embargo, es un lenguaje muy capaz y se ha convertido en una herramienta muy ampliamente utilizado. Eso es sólo un poco más de un comentario entre paréntesis alrededor de las líneas de especificador. En la totalidad o la mayoría de las formas de Linux - de nuevo, no puedo estar seguro de que es todo - y en Mac OS, si escribe csh usted consigue tcsh, y si escribe SH se obtiene bash. Ellos estaban tratando de no darle las versiones más avanzadas de estas conchas, pero esto puede ser confuso. Si se escribe un guión usando tcsh o Bash características, mientras que llamar a csh o sh y luego tratar de ejecutarlo en un ordenador que no tiene tcsh o Bash, lo que podría tener algunos errores si hay comandos allí que esos proyectiles no reconocen. Además, es posible que haya llamado su shell en el equipo local calificándola como sh o csh y luego conseguir las conchas más avanzados. Puede que ni siquiera pensar en el hecho de que usted está utilizando el shell más avanzada. Así que este es un problema potencial. ¿Cómo se determina que si escribe sh usted consigue Bash, si escribe csh usted consigue tsch? Hay cosas en estos ordenadores llamados enlaces que pueden conectarse a los nombres de archivo para referirse a la misma cosa. O bien puede ser de 2 nombres para el mismo archivo o un archivo que tiene por objeto hacer referencia a otro archivo. Se les conoce como enlaces duros y simbólicos. Nosotros no vamos a eso más hoy. También puede haber archivos separados - 1 archivo sh, 1 archivo Bash - pero ambos funcionan Bash. Luego hay otro calificativo aquí. Si usted está llamando a uno de estos depósitos por un nombre, se podría pensar que tendrías la misma funcionalidad que llamarlo por otro nombre. Bueno, eso en realidad no es necesariamente cierto. Estos comandos pueden examinar el nombre por el cual fueron llamados y pueden, sobre la base de ese nombre, se comportan de manera diferente. Puede haber problemas de tratar de ajustarse a una norma. Algunos de ustedes pueden haber oído hablar del estándar POSIX o de otra, tal vez otras características. Esto puede ser seleccionado a veces por los argumentos de línea de comandos o estableciendo las variables de shell. Llamarlo como sh o bash en realidad puede conducir a una ejecución diferente incluso si es el mismo archivo que se está ejecutando. Otra cosa a considerar es que, incluso si otro equipo tiene tcsh o Bash, si no están vinculados como están en su computadora local si usted tiene un equipo local de Linux o Mac OS, luego otra vez obtendrá la cáscara que se llama sh o csh, no el que es posible que prefiera. The Bourne shell actual tiene mejoras menores que los de Bash pero más allá de los de la shell Bourne original. Como resultado de que, incluso en el shell actual Bourne, SH, aun cuando no es Bash, se asemeja al lenguaje C más que el C-shell hace. Eso no era cierto cuando se creó el C-shell primero, pero se ha desarrollado de esa manera. Usted puede notar aquí que todos estos nombres de shell, excepto para el shell Bourne tener algo que indique que la cáscara que son - csh, bash - pero el shell Bourne es sólo sh. ¿Por qué? Ese fue el shell inicial. Fue el Shell entonces, no una concha, y ya que era la concha, no había ninguna razón para distinguirlo de otro proyectil. Así que por eso tiene ese nombre y todavía lo hace. Esta camiseta aquí es una línea de una base de datos de la contraseña de una cuenta que tengo allí en otro equipo. Voy a tratar de conseguir que el nombre para que pueda ver esa parte al final, la cáscara. La base de datos de la contraseña tiene las características de acceso para todos los usuarios. Al principio, es el nombre de usuario, que se puede ver los últimos 2 cartas mías ahora. Los campos aquí son separados por dos puntos. El último campo, como se puede ver, es bin / tcsh, la cáscara. Ese es el especificador de shell. Hay algo interesante aquí. Cuando Unix fue desarrollado por primera vez, sólo había 1 cáscara, así que no había otra opción que hay. Entonces, ¿por qué permitieron un campo en la base de datos de contraseñas para especificar un shell? No sé, pero es una suerte que lo hicieron. Es bastante difícil hacer cambios en el formato de datos de contraseñas porque muchos programas hacen referencia a su formato y tendría que ser reescrito. Es un feliz desarrollo o fortuito que incluyen ese campo. Ese tipo de una línea de archivo de contraseñas se utiliza en todos los equipos Unix y Linux por lo que yo sé. El Mac tiene su propio sistema. En realidad, tiene un archivo de contraseñas con las líneas en ese formato, pero no es ahí donde se definen las características de los usuarios. Otro comentario entre paréntesis allí. Si llama un shell, se le puede llamar como un sub-shell de sus conchas existentes. Así que si voy allí, vamos a deshacernos de estas cosas. Aquí estoy en el C-shell. Esa variable, que identifica con precisión de mi caparazón, en realidad no es siempre una manera fiable de determinar qué shell se está ejecutando, pero en este caso es. ¿Qué pasa si yo sólo escribo - Ahora estoy en Bash. Algunas cosas van a ser los mismos. ls me dicen mis mandamientos. ¿Si suspendo un regreso a mi C-shell, ls, igual. ¿Cierto? fg, primer plano, de vuelta a mi shell Bash. pwd, directorio actual, de nuevo a la C-shell. pwd, directorio diferente - en realidad no es un directorio diferente en este caso. Es el mismo directorio. Digamos que quiero llamar a un comando aquí: donde ls. ¿Qué quiere hacer? Me dice cuando el comando ls, el que me da un listado de directorio, se encuentra en ls. Volvamos a Bash shell. Vamos a intentar lo mismo. Hmm, interesante allí, donde: command not found. ¿Por qué? El comando donde se integra en el C-shell. Esto no es un comando que tiene que ser leído en la memoria de alguna otra parte y ejecutado. El C-shell ejecuta mediante la transferencia de la ejecución de parte de su propio código y no es en el shell Bash. Así Bash, que no tenga un comando integrado, lo busca, no lo encuentra, y obtenemos un error. Así que ahí tenemos un intérprete de comandos se ejecuta con un C-shell, y llamamos a eso un sub-shell. Y por si acaso usted es curioso, Bash shell tiene su propia manera de localizar los comandos. hash se refiere al hecho de que se puede ejecutar más rápidamente, encontrándose con mayor rapidez. Esa es una de las mejoras incorporadas en algunas de estas conchas. Conchas de tipo Bourne se prefieren para la programación. Tienen estructuras de control, como bucles, sentencias condicionales, el tipo de comandos que puede utilizar en lenguajes de programación como C o cualquier idioma. Tal vez usted está programando en Java o lo que sea. Los depósitos tienen aquellos demasiado. Las conchas de tipo Bourne, en particular Bash, tienen más y que están diseñados con una mayor flexibilidad. El intérprete de comandos tiene arrays. El shell Bourne original no lo hace. Así que puede ser considerablemente más ventajosa para la programación. El C-shell realidad existen matrices, pero no tiene una gran cantidad de estas otras características. Las conchas de tipo Bourne se ejecutarán más rápido si no tienen las características previstas para el uso interactivo. Se cargue las cosas con un propósito, lo que los carga hacia abajo para otro propósito. Ahí está esa disyuntiva allí. Esas características que están destinadas para uso interactivo realmente son de poco o ningún uso de secuencias de comandos. Es posible utilizar un sub-shell interactivo como el que yo empecé allí para poner a prueba los comandos que se va a utilizar en un script. Eso es lo que no puedes ver con perl. Usted puede hacerlo con las conchas. Incluso las estructuras como los bucles y así sucesivamente se pueden ejecutar de forma interactiva. Ellos son en ocasiones útiles para ejecutar de forma interactiva, pero lo más probable es que usted está utilizando para desarrollar un guión. Alias. Esto va a ser sobre el C-shell. Mecanismo de Historia donde se llega de nuevo a los comandos anteriores o partes de ellos que ha ya ha ejecutado. Una vez más, sobre el C-shell, la shell Bourne y Korn shell tienen estas cosas, pero yo no voy a entrar en ellos. Así que aquí están algunos alias útiles que tengo. En lugar de escribir ls - es un comando común - sólo tienes que escribir l y se ahorrará 1 carácter. ls con varias opciones, todos los trabajos. Tenga en cuenta que estas definiciones tienen comillas alrededor de ellos. En estos casos, las comillas no son necesarias. Si usted puede definir los alias sin comillas, todavía funcionaría. Son recomendados. Hay situaciones en las que no se puede utilizar la cita porque usted quiere que suceda algo que la cita impediría. A veces se puede citar parte de la definición, pero no todos de la misma. También se recomienda en general utilizar comillas simples en lugar de comillas dobles. Las comillas dobles tienen efectos sobre la definición de las variables, sobre todo haciendo que estos sean evaluados en lugar de detenerlo. ¿Por qué íbamos a querer detener la evaluación? ¿Y cómo hacer que las cotizaciones para nosotros? Este es un comando que usted puede ser que encuentre interesante. 'Ls g *' g *, como usted probablemente sabe, es una expresión comodín para todos los nombres de archivo que comienzan con g. Si acabo de escribir en un comando ls g *, voy a conseguir una lista de todos los nombres en mi directorio actual. Si yo defino ese alias, ya que está aquí con las comillas, se ejecutará ese comando en el directorio actual donde se está ejecutando ello. Pero si ejecuta la definición de alias sin comillas, evaluará el comodín g * cuando se ejecuta este comando de definición. Así que la definición del alias se ls seguido por la lista de archivos en el directorio en el que se ejecuta el comando alias, independientemente de donde realmente se va a ejecutar el comando. Esto no es de mucha utilidad, y las comillas simples a evitar la evaluación del asterisco. Así que usted acaba de obtener la definición ser ls g *. Luego, cuando se ejecuta el alias, lgs, entonces se pone eso. Ahora ya no hay citas, y evaluarán el asterisco cuando se ejecuta el comando alias. Así que eso es una cosa. Las comillas dobles tendrían el mismo efecto aquí, pero hay otros casos en los que las comillas dobles no iba a funcionar tan bien. Aquí es otro. Puede que conozcas el comando grep. El comando grep se puede utilizar para examinar un archivo para las líneas que tienen ciertas cadenas. Así que vamos a ir de aquí y voy a salir de mi shell Bourne. Okay. Aquí hay un archivo. Digamos que es cadenas ABC grep. Ahí está. Si lo hago zddd grep, no consigo nada. Okay. Así que encuentra una cadena, se informa; no lo encuentra, no informa de ello. Genera cualquier línea que tiene esa cadena en él. Hay todo tipo de opciones aquí que se pueden encontrar en la documentación. He aquí una manera de hacerlo. ¿Y ésta, alias grabc 'grep abc'? Eso va a incluir 1 argumento cuando se define el alias. Así que si lo hago aquí, ahora si lo hago grabc, ahora el alias incluye más que el simple comando. También tiene el argumento. Hasta ahora funciona. Tengo otro mando aquí, éste, por lo que esas son las diferentes cadenas de ahí y demostrar que este no encuentra nada allí ya que no coincide. ¿Qué pasa si quiero incluir en la definición de alias en el archivo que voy a buscar y quiero dar como argumento para el alias de la cadena que estoy buscando? Podría querer decir abc como argumento a mi alias, pero el alias ya determinó el archivo. Y ahí es donde entra en juego esta expresión Nótese aquí que tenemos grep igual que antes. Tenemos el archivo aquí, cuerdas. \! ^, Tipo de una expresión extraña, supongo, si usted no ha visto esto antes. Signo de exclamación es parte del mecanismo de la historia de C-shell. Se puede recordar los comandos anteriores, se puede recordar argumentos de los comandos y así sucesivamente. El mecanismo de historial se utiliza como parte de aliasing. Si especifica una línea después del signo de exclamación, se referirá a esa línea en la lista de la historia, que no vamos a estar metiendo ahora, ya que es un tema totalmente distinto. Es posible especificar parte de una línea. So! 03:02 sería el segundo argumento de mando número 3. El símbolo de intercalación en esta expresión representa el primer argumento. Si no le dan una indicación de qué comando está refiriendo, se refiere al comando inmediatamente anterior, y el símbolo de intercalación es un símbolo para el primer argumento. Debido a que es el símbolo de intercalación y no el número, no es necesario utilizar los dos puntos, so! ^ significa que el primer argumento de la orden anterior. Un poco mezclado aquí. En este caso, cuando se utiliza esto como una definición de alias, la referencia de la historia se refiere de nuevo a las órdenes en las que se utiliza el alias. Así que esto va a volver 1 de comandos como una operación de la historia, sino como una operación alias hace referencia a la orden en la que tendría que escribir, decir, grstrings_file. Tenemos aquí las comillas en el mismo. ¿Cuál es la barra invertida para? En este caso, como en otros, no queremos ejecutar el mecanismo de la historia mientras se define el alias. Si no tuviéramos la barra invertida allí, la cáscara se retiraría en el primer argumento del comando de la derecha antes de que corrió este comando alias, lo que no queremos. Queremos que esto se integra en el comando alias para llamar en una discusión posterior. Las comillas simples no escapan a un signo de exclamación, la referencia de la historia. Tal vez usted sabe el escape expresión significa cambiar el significado de algo. En este caso, significa dejar algo de tener un significado especial. Significado especial del signo de exclamación es historia. Escapa y no tiene ese significado. Cotizaciones no hacen eso; barra invertida hace. Así que en realidad estamos usando 2 niveles de escapar de aquí. Voy a mover este comando en la otra ventana sin escribirla mediante el uso de estas operaciones de edición, que pueden serle de utilidad. Otra cosa que aquí os voy a mostrar. Si usted acaba de escribir alias sin argumentos, que le dice a todos sus argumentos. Se trata de un montón de alias que ya tenía aquí además de los que he estado usando aquí hoy. Pero si acabo de escribir con el nombre de un alias, me dice lo que significa. Observe que las cotizaciones se han ido y la barra invertida se ha ido. Esta cadena de aquí es el resultado de esa definición de alias, y ahora se acaba! ^ en ella. Esto se va a ver en las cuerdas de archivo para nada. Así que si lo hago cadenas grstrings_file, yo no le di nada que buscar allí, pero está buscando en las cuerdas. No encontraba las palabras cadenas en las cuerdas de archivo, pero sí encontrar abc. Y no encuentra eso. Así que aquí estamos dando un argumento que impacta en la definición del alias, que se inserta en él. Es el lugar donde esta expresión viene. Usted puede utilizar más de 1. El símbolo de intercalación es un símbolo para el primer argumento. Si desea utilizar un segundo argumento, usted entonces decir: 2. No hay símbolo especial para el segundo argumento. Y porque usted está utilizando un número, usted tendría que usar los dos puntos. Hay, sin embargo, otra opción aquí. La muestra de dólar representa el último argumento. Y porque se trata de un símbolo, puede omitir el colon. Por lo que sería el último argumento en la lista. Y también está esa. El asterisco significa que todos, por lo que esta es la lista de argumentos completa, y de nuevo, se puede omitir el colon debido a que no es un número. Espero que estés todo observando todo esto. El mecanismo de la historia puede volver a las líneas anteriores en la lista del historial. Usted puede hacer esto en una definición de alias. Nunca he visto este hecho. Esto tendría el efecto de sacar los comandos anteriores en la lista histórica cuando se ejecuta el alias, lo que podría haber diferentes comandos dependiendo de cuando y donde lo ejecuta. Es concebible que es posible que desee retirarse de dicha referencia sólo para saber lo que era un comando anterior. Nunca he visto que esto suceda. Supongo que alguien podría desear, pero esto es muy poco probable. Hay otra cosa aquí. Si utiliza esa referencia de tipo de la historia, a continuación, sólo se utilizan los argumentos para los que existe dicha referencia. Si usted tiene una definición de alias que no utiliza una referencia de tipo de la historia, Si sólo se convierte en el principio del comando y tiene más argumentos, entonces cualquier cosa que escriba después de que se añaden al comando. En este caso, el ejemplo que acabo de dar allí, utilizamos el primer argumento; no usamos ningún otro. Si se hubieran dado otros argumentos en la línea de comandos, no se utilizarían. Así que si usted utiliza la referencia de la historia en absoluto, entonces usted debe utilizar para obtener cualquier argumento. Hay otra cosa aquí sólo quiero mencionar, en parte, entre paréntesis, a saber, que este mecanismo de la historia con el signo de exclamación se remonta a la C-shell originales. El tcsh introdujo operaciones historia que utilizan el tipo de comandos y cadenas de los editores, ya sea Emacs o vi. Mi opinión personal es que Emacs es mucho más fácil de utilizar para este propósito aunque utilice vi para la edición regular. Hay varios comandos de Emacs que ahora se han adaptado a la historia. Control P pone la línea anterior en la lista de historial. Otra Control P le conseguirá la anterior a esa. La flecha hacia arriba hace lo mismo. Control No. obtiene el siguiente comando si ya ha desplazado hacia atrás algunos aspectos. Flecha hacia abajo hace eso también. Puede mover de izquierda a derecha con las flechas y varias otras cosas. Esto puede hacer uso del mecanismo de la historia mucho más fácil que utilizar la sintaxis de exclamación, pero que no se usará de que en una definición de alias. Vamos a ir más que en otro momento. Variables. ¿Sabes lo que las variables están en lenguajes de programación. Las cáscaras de ellos tienen también. El C-shell utiliza el comando set para asignar las variables, por lo que establece la variable a un valor de b - como he dicho, una definición inútil sino una ilustración de cómo se utiliza. El comando set creará una variable si no existe ya. Las posiciones para los scripts de shell se pueden considerar las variables, pero el uso de los mismos y las reglas para ellos son algo diferentes. No se puede asignar un valor a $ 1 en el transcurso de un guión. Usted tendría que definir una nueva variable para ese propósito si algunos de ustedes querían. Escriba SET sin argumentos y se obtiene una lista de todas las variables definidas actualmente. Y vamos a llegar a mi otro shell aquí y veamos lo que obtenemos si hacemos eso. Toda una larga lista, ¿verdad? Desplácese hacia arriba un poco. Mira todo eso. Algunas de estas cosas se definen automáticamente por el shell. El shell crea la variable y le da un valor. Algunos de ellos son definidos por el shell, pero luego redefinidas por el usuario de acuerdo con sus preferencias. Y algunos de ellos son creados por el usuario en función de lo que está haciendo ese día. Eso es sólo set sin argumentos. Hay una extraña característica aquí de esta cosa. Tiene que ser o ningún espacio entre signo igual y el nombre de la variable y el valor o los espacios a ambos lados del signo igual, como en este uno. Esto no va a funcionar, y esto realmente es un comando válido pero no va a hacer lo que tenía planeado. Ese comando funcionará porque si acabas de decir y establecer un nombre de variable sin signo igual o conjunto y un nombre de variable con un signo igual y sin valor, se establece la variable en un valor nulo. A fin de establecer a = es un comando válido. El comando set puede definir más de 1 variable sobre la misma línea. Así que este comando de aquí tiene el efecto de definir a y b a valores nulos. Probablemente no es lo que quieres. Este de aquí, se mencionó anteriormente, dará lugar a un error ya = b no es una expresión válida. Un nombre de variable no puede empezar con el signo igual. Y hay estas cosas nuevas aquí. Los dos puntos se utilizan para seleccionar los argumentos de las líneas de la historia, y que pueden ser utilizados - y yo no entraron en antes - para modificar esas cosas. Ellos también se pueden utilizar para modificar las variables de shell. Este de aquí, $ a, tiene un valor. : R despegará una extensión. Una extensión será cualquier cosa después de un punto, un punto y nada después de que al final de un archivo, sólo al final de la lista después de la última barra. Así que tengo aquí. una es que. Se dejará caer el. O. Si no hay extensión, sólo los nombres de ruta después de la última barra, no tendrá ningún efecto. a: h, que una expresión variable, despegará el último elemento de una lista de directorios, de nuevo, sólo después de la última barra. Así que / a / b / c se convierte en / a / b, pero éste se cambia porque el elemento después de la lista es nulo. Aquí hay algo que también quiero hacer hincapié. Estos calificadores no buscan la existencia de estos archivos. Ellos sólo buscan cadenas. Estos pretenden manipular a los nombres de archivos, rutas de acceso, pero se pueden utilizar en cualquier cadena, incluso si no es un nombre de archivo. Y ellos no buscan la existencia, por lo que si no existe tal archivo, / a / b / c, esto seguirá funcionando. Ya sea de alguna utilidad, es otra cuestión, pero todavía funciona. Las variables son diferentes en los shells Bourne. Ya llegaremos a eso más adelante. Signo de dólar se puede escapar al igual que el signo de exclamación y el asterisco. Signo de dólar se puede escapar con una barra invertida o las comillas simples. Las comillas dobles tienen el extraño efecto en todas las conchas de obligar a la evaluación de una muestra de dólar expresión variable. Así que si está siendo escapó de una manera, las comillas dobles pueden tener el efecto de causando que se puede evaluar de todos modos. Esto es un poco confuso. Si hay varios niveles de escapar, como las comillas simples dentro de comillas dobles o comillas dobles dentro de comillas simples, se debe probar para ver qué va a pasar a una variable si está usando uno. Esas situaciones 2 - doble en el interior de un solo interior, único de doble - no necesariamente le dará el mismo resultado. Las variables de entorno, variables de C-shell consolidados. Las variables de entorno son también variables en el C-shell, y también son variables en otras cáscaras demasiado. En el C-shell, son conjuntos distintos. Las cosas que yo decía antes son acerca de las variables de shell. Las variables de entorno son un conjunto distinto de variables con la excepción de algunas variables que llamamos variables ligadas, que son muy importantes y vamos a entrar en eso más tarde. Las variables de entorno se transmiten automáticamente a las conchas o los comandos que se ejecutan desde la shell. Las otras cosas no lo son. Las variables de shell, los alias no lo son. Las variables de entorno son. Es por eso que los llamamos variables de entorno, La idea es que el medio ambiente se extiende más allá sólo su shell actual. Ellos se pueden utilizar para definir las cosas para los comandos. He aquí un ejemplo. IMPRESORA, LPDEST. Ambas variables se pueden definir una impresora que un comando utilizará para imprimir las cosas. Si tiene varias impresoras en todo, es posible que desee poner el que más te guste. La razón por la que tenemos 2 variables es que los diferentes conjuntos de comandos se escribieron el uso de estos diferentes variables. Usted puede darles valores diferentes. Lo más probable es que les des tanto el mismo valor. Esas cosas funcionan porque los comandos que hacen la impresión fueron programados para examinar los valores de estas variables. Si un programa no se escribieron de esa manera, si fuera escrito para hacer otra cosa, la variable sería irrelevante. De modo que el sistema operativo no está en busca de estas variables cada vez que se refieren a una impresora. Un comando que hace la impresión está en busca de estas variables si está programado de esa manera. Estas variables se definen a menudo en los archivos de inicialización pero no necesariamente. Usted puede definir en la línea de comandos. Pueden definirse en un comando. Un comando que se ejecuta algo podría tener su propia selección de variables - variables que son exclusivos de un paquete de software en particular, por ejemplo. Estos serán definidos cuando se ejecuta el paquete. ¿Cómo son estas variables pasan a un sub-shell? Cuando se escribe un sub-shell, no escribe en esa área. El área de la sub-shell que se dedica a las variables de entorno que no está escrito por el sub-shell, sino que está escrito por copia. Cuando se ejecuta un comando común, tales como estos comandos para imprimir o lo que sea, que empiezan por la creación de un nuevo shell. El shell crea una concha y luego sobrescribe parte de ella con el comando que se está ejecutando, que es un poco confuso, pero así es como estos comandos obtienen las variables de entorno que a continuación se refieren al futuro. El comando aquí para definir el setenv variable. Así es como se definen. Es 3 elementos: setenv, variables, valor. Si usted apenas setenv sin argumentos, ¿qué se obtiene? Una lista de todas esas variables. De nuevo, es una buena lista larga y en este caso, como en los otros, estas variables se definen en gran parte por mi operación de inicio de sesión por el propio depósito no por nada de lo que hice. Hay otro mando aquí, printenv. Eso también imprime el medio ambiente. Observe este último que aquí, = Editor vi. Eso dice que si estoy usando algo que llama a un editor y no especifico un editor y me permite la elección, puede darme vi. ¿Qué pasa si hago EDITOR printenv? Me dice lo que es. Justo antes de eso, había una variable, MENOS. Estas son las opciones por defecto cuando ejecuto el comando MENOS, que muestra archivos. Así que si hago eso, printenv puede tomar 1 o 0 argumento argumentos, no más de 1. Hay otros comandos también, pero no vamos a entrar en todo lo que hoy en día. Recuerde que no eran los modificadores de las variables de shell, como: h, que lo llevará hasta el último elemento de una ruta de acceso, o: r, que se reducirá una extensión. Aquellos ahora se aplican a las variables de entorno también. Ellos no solían hacerlo. Solía ​​ser que no podían ser modificados. Ahora que puede ser. Es uno de los avances con los desarrollos de las conchas en los últimos años. Decía que las conchas como parte de los entornos y las variables de shell en el C-shell son, con algunas excepciones, conjuntos distintos. Puede establecer una variable de entorno y una variable de shell con el mismo nombre. Serán diferentes variables, ya que pueden tener diferentes valores. Cambiar el valor de uno no va a cambiar el valor de la otra. Estas variables se evaluaron con el signo de dólar - $ a, $ lo que sea. ¿Y qué si usted tiene esto? ¿Sabe usted cuál se obtiene? En mis pruebas me dieron la variable de shell, pero esto no está documentado y no se puede confiar en eso. Así que me pregunto, es la creación de las variables de shell y el medio ambiente con los mismos nombres una buena idea? No. De acuerdo. ¿Cuáles son los principales excepciones en que las variables del entorno y shell están vinculados el uno al otro? Hay estos 4. Variable de entorno TERM Mayúscula, shell término variable en letras pequeñas, tipo de emulación de terminal. Yo sólo voy a ir de aquí y yo voy a hacer eco, un comando útil en este caso, $ $ TERM plazo. Y ahí. xterm es un tipo de terminal para las ventanas que aparecen en el sistema X Window. xterm-color es una variación del que permite que diferentes colores. ¿Por qué nos definimos estos? ¿Qué es esto bueno? Los comandos que reorganizan la pantalla como el editor enviar secuencias particulares, llamadas secuencias de escape, a un terminal o una ventana para reorganizar y así sucesivamente. Estas secuencias son diferentes para diferentes tipos de terminales. Esto le dice a ella que los utilicen. A veces hay problemas allí. Es posible que desee cambiar eso. Si las cosas no funcionan, a veces el tipo de terminal se configura mal, usted puede ser capaz de arreglarlo por redefinir el término variable. En estos casos, el cambio de una variable, la variable de entorno o la variable de shell, debe cambiar la otra. He descubierto a través de la experiencia que el cambio TERM en mayúsculas no siempre cambiar variable de shell término en minúsculas. Esto es un error. No sé si eso es siempre verdad. La mayoría de las veces no es verdad, pero que puede ser. Así que si usted hace un cambio, simplemente comprobar que fuera. No es frecuente que se necesita cambiar ese valor, pero de vez en cuando lo hace. Variable de entorno USER. Una vez más, la variable de entorno en mayúsculas, shell variable en minúsculas. Este es su nombre de usuario. Es sólo en circunstancias muy excepcionales que te gustaría cambiar eso. Si su nombre de usuario es otra persona, que puede tirar todo tipo de cosas. Directorio de inicio, el directorio home del usuario. Una vez más, usted no quiere cambiar eso. Fíjese en todos estos casos y la que estamos a punto de cubrir, la variable de ruta, variable de entorno es en mayúsculas y la variable de shell unido es en minúsculas. Si cambia uno, usted debe cambiar a la otra. Este tipo de unión no se puede establecer como no se puede obligar a 2 variables, aparte de estos 4, y la unión de estas variables no se puede deshacer, no se puede separar. Así que estos 4 pares de variables están obligados. Ellos siempre van a ser. Ninguno otros serán. Además, sería posible crear variables con los mismos nombres de los tipos opuestos. Usted podría hacer un término variable de shell en minúsculas o una variable de entorno TERM en mayúsculas. Aquellas variables serían independientes de estas variables apareadas y que serían independientes el uno del otro. No puedo imaginar por qué haría eso a menos que quiera confundir a la gente. Este de aquí, variable de la ruta, esta es una muy importante. Otra cosa es que no puede haber casos de variables con nombres pareadas similares que no están vinculados entre sí. No puede haber variables, Shell y Shell, en mayúsculas y minúsculas. Sobre la base de ese nombre, que no sabes si esa variable es una variable de shell o una variable de entorno, y están no ligados entre sí. Así que ese tipo de pares de nombres no implica variables ligadas. La variable de la ruta, que estaba mostrando antes, es una lista de los nombres de las rutas en las que el shell busca los comandos. Vamos a esta ventana aquí y haremos todo lo echo $ PATH, mayúsculas - variable de entorno - echo $ PATH, minúsculas - shell variable. Observe que la lista de directorios es el mismo. Estos están obligados. Cambia uno, cambia el otro. En la variable de entorno los elementos están separados por dos puntos. Tenga en cuenta que. Las variables de shell están separados por espacios. Esta variable de entorno es una sola cadena. La variable de shell es una matriz. El shell Bourne no tenía arrays. Bash hace, pero esto ya es una parte fija de la cáscara. Se trata de una sola cadena y no una matriz. El C-shell siempre tuvo arrays. Las matrices son mucho más fáciles de trabajar. Puede hacer referencia a partes de ella. $ Ruta Entonces echo [1] y me sale / usr / bin, el primer elemento. Una vez más, recuerde signo de dólar representa el último elemento de la lista del historial. ¿Qué pasa ahí? Se trató de encontrar el signo de dólar como un símbolo de la variable. Me escapo ella. Lo sentimos. No haría falta que sea. Algunas de estas cosas no funcionan tan bien. Tal vez sólo tendremos que dejar eso a cabo. El asterisco se refiere a toda la cosa, pero eso es lo que se obtiene si no se especifica un elemento. Otra forma en que las variables de matriz se pueden manipular, número de elementos allí, 7 elementos. Aquí ponemos el signo de número antes del nombre de variable. Aquí hay otro. Ponga un signo de interrogación allí. Ese es un valor lógico. Eso indica que la variable existe. Es otra forma de trabajar con variables. Que, por cierto, no tiene que ser una variable de matriz. Eso podría ser cualquier variable. Y si lo hago, no hay tal variable y me siento un 0. Otra pequeña cosa que hay sobre las evaluaciones de variables. Volver a este de aquí, si por alguna razón usted quería trabajar con este en lugar de trabajar con la matriz, la variable de shell, hay comandos que pueden separar estas cosas sobre la base de los dos puntos. De hecho, si usted va a estar haciendo esto en el intérprete de comandos, posiblemente, una especie de guión, que sería probablemente la forma en que lo haría. Pero en el C-shell es mucho más fácil de usar del arreglo. En el shell Bourne, variables que son asignadas por una sola expresión de este tipo, como la forma en que usted puede asignar una variable en un lenguaje de programación, y aquí no debe haber espacios. Es necesario que sea sólo 1 cadena. En las conchas de tipo Bourne, todas las variables son variables de shell. Las variables de entorno son un subconjunto de las variables de shell. Se distinguen de las variables no ambientales mediante la exportación. El comando para hacerlo es la exportación, como IMPRESORA exportación. Si tuviéramos que definir una variable de este tipo, si queríamos un comando de impresión para encontrarlo, tendría que ser una variable de entorno, y así es como lo hacemos uno. Aquí hay algo un poco confuso. Esta expresión, su exportación al medio ambiente, se deriva de este concepto shell Bourne, y sin embargo, esa expresión se utiliza en la descripción de la C-shell, donde no existe tal orden como de exportación. Si usted acaba de decir exportación por sí mismo, se obtiene una lista de los exportados - Así que si yo simplemente exporto aquí, no hay tal cosa. Bien, ahí vamos. Estas cosas, por cierto, también se definen por el shell. No me defino cualquiera de estos por mi mismo. La concha hace todo tipo de cosas por sí mismo. Se debe hacer las cosas de forma automática. En Bash o Korn, se puede ejecutar un comando como el siguiente, que ambos dan una variable un valor y exportarlo en 1 mando. En el shell de Bourne tienen que ser comandos separados como exportación a. Aquí hay otro aspecto que es confuso. El comando set en el C-shell define variables y sin argumentos te dice cuáles son los valores de las variables son. En el intérprete de comandos, el comando set sin argumentos hace lo mismo, pero con argumentos que hace algo muy diferente. Así que estos son los diversos argumentos aquí. Algunos de estos son las variables de entorno, algunas de ellas son las variables de shell. Todas ellas son variables de shell realmente. Algunas de esas son las variables de entorno. El comando set con argumentos puede ser usado para operar sobre los parámetros de posición a un guión, que es una forma de acceder a ellos de una sola vez. En realidad no podemos entrar en eso hoy. También se puede utilizar para cambiar el comportamiento de la cáscara. Particularmente en Bash hay variables que determinarán el comportamiento del shell. Entonces también sólo este comando que usted puede ver, este comando. Typeset seguido de variables y tipos de variables se usa en los shells Korn y Bash. No es obligatorio, pero puede ser utilizado para restringir los valores de las variables, que puede ser útil para evitar errores, y es bastante común. Así que sólo estoy mencionando que en caso de que vea en alguna parte. El comando dónde. ¿Recuerdas que mencioné antes, el lugar donde el mandamiento en el C-shell, que le puede indicarle la ubicación de una ruta de acceso de comandos. Aquí está la sustitución de comandos. Usted debe encontrar en su teclado en algún lugar de un personaje que se parece a esto. La ubicación en el teclado va a variar. Lo hemos llamado backquote. Es aproximadamente del tamaño de una cotización. Va desde la parte superior izquierda a la inferior derecha. Aquí en mi teclado Mac está en la esquina superior izquierda. Ese carácter se puede utilizar para ejecutar un comando en un comando. Si usted tiene una expresión dentro de comillas inversas, esa expresión es un comando, se ejecuta. La salida de ese comando es sustituido luego por toda la expresión backquote dentro de un comando ya que entonces se ejecuta con que la producción como parte de su serie de argumentos y así sucesivamente. Este es un comando que utiliza eso. Demostremos la operación aquí. Subamos aquí, sacar las comillas inversas. Control de A me llega al principio de la línea con la sintaxis de edición de Emacs. Hasta ahora, la rutas de acceso es lo que ¿de dónde viene, pero cuando lo hago de esta manera, entonces se enchufa en esa lista de nombres de ruta en lugar de toda esta expresión backquote y se ejecuta ls-l en ellos. Algo cómodo, ¿no? Así que eso es una cosa ordenada. Así es como funcionan comillas inversas. Ahora vamos a ir un poco más lejos. Estos son los alias. En realidad yo uso estos. Voy a tratar de conseguir esto con 1 operación de edición. Okay. Ahora vamos a ver cómo esas definiciones salieron. alias LWH decirme cómo se define. Observe que es sólo esto, pero las cotizaciones externas se han quitado y el signo de exclamación se lo llevan fuera. ! *, La lista completa de todos los argumentos. En una definición de alias que se aplicará de nuevo a donde yo uso esto. lwh fiesta ksh. Okay. ¿Ves cómo funciona? Me ahorra algo de tecleo. Subamos un poco solo por mencionar algo más aquí. Nótese aquí estos proyectiles diferentes. Debería haberlo dicho antes. El csh tiene un 2 por aquí y también lo hace / bin / tcsh. Podríamos establecer por otros medios que aquellos son en realidad el mismo archivo. Recuerda que yo estaba diciendo si escribe SH se obtiene bash. Escriba esto y usted tiene esto. Pero los que no están vinculados. Aquellos tienen los solos allí. Y este no es el tipo de archivo que se llame a otro. Así que estos son archivos separados; las C-shell son el mismo archivo. Volver aquí abajo, el otro aquí, este alias, tenga en cuenta que se está ejecutando este comando, archivo. Eso alias funciona eso. Archivo le indica el tipo de un archivo. Fiesta ksh Así FWH. Okay. Ese es el resultado del comando file. No sé si usted sabe lo que esto significa aquí, Mach-O binario universal, con 2 arquitecturas. Hay 2 posibles tipos de procesadores en Mac, y algunos programas fueron escritos para ser capaz de ejecutar con ambos, y el comando file puede determinar que, por lo que eso es lo que esto significa. Ambos archivos fueron escritos de esa manera. Así vemos cómo funciona el alias, vemos cómo funciona el backquote, vemos cómo funciona el ls real de los archivos o de archivos. Esto podría no funcionar. Try "donde dónde" y "lwh donde". Bueno, vamos a intentar eso. donde dónde. donde es una cáscara integrada. Recuerde que ya demostró que Bash no tenía dónde. Si escribe en qué parte del intérprete de comandos, aparece un mensaje de error. Es sólo una parte de la cubierta en lugar de ser un comando independiente. ¿Qué sucede si escribo lwh buscando dónde? Vea lo que sucede allí. Ran donde donde, conseguido este resultado, y luego trató de ejecutar ls como l en donde es una cáscara integrada. donde está ahí, pero no existen los otros. Ninguno de ellos existe, en realidad. Así que no siempre funciona, y también ilustra cómo algunas cosas no haces exactamente lo que usted podría haber pensado. Bajemos un poco más aquí. Esto aquí es en Bash. Esa es también la sustitución de comandos como la comilla inversa. Pero a diferencia de backquote, utiliza este estilo variable. Hay una serie de expresiones que comienzan con un signo de dólar, y si bien estos no son variables, tomaron prestado el uso del signo de dólar para indicar una expresión de algún tipo. Eso puede estar rodeado de paréntesis o corchetes o paréntesis dobles, que tiene un propósito diferente. Paréntesis Soltero aquí son una sustitución de comandos al igual que los acentos graves. Paréntesis dobles es en realidad una operación aritmética. Hay otras sintaxis, otras operaciones. Sintaxis backquote está disponible en Bash. Sin embargo, éste es preferible. Es mucho más fácil de leer y que permite la anidación. Usted puede tener dentro de $ (comando) otro comando, algo así como - Puedo obtener una lista allí. Eso funcionaría si tuviera la comilla inversa también. ¿Y si quiero hacer algo así - Usted probablemente no realmente usar este comando, pero esta sustitución de orden interno se hace eco de los nombres de todos los archivos que comienzan con a, entonces éste se ejecuta ls-l en esos archivos, y entonces éste sólo se hace eco de la salida. Usted probablemente no haría esto, sólo harías lo eco o ls, pero esto ilustra el funcionamiento de la anidación de comandos. Así que otra de las características aquí.  He mencionado esto antes, que cuando se tiene en qué lugar del C-shell, escribir obras en las conchas de tipo Bourne para la localización de los comandos. Comandos incorporados, justo lo que estaba diciendo que no. Los comandos son parte de la concha, como dónde. Cuando el shell ejecuta un comando como ls, se localiza a través de la ruta, lo encuentra en algún directorio en alguna parte, dice que en la memoria, se crea un nuevo shell, lee el comando ls o lo que sea en la cáscara donde ya se ubican las variables de entorno, y luego se transfiere la ejecución a la misma. Incorporado en el mando, el código para ese comando es el interior de la concha, por lo que el shell sólo comienza a ejecutar parte de su propio código. donde es un comando. En realidad se hace más rápido. No tiene que leer nada en la memoria, sino que ya está en la memoria. Comandos integrados siempre tienen prioridad sobre las órdenes con el mismo nombre. Los comandos que se encuentran en los directorios en la ruta de acceso pueden tener el mismo nombre, comandos en diferentes directorios, archivos en directorios diferentes. La que se produce antes en el camino es el que se obtiene. Si hay un comando integrado, que siempre lo consigue. No hay manera de darle una prioridad más baja que un comando en el camino. Si usted quiere conseguir que el comando path, puede escribir el nombre de ruta completo. Si había un comando donde en la ruta de acceso en alguna parte, podría escribir / bin / dónde y que lo entenderías. Si no desea escribir toda la ruta, se podría definir un alias. De hecho, si usted le dio el alias el mismo nombre que el comando integrado, que funcionaría porque se evalúa la definición de alias antes de que el shell determina que se trata de un comando integrado en el que se debe ejecutar. Entonces esto se vuelve un poco más complicado con algunos comandos aquí. El caso de algunos comandos son en realidad construida-en los comandos y en el camino. Uno de ellos es el eco, el comando que acaba de utilizar hace un rato en esos ejemplos. Echo es un comando en la ruta y que se encuentra en todos los depósitos. No necesariamente todos se comportan de la misma manera. En su origen fue un comando sólo en el camino. Fue construido en las conchas más tarde. Debido a que hay opciones que dependen del medio ambiente y las opciones de línea de comandos, los comandos integrados fueron escritos para funcionar lo mismo que el comando que había estado en el camino, es poco probable que hubieran sido escritas de esa manera si el comando ya no había sido escrito por el camino. Así que esto tiene efectos secundarios. Su historia tiene efectos aquí. Hay opciones que hay. También hay una opción definida por una variable en el tcsh llamado echo_style. Esa es una de las variables que pueden cambiar la forma en que se hacen eco las obras. Hay otros casos en los que puede asignar una variable que cambia la forma en que la operación de la cáscara, como un comando integrado, funciona. No afectaría a cualquier otra cosa ya que otros comandos no tienen acceso a las variables de shell, sólo las variables de entorno. Pero las operaciones de shell pueden leer las variables de shell. Eso no va a funcionar para csh. Eso es sólo tcsh. Esa es una de las mejoras. Parsing tiene secuencias cuando se evalúa metacaracteres, cuando se evalúa las variables, alias, referencias de historia. Hay una secuencia particular para estas cosas. Si hace las cosas de una secuencia particular y llega a algo que es una expresión de una especie que ya ha sido evaluado, no va a evaluar de nuevo. Si lo consigue, entonces, sólo se pasará en los personajes. Así que si la evaluación de algunas expresiones como la sustitución de comandos o variable o lo que sea da lugar a una expresión que le gustaría que para ser evaluados, que funcionará sólo si esa evaluación se produce al final de la secuencia. Espero que estoy siendo claro que no. Esa secuencia de análisis, una operación en el C-shell, no es lo mismo para los comandos integrados como lo es para los comandos de los no integrados. No estoy seguro acerca de Bash allí. Por ejemplo, si una variable Shell produjo una referencia historia, probablemente no volvería en la historia. Sería acaba de obtener el signo de exclamación. De hecho, sólo podemos probar eso ahora mismo. establecer a = y vamos a tener que poner esto ahí. Oh, espera. Lo siento. Hice esto en el Bash. Yo quería hacerlo aquí. Ver, por lo que no evaluó que la referencia la historia porque ya era pasado el punto de evaluación de expresiones de historia cuando se evaluó la variable. Así que eso es 1 efecto de análisis. Y de nuevo, comandos integrados no se hacen de la misma manera. Está bien. Vamos a ir a la siguiente aquí. Este pretende ser 1 línea, pero está haciendo más fácil la lectura. ¿Qué quiere hacer? Usted puede recordar que podamos evaluar asteriscos como comodines de nombre de archivo, y hay otros determinados comodines, como el signo de interrogación y expresiones con corchetes. Este tipo de evaluación se denomina globbing. establecer noglob a principios de este comando dice no hagas eso. noglob unset dice volver a hacer eso. Tenga en cuenta que conjunto glob no tendría ese efecto. En el lenguaje ordinario, glob establecer o noglob unset parecen ser equivalentes, pero aquí no lo es. Es noglob desarmado. Ahora tset. tset paró para el grupo terminal. No se usa a menudo que ahora, pero antes de disponer de sistemas de ventanas y que tenía una sola terminal, puede que tenga que determinar el tipo. Y si algo iba a venir a través de Ethernet o de la red, usted podría querer decir que es un vt100. VT100 es una especie de estándar en el negocio de terminales. Proviene de la terminal DEC. Si usted acaba de hacer dialup - cuenta de que? Esto se remonta un largo camino, ¿eh? Así que si simplemente no TSET aquí, si yo sólo hago tset, ha de restablecer mi terminal, pero no vio nada. En realidad no cambia nada. -S Okay. setenv TERM xterm-color. Ya sabemos que el término se estableció de esa manera, así que eso no cambiaba. Esa es la manera que nos gustaría hacerlo. Pero note que este comando, tset-s, la salida sólo estos comandos. No ejecutarlos. No ejecutar estos comandos, sino que la salida de ellos. Así que esta es la intención de producir comandos que luego se ejecutan. ¿Te acuerdas de la orden en ese archivo que acabo mostró que tenía una Q en el mismo. Así que vamos a hacer eso. El Q suprime alguna salida, pero eso no importa aquí, como se puede ver. Yo sólo voy a hacer eso para mostrar que no tenía importancia. Esto está en la sintaxis backquote. Tenga en cuenta el backquote aquí, backquote aquí. Estoy omitiendo estas cosas aquí. Estos son los casos de decirle qué hacer en el caso de determinados tipos de terminales - Ethernet, red telefónica, lo que usted tiene. No importa aquí porque no estamos haciendo en realidad ninguna de estas cosas. Sólo estoy ilustrando el comando. Si hago esto con la comilla inversa, ¿qué voy a recibir? Observe también aquí que esta incluido el noglob set y el noglob unset, Así que estos son ahora redundantes en la definición. Eso no fue siempre así, pero ahora están incluidas en esta orden. Pero vamos a ver qué pasa si hago lo que y voy al principio de la línea con Control A y lo hago. Bueno, establezca: Command not found. Eso es un poco raro, ¿no? conjunto es un comando muy conocido. Es parte de la cáscara. establece: Command not found? ¿Por qué? Hmm. Bueno, vamos a pensar en esto. Se está ejecutando una sustitución de comandos backquote, y que se produce a una cierta parte de la secuencia de analizar el comando. conjunto es un comando incorporado. Así que para el momento en que hace que la sustitución de comandos, que ya ha conseguido más allá del punto de identificación de comandos integrados. Por lo tanto, trata a establecer como si se tratara de un comando en el camino. Ni que decir tiene, que no lo encuentra y se obtiene un error. Bueno. Hay un ejemplo de secuencia de análisis. Y ¿qué hacemos al respecto? Observe este comando muy interesante aquí, eval. Me pregunto lo que hace. Si nos fijamos en el manual - y vamos a hacer eso para mostrar lo confuso estos manuales son - man tcsh, manual confusa, la búsqueda de las cosas que aquí no es fácil tampoco. Aquí vamos, eval arg, para que podamos tener 1 o más argumentos y hay una lista de cosas que hay. Se usa para tratar los argumentos como entradas a la shell y ejecuta los comandos resultantes en el contexto de la shell actual. Esto se utiliza generalmente para ejecutar comandos generados como resultado de comando o la sustitución de variables, porque el análisis se produce antes de que estas sustituciones. Muy bueno. Y aquí incluso se refieren a la orden tset para un uso de la muestra como la que acabo de mostrar. Ahora tengo que conseguir la ventana de nuevo a un lugar útil. Vayamos por aquí y vamos a ver que eval se utiliza justo antes de eso. Así que vamos a ver qué pasa si ponemos - aquí vamos con las flechas a ese comando y controlar una al principio, EVAL. Bueno, por lo que funciona. Al hacer eval, que tarda lo que viene después y lo hace un comando. Esto le permite esencialmente Parse dos veces. La sección aquí se ejecuta este comando dentro de las comillas inversas, obtiene la salida. Se supone que la salida que se ejecuten como esos comandos aquí como estos en éste y éste. Así que esos comandos están ahora aquí en esta secuencia, pero estos están incorporados en los comandos y no pueden obtener de inmediato. Así que vamos a eval, eval recoge que hasta, empieza todo de nuevo, y funciona. Un ejemplo tanto de backquoting, eval, el análisis, las consecuencias del análisis sintáctico, y un comando que es probablemente de muy poca utilidad para usted hoy en día. Okay. Muy bien, umask. Echemos un vistazo a este comando aquí, umask 022. Me pregunto lo que hace. Vamos a escriba umask sin nada después de ella. 22. Okay. 022 y hacerlo de nuevo. Como ya habrán adivinado, umask sin argumentos te dice la máscara actual; umask con argumentos hace que sea eso, pero esa era la que ya tenía. ¿Qué significa 022? Estos son aquí las protecciones para un archivo. Ellos determinan quién puede leer o escribir o ejecutar el archivo. Protecciones también se llaman los permisos. La r representa de lectura, el w para escritura, y la X, que no está presente allí, significa ejecutar. Hay 3 categorías de allí. Los 3 últimos elementos se encuentran en la categoría de usuario. Aquellos se aplican a mí, el usuario. Estos 3 aquí se aplican al grupo. El archivo pertenece al grupo 1, el usuario puede pertenecer a varios grupos, pero si el usuario está en el grupo al que pertenece el archivo, a continuación, estas protecciones se aplican a él si él no es el usuario. Y éste es todo el mundo. Estas categorías son mutuamente excluyentes. Las protecciones de usuario se aplican a él, las protecciones de grupo se aplican a los miembros del grupo que no sea el usuario, y las otras protecciones sólo se aplican a personas distintas del usuario, y los miembros del grupo. Si hay una ro aw o un x, significa que se ha concedido la protección. Si hay un guión, significa que no es. De hecho, existen otras cosas que se pueden poner aquí además de estos, que no voy a entrar en ahora. El umask define un valor predeterminado para los archivos que usted crea. Y como una máscara, básicamente, dice que los bits que no se hayan establecido. ¿Cómo se ha convertido en pedazos? Si usted piensa en cada uno de ellos como un número octal, este es el bit de 1s, esto es los 2s, esto es los 4s. Así que de 0 a 7 describa qué combinación de r, w de, y las x que tiene para estos 3 y luego un número similar de estos y luego para estos. Así que 022 significa 0 para la otra, para el grupo 2, 2 para el usuario. Pero esto es una máscara. La máscara es lo que usted no tiene. Lo siento. Me acabo de dar las cosas en el orden equivocado. Es la primera 3. Estos 3 son el usuario, estos 3 son el grupo, estos 3 son los otros. Lo siento, te di éstos en el orden equivocado. El 0, que es el primero de ellos, no se muestra el valor, pero si un número no es ahí, es un 0. Eso significa que todos los 3 de ellos se permitiría. Observe que en este en particular no se permite que la x. La razón es que la cáscara es capaz de determinar si un archivo debe ser ejecutado o no. Dado que esto no es un archivo ejecutable, que no puso la x. Los 2 significa que el permiso de escritura, la segunda categoría aquí, el que está en el medio, se le niega. Así que de nuevo, estas son las cosas que se negó. Bueno, está permitido x pero no está aquí porque no es ejecutable y lo mismo para los otros. Así que eso es un umask común. Otra común es 700 - darte todo y nadie más nada. Y hay otras posibilidades. Voy a volver a eso. El uso de la historia que puedo buscar de nuevo para eso, lwh para allá. Okay. Así que aquí, éstas son las conchas. Bash, el dueño, que es la cuenta del sistema, puede hacerlo todo. Grupo y todos los demás pueden hacer lectura o de ejecución, pero no escribir. Éste ni siquiera permite al propietario para escribir en él. Si el propietario quería escribir en él, la cuenta del sistema, tendría que cambiar la protección primero. Pero, de nuevo, la umask establece el valor predeterminado por enmascararlo, indicando las partes que no se pueden establecer. Esto es por lo general en uno de los archivos de inicialización, que es el archivo. Cshrc para el C-shell o el perfil. para las conchas de tipo Bourne. Puede ser en otro lugar también si hay otros archivos de inicialización en el sistema. De todos modos, eso es umask. Hay algo un poco raro aquí, y es que, ¿por qué hay un solo comando para esto? Si estuviera escribiendo esto, me gustaría que sea una variable, umask = algún valor. ¿Por qué hay todo un comando para este propósito? La razón es ésta sólo se remonta a los orígenes de Unix. Unix era sólo un proyecto de programación en los Laboratorios Bell en la década de 1970. La gente sólo se reunieron para el programa. Ellos nunca tuvieron la intención que se convierta en un sistema operativo en todo el mundo. Diferentes personas escribieron diferentes partes sin pensar mucho de cómo se van a utilizar - más bien sucinta. Y se unieron así, y sigue siendo así en algunos aspectos. Así que refleja la historia, y todavía hay esas incoherencias y los elementos extraños de la misma. Okay. Siguiente una aquí. Como he escrito antes, el C-shell no se usa realmente mucho para la programación, aunque puede ser. Se ejecuta más lentamente, de nuevo el equilibrio entre el uso interactivo, que tienen más información que la velocidad de procesamiento implicado, que se puede hacer sin el procesamiento. Las características adicionales añadidas a la shell Bourne por el Korn y Bourne-Again conchas no parece que aminore su velocidad, y yo no sé por qué es así. Tal vez sólo sea una mejor programación, pero no estoy en condiciones de saber. Acelerar aquí en realidad no es una cosa muy importante, a pesar de que se menciona. La razón es que los scripts de shell realmente consiguen bastante rápido. Si hay una gran cantidad de comandos como en un programa de calculo, es probable que no lo harías en un script de shell. Las operaciones no son bastante simple y directo. Los que yo he experimentado que son demasiado lentos involucrar a las aplicaciones repetidas de comandos lentos. Antes he mencionado el editor de flujo sed. Este comando es lento. Si ejecuta sed muchas veces, obtendrás un script lento, pero no es la cáscara que es lento. Si lo ejecuta en el shell Bourne no será mucho más rápido que corriendo en el C-shell, aunque no hay tal vez algunas ventajas allí. Las capacidades de programación adicionales, por otro lado, son razones importantes por las que se utilizan las cáscaras de tipo Bourne. C-shell tiene características extrañas a ella - el hecho de que usted no sabe si una variable es una variable de shell o una variable de entorno. Puede ser muy confuso. No es tan fácil de escribir sólo se basa en su experiencia en programación en otros idiomas. Creo que es posible que las conchas de tipo Bourne más consistente con su experiencia. Algunas secuencias de comandos, sin embargo, pueden ser miles de líneas de longitud. Los que he visto se utilizan para parchar los sistemas operativos. Estos pueden ejecutar muy lentamente, pero que no se quede los muy a menudo. Es sólo cuando usted está haciendo parches, y es sólo el administrador del sistema que haga estas cosas, así que no es realmente un gran problema. Los que son cientos de líneas de largo realmente ejecutan con bastante rapidez. Al mencionar esto aquí, ¿cuáles son esas mejoras? Ya he mencionado algunos de ellos - Arrays, cálculos, los $ () de expresión para los cálculos en el intérprete de comandos, el otro tipo de sustitución de comandos. Hay diferentes tipos de comandos de prueba mediante el cual es posible realizar pruebas a la existencia de un fichero o otras cosas. La última vez aquí, este comando aquí. ¿Qué hace esto, y ¿por qué nadie usa? nombrevariable printenv. Sabemos lo printenv hace. Se nos dice que el valor de una variable. Y nombrevariable printenv no nos va a decir mucho porque no hay tal variable. En blanco. Pero vamos a darle algo significativo. Eso no es allí. Okay. Supongo que nunca definí eso. Vamos a comprobar mi entorno. Este es otro comando mediante el cual usted puede inspeccionar su entorno. Hay buena EDITOR de edad, la que vimos antes. ¿Qué quiere hacer? Aquí tenemos una expresión backquote. Recuerde que este es el C-shell. Así EDITOR printenv nos dará un valor de EDITOR. Es vi. Y entonces será establecer ese valor a la variable a, el comando set. Así que ahora si hago echo $ a, me sale vi. Eso no parece demasiado útil. Sin embargo, lo que realmente tiene un propósito. Dado que no sabemos si una variable es una variable de shell o una variable de entorno mediante el uso de la sintaxis de evaluación signo del dólar, podemos utilizar printenv para asegurarse de que se trata de una variable de entorno. Así que si había un editor de variables de shell, esto no habría conseguido. Esto sólo funciona con la variable de entorno. Si hubiera una variable de shell y quería su valor, Tendría que encontrar otra manera de hacerlo. Una manera de hacer eso sería haciendo juego y la tubería. Este es uno de los metacaracteres, caracteres especiales. Envía la salida del conjunto a otra cosa. Vamos a ver lo que nos íbamos a encontrar allí. Nada. Okay. Vamos a ver lo que hay allí todos juntos. Fue echo_style, la que mencioné antes. Está bien, vamos a hacer eso. ¿Recuerdas que mencioné antes, echo_style determina la forma en que el comando echo se ejecutará. bsd significa Distribución Berkeley estándar. Este es el Berkeley Unix desde la década de 1970. Esa es una de las formas en que se hacen eco se puede ejecutar. Ajuste echo_style a ese valor en el TC-shell hará eco a comportarse de esa manera. A fin de establecer hace eso, pero sólo consigue establecer las variables de shell. No sería encontrar Editor, que no es una variable de shell. Nada. Así que esa es una forma de distinguirlos. Pero el hecho de que tienes que ir a través de algún comando extraño como eso distinguir entre las variables de shell o variables de entorno muestra el tipo de carácter práctico de la C-shell para algunos propósitos. Y ahora, el pasado y tal vez menos, se trata de las páginas del manual. Aquellos de quienes ustedes saben, el hombre es el corto mandato de manual. Las páginas del manual de las conchas son difíciles de leer. Son muy largo. Están organizados de una manera que puede hacer que sea difícil de encontrar lo que estás buscando. Así que si estás buscando algo con un propósito, usted no puede saber si ese propósito es una variable de shell o algo más, por lo que no puede saber dónde buscarlo. Usted puede buscar varias cadenas, pero las cadenas se repiten a menudo. Así que es generalmente difícil de leer. Nos miramos en la página de manual TC-shell un poco antes de encontrar el comando eval. Algunas cosas van más rápido. Un enfoque consiste en buscar una cadena. Usted puede utilizar el localizador. Pager tiene la barra en busca de un comando o una cadena dentro de una operación de paginación. Hombre por defecto usará localizadores, ya sea más o menos. No sé si está familiarizado con ellos, pero los puedo mostrar archivos poco a poco. He estado usando MENOS para visualizar estos archivos en particular que tenemos aquí. Usted puede buscar en el interior hay. Puedes probar a utilizar cadenas de búsqueda diferentes. También las páginas de manual en diferentes sistemas operativos pueden no ser los mismos. Pueden ser páginas separadas para csh y tcsh. Son no están en la Mac, pero que podrían ser si esas son comandos separados. Si sh realmente no llaman Bash, probablemente sería una página de manual separado. Algunos sistemas tienen páginas man separadas sólo por el C-shell comandos integrados. A veces, si desea leer una descripción de un comando integrado eso es también en el camino, como eco, usted necesita leer la página del manual sobre ese comando en eco para determinar cómo va a funcionar como un comando integrado incluso si usted no está llamando el comando incorporado. Eso es un inconveniente del sistema operativo en general, no sólo para las conchas, aunque para las conchas, en particular, las páginas del manual son bastante largos, en parte porque se han agregado características útiles para ellos, lo que puede ser algo positivo. Okay. ¿Hay alguna pregunta? Cualquier tema que desea que aparezca? Todo lo relevante aquí? Bueno, ha sido muy agradable hablar con todos ustedes. Espero que tengas algo fuera de este seminario que serán de utilidad para usted en sus actividades futuras. [CS50.TV]