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

时间:2012-12-24 18:52:48

标签: linux bash command-line

假设我有以下命令

  

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

我的意思是MYENVVAR = myfolder重复

是否可以为“&&”设置一次在将命令保持在一行的同时分离命令?

4 个答案:

答案 0 :(得分:27)

假设您确实需要它作为环境变量(即使示例代码实际上不需要环境变量;某些shell变量不是环境变量):

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

如果您不需要它作为环境变量,那么:

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

圆括号创建一个子shell;在子shell中设置的环境变量(和普通变量)不会影响父shell。在显示的两个命令中,变量设置一次然后使用两次,两次命令分别使用一次。

答案 1 :(得分:3)

括号产生新进程,您可以在其中设置自己的变量:

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

答案 2 :(得分:0)

您是否考虑使用export之类的

export MYENVVAR=myfolder

然后输入你的命令echo $MYENVVAR(即使在子shell中也能工作)等等

答案 3 :(得分:0)

将命令包装成字符串并在其上使用 eval 是一种尚未提及的方法:

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

或者,如果您想在环境变量和命令之间使用通用的多对多映射,而无需引用您的命令,您可以使用我下面基于 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";
}

用法:

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

注意:上面的eval 'echo...'与我的脚本无关;您永远不能直接执行 a=aaa echo $a,因为 $a 过早扩展。

如果您愿意,也可以将它与 env 一起使用(它实际上在任何命令前加上任何内容):

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

注意:创建了一个测试脚本只是为了演示 env 的用法,它不能接受像前面演示中使用的 eval 这样的内置函数。

哦,以上都是为了手动运行您自己的 shell 命令。如果您不这样做,请确保您了解有关使用 eval 的所有注意事项 - 即确保您信任命令的来源等。