简体   繁体   English

在bash one-liner中为多个命令设置环境变量

[英]Setting environment variables for multiple commands in bash one-liner

Let's say I have following command假设我有以下命令

$> MYENVVAR=myfolder echo $MYENVVAR && MYENVVAR=myfolder ls $MYENVVAR $> MYENVVAR=myfolder echo $MYENVVAR && MYENVVAR=myfolder ls $MYENVVAR

I mean that MYENVVAR=myfolder repeats我的意思是 MYENVVAR=myfolder 重复

Is it possible to set it once for both "&&" separated commands while keeping the command on one line?是否可以为两个“&&”分隔的命令设置一次,同时将命令保留在一行上?

Assuming you actually need it as an environment variable (even though the example code does not really need an environment variable; some shell variables are not environment variables):假设您实际上需要它作为环境变量(即使示例代码并不真正需要环境变量;一些 shell 变量不是环境变量):

(export MYENVVAR=myfolder; echo $MYENVVAR && ls $MYENVVAR)

If you don't need it as an environment variable, then:如果您不需要它作为环境变量,则:

(MYENVVAR=myfolder; echo $MYENVVAR && ls $MYENVVAR)

The parentheses create a sub-shell;括号创建一个子壳; environment variables (and plain variables) set in the sub-shell do not affect the parent shell.在子 shell 中设置的环境变量(和普通变量)不会影响父 shell。 In both commands shown, the variable is set once and then used twice, once by each of the two commands.在显示的两个命令中,变量设置一次,然后使用两次,两个命令中的每一个都使用一次。

Parentheses spawn new proces, where you can set its own variables:括号产生新的过程,您可以在其中设置自己的变量:

( MYENVVAR=myfolder; echo  1: $MYENVVAR; ); echo  2: $MYENVVAR;
1: myfolder
2:

Did you consider using export like您是否考虑过使用export 之类的

export MYENVVAR=myfolder

then type your commands like echo $MYENVVAR (that would work even in sub-shells) etc然后输入您的命令,例如echo $MYENVVAR (即使在子外壳中也可以使用)等

Wrapping the commands into a string and using eval on them is one way not yet mentioned:将命令包装成一个字符串并对它们使用eval是一种尚未提及的方法:

a=abc eval 'echo $a; echo $a'
a=abc eval 'echo $a && echo $a'

Or, if you want to use a general-purpose many-to-many mapping between environment variables and commands, without the need to quote your commands, you can use my trap -based function below:或者,如果您想在环境变量和命令之间使用通用的多对多映射,而无需引用您的命令,您可以使用我下面的基于trap的函数:

envMulti()
{
shopt -s extdebug;
PROMPT_COMMAND="$(trap -p DEBUG | tee >(read -n 1 || echo "trap - DEBUG")); $(shopt -p extdebug); PROMPT_COMMAND=$PROMPT_COMMAND";
eval "trap \"\
[[ \\\"\\\$BASH_COMMAND\\\" =~ ^trap ]] \
|| { eval \\\"$@ \\\$BASH_COMMAND\\\"; false; }\" DEBUG";
}

Usage:用法:

envMulti a=aaa b=bbb; eval 'echo $a'; eval 'echo $b'

Note: the eval 'echo...' s above have nothing to do with my script;注意:上面的eval 'echo...'与我的脚本无关; you can never do a=aaa echo $a directly, because the $a gets expanded too early.您永远不能直接执行a=aaa echo $a ,因为$a过早扩展。

Or use it with env if you prefer (it actually prefixes any commands with anything):或者,如果您愿意,也可以将它与env使用(它实际上在任何命令前加上任何内容):

echo -e '#!/bin/bash\n\necho $a' > echoScript.sh
chmod +x echoScript.sh
envMulti env a=aaa; ./echoScript.sh; ./echoScript.sh

Note: created a test script just to demonstrate usage with env , which can't accept built-ins like eval as used in the earlier demo.注意:创建了一个测试脚本只是为了演示env用法,它不能接受像早期演示中使用的eval这样的内置eval

Oh, and the above were all intended for running your own shell commands by-hand.哦,以上都是为了手动运行你自己的 shell 命令。 If you do anything other than that, make sure you know all the cautions about using eval -- ie make sure you trust the source of the commands, etc.如果您不这样做,请确保您了解有关使用eval所有注意事项——即确保您信任命令的来源等。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM