В данной оболочке обычно я устанавливаю переменную или переменные и затем запускаю команду. Недавно я узнал о концепции добавления определения переменной к команде:
FOO=bar somecommand someargs
Это работает ... вроде. Это не работает, когда вы изменяете переменную LC_ * (которая, кажется, влияет на команду, но не на ее аргументы, например, '[az]' char char)) или когда таким образом передается вывод в другую команду:
FOO=bar somecommand someargs | somecommand2 # somecommand2 is unaware of FOO
Я также могу добавить к некоторой команде2 "FOO = bar", которая работает, но добавляет нежелательное дублирование и не помогает с аргументами, которые интерпретируются в зависимости от переменной (например, '[az]').
Итак, что хорошего способа сделать это в одной строке?
Я думаю что-то порядка:
FOO=bar (somecommand someargs | somecommand2) # Doesn't actually work
Я получил много хороших ответов! Цель состоит в том, чтобы сохранить это в одну строку, желательно без использования «экспорта». Метод, использующий вызов Bash, был лучшим в целом, хотя версия в скобках с «экспортом» была немного более компактной. Интересен также способ использования перенаправления, а не канала.
источник
(T=$(date) echo $T)
будет работатьОтветы:
источник
somecommand
как sudo, вам нужно передать sudo-E
флаг для передачи через переменные. Потому что переменные могут создавать уязвимости. stackoverflow.com/a/8633575/1695680FOO_X=foox bash -c 'echo $FOO_X'
работает как положено, но с определенными именамиDYLD_X=foox bash -c 'echo $DYLD_X'
переменных не работает: echos blank. оба работают, используяeval
вместоbash -c
Как насчет экспорта переменной, но только внутри subshell ?:
У Кейта есть смысл безоговорочно выполнять команды:
источник
;
а не&&
; нет пути,export FOO=bar
который потерпит неудачу.&&
выполняет левую команду, затем выполняет правую команду, только если левая команда выполнена успешно.;
выполняет обе команды безоговорочно.cmd.exe
Эквивалент Windows batch ( );
- это&
.(FOO=XXX ; echo FOO=$FOO) ; echo FOO=$FOO
выходыFOO=XXX\nFOO=\n
.source
(иначе.
) в этом случае? Кроме того, в наши дни не следует больше использовать обратные кавычки, и это одна из причин, по которой использование$(command)
становится более безопасным.bash
но может быть чем-то другим, напримерdash
), и у меня не возникнет никаких проблем, если я должен использовать кавычки внутри команды args (someargs
).Вы также можете использовать
eval
:Поскольку этот ответ
eval
не всем нравится, позвольте мне кое-что прояснить: при использовании в письменном виде с одинарными кавычками он совершенно безопасен. Это хорошо, так как он не будет запускать внешний процесс (например, принятый ответ) и не будет выполнять команды в дополнительной подоболочке (как и другой ответ).Поскольку мы получаем несколько регулярных просмотров, вероятно, было бы неплохо дать альтернативу
eval
, которая понравится всем, и имеет все преимущества (и, возможно, даже больше!) Этого быстрогоeval
«трюка». Просто используйте функцию! Определите функцию со всеми вашими командами:и выполните его с переменными вашей среды следующим образом:
источник
eval
.eval
это зло без понимания того , что зло оeval
. И, может быть, вы все-таки не совсем понимаете этот ответ (и в этом нет ничего плохого). На том же уровне: вы бы сказали, чтоls
это плохо, потому чтоfor file in $(ls)
это плохо? (и да, вы не понизили принятый ответ и не оставили комментарий). ТАК иногда такое странное и абсурдное место.eval
eval
говорите как парень, который когда-то читал, является злом, не понимая, в чем зло , я имею в виду ваше предложение: в этом ответе отсутствуют все предупреждения и объяснения, необходимые для разговораeval
.eval
не плохой или опасный; не болееbash -c
.eval
. В ответе при условии, что аргументы заключены в одинарные кавычки, защищая от раскрытия переменных, поэтому я не вижу проблем с ответом.eval
это проблема безопасности в целом (как,bash -c
но менее очевидная), поэтому опасности должны быть упомянуты в ответе, предлагающем его использование. Неосторожные пользователи могут взять ответ (FOO=bar eval …
) и применить его к своей ситуации, чтобы он вызвал проблемы. Но очевидно, что для ответчика было более важно выяснить, понизил ли я его и / или другие ответы, чем что-либо улучшить. Как я писал ранее, справедливость не должна быть главной заботой; Быть не хуже любого другого данного ответа также безотносительно.Использование
env
.Например,
env FOO=BAR command
. Обратите внимание, что переменные окружения будут восстановлены / неизменны снова послеcommand
завершения выполнения.Просто быть осторожным о оболочке замещения случаться, то есть , если вы хотите ссылаться
$FOO
явно в той же командной строке, вам может понадобиться , чтобы избежать его , чтобы ваш интерпретатор оболочки не выполняет замену , прежде чем он работаетenv
.источник
Используйте скрипт оболочки:
источник
export
; в противном случае$FOO
это будет переменная оболочки, а не переменная окружения, и, следовательно, не видимая дляsomecommand
илиsomecommand2
.