Journal petite introduction à Fish

Posté par  . Licence CC By‑SA.
Étiquettes :
23
10
avr.
2018

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  (site web personnel) . Évalué à 10.

    untel@hostname ~> ls
    entrée  erreur  kakoune/  sortie_standard

    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  . Évalué à 1.

      Désolé, je les avais crée en testant

      cat < entrée > ./sortie_standard ^ ./erreur

      et cela me faisait quelques répertoires "neutres" à montrer.

  • # Rien compris sur l'autocomplétion

    Posté par  (site web personnel) . Évalué à 4.

    Je n'ai rien compris au passage sur l'autocomplétion.

    L’autocomplétion :

    ~> ls |-l -r -t`

    Si je tapais ls | (| désigne le curseur) puis tab, le shell proposerait

    ~> ls |-l -r -t

    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.

  • # coloration syntaxique en mode interactif

    Posté par  . Évalué à 2.

    Ce n’est pas celle que vous voyez, mais la coloration syntaxique fonctionne en mode interactif.

    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  (site web personnel) . Évalué à 1.

    Du coup, comment on fait l'équivalent de:

    ./a.out 2>&1 | grep toto
    
    • [^] # Re: Pipe erreur

      Posté par  . Évalué à 1.

      Tout simplement en redirigeant vers /dev/stdout :

      ./a.out ^/dev/stdout | grep toto
      • [^] # Re: Pipe erreur

        Posté par  . É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:

        ./a.out |& grep toto
        
        • [^] # Re: Pipe erreur

          Posté par  . Évalué à 2.

          En Bash, 1 désigne stdout, et 2 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 que 1 et 2. 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  . Évalué à 2.

            En Bash, 1 désigne stdout, et 2 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 que 1 et 2.

            Parce que ^ est moins cryptique ?

            Et /dev/std… fonctionneront quel que soit le langage utilisé. Ils sont liés à Linux (Peut-être pourrais-je dire à Unix/POSIX ?).

            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  . Évalué à 2.

            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.

            Non, il redirige les deux.
            D'après la page de manuel de bash (version 4.3):

            If |& is used, command's standard error, in addition to its standard output, is connected to command2's standard input through the pipe; it is shorthand for 2>&1 |. This implicit redirection of the standard error to the standard output is performed after any redirections specified by the command.

            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.