Как я могу установить переменную среды только для одной команды в оболочке рыбы?


49

В Bash я могу сделать EDITOR=vim crontab -e. Могу ли я получить подобный эффект в рыбной раковине?

Ответы:


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

2
Есть ли более простой способ сделать это?
Милован Зогович

странно, это не работает для меня. Я вызываю скрипт ruby, и ENV не берет переменную, которую я устанавливаю:set -lx date '12/04/2012'
Duke

@Duke: это работает для меня. begin; set -lx date '12/04/2012'; ruby -e 'puts ENV["date"]'; end
Деннис Уильямсон

10
Тем временем на этот вопрос ответили в 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
Это намного проще. Единственная проблема состоит в том, что обход оболочки запрещает любые пользовательские команды рыбы, которые, вероятно, заблокированы в вашей мышечной памяти.
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 позволяет функции получать доступ к переменным вызывающих функций. Обычно любые переменные внутри функции, которые имеют то же имя, что и переменные из вызывающей функции, являются «затененными», и их содержимое не зависит от вызывающей функции.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.