shell 变量的切换/宏/xargs 之类的东西

shell 变量的切换/宏/xargs 之类的东西

所以我一直在做大量的交叉编译,并且经常输入这样的东西

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
  "$@"
}

相关内容