Mar*_*ver 333 bash environment-variables
在给定的shell中,通常我会设置一个或多个变量,然后运行一个命令.最近我了解了将变量定义添加到命令的概念:
FOO=bar somecommand someargs
Run Code Online (Sandbox Code Playgroud)
这工作......有点儿.当你改变一个LC_*变量(它似乎影响命令而不是它的参数,例如'[az]'字符范围)或者输出到另一个命令时,它不起作用:
FOO=bar somecommand someargs | somecommand2 # somecommand2 is unaware of FOO
Run Code Online (Sandbox Code Playgroud)
我可以在"FOO = bar"之前添加somecommand2,但是它可以添加不需要的重复,但它对根据变量解释的参数没有帮助(例如'[az]')
那么,在一条线上做这件事的好方法是什么?我正在考虑以下顺序:
FOO=bar (somecommand someargs | somecommand2) # Doesn't actually work
Run Code Online (Sandbox Code Playgroud)
编辑:我有很多好的答案!目标是保持一个单行,最好不使用"导出".使用bash调用的方法总体上是最好的,尽管带有"export"的括号版本更紧凑.使用重定向而不是管道的方法也很有趣.
Pau*_*ce. 295
FOO=bar bash -c 'somecommand someargs | somecommand2'
Run Code Online (Sandbox Code Playgroud)
0xC*_*22L 191
如何导出变量,但仅在子shell中?:
(export FOO=bar && somecommand someargs | somecommand2)
Run Code Online (Sandbox Code Playgroud)
Keith有一个观点,无条件执行命令,执行此操作:
(export FOO=bar; somecommand someargs | somecommand2)
Run Code Online (Sandbox Code Playgroud)
gni*_*urf 42
您还可以使用eval
:
FOO=bar eval 'somecommand someargs | somecommand2'
Run Code Online (Sandbox Code Playgroud)
由于这个答案eval
似乎并不能让所有人满意,所以让我澄清一下:当使用单引号书面时,它是完全安全的.这很好,因为它不会启动外部进程(如接受的答案),也不会在额外的子shell中执行命令(如另一个答案).
当我们得到一些常规观点时,给予eval
每个人满意的替代方案可能是好的,并且具有这种快速eval
"技巧"的所有好处(甚至可能更多!).只需使用一个功能!使用所有命令定义函数:
mypipe() {
somecommand someargs | somecommand2
}
Run Code Online (Sandbox Code Playgroud)
并使用您的环境变量执行它,如下所示:
FOO=bar mypipe
Run Code Online (Sandbox Code Playgroud)
Akh*_*gam 12
一个简单的方法是利用
;
例如:
ENV=prod; ansible-playbook -i inventories/$ENV --extra-vars "env=$ENV" deauthorize_users.yml --check
Run Code Online (Sandbox Code Playgroud)
command1; command2
在执行 command1 之后,依次执行 command2。命令是否成功并不重要。
使用env
。
例如,env FOO=BAR command
。请注意,command
完成执行后,环境变量将再次恢复/不变。
请注意外壳替换的发生,即,如果要$FOO
在同一命令行上显式引用,则可能需要对其进行转义,以便您的外壳解释程序在运行之前不执行替换env
。
$ export FOO=BAR
$ env FOO=FUBAR bash -c 'echo $FOO'
FUBAR
$ echo $FOO
BAR
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
222678 次 |
最近记录: |