Comment définir une variable d'environnement pour une seule commande dans une coquille de poisson?

49

En bash, je peux faire EDITOR=vim crontab -e. Puis-je obtenir un effet similaire dans la coquille de poisson?

skalee
la source

Réponses:

27
begin; set -lx EDITOR vim; crontab -e; end
Dennis Williamson
la source
2
y a-t-il un moyen plus facile de faire cela?
Milovan Zogovic
curieusement, cela ne fonctionne pas pour moi. J'appelle un script ruby, et ENV ne prend pas la variable que je mets:set -lx date '12/04/2012'
Duke
@Duke: Cela fonctionne pour moi. begin; set -lx date '12/04/2012'; ruby -e 'puts ENV["date"]'; end
Dennis Williamson
10
Dans l'intervalle, cela a été répondu dans la FAQ sur les poissons: fishshell.com/docs/current/faq.html#faq-single-env
harm
2
Et voici ce que dit la FAQ:env SOME_VAR=1 command
BallpointBen
72

Je ne vois pas pourquoi cela ne fonctionnerait pas: env EDITOR=vim crontab -e
cela contourne complètement le shell.

Wayne
la source
3
C'est tellement plus facile. Le seul problème est que le contournement de la coque interdit toute commande de poisson personnalisée, qui est probablement verrouillée dans votre mémoire musculaire.
JohnMetta
J'ai vu cela aussi dans la documentation, mais pourquoi alors ce qui suit ne fonctionne-t-il pas? env SOME_VAR=1 echo $SOME_VAR
lmsurprenant
ça ne fait rien, j'aurais dû le regarder: stackoverflow.com/questions/10938483/…
lmsurprenant
10

C'est de la documentation

SOME_VAR=1 command produces an error: Unknown command "SOME_VAR=1".

Utilisez la commande env.

env SOME_VAR=1 command

Vous pouvez également déclarer une variable locale dans un bloc et ne pas contourner le shell

begin
  set -lx SOME_VAR 1
  command
end
Azd325
la source
2

en fonction d'une définition de befonction, cela peut échouer

begin
  set -lx RAILS_ENV staging
  be rails r "p ENV['RAILS_ENV']"
end

Pour que cela fonctionne:

function be --description 'Runs bundle exec' --no-scope-shadowing
  bundle exec $argv
end

S'il vous plaît, voir l'explication de l' option --no-scope-shadowing

-S ou --no-scope-shadowing permet à la fonction d'accéder aux variables des fonctions d'appel. Normalement, toutes les variables de la fonction qui portent le même nom que les variables de la fonction appelante sont "masquées" et leur contenu est indépendant de la fonction appelante.

Vadym Tyemirov
la source