Este artículo necesita citas adicionales para su verificación . ( mayo de 2019 ) |
Autor (es) original (es) | Axel Liljencrantz |
---|---|
Desarrollador (es) | Desarrolladores de conchas de pescado [1] |
Versión inicial | 13 de febrero de 2005 |
Lanzamiento estable | 3.3.1 [2] / 6 de julio de 2021 |
Repositorio | |
Sistema operativo | Tipo Unix |
Escribe | Shell de Unix |
Licencia | Solo GPL-2.0 [3] |
Sitio web | concha de pescado |
fish es un caparazón de Unix con un enfoque en la interactividad y la usabilidad. Fish está diseñado para ofrecer al usuario funciones por defecto, en lugar de por configuración. [4] El pescado se considera un caparazón exótico ya que no se adhiere rigurosamente a los estándares de caparazón POSIX , a discreción de los mantenedores. [5]
Fish tiene sugerencias automáticas de " búsqueda mientras escribe " basadas en el historial y el directorio actual. Esto es esencialmente como la búsqueda de historial de Bash + , pero debido a que siempre está activado en lugar de ser un modo separado, el usuario recibe comentarios continuos mientras escribe la línea de comando y puede seleccionar sugerencias con las teclas de flecha, o como en Bash, presione para un en su lugar, completar la pestaña. La finalización con tabulación tiene muchas funciones, rutas de archivo en expansión (con comodines y expansión de llaves ), variables y muchas finalizaciones específicas de comandos. Las finalizaciones específicas de los comandos, incluidas las opciones con descripciones, pueden generarse hasta cierto punto a partir de las páginas de manual de los comandos.CtrlRTab ↹
Fish tiene pocas reglas sintácticas, prefiriendo características como comandos en lugar de sintaxis. Esto hace que ofrece detectable en términos de comandos con opciones y textos de ayuda. Las funciones también pueden llevar una descripción legible por humanos. Un comando de ayuda especial da acceso a toda la documentación de peces en el navegador web del usuario . [6]
La sintaxis se asemeja a un shell compatible con POSIX (como Bash), pero se desvía de manera importante cuando los creadores creen que el shell POSIX estaba mal diseñado. [7]
# Asignación de variable, establezca la variable 'foo' en el # valor 'barra'. Fish no usa el operador =, ya que # es inherentemente sensible a los espacios en blanco. Además, el comando set # se extiende fácilmente para trabajar con matrices, alcance, etc. > set foo bar > echo $ foobar # Sustitución de comando, asigne la salida del comando # 'pwd' en la variable 'wd'. Fish no usa `` # ya que no se pueden anidar y se parecen mucho a ''. # No use $ () ya que $ solo se usa para la expansión de # variable en fish. > establecer wd ( pwd ) > echo $ wd~# Variables de matriz. 'A' se convierte en una matriz con 5 valores: > set A 3 5 7 9 12 # Rebanada de matriz. 'B' se convierte en los dos primeros elementos de 'A': > set B $ A [ 1 2 ] > echo $ B 3 5 # Puede indexar con otras matrices e incluso el comando # salida de sustitución: > echo $ A [( seq 3 )] 3 5 7 # Borra el tercer y quinto elemento de 'A' > set --erase A [ $ B ] > echo $ A 3 5 9# for-loop, convierte jpegs a pngs > for i en * .jpg convertir $ i ( nombre base $ i .jpg ) .png end # Los puntos y comas funcionan como líneas nuevas: > para i en * .jpg ; convertir $ i ( nombre base $ i .jpg ) .png ; end # pero el formulario de varias líneas es cómodo de usar porque # fish admite el historial y la edición de varias líneas.# while-loop, lee las líneas / etc / passwd y genera el quinto campo # separado por dos puntos del archivo. Esta debe ser # la descripción del usuario. > while read line set arr ( echo $ line | tr: \ n ) echo $ arr [ 5 ] end < / etc / passwd# Reemplazo de cadena (reemplazando todo i por I) > reemplazo de cadena -a "i" "I" "Wikipedia"WIkIpedIa
Algunas construcciones de lenguaje, como pipelines , funciones y bucles , se han implementado utilizando las denominadas subcapas en otros lenguajes de shell . Los subshells son simplemente programas secundarios que ejecutan algunos comandos para el shell y luego salen. Desafortunadamente, este detalle de implementación generalmente tiene el efecto secundario de que cualquier cambio de estado realizado en la subcapa, como las asignaciones de variables, no se propaga al shell principal, lo que puede sorprender al usuario. Los peces nunca se bifurcan de las llamadas subcapas; todas las funciones integradas son siempre completamente funcionales.
# Esto no funcionará en muchos otros shells, ya que el builtin # 'read' se ejecutará en su propio subshell. En Bash, el lado derecho de la tubería # no puede tener efectos secundarios. En ksh, el siguiente comando funciona, pero # el lado izquierdo no puede tener efectos secundarios. En fish y zsh, ambos lados # pueden tener efectos secundarios. > gato * .txt | leer línea
Este ejemplo de Bash no hace lo que parece: debido a que el cuerpo del bucle es una subcapa, la actualización a $found
no es persistente.
encontrado = ''
cat / etc / fstab | mientras lee dev mnt resto ; hacer si prueba " $ mnt " = "/" ; luego encontrado = " $ dev " fi listo
Solución alterna:
found = '' while read dev mnt rest ; hacer si prueba " $ mnt " = "/" ; luego encontrado = " $ dev " fi hecho </ etc / fstab
Fish no necesita una solución alternativa:
conjunto encontrado ''
cat / etc / fstab | while read dev mnt rest si prueba " $ mnt " = "/" conjunto encontrado $ dev end end
Los mensajes de error en peces están diseñados para decirle al usuario qué salió mal y qué se puede hacer al respecto. [8]
> foo = bar fish: comando desconocido "foo = bar". ¿Quiso decir "establecer VALOR VARIABLE"? Para obtener información sobre cómo configurar los valores de las variables, consulte la sección de ayuda sobre el comando set escribiendo "help set".> echo $ {foo} bar fish: ¿Quisiste decir {$ VARIABLE}? El carácter '$' comienza con un nombre de variable . Un corchete, que sigue directamente a '$', no está permitido como parte de un nombre de variable, y los nombres de variable no pueden tener cero caracteres . Para obtener más información sobre la expansión variable en peces, escriba "ayudar a expandir la variable".> echo $ (pwd) fish: ¿Quiso decir (COMMAND)? En fish, el carácter '$' solo se usa para acceder a las variables. Para obtener más información sobre la sustitución de comandos en peces, escriba "help expand-command-substitution".
Fish tiene una función conocida como variables universales, que permiten a un usuario asignar permanentemente un valor a una variable en todas las conchas de pescado en ejecución del usuario. El valor de la variable se recuerda a través de cierres de sesión y reinicios, y las actualizaciones se propagan inmediatamente a todos los shells en ejecución.
# Esto hará que emacs sea el editor de texto predeterminado. El '--universal' (o '-U') le dice a Fish que # haga de esto una variable universal. > set - EDITOR universal emacs# Este comando hará que el directorio de trabajo actual sea parte del indicador # fish y se vuelva azul en todas las instancias de fish en ejecución. > conjunto --universal fish_color_cwd blue
La versión 2 agrega:
Característica | Sintaxis bash | sintaxis de pescado | Comentario |
---|---|---|---|
expansión variable: con división de palabras e interpretación global | $ var o $ {var [@]} o $ {var [*]} | deliberadamente omitido | Identificado como la causa principal de errores en los lenguajes de shell compatibles con posix [9] |
expansión variable: escalar | "$ var" | deliberadamente omitido | Cada variable es una matriz |
expansión variable: matriz | "$ {var [@]}" | $ var | No es necesario citar para suprimir la división de palabras y la interpretación global. En cambio, citar significa serialización. |
expansión variable: como una cadena separada por espacios | "$ {var [*]}" | "$ var" | |
editar línea en el editor de texto | Ctrl+ X, Ctrl+E | Alt+E | Tras la invocación, mueve la entrada de línea a un editor de texto |
evaluar la entrada de línea | Ctrl+ Alt+E | N / A [10] | Evalúa expresiones in situ en el editor de líneas |
finalización de la historia | Ctrl+R | implícito | |
sustitución de historia | !! | deliberadamente omitido | No detectable |
subcapa explícita | (expresión) | expresión de pescado -c | |
sustitución de comando | "$ (expresión)" | (expresión) | |
sustitución de procesos | <(expresión) | (expresión | psub) | Comando, no sintaxis |
operadores logicos | ! cmd && echo FAIL || echo bien | no comando y echo FAIL o echo OK | |
asignación de variable | var = valor | establecer valor de var | |
procesamiento de cadenas: reemplazar | "$ {HOME / alice / bob}" | cadena reemplazar alice bob $ HOME | |
procesamiento de cadenas: elimine el patrón de prefijo o sufijo, sin codicia o codicia | var = abc " $ { var # *. } " #bc " $ { var ## *. } " #c " $ { var %. * } " #ab " $ { var %%. * } " #a | cadena reemplazar --regex '. *? \. (. *)' '$ 1' abc #bc
cadena reemplazar --regex '. * \. (. *)' '$ 1' abc #c
cadena reemplazar --regex '( . *) \ .. * ' ' $ 1 ' abc #ab
cadena reemplazar --regex ' (. *?) \ .. * ' ' $ 1 ' abc #a | |
exportar variable | exportar var | set --export var | Opciones detectables al completar la pestaña |
variable local de función | var local | por defecto | |
variable local de alcance | sin equivalente | set --local var | |
eliminar variable | var unset | set --erase var | |
comprobar si existe una variable | prueba -v var | set --query var | |
inicialización de matriz | var = (abc) | establecer var abc | Cada variable es una matriz |
iteración de matriz | para i en " $ { var [@] } " ; haz eco de " $ i " hecho | para i en $ var echo $ i end | |
vector de argumento: todos los argumentos | PS | $ argv | |
vector de argumento: indexación | "$ 1" | $ argv [1] | |
vector de argumento: longitud | PS | (cuenta $ argv) | |
vector de argumento: cambio | cambio | set --erase argv [ 1 ] | |
representación de matriz en variables de entorno | RUTA = " $ RUTA : $ INICIO /.local/bin" | establecer RUTA $ RUTA $ INICIO /.local/bin | fish asume dos puntos como delimitador de matriz para traducir variables hacia y desde el entorno. Esto se alinea con muchas variables de entorno similares a matrices, como $ PATH y $ LS_COLORS. |
exportar y ejecutar | LANG = C.UTF-8 python3 | env LANG = C.UTF-8 python3 | env LANG=C.UTF-8 python3 funciona en cualquier shell, ya que env es un programa independiente. |
aritmética | $ ((10/3)) | matemáticas '10 / 3 ' | expr 10 / 3 funciona en cualquier shell, ya que expr es un programa independiente. |
secuencia de escape | $ '\ e' | \mi | printf '\e' funciona en ambas carcasas; sus printf incorporaciones son compatibles con el printf programa independiente GNU . [11] |
cadena entre comillas simples: secuencias de escape | barra invertida final de 'mamá' \ ' : \' | 'madre \' s barra invertida final: \\ ' | Bash solo requiere el reemplazo de la comilla simple en sí en cadenas entre comillas simples, pero el reemplazo es de 4 caracteres. El mismo reemplazo funciona en fish, pero fish admite una secuencia de escape regular para esto, por lo que también requiere escapar de las barras invertidas (excepto que permite barras invertidas simples que no preceden a otra barra invertida o comillas simples). |
la sintaxis de Posix tiene varias características faltantes o mal implementadas, incluyendo alcance de variables, matrices y funciones.
Por esta razón, los peces se desvían de la sintaxis de Posix en varios lugares importantes.
Esta página muestra errores comunes que cometen los programadores de Bash.
(…) ¡Te salvarás de muchas de estas trampas si simplemente siempre usas comillas y nunca usas la división de palabras por ningún motivo!
La división de palabras es un error heredado roto heredado del shell Bourne que se atasca de forma predeterminada si no cita las expansiones.
La gran mayoría de las trampas están relacionadas de alguna manera con expansiones no citadas, y la consiguiente división de palabras y globbing como resultado.