# Introducción

Hola, y bienvenido al proyecto Nushell. El objetivo de este proyecto es tomar la filosofía Unix de shells, dónde tuberías -pipes- conectan comandos simples juntos y llevarlos al estilo moderno de desarrollo.

Nu toma ideas de muchos territorios familiares: shells tradicionales como bash, shells basadas en objetos como PowerShell, programación funcional, programación de sistemas, y más. Pero, en lugar de ser un "Todo en uno", Nu enfoca su energía en hacer algunas cosas bien:

  • Crear una multiplataforma shell flexible con un toque moderno.
  • Permitir mezclar y combinar aplicaciones de línea de comandos con una shell que entiende la estructura de sus datos.
  • Tenga el brillo UX que proporcionan las aplicaciones modernas CLI.

La manera más facil de ver qué puede hacer Nu es con ejemplos, iniciemos.

Lo primero que notarás al ejercutar un comando como ls es que en lugar de un bloque de texto que regresa, recibirás una tabla estructurada.

> ls
────┬────────────────────┬──────┬────────┬────────────
 #  │ name               │ type │ size   │ modified
────┼────────────────────┼──────┼────────┼────────────
  0404.html           │ File │  429 B │ 3 days ago
  1 │ CONTRIBUTING.md    │ File │  955 B │ 8 mins ago
  2 │ Gemfile            │ File │ 1.1 KB │ 3 days ago
  3 │ Gemfile.lock       │ File │ 6.9 KB │ 3 days ago
  4 │ LICENSE            │ File │ 1.1 KB │ 3 days ago
  5 │ README.md          │ File │  213 B │ 3 days ago
...

La tabla no solamente muestra lo que hay en el directorio de una manera distinta sino algo más. Como las tablas de una hoja de cálculo -spreadsheet-, esta tabla te permite trabajar con los datos más interactivamente.

Lo primero que vamos hacer es ordenar nuestra tabla por tamaño. Para poder hacerlo tomaremos la salida de ls y la alimentaremos al comando que ordena tablas basado en los valores de una columna (para este ejemplo sería la columna size).

> ls | sort-by size | reverse
────┬────────────────────┬──────┬────────┬────────────
 #  │ name               │ type │ size   │ modified
────┼────────────────────┼──────┼────────┼────────────
  0 │ Gemfile.lock       │ File │ 6.9 KB │ 3 days ago
  1 │ SUMMARY.md         │ File │ 3.7 KB │ 3 days ago
  2 │ Gemfile            │ File │ 1.1 KB │ 3 days ago
  3 │ LICENSE            │ File │ 1.1 KB │ 3 days ago
  4 │ CONTRIBUTING.md    │ File │  955 B │ 9 mins ago
  5 │ books.md           │ File │  687 B │ 3 days ago
...

Puedes observar que para lograrlo no tuvimos que pasar argumentos al comando ls. En cambio, nosotros usamos el comando sort-by que proporciona Nu para ordenar la salida del comando ls. Para ver los archivos más grandes en las primeras filas usamos el comando reverse.

Nu proporciona muchos comandos que trabajan con tablas. Por ejemplo, podemos filtrar los contenidos de la tabla de ls para únicamente mostrar archivos superiores a 1 kilobytes:

> ls | where size > 1kb
───┬──────────────┬──────┬────────┬────────────
 # │ name         │ type │ size   │ modified
───┼──────────────┼──────┼────────┼────────────
 0 │ Gemfile      │ File │ 1.1 KB │ 3 days ago
 1 │ Gemfile.lock │ File │ 6.9 KB │ 3 days ago
 2 │ LICENSE      │ File │ 1.1 KB │ 3 days ago
 3 │ SUMMARY.md   │ File │ 3.7 KB │ 3 days ago
───┴──────────────┴──────┴────────┴────────────

Al igual que en la filosofía Unix, poder hacer que los comandos hablen entre ellos nos da maneras de mezclar y combinar de formas distintas. Miremos otro ejemplo:

> ps
─────┬───────┬──────────────────┬─────────┬─────────┬──────────┬─────────
 #   │ pid   │ name             │ status  │ cpu     │ mem      │ virtual
─────┼───────┼──────────────────┼─────────┼─────────┼──────────┼─────────
   033155 │ nu_plugin_core_p │ Running │  3.84961.8 MB │  4.4 GB
   132841 │ mdworker_shared  │ Running │  0.000019.3 MB │  4.4 GB
   232829 │ CoreServicesUIAg │ Running │  0.000016.1 MB │  4.5 GB
   332828 │ mdworker_shared  │ Running │  0.000023.0 MB │  4.4 GB

Es posible que estés familiarizado con el comando ps si has utilizado Linux. Con dicho comando, podemos tener una lista de los procesos actuales que ejecuta el sistema, qué estado tienen y sus nombres. También podemos ver la carga CPU del proceso.

¿Qué tal si quisiéramos mostrar los procesos que activamente usan el CPU? Así como hicimos con el comando ls previamente, también podemos trabajar con la tabla que nos devuelve ps:

> ps | where cpu > 5
───┬──────┬──────────────────┬─────────┬────────┬──────────┬─────────
 # │ pid  │ name             │ status  │ cpu    │ mem      │ virtual
───┼──────┼──────────────────┼─────────┼────────┼──────────┼─────────
 03971 │ Google Chrome He │ Running │ 5.126399.4 MB │  5.5 GB
 1360 │ iTerm2           │ Running │ 6.6635218.6 MB │  6.0 GB
───┴──────┴──────────────────┴─────────┴────────┴──────────┴─────────

Hasta ahora, hemos visto el uso de ls y ps para enumerar archivos y procesos. Nu también ofrece otros comandos que pueden crear tablas con información de gran utilidad. Exploremos date y sys.

Ejecutando date now nos proporciona información del día y tiempo:

> date now
2020-09-09 09:14:51.684619600 +00:00

Para obtener una tabla podemos alimentar la salida a date to-table

> date now | date to-table
───┬──────┬───────┬─────┬──────┬────────┬────────┬──────────
 # │ year │ month │ day │ hour │ minute │ second │ timezone
───┼──────┼───────┼─────┼──────┼────────┼────────┼──────────
 020209991451 │ +00:00
───┴──────┴───────┴─────┴──────┴────────┴────────┴──────────

Ejecutando sys devuelve información sobre el sistema en el que se ejecuta Nu:

> sys
─────────┬─────────────────────────────────────────
 host[row 7 columns]
 cpu     │ [row cores current ghz max ghz min ghz]
 disks   │ [table 2 rows]
 mem     │ [row free swap free swap total total]
 net     │ [table 11 rows]
 battery │ [table 1 rows]
─────────┴─────────────────────────────────────────

Esta tabla se ve un poco diferente con las que ya hemos trabajado. El comando sys nos regresa una tabla que también contiene tablas estructuradas en las celdas en vez de valores simples. Para explorar esos datos, necesitamos obtener la columna deseada para mostrar:

> sys | get host
──────────┬─────────────────────────────────────────────
 name     │ Linux
 release  │ 5.3.0-1019-azure
 version  │ #20-Ubuntu SMP Fri Mar 27 23:54:23 UTC 2020
 hostname │ lifeless
 arch     │ x86_64
 uptime8:03:47:32
 sessions │ [table 2 rows]
──────────┴─────────────────────────────────────────────

El comando get nos permite ir directo al valor de una columa de la tabla. Aquí estamos mirando la columna "host" que contiene información del host dónde se está ejecutando Nu. El nombre del sistema operativo, hostname, CPU, y más. Miremos los nombres de los usuarios en el sistema:

> sys | get host.sessions.name
───┬────
 0 │ jt
───┴────

En este momento, solo hay un usuario en el sistema llamado "jt". Notarás que podemos pasar una ruta de columna -column path- y no únicamente el nombre de una columna. Nu tomará esta ruta de columna e irá a los datos correspondientes en la tabla.

Es posible que hayas notado algo más diferente también. En lugar de tener una tabla de datos, tenemos solo un elemento individual: la cadena "jt". Nu trabaja tanto con tabla de datos así como cadenas. Cadenas son una parte importante de trabajar con comandos fuera de Nu.

Miremos en acción cómo funcionan las cadenas fuera de Nu. Tomaremos el ejemplo anterior y ejecutaremos el comando externo echo (el carácter ^ le informa a Nu que no se desea usar el comando interno también llamado echo):

> sys | get host.sessions.name | each { ^echo $it }
jt

Si esto se parece mucho a lo que teníamos antes, ¡tienes buen ojo! Es similar, pero con una diferencia importante: hemos llamado echo con el valor que vimos antes. Esto nos permite pasar datos fuera de Nu a echo (o cualquier comando fuera de Nu, como git por ejemplo)

Nota: Para texto de ayuda de los comandos internos de Nu, puedes descubrirlos con el comando help:

> help config
Configuration management.

Usage:
  > config <subcommand> {flags}

Subcommands:
  config get - Gets a value from the config
  config set - Sets a value in the config
  config set_into - Sets a value in the config
  config clear - clear the config
  config remove - Removes a value from the config
  config path - return the path to the config file

Flags:
  -h, --help: Display this help message