所以我一直在做大量的交叉编译,并且经常输入这样的东西
FOO=bar command --some-args
BAZ=qxt other-command --other-args
但显然真正的 shell 变量很长而且输入起来很麻烦。 Bash 不是动态语言,因此反引号不起作用(它尝试运行命令 FOO=bar)。 xargs 是错误的,尽管类似的东西在命令评估之前起作用会很好。如果我只是将它们放在命令之前,将我想要的 shell 变量设置为环境变量会遇到与反引号相同的问题;每次显式地更改 envs 都会给我带来与 shell 变量相同的繁琐的输入问题,并且还增加了污染我以后的环境的乐趣。有没有类似pushenv 和popenv 的东西?
有什么方法可以通过短句柄存储和检索我可能需要的所有 shell 变量,这样我就可以做类似的事情
shellvars1 command --some-args
shellvars2 other-command --other-args
shell 变量的不同组合很大但有限,因此如果有一种方法将其卸载到帮助程序脚本中,我可以将它们全部键入一次,但我只是想不出一种方法来做到这一点。
加分点:bash 是否有类似 tcsh 的能力
!24:s/FOO/BAZ/
?
这也可能有帮助(尽管没有那么大)。我主要是想消除我在拼写错误方面表现出超自然能力的机会。
答案1
您似乎对什么是 shell 变量、什么不是有些困惑。您帖子中的所有变量都是环境变量,而不是 shell 变量。设置 shell 变量:
foo=bar
要设置环境变量:
export FOO=BAR
(或 c shell 中的 setenv)。但在
FOO=BAR command
与直觉相反,赋值的含义与以前不同,并且仅在命令的环境中设置环境变量。也就是说,这个简单的脚本应该可以满足您的需求:
#!/bin/bash
VAR1=VAL1 ... VALN=VARN "$@"
至于额外的问题:我不认为 bash 可以做到这一点,但 zsh 很棒并且可以做到。两个都
^FOO^BAR
和
!!:s/FOO/BAR/
具有相同的效果,对于您的具体示例:
!24:s/FOO/BAR/
答案2
您可以将变量赋值放在别名中。
alias shellvars1='FOO=bar '
alias shellvars2='BAZ=qxt '
变量末尾的空格告诉 shell 也考虑别名扩展的后续单词。例如,如果a
是 的别名somecommand --option
,则shellvars1 shellvars2 a wibble
运行FOO=bar BAZ=qxt somecommand --option a
。
您也可以使用函数。如果分配是固定的,则使用别名;如果您想要更大的灵活性(例如条件分配),则使用函数。
shellvars1 () {
local tmp=2
FOO=$((tmp + tmp)) "$@"
}
…
shellvars1 mycommand
您还可以将变量设置为函数的局部变量。如果变量是函数的局部变量,则export
指令也仅限于该函数的范围。
shellvars1 () {
local FOO=bar
export FOO
"$@"
}