poisson (coquille Unix) - fish (Unix shell)

poisson
Fish shell logo ascii.png
Fish shell 3.3.1 screenshot.png
La coquille de poisson. Son slogan, "fish - the friendly interactive shell", est affiché en haut.
Auteur(s) original(aux) Axel Liljencrantz
Développeur(s) Développeurs de coquilles de poisson
Première version 13 février 2005 ; il y a 16 ans (2005-02-13)
Version stable
3.3.1  Edit this on Wikidata / 6 juillet 2021 ; il y a 2 mois (6 July 2021)
Dépôt
Système opérateur Unix-like
Taper Shell Unix
Licence GPL-2.0 uniquement
Site Internet fishshell .com

fish est un shell Unix axé sur l'interactivité et la convivialité. Fish est conçu pour donner à l'utilisateur des fonctionnalités par défaut, plutôt que par configuration. Le poisson est considéré comme un coquillage exotique car il ne respecte pas rigoureusement les normes de coquillage POSIX , à la discrétion des responsables.

Points forts

Fish propose des suggestions automatiques de « recherche au fur et à mesure que vous tapez » en fonction de l'historique et du répertoire actuel. C'est essentiellement comme la recherche + historique de Bash , mais comme il est toujours activé au lieu d'être un mode séparé, l'utilisateur reçoit un retour continu tout en écrivant la ligne de commande, et peut sélectionner des suggestions avec les touches fléchées, ou comme dans Bash, appuyez pour un l'achèvement de la tabulation à la place. La complétion par tabulation est riche en fonctionnalités, étendant les chemins de fichiers (avec des caractères génériques et l' extension des accolades ), des variables et de nombreuses complétions spécifiques aux commandes. Les complétions spécifiques aux commandes, y compris les options avec descriptions, peuvent dans une certaine mesure être générées à partir des pages de manuel des commandes. CtrlRTab ↹

Fish a peu de règles syntaxiques, préférant les fonctionnalités comme commandes plutôt que la syntaxe. Cela rend les fonctionnalités détectables en termes de commandes avec des options et des textes d'aide. Les fonctions peuvent également porter une description lisible par l'homme. Une commande d' aide spéciale donne accès à toute la documentation sur les poissons dans le navigateur Web de l'utilisateur .

Syntaxe

La syntaxe ressemble à un shell compatible POSIX (tel que Bash), mais s'écarte de manière importante lorsque les créateurs pensent que le shell POSIX a été mal conçu.

# Variable assignment, set the variable 'foo' to the 
# value 'bar'.  Fish doesn't use the = operator, since 
# it is inherently whitespace sensitive.  Also, the set 
# command easily extends to work with arrays, scoping, etc.
> set foo bar
> echo $foo
bar
 
# Command substitution, assign the output of the command 
# 'pwd' into the variable 'wd'.  Fish doesn't use `` 
# since they can't be nested and look too much like ' '. 
# Don't use $() since $ is only used for variable 
# expansion in fish.
> set wd (pwd)
> echo $wd
~

# Array variables. 'A' becomes an array with 5 values:
> set A 3 5 7 9 12
# Array slicing. 'B' becomes the first two elements of 'A':
> set B $A[1 2]
> echo $B
3 5
# You can index with other arrays and even command 
# substitution output:
> echo $A[(seq 3)]
3 5 7
# Erase the third and fifth elements of 'A'
> set --erase A[$B]
> echo $A
3 5 9

# for-loop, convert jpegs to pngs
> for i in *.jpg
      convert $i (basename $i .jpg).png
  end
# Semicolons work like newlines:
> for i in *.jpg; convert $i (basename $i .jpg).png; end
# but the multi-line form is comfortable to use because 
# fish supports multi-line history and editing.

# while-loop, read lines /etc/passwd and output the fifth 
# colon-separated field from the file. This should be
# the user description.
> while read line
      set arr (echo $line|tr : \n)
      echo $arr[5]
  end < /etc/passwd

# String replacement (replacing all i by I)
> string replace -a "i" "I" "Wikipedia"
WIkIpedIa

Pas de sous-shell implicite

Certaines constructions de langage, comme les pipelines , les fonctions et les boucles , ont été implémentées à l'aide de sous- shells dans d'autres langages shell . Les sous-shells sont simplement des programmes enfants qui exécutent quelques commandes pour le shell, puis se terminent. Malheureusement, ce détail d'implémentation a généralement pour effet secondaire que les changements d'état effectués dans le sous-shell, tels que les affectations de variables, ne se propagent pas au shell principal, ce qui peut surprendre l'utilisateur. Le poisson ne déchire jamais les soi-disant sous-coquilles; toutes les fonctions intégrées sont toujours entièrement fonctionnelles.

# This will not work in many other shells, since the 'read' builtin
# will run in its own subshell. In Bash, the right side of the pipe
# can't have any side effects. In ksh, the below command works, but
# the left side can't have any side effects. In fish and zsh, both
# sides can have side effects.
> cat *.txt | read line

Exemple d'affectation de variable

Cet exemple Bash ne fait pas ce à quoi il ressemble : parce que le corps de la boucle est un sous-shell, la mise à jour de $foundn'est pas persistante.

found=''
cat /etc/fstab | while read dev mnt rest; do
  if test "$mnt" = "/"; then
    found="$dev"
  fi
done

Solution de contournement:

found=''
while read dev mnt rest; do
  if test "$mnt" = "/"; then
    found="$dev"
  fi
done < /etc/fstab

Le poisson n'a pas besoin de solution de contournement :

set found ''
cat /etc/fstab | while read dev mnt rest
  if test "$mnt" = "/"
    set found $dev
  end
end

Messages d'erreur utiles

Les messages d'erreur dans fish sont conçus pour dire à l'utilisateur ce qui s'est mal passé et ce qui peut être fait à ce sujet.

> foo=bar
fish: Unknown command “foo=bar”. Did you mean “set VARIABLE VALUE”?
For information on setting variable values, see the help section on
the set command by typing “help set”.

> echo ${foo}bar
fish: Did you mean {$VARIABLE}? The '$' character begins a variable
name. A bracket, which directly followed a '$', is not allowed as a
part of a variable name, and variable names may not be zero characters
long. To learn more about variable expansion in fish, type “help
expand-variable”.

> echo $(pwd)
fish: Did you mean (COMMAND)? In fish, the '$' character is only used
for accessing variables. To learn more about command substitution in
fish, type “help expand-command-substitution”.

Variables universelles

Fish a une fonctionnalité connue sous le nom de variables universelles, qui permettent à un utilisateur d'attribuer de manière permanente une valeur à une variable sur toutes les carapaces de poissons en cours d'exécution de l'utilisateur. La valeur de la variable est mémorisée lors des déconnexions et des redémarrages, et les mises à jour sont immédiatement propagées à tous les shells en cours d'exécution.

# This will make emacs the default text editor. The '--universal' (or '-U') tells fish to
# make this a universal variable.
> set --universal EDITOR emacs

# This command will make the current working directory part of the fish
# prompt turn blue on all running fish instances.
> set --universal fish_color_cwd blue

Autres caractéristiques

La version 2 ajoute :

  • Autosuggestions
  • 256 couleurs de bornes
  • Configuration basée sur le Web
  • Amélioration des performances (en ayant plus de fonctions intégrées).

Table de traduction bash/poisson

Caractéristique Syntaxe Bash syntaxe de poisson Commenter
expansion variable :
avec fractionnement de mots et interprétation globale
$var

ou

${var[@]}

ou

${var[*]}
délibérément omis Identifié comme une cause principale de bogues dans les langages shell compatibles posix
expansion variable :
scalaire
"$var"
délibérément omis Chaque variable est un tableau
expansion variable :
tableau
"${var[@]}"
$var
La citation n'est pas nécessaire pour supprimer le fractionnement des mots et l'interprétation globale. Au lieu de cela, la citation signifie la sérialisation.
expansion variable : en
tant que chaîne séparée par des espaces
"${var[*]}"
"$var"
éditer la ligne dans l'éditeur de texte Ctrl+ X, Ctrl+E Alt+E Lors de l'appel, déplace l'entrée de ligne vers un éditeur de texte
évaluer l'entrée de ligne Ctrl+ Alt+E N / A Évalue les expressions en place sur l'éditeur de ligne
achèvement de l'histoire Ctrl+R implicite
substitution d'historique !! délibérément omis Non détectable
sous-shell explicite
(expression)
fish -c expression
substitution de commande
"$(expression)" 
(expression) 
substitution de processus
<(expression)
(expression | psub)
Commande, pas de syntaxe
Opérateurs logiques
!cmd && echo FAIL || echo OK
not command
and echo FAIL
or echo OK
affectation variable
var=value 
set var value
traitement de chaîne :
 remplacer
"${HOME/alice/bob}"
string replace alice bob $HOME
traitement des chaînes :
supprimez le modèle de préfixe ou de suffixe, de manière non gourmande ou gourmande
var=a.b.c
"${var#*.}"  #b.c
"${var##*.}" #c
"${var%.*}"  #a.b
"${var%%.*}" #a
string replace --regex '.*?\.(.*)' '$1' a.b.c #b.c
string replace --regex '.*\.(.*)' '$1' a.b.c  #c
string replace --regex '(.*)\..*' '$1' a.b.c  #a.b
string replace --regex '(.*?)\..*' '$1' a.b.c #a
variable d'exportation
export var 
set --export var 
Options détectables via la complétion des onglets
variable locale de fonction
local var
par défaut
variable de portée locale pas d'équivalent
set --local var
supprimer une variable
unset var 
set --erase var 
vérifier si une variable existe
test -v var
set --query var
initialisation du tableau
var=( a b c ) 
set var a b c
Chaque variable est un tableau
itération de tableau
for i in "${var[@]}"; do
  echo "$i"
done
for i in $var
  echo $i
end
vecteur d'arguments :
tous les arguments
"$@" 
$argv 
vecteur d'argument :
indexation
"$1" 
$argv[1] 
vecteur d'argument :
longueur
$#
(count $argv)
vecteur d'argument :
décalage
shift
set --erase argv[1]
représentation de tableau dans les variables d'environnement
PATH="$PATH:$HOME/.local/bin"
set PATH $PATH $HOME/.local/bin
fish utilise deux points comme délimiteur de tableau pour traduire les variables vers et depuis l'environnement. Cela s'aligne avec de nombreuses variables d'environnement de type tableau, telles que $PATH et $LS_COLORS.
exporter et exécuter
LANG=C.UTF-8 python3 
env LANG=C.UTF-8 python3
env LANG=C.UTF-8 python3 fonctionne dans n'importe quel shell, car env est un programme autonome.
arithmétique
$((10/3))
math '10/3'
expr 10 / 3 fonctionne dans n'importe quel shell, car expr est un programme autonome.
séquence d'échappement
$'\e'
\e 
printf '\e'fonctionne dans les deux coquilles; leurs éléments printfintégrés sont tous deux compatibles avec le printfprogramme autonome GNU .
chaîne entre guillemets simples :
séquences d'échappement
'mom'\''s final backslash: \'
'mom\'s final backslash: \\'
Bash ne nécessite que le remplacement du guillemet simple lui-même dans les chaînes entre guillemets simples, mais le remplacement fait 4 caractères. Le même remplacement fonctionne dans fish, mais fish prend en charge une séquence d'échappement régulière pour cela, nécessite donc également d'échapper les barres obliques inverses (sauf autorise les barres obliques inverses simples qui ne précèdent pas une autre barre oblique inverse ou guillemet simple).

Voir également

Les références

Liens externes