Fish est un shell qui se veut simple. Il est tout à fait utilisable, quoiqu'il souffre encore de quelques bugs. Son mode interactif est particulièrement agréable. Utiliser Bash, le shell par défaut de nombreuses distributions, consiste en partie à éviter les pièges et à se retrouver dans un empilement de syntaxes ajoutées au fil du temps. Fish, lui, essaye d’être cohérent. Il ne cherche pas à respecter POSIX, enfin pas complètement, même si je pense qu’il ne devrait même pas essayer, car il risquerait d’y perdre une partie de sa cohérence.
Fish est sous licence GPL v2.
L’invite de commande
untel@hostname ~> ls
entrée erreur kakoune/ sortie_standard
Les redirections n’utilisent pas de numéro. Les habituelles <
pour l’entrée et >
pour la sortie sont bien présentes, par contre ^
est utilisée pour les erreurs.
~> cat < entrée > ./sortie_standard ^ ./erreur
La mise en arrière-plan se fait classiquement avec l’esperluette.
~> gvim &
retour au premier plan
~> fg
remise en arrière-plan
~> bg
la conditionnelle :
~> if test 1=1
echo oui
else
echo non
end
oui
~> if true
echo oui
end
oui
Fish utilise essentiellement test
pour les comparaisons. En réalité, c’est bien le code de retour de test
qui est utilisé.test
gère les comparaisons de fichiers et de nombres.
Le code retour n’est pas stocké dans $?
mais dans $status
~> true
~> echo $status
0
La boucle for :
~> for i in *
echo $i
end
entrée
erreur
kakoune
sortie_standard
L’indentation est faite automatiquement. La boucle n’a pas de bloc ouvrant, mais le bloc fermant sera toujours end
. Alt-Entrée
pourra permettre d’ajouter des lignes lorsque Fish aurait exécuté le code lors de l’appui sur entrée
.
La boucle while :
~> set i 5
~> while test 1 -lt $i
echo $i
set i (math $i - 1)
end
5
4
3
2
L’échappement :
Les paramètres n’ont pas besoins d’être échappés. Ils sont utilisables tels quels :
~> set a 'a b'
~> echo $a
a b
pour rappel, en Bash :
$ a="a b"
$ echo "$a"
a b
$ echo $a
a b
Les arguments des fonctions se retrouvent dans argv
.
~> function echo2
echo $argv
end
~> echo2 1 2 3
1 2 3
Les variables :
~> set a 5
affecte 5 à a
~> set --export a 5
rend la variable accessible aux sous processus
~> set --universal a 5
rend la variable accessible à toutes les instances de Fish de l’utilisateur. Cette variable sera accessible même après un redémarrage du shell.
L’autocomplétion :
~> ls |-l -r -t
Si je tapais ls |
(|
désigne le curseur) puis tab, le shell proposerait
~> ls |-l -r -t
avec la partie à droite de |
grisée
Alt-F permettrait alors d’obtenir ls -l
, alors qu’avec la flèche droite nous obtiendrons ls -l -r -t
.
Ce n’est pas celle que vous voyez, mais la coloration syntaxique fonctionne en mode interactif.
Une version locale de la documentation est accessible par la commande help
, qui s’ouvrira dans votre navigateur. Elle est d’excellente qualité, mais en anglais seulement. Un certain nombre de commandes disposent également de leurs pages de manuels accessible avec la commande man
.
# Exemple de répertoire malsain
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 10.
Tu as fait exprès de te mettre dans un répertoire qui contient des fichiers avec des noms aussi perturbants ? À lire ça une première fois, j'ai eu l'impression que Fish utilisait des noms de fichiers magiques « entrée », « erreur » et « sortie_standard », utilisables dans tout répertoire mais en réalité inexistants et reconnus comme mots-clefs. Un peu comme les CON, LPT et COMM1 de DOS.
[^] # Re: Exemple de répertoire malsain
Posté par pachamaro . Évalué à 1.
Désolé, je les avais crée en testant
et cela me faisait quelques répertoires "neutres" à montrer.
# Rien compris sur l'autocomplétion
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 4.
Je n'ai rien compris au passage sur l'autocomplétion.
Pas chez moi. Quand je tape
ls
, suivi d'une espace, et que j'appuie sur tab, Fish m'affiche le contenu du répertoire courant, ce qui est un comportement semblable à tous les shells interactifs que je connais. En revanche, il commence à compléter avec le premier, mais visiblement sans activer cette complétion, ce qui est effectivement assez original. Pas de-l -r -t
en vue.[^] # Re: Rien compris sur l'autocomplétion
Posté par Guillaume Smet (site web personnel) . Évalué à 1.
De ce que j'ai compris, ça va te le proposer si tu as exécuté la commande auparavant. Il y a un exemple avec une commande SSH sur le site.
[^] # Re: Rien compris sur l'autocomplétion
Posté par Frank-N-Furter . Évalué à 2.
C’est l’équivalant d'un -R ?
Depending on the time of day, the French go either way.
[^] # Re: Rien compris sur l'autocomplétion
Posté par Guillaume Smet (site web personnel) . Évalué à 1.
Oui, ça a l'air, sauf que ça le propose comme de la complétion.
[^] # Re: Rien compris sur l'autocomplétion
Posté par pachamaro . Évalué à 0.
Oui.
peut fournir une liste avec plus d'un élément.
[^] # Re: Rien compris sur l'autocomplétion
Posté par pachamaro . Évalué à 0.
C'est exactement ça. J'aurai dû le mentionner.
[^] # Re: Rien compris sur l'autocomplétion
Posté par Benoît Laurent (site web personnel) . Évalué à 1. Dernière modification le 11 avril 2018 à 09:40.
En fait il y a un autre type de complétion si on fait TAB après un '-' ça propose les options disponibles sur 3 colonnes :
Pas réussi à faire mieux pour l'exemple.
# coloration syntaxique en mode interactif
Posté par Jarvis . Évalué à 2.
C'est pour moi la fonctionnalité qui manque au Bash pour les débutants. C'est comme ça que j'ai connu fish.
# Pipe erreur
Posté par Colin Pitrat (site web personnel) . Évalué à 1.
Du coup, comment on fait l'équivalent de:
[^] # Re: Pipe erreur
Posté par pachamaro . Évalué à 1.
Tout simplement en redirigeant vers /dev/stdout :
[^] # Re: Pipe erreur
Posté par wismerhill . Évalué à 3.
C'est du coup plus long à écrire.
D'autant qu'avec bash (et probablement d'autres), on a une version encore plus courte:
[^] # Re: Pipe erreur
Posté par pachamaro . Évalué à 2.
En Bash,
1
désigne stdout, et2
stderr. Cela peut avoir une cohérence il me semble lorsque l'on connaît certains appels systèmes. Ceci dit, stderr – standard error – et stdout – standard output – sont moins cryptiques que1
et2
. Et /dev/std… fonctionneront quel que soit le langage utilisé. Ils sont liés à Linux (Peut-être pourrais-je dire à Unix/POSIX ?).Et quid de la cohérence ?
En Bash :
>&1
redirige vers/dev/stdout
>&2
redirige vers/dev/stderr
Le symbole de redirection serait donc
>
.Et le pipe | redirigerait la sortie standard vers le programme à sa droite.
Sauf que avec
|&
, | redirige non stdout mais stderr, et non vers le programme à sa droite, mais vers&
qui désigne cette fois non la mise en arrière plan mais/dev/stdout
.Avec Fish, l'esperluette a un usage unique, la mise en arrière plan, de même que
>
redirige toujours stdout, et^
toujours vers stderr.[^] # Re: Pipe erreur
Posté par barmic . Évalué à 2.
Parce que
^
est moins cryptique ?1, 2 et 3 c'est POSIX, hein ? En fait le bourn shell est POSIX donc comme argument ça ne marche pas très bien :)
[^] # Re: Pipe erreur
Posté par wismerhill . Évalué à 2.
Non, il redirige les deux.
D'après la page de manuel de bash (version 4.3):
C'est donc bien l'équivalent de l'exemple donné dans le message d'origine.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.