[英]Setting environment variables for multiple commands in bash one-liner
假设我有以下命令
$> MYENVVAR=myfolder echo $MYENVVAR && MYENVVAR=myfolder ls $MYENVVAR
我的意思是 MYENVVAR=myfolder 重复
是否可以为两个“&&”分隔的命令设置一次,同时将命令保留在一行上?
假设您实际上需要它作为环境变量(即使示例代码并不真正需要环境变量;一些 shell 变量不是环境变量):
(export MYENVVAR=myfolder; echo $MYENVVAR && ls $MYENVVAR)
如果您不需要它作为环境变量,则:
(MYENVVAR=myfolder; echo $MYENVVAR && ls $MYENVVAR)
括号创建一个子壳; 在子 shell 中设置的环境变量(和普通变量)不会影响父 shell。 在显示的两个命令中,变量设置一次,然后使用两次,两个命令中的每一个都使用一次。
括号产生新的过程,您可以在其中设置自己的变量:
( MYENVVAR=myfolder; echo 1: $MYENVVAR; ); echo 2: $MYENVVAR;
1: myfolder
2:
将命令包装成一个字符串并对它们使用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
这样的内置eval
。
哦,以上都是为了手动运行你自己的 shell 命令。 如果您不这样做,请确保您了解有关使用eval
所有注意事项——即确保您信任命令的来源等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.