37

假设我有以下命令

$> MYENVVAR=我的文件夹回显 $MYENVVAR && MYENVVAR=我的文件夹 ls $MYENVVAR

我的意思是 MYENVVAR=myfolder 重复

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

4

4 回答 4

48

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

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

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

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

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

于 2012-12-24T20:41:35.353 回答
3

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

( MYENVVAR=myfolder; echo  1: $MYENVVAR; ); echo  2: $MYENVVAR;
1: myfolder
2:
于 2012-12-24T20:34:44.907 回答
1

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

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

或者,如果你想在环境变量和命令之间使用通用的多对多映射,而不需要引用你的命令,你可以使用trap下面的 my -based 函数:

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...'上面的s与我的脚本无关;你永远不能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——即确保你相信命令的来源等。

于 2021-03-31T13:45:33.033 回答
0

您是否考虑过使用export 之类的

export MYENVVAR=myfolder

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

于 2012-12-24T18:57:02.600 回答