2
votes

Quel est l'équivalent de $ {var: -defaultvalue} dans fish?

Bonjour, j'essaye de traduire mon .bashrc au format fish presque terminé, la plupart du temps est clair sur la documentation mais cette partie me donne mal à la tête .. c'est donc mon gnupg fonctionne avec mon yubikey ssh etc. etc. La version fish est la dernière 3.0 sous Arch GNU / Linux

original sur BASH:

~/.config/fish/config.fish (line 33): ${ is not a valid variable in fish.
if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]
       ^
from sourcing file ~/.config/fish/config.fish
        called during startup

Mine à moitié convertie en poisson:

set -e SSH_AGENT_PID
if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]
  set -x  SSH_AUTH_SOCK="/run/user/$UID/gnupg/S.gpg-agent.ssh"
end
echo "UPDATESTARTUPTTY" | gpg-connect-agent > /dev/null 2>&1


3 commentaires

Une bonne question concerne un problème spécifique étroit - alors "comment puis-je traduire programme-X en langage-Y?" est une mauvaise question, mais "quel est le moyen en langage Y d'écrire thing-X sans déclencher error-Z?" peut être une bonne. J'ai édité le titre pour le réduire de manière appropriée.


Spécifiez toujours la version des programmes que vous utilisez. Dans ce cas, le poisson 3.0 a été récemment publié, ce qui présente quelques différences pertinentes par rapport à votre question par rapport au poisson 2.x.


c'est 3.0 J'ai édité la question désolé.


3 Réponses :


1
votes

Puisque $ {var: -value} se développe en valeur si $ var est vide, vous pouvez toujours le remplacer en écrivant votre code sur le long chemin:

begin
  if test -n "$gnupg_SSH_AUTH_SOCK_by"
    set result "$gnupg_SSH_AUTH_SOCK_by"
  else
    set result 0
  end

  if [ "$result" -ne %self ]
    set -x SSH_AUTH_SOCK "/run/user/$UID/gnupg/S.gpg-agent.ssh"
  end
  set -e result
end

Notez que je n'utilise pas (a) approuver, (b) tolérer l'utilisation de, ou (c) ne pas avoir de préjugés injustifiés contre les utilisateurs de poisson. Ainsi, mon conseil est très suspect, et il est probable qu'il existe de bien meilleures façons de le faire.


0 commentaires

3
votes

Vous ne devriez pas changer votre shell de connexion tant que vous n'avez pas une bien meilleure compréhension de la syntaxe et du comportement des poissons. Par exemple, dans le poisson, l'équivalent de $$ est % self ou $ fish_pid selon la version de poisson que vous utilisez. Vous devez toujours spécifier la version du programme avec laquelle vous rencontrez des problèmes.

En supposant que vous utilisez fish 2.x qui serait écrit comme

if not set -q gnupg_SSH_AUTH_SOCK_by
or test $gnupg_SSH_AUTH_SOCK_by -ne %self
    set -gx SSH_AUTH_SOCK "/run/user/$UID/gnupg/S.gpg-agent.ssh"
end

Notez également qu'il n'y a pas de signe égal entre le nom et la valeur de la var dans le set -x .


2 commentaires

J'utilise le dernier sur arch donc 3.0 mais je suppose que c'est rétrocompatible?


J'ai tout fonctionne, merci! <3 note que j'ai dû créer une variable $ UID car fish ne vous donne pas cela, donc créé un ensemble UID (id -u)



1
votes

J'avais une question similaire, liée aux variables XDG_ *.

set -U XDG_CACHE_HOME ~/.cache
set -U XDG_CONFIG_HOME ~/.config
set -U XDG_DATA_HOME ~/.local/share

Ce que j'ai trouvé comme la meilleure alternative est de simplement définir les variables universelles une fois pour les valeurs par défaut--

XXX

Ensuite, dans le (s) fichier (s) de configuration de poisson ou les scripts, utilisez simplement "$ XDG_CONFIG_HOME" / ... . La valeur d'une variable d'environnement exportée remplacera la variable universelle si elle est définie, sinon la variable universelle est là comme valeur par défaut / de secours. Si la variable universelle est utilisée, elle n'est pas exportée vers les processus enfants, alors qu'une variable d'environnement exportée l'est, qui fournit l'équivalent complet du développement des paramètres bash | zsh.


1 commentaires

Ma question similaire était fermé comme un double de celui-ci, j'ai donc pensé partager mes résultats ici, même si ma réponse ne correspond pas directement à la question exacte posée.