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

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

6 ответов

Решение
begin; set -lx EDITOR vim; crontab -e; end

Не понимаю, почему это не должно работать:env EDITOR=vim crontab -e
Это полностью обходит оболочку.

Это из документации

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

Начиная с версии 3.1 , вы можете использовать тот же синтаксис, что и в bash (EDITOR=vim crontab -e).

PR, представляющий эту функцию:https://github.com/fish-shell/fish-shell/pull/6287 .

В зависимости от определения 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 позволяет функции получать доступ к переменным вызывающих функций. Обычно любые переменные внутри функции, которые имеют то же имя, что и переменные из вызывающей функции, являются "затененными", и их содержимое не зависит от вызывающей функции.

В оболочке Fish вы можете установить переменную среды только для одной команды, добавив к команде префикс назначения переменной. Вот синтаксис:

      VARNAME=value command

Например, если вы хотите установить переменную среды для определенной команды, вы должны сделать:

      MY_VARIABLE=some_value your_command_here

Это устанавливает переменную среды только на времяyour_command_hereкоманда. После завершения команды переменная среды вернется к своему предыдущему значению (или будет удалена, если ее раньше не существовало).

Вот более конкретный пример:

      MY_VARIABLE=some_value echo $MY_VARIABLE

В этом примереecho $MY_VARIABLEвыведетsome_value, но если вы проверите значениеMY_VARIABLEпосле команды оно не будет изменено:

      echo $MY_VARIABLE  # Outputs the original value of MY_VARIABLE

Этот метод специфичен для синтаксиса оболочки Fish и может не работать в других оболочках, таких как Bash или Zsh. Если вам нужен более общий подход, который работает в разных оболочках, вы можете рассмотреть возможность использования подоболочки:

      env MY_VARIABLE=some_value your_command_here

При этом создается подоболочка с указанным набором переменных среды, и изменение изолируется от этой подоболочки.

Другие вопросы по тегам