Як я можу встановити змінну середовища лише для однієї команди в рибній оболонці?


49

У баші я можу зробити EDITOR=vim crontab -e. Чи можна отримати подібний ефект в шкаралупі Риби?

Відповіді:


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

2
чи є простіший спосіб зробити це?
Мілован Зогович

як не дивно, це не працює для мене. Я дзвоню рубіновий скрипт, і ENV не підбирає змінну, яку я встановлюю:set -lx date '12/04/2012'
Герцог

@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
Лемспрепарат

ніколи не заперечуєте, я повинен був просто подивився його: 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-range-shadowing

-S або --no-range-shadowing дозволяє функції отримувати доступ до змінних викликових функцій. Зазвичай будь-які змінні всередині функції, які мають те саме ім’я, що і змінні з викликової функції, є "затіненими", а їх зміст не залежить від викличної функції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.