poisson (coquille Unix) - fish (Unix shell)
|
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 |
| Version stable | |
| Dépôt | |
| Système opérateur | Unix-like |
| Taper | Shell Unix |
| Licence | GPL-2.0 uniquement |
| Site Internet | fishshell |
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
- Achèvement avancé de l'onglet.
- Mise en évidence de la syntaxe avec vérification approfondie des erreurs.
- Soutenir le X presse - papiers .
- Traitement intelligent des terminaux basé sur terminfo .
- Historique des commandes consultable .
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
-
Site officiel
– contenant de la documentation et des téléchargements - poisson sur GitHub (actif)
- poisson sur Gitorious (obsolète)
- poisson sur SourceForge (obsolète)
- Utilisateurs de poisson – liste de discussion générale pour les utilisateurs de poisson
- Shell Translation Dictionary - une autre table de traduction Bash/Fish