tutorial_de_fish

¡Esta es una revisión vieja del documento!


Tutorial de Fish

Este tutorial asume que ya tienes un entendimiento básico de los lenguaje del interprete de comandos y los comandos de Unix.

chpass

En la línea Shell, asegúrate de agregar esta ruta:

/usr/local/bin/fish

Guarda los cambios y reinicia la sesión.

Fish shell ejecuta comandos como cualquier otra shell: para hacerlo ingresa un comando, seguido por sus argumentos. Los espacios son separadores

echo ¡Hola texto-plano.xyz!
¡Hola texto-plano.xyz!

Esto ejecuta el comando echo con los argumentos ¡Hola y texto-plano.xyz!. En este caso, es lo mismo que un solo argumento ¡Hola texto-plano.xyz!,pero en muchos casos no lo será. Si necesitas pasar un argumento que incluya un espacio, puedes indicarlo con una \, o utiliza comillas simples \'\' o dobles “”.:

mkdir Mis\ Documentos
# Crea un directorio llamado "Mis Documentos", con un espacio en el nombre
 
cp ~/Algún\ Fichero 'Mis Documentos'
# Copia un fichero llamado "Algún Fichero" en el directorio "Mis Documentos" del directorio home/
 
ls "Mis Documentos"
Algún Fichero

Ejecuta help para abrir la ayuda de fish en un navegador web, y man con la página para que abra la página de man. Puedes también solicitar ayuda con el comando específico, por ejemplo help set para abrirlo en el navegador web, o man set para presentarlo en la terminal.

man set
set - handle shell variables
  Synopsis...

Notarás rápidamente que fish resaltará la sintaxis al vuelo en la medida que la escribas. Los comandos inválidos resultarán por defecto coloreados en rojo:

> /bin/mkd

Un comando peude ser inválido porque no existe o porque se refiere a un fichero que no se puede ejecutar. Cuando el comando sea válido, se presentará en un color diferente:

/bin/mkdir

Las rutas de fichero válidas son subrayadas en la medida que las tipeas:

\> cat ~/algunfi

Esto te dirá que existe un fichero que comienza con algunfi, lo cual es una retroalimentación útil de tener mientras vas escribiendo.

Pueden cambiarse estos y muchos otros colores ejecutando el comando fish_config, o modificando directamente las variables de color.

Por ejemplo, si deseas desactivar (casi) todo el coloreado, ingresa:

fish_config theme choose none

Esto escoge el tema none (“ninguno”). Para ver todos los temas de color ingresa:

fish_config theme show

El sólo ejecutar fish_config te abrirá una interfaz de navegador que te permitirá escoger entre los temas disponibles.

Fish soporta los comodines familiares * que significa “todos”. Para listar “todos los ficheros JPEG”:

ls *.jpg
lena.jpg
meena.jpg
santa maria.jpg

Puedes incluir múltiples comodines:

ls l*.p*
lena.png
lesson.pdf

El comodín recursivo doble asterisco es especialmente poderoso, ya que busca en directorios de forma recursiva:

ls /var/**.log
/var/log/system.log
/var/run/sntp.log

Si la búsqueda transversal en tales directorios lleva mucho tiempo, puedes usar Ctrl+c para interrumpirla.

Puedes usar caños entre comandos con el |:

echo hola texto-plano.xyz | wc
      1       2      12

Puedes redirigir los stdin y stdout con < y >. stderr se redirecciona con2>.

grep fish < /etc/shells > ~/output.txt 2> ~/errors.txt

Para redirigir stdout y stderr en un fichero, necesitarás primero redirigir stdout, y posteriormente colocar stderr en stdout:

make > salida_make.txt 2>&1

En la medida que tipeas, fish te sugerirá comandos a la derecha del cursor actual, el color gris:

> /bin/hostname

Conocerá las rutas y las opciones:

> grep --ignore-case

Y la historia también. Ingresa una vez un comando, y podrás volver a invocarlo simplemente tipeando unos pocos caracteres:

> rsync -avze ssh . usuario@algunhuespedlargo.com:/alguna/ruta/larga/hasta/lograr/llegar/a/la/verdad/

Para aceptar la sugerencia presiona flecha derecha del cursor o Ctrl+f. Para aceptar una palabra única de la autosugerencia, usa Alt+Flecha derecha del cursor. Si la autosugerencia no es lo que quieres, simplemente ignórala.

Si no gustas de recibir autosugerencias, desactívalas configurando $fish_autosuggestion_enabled en 0 de la siguiente manera:

set -g fish_autosuggestion_enabled 0

En fish funcionarán un rico conjunto de autocompletados con Tab.

Presiona la tecla tab y fish intentará completar el comando o ruta:

> /pri[Tab] => /privado/

Si hay más de una posibilidad, te las listará:

> ~/cosas/s[Tab]
~/cosas/sueño.txt  (txt, 2.8kB)  ~/cosas/script.sh  (Executable, 1.3K)

Presiona la tecla tab nuevamente para ciclar entre las posibilidades.

fish también es capaz de completar muchos comandos, como ramas de git:

> git merge pr[Tab] => git merge prompt_designer
> git checkout b[Tab]
builtin_list_io_merge (Branch) builtin_set_color (Branch) busted_events (Tag)

¡Intenta presionar la tecla tab para ver que puede hacer fish!

Como otras shells, en fish el $ seguido por un nombre de variable resultará reemplazado con el valor de dal variable:

echo Mi directorio de la tilde tilde es $HOME
Mi directorio en la tilde es /home/fulana

Esto se conoce como sustitución de variables, y también sucede su se utilizan , pero no con ':

echo "Mi directorio de trabajo es $PWD"
Mi directorio de trabajo es /home/fulana/docs
 
echo 'Mi directorio de trabajo es $PWD'
Mi directorio de trabajo es $PWD

A diferencia de otras shells, fish no tiene una sintaxis VARIABLE=VALOR dedicada para configurar las variables. En lugar de ello, utiliza un comando ordinario: set, el cual toma el nombre de la variable, y luego su valor.

set nombre 'Fulana Mengana'
 
echo $nombre
Fulana Mengana

Te en cuenta el uso de las ”“: sin ellas, Fulana y Mengana habrían sido argumentos separados, y $nombre se hubiese convertido en una lista de dos elementos).

A diferencia de otras shells, las variables no resultan divididas luego de este paso de sustitución de variables. Entonces:

mkdir $nombre
 
ls
Fulana Mengana

En Bash, esto hubiese creado dos directorios: Fulana/ y Mengana/. En fish, crea solo uno, ya que la variable cuenta con el valor Fulana Mengana, de modo que este es el argumento enviado al comando mkdir, con espacios y todo.

Puedes eliminar (o “borrar”) una variable utilizando el argumento -e or –erase en set. Por ejemplo:

set -e MiVariable
 
env | grep MiVariable
(sin salida)

A veces necesitarás tener disponible una variable para utilizar en un comando externo, a menudo como una configuración de set. Por ejemplo, muchos programas como git o man leen la variable $PAGER para descubrir tu paginador (programa para reveer texto) preferido. Otras variables utilizas así incluyen $BROWSER, $LANG (para configurar tu idioma) y $PATH. Notarás que estás estás escritas en MAYUSCULAS, pero esto es sólo por convención.

Para otorgar una variable a un comando externo, debes “exportarla”. A diferencia de otras shells, fish no usa el comando export para ello. En su lugar, podrás exportar la variable con set -x o set –export.

set -x MiVariable AlgunValor
 
env | grep MiVariable
MyVariable=AlgunValue

También puedes des-exportarlas con –unexport or -u.

¡Esto también opera a la inveersa! Si fish comienza con algo más, heredará las variables exportadas por su proceso progenitor. De modo que si tu emulador de terminar ejecuta fish, y exporta $LANG con el valor es_AR.UTF-8, fish recibirá tal configuración. Y cualquier emulador que inicies al cual le otorgues variables también las pasarán, a no ser que específicamente decidas no hacerlo. Esta es la manera en la cual fish recibe usualmente los valores de $LANG, $PATH y $TERM, sin que se los debas especificar obligatoriamente.

Las variables exportadas pueden ser locales, globales o universales; “exportar” no es limitado! Usualmente las querrías globalizar con set -gx MiVariable AlgunValor.

El comando set indicado arriba emplea comillas para asegurar que Fulana Mengana fuese un solo argumento. Si hubiesen sido dos argumentos, entonces el nombre hubiese consitnuido una lista de dos elementos. De hecho, todas las variables de fish son en realidad listas, que pueden contener cualquier cantidad de valores, o de hecho ninguno.

Algunas variables como $PWD, cuentas únicamente con un valor. Por convención, hablamos de valor de la variable, pero realmente significan su primer (y único) valor.

Otras variables como $PATH, cuentan realmente con múltiples valores. Durante la expansión de variables, esta se expandirá para convertirse en múltiples argumentos, de la siguiente manera:

echo $PATH
/usr/bin /bin /usr/sbin /sbin /usr/local/bin

Las variables cuyo nombre finaliza con PATH serán divididas automáticamente con comas para convertirse en listas. Se unen utilizando , y luego se exportan a subcomandos individuales. Esto se realiza para retener compatibilidad con otras herramientas, que esperan que $PATH use , como divisor. Puedes agregar este hack a una variable con set –path, o removerlo con set –unpath.

Las listas no pueden contener sublistas; no existe recursividad. Una variable consiste en una lista de cadenas, sin otra consideración alguna.

Para obtener un conteo de una lista, utiliza:

count $PATH
5

Puedes agregar (o preceder) a una lista configurando la lista a sí misma, con algunos argumentos adicionales. Aquí agregamos /usr/local/bin a la variable $PATH:

set PATH $PATH /usr/local/bin

Puedes acceder a elementos individuales entrecorchetando con []. En indizado comienza en 1 desde el comienzo, y desde -1 desde el final:

echo $PATH
/usr/bin /bin /usr/sbin /sbin /usr/local/bin
 
echo $PATH[1]
/usr/bin
 
echo $PATH[-1]
/usr/local/bin

También podrás acceder a rangos de elementos, conocidos como ”cortes“:

echo $PATH[1..2]
/usr/bin /bin
 
echo $PATH[-1..2]
/usr/local/bin /sbin /usr/sbin /bin

Podrás reiterar sobre una lista (o corte) con un bucle for:

for val in $PATH
  echo "entrada: $val"
end
# Presentará:
# entrada: /usr/bin/
# entrada: /bin
# entrada: /usr/sbin
# entrada: /sbin
# entrada: /usr/local/bin

Las listas adyacentes a otras listas o cadenas resultarán expandidas como productos cartesianos, a no ser que se encuentren entrecomilladas con ”“.

set a 1 2 3
 
set 1 a b c
 
echo $a$1
1a 2a 3a 1b 2b 3b 1c 2c 3c
 
echo $a" banana"
1 banana 2 banana 3 banana
 
echo "$a banana"
1 2 3 banana

Esto es similar a una expansión arbolada.

Command substitutions use the output of one command as an argument to another. Unlike other shells, fish does not use backticks `` for command substitutions. Instead, it uses parentheses with or without a dollar:

echo En (pwd), usando $(uname)
En /home/fulana, usando OpenBSD

A common idiom is to capture the output of a command in a variable:

set os (uname)
 
echo $os
Linux

Command substitutions without a dollar are not expanded within quotes, so the version with a dollar is simpler:

touch "testing_$(date +%s).txt"
 
ls *.txt
testing_1360099791.txt

Unlike other shells, fish does not split command substitutions on any whitespace (like spaces or tabs), only newlines. This can be an issue with commands like pkg-config that print what is meant to be multiple arguments on a single line. To split it on spaces too, use string split.

printf '%s\n' (pkg-config --libs gio-2.0)
-lgio-2.0 -lgobject-2.0 -lglib-2.0
 
printf '%s\n' (pkg-config --libs gio-2.0 | string split -n " ")
-lgio-2.0
-lgobject-2.0
-lglib-2.0

If you need a command substitutions output as one argument, without any splits, use quoted command substitution:

echo "first line
second line" > myfile
 
set myfile "$(cat myfile)"
 
printf '|%s|' $myfile
|first line
second line|

For more, see Command substitution.

Como otras shells, fish permite secuenciar múltiples comandos tanto en órdenes separadas como en una sola órden por línea.

Para escribirlas en una sola línea, usa el punto y coma ;. Esto significa que los ejemplos siguientes son equivalentes.

echo ¡fish; echo es un pescado
 
# or
echo fish
echo es un pescado!

Cuando un comando sale a la shell, retornará un código de status de salida, como un número entero positivo.

A diferencia de otras shells, fish almacena la última status de salida recibida en $status en lugar de hacerlo en $?.

false
 
echo $status
1

Esto indica cómo resultó la ejecución del comando. 0 significa realmente éxito, mientras que los otros significan determinados casos de fracasos. Por ejemplo, set –query retornará el número de variables que solicitó que no estuvieron configuradas con set, mientras que set –query PATH usualmente devuelve 0, set –query arglbargl boogaboo usualmente devuelve 2.

También existe una lista $pipestatus variable para cada status de salidas 1 de los procesos en un caño.

fish utiliza los combinadores && y || usuales para combinar comandos, y ! para negar la combinación:

./configure && make && sudo make install

Aquí, make se ejecuta sólo si ./configure tiene éxito (devuelve 0), y sudo make install se ejecutará si y solo si tanbto ./configure y make tienen éxito.

fish también soporta condicionales and, or, y not. Los primeros dos son modificadores de trabajos y tienen precedencia menor. Ejemplo:

cp fichero1 fichero1_bak && cp fichero2 fichero2_bak; and echo "Respaldo exitoso"; or echo "El respaldo falló"
El respaldo falló

Como se mencionó en la sección sobre el uso de ;, esto también podría ordenarse en múltiples órdenes, tal como:

cp fichero1 fichero1_bak && cp fichero2 fichero2_bak
and echo "Respaldo exitoso"
or echo "El respaldo falló"

Usa if y else para ejecutar código condicionalmente, de acuerdo al status de salida de un comando dado.

if grep fish /etc/shells
    echo "¡Pesqué un fish!"
else if grep bash /etc/shells
    echo "¡Pesqué un bash!"
else
    echo "No pesqué nada interesante."
end

Para comparar cadenas o números o consultar las propiedades de un fichero (si existe o si es se lo puede escribir, etc), usamos test, por ejemplo:

if test "$fish" = "flounder"
    echo FLOUNDER
end
 
# or
 
if test "$number" -gt 5
    echo $number es mayor que cinco
else
    echo $number es cinco o menor
end
 
# o
 
# Este test es verdadero si existe la ruta /etc/hosts
# - Podría ser un fichero, directorio, o symlink (o posiblemente algo mas).
if test -e /etc/hosts
    echo Muy probablemente tengamos un fichero host
else
    echo No tenemos un fichero host
end

También pueden utilizarse combinadores para lograr condicionales más complejas, tales como:

if grep fish /etc/shells; and command -sq fish
    echo fish está instalado y configurado
end

Para condicionales aún más complejos, utiliza begin y end para agrupar partes de estas condicionales.

También contarás con un comando switch:

switch (uname)
case Linux
    echo ¡Hola, Pingüino de Tux!
case Darwin
    echo ¡Hola, ¿Cómo está Hexley?
case FreeBSD NetBSD DragonFly OpenBSD
    echo ¡Hola, monstruo de Beastie!
case '*'
    echo "¿Quién eres tú, forastero?"
end

Como ves, case no falla, y puede aceptar argumentos múltiples o comodines entrecomillados con .

A fish function is a list of commands, which may optionally take arguments. Unlike other shells, arguments are not passed in “numbered variables” like $1, but instead in a single list $argv. To create a function, use the function builtin:

function say_hello
    echo Hello $argv
end
say_hello
# prints: Hello
say_hello everybody!
# prints: Hello everybody!

Unlike other shells, fish does not have aliases or special prompt syntax. Functions take their place. 2

You can list the names of all functions with the functions builtin (note the plural!). fish starts out with a number of functions:

functions

N_, abbr, alias, bg, cd, cdh, contains_seq, dirh, dirs, disown, down-or-search, edit_command_buffer, export, fg, fish_add_path, fish_breakpoint_prompt, fish_clipboard_copy, fish_clipboard_paste, fish_config, fish_default_key_bindings, fish_default_mode_prompt, fish_git_prompt, fish_hg_prompt, fish_hybrid_key_bindings, fish_indent, fish_is_root_user, fish_job_summary, fish_key_reader, fish_md5, fish_mode_prompt, fish_npm_helper, fish_opt, fish_print_git_action, fish_print_hg_root, fish_prompt, fish_sigtrap_handler, fish_svn_prompt, fish_title, fish_update_completions, fish_vcs_prompt, fish_vi_cursor, fish_vi_key_bindings, funced, funcsave, grep, help, history, hostname, isatty, kill, la, ll, ls, man, nextd, open, popd, prevd, prompt_hostname, prompt_pwd, psub, pushd, realpath, seq, setenv, suspend, trap, type, umask, up-or-search, vared, wait

You can see the source for any function by passing its name to functions:

functions ls
function ls --description 'List contents of directory'
    command ls -G $argv
end

For more, see Functions.

2

  There is a function called alias, but it’s just a shortcut to make functions.

Bucles While:

while true
    echo "Buclear por siempre"
end
# Presenta:
# Buclear por siempre
# Buclear por siempre
# Buclear por siempre
# Si, esto bucleará por siempre. A no ser que abortes con Ctrl+c.

Bucles For

Los bucles For pueden utilizarse paera iterar sobre una lista. Por ejemplo, un listado de ficheros:

for fichero in *.txt
    cp $fichero $fichero.bak
end

Podrás iterar sobre una lista de números utilizando seq:

for x in (seq 5)
    touch fichero_$x.txt
end

Unlike other shells, there is no prompt variable like PS1. To display your prompt, fish executes the fish_prompt function and uses its output as the prompt. And if it exists, fish also executes the fish_right_prompt function and uses its output as the right prompt.

You can define your own prompt from the command line:

function fish_prompt; echo "New Prompt % "; end
New Prompt % _

Then, if you are happy with it, you can save it to disk by typing funcsave fish_prompt. This saves the prompt in ~/.config/fish/functions/fish_prompt.fish. (Or, if you want, you can create that file manually from the start.)

Multiple lines are OK. Colors can be set via set_color, passing it named ANSI colors, or hex RGB values:

function fish_prompt
    set_color purple
    date "+%m/%d/%y"
    set_color F00
    echo (pwd) '>' (set_color normal)
end

This prompt would look like:

02/06/13
/home/tutorial > _

You can choose among some sample prompts by running fish_config for a web UI or fish_config prompt for a simpler version inside your terminal.

$PATH is an environment variable containing the directories that fish searches for commands. Unlike other shells, $PATH is a list, not a colon-delimited string.

Fish takes care to set $PATH to a default, but typically it is just inherited from fish’s parent process and is set to a value that makes sense for the system - see Exports.

To prepend /usr/local/bin and /usr/sbin to $PATH, you can write:

set PATH /usr/local/bin /usr/sbin $PATH

To remove /usr/local/bin from $PATH, you can write:

set PATH (string match -v /usr/local/bin $PATH)

For compatibility with other shells and external commands, $PATH is a path variable, and so will be joined with colons (not spaces) when you quote it:

echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/bin

and it will be exported like that, and when fish starts it splits the $PATH it receives into a list on colon.

You can do so directly in config.fish, like you might do in other shells with .profile. See this example.

A faster way is to use the fish_add_path function, which adds given directories to the path if they aren’t already included. It does this by modifying the $fish_user_paths universal variable, which is automatically prepended to $PATH. For example, to permanently add /usr/local/bin to your $PATH, you could write:

fish_add_path /usr/local/bin

The advantage is that you don’t have to go mucking around in files: just run this once at the command line, and it will affect the current session and all future instances too. You can also add this line to config.fish, as it only adds the component if necessary.

Or you can modify $fish_user_paths yourself, but you should be careful not to append to it unconditionally in config.fish, or it will grow longer and longer. Startup (Where’s .bashrc?)

Fish starts by executing commands in ~/.config/fish/config.fish. You can create it if it does not exist.

It is possible to directly create functions and variables in config.fish file, using the commands shown above. For example:

cat ~/.config/fish/config.fish
 
set -x PATH $PATH /sbin/
 
function ll
    ls -lh $argv
end

However, it is more common and efficient to use autoloading functions and universal variables.

If you want to organize your configuration, fish also reads commands in .fish files in ~/.config/fish/conf.d/. See Configuration Files for the details.

When fish encounters a command, it attempts to autoload a function for that command, by looking for a file with the name of that command in ~/.config/fish/functions/.

For example, if you wanted to have a function ll, you would add a text file ll.fish to ~/.config/fish/functions:

cat ~/.config/fish/functions/ll.fish
function ll
    ls -lh $argv
end

This is the preferred way to define your prompt as well:

cat ~/.config/fish/functions/fish_prompt.fish
function fish_prompt
    echo (pwd) "> "
end

See the documentation for funced and funcsave for ways to create these files automatically, and $fish_function_path to control their location.

A universal variable is a variable whose value is shared across all instances of fish, now and in the future – even after a reboot. You can make a variable universal with set -U:

set -U EDITOR vim
 
Now in another shell:
 
echo $EDITOR
vim
  • tutorial_de_fish.1656451251.txt.gz
  • Última modificación: 2022/06/28 21:20
  • por peron