如何在鱼壳中仅为一个命令设置环境变量?


49

用bash,我可以做EDITOR=vim crontab -e。我可以在鱼壳中得到类似的效果吗?

Answers:


27
begin; set -lx EDITOR vim; crontab -e; end

2
有没有更简单的方法可以做到这一点?
米洛万·佐格维奇

奇怪的是,这对我不起作用。我正在调用ruby脚本,并且ENV不会选择我设置的变量:set -lx date '12/04/2012'
Duke Duke

@Duke:对我有用。begin; set -lx date '12/04/2012'; ruby -e 'puts ENV["date"]'; end
丹尼斯·威廉姆森

10
同时,这已在Fish FAQ中得到了解答:fishshell.com/docs/current/faq.html#faq-single-env
危害

2
FAQ所说的是:env SOME_VAR=1 command
BallpointBen

72

不明白为什么这不起作用: env EDITOR=vim crontab -e
完全绕过了外壳。


3
这非常容易。唯一的问题是绕过外壳不允许任何自定义的fish命令,这些命令可能已锁定在您的肌肉记忆中。
JohnMetta

我也在文档中看到了,但是为什么下面的代码不起作用?env SOME_VAR=1 echo $SOME_VAR
lmsurprenant

没关系,我应该查看一下:stackoverflow.com/questions/10938483/…–
lmsurprenant

10

那是从文档

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

使用env命令。

env SOME_VAR=1 command

您还可以在一个块中声明一个局部变量,该变量不会绕过外壳

begin
  set -lx SOME_VAR 1
  command
end

2

根据功能的定义be,这可能会失败

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

为了使其工作:

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

请参阅--no-scope-shadowing选项的说明

-S或--no-scope-shadowing允许函数访问调用函数的变量。通常,函数中与调用函数中的变量具有相同名称的任何变量都会被“阴影化”,并且其内容与调用函数无关。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.