foo如果我想在每次使用时将 的值设置为等于“bar” git status,我将如何继续执行此操作?我的第一个想法是设置一个别名,status="status && foo=bar"但是当我尝试这样做时echo $foo,我没有得到“bar”回声;但是,如果我手动将其全部输入为git status && foo=bazand then echo $foo,我的输出是“baz”。为什么我不能在别名中声明变量?
我观察到,如果我要切换顺序并且出于某种原因这样做,alias git="foo=bar && git"并且如果我尝试任何 git 命令并且echo foo它等于“bar”。
Git 别名由以下人员运行:
\n!: 开头,在这种情况下您无法设置新的环境变量;或者!.POSIX 兼容 shell 允许通过两种方式设置环境变量:
\nVAR=value command\nRun Code Online (Sandbox Code Playgroud)\n或者:
\nVAR=value; export VAR; command1; command2; ...; commandN\nRun Code Online (Sandbox Code Playgroud)\n第二个变体可以写成:
\nexport VAR=value; command1; ...; commandN\nRun Code Online (Sandbox Code Playgroud)\n显式导出的变量是为所有以这种方式调用的命令设置的\xe2\x80\x94 VAR=value command,而不是为单个命令设置它\xe2\x80\x94,因为此设置是在shell 中完成的,并且一直持续到 shell 本身退出,然后该设置会随着 shell 退出而消失。所以 ifx是 Git 别名:
git x\nRun Code Online (Sandbox Code Playgroud)\n运行该别名,它可以在别名本身运行的任何命令的持续时间内设置环境变量设置。然后运行这些命令的 shell 退出,所有设置都消失。
\n因此,Git 别名实际上不可能在用于运行该别名的命令行 shell 中设置任何环境变量。这对于所有命令都是如此,而不仅仅是 Git 命令:没有命令可以在任何“外部”shell 中设置环境变量。
\n有一个逃生口,那就是:当您自己编写 shell 命令时,您就拥有了控制权。例如,您可以编写相当愚蠢的 shell 命令:
\nexport VAR=$(echo value)\nRun Code Online (Sandbox Code Playgroud)\n其中对括号$(echo value)进行求值,然后将其输出替换。但这确实意味着如果某个程序打印您想要保存的某个值,您可以编写:
var=$(command)\nRun Code Online (Sandbox Code Playgroud)\n它将本地 shell 变量设置var为输出,或者:
export VAR=$(command)\nRun Code Online (Sandbox Code Playgroud)\n它设置 shell 变量并将其导出。(注意:这里的大写只是约定:导出的本地 shell 变量通常全部大写,而不导出的本地 shell 变量通常全部小写。)
\n还有第二个逃生舱口,但使用它是有风险的:POSIX shell 有一个eval命令将文本反馈给 shell 解释器。export VAR1=value1; export VAR2=value2我们可以将其与打印输出的程序一起使用:
eval `ssh-agent -s`\nRun Code Online (Sandbox Code Playgroud)\n在这里,ssh-agent程序设置代理,然后打印几个适当的export命令。然而,如果ssh-agent程序 print rm -rf /, usingeval ssh-agent -s将继续删除它可以删除的每个文件:这意味着您对该命令给予了极大的信任ssh-agent。
您可以使用shell别名来创建一些易于输入的命令,例如gst,由变量设置操作和 Git 命令组成:
alias gst=\'foo=bar && git status\'\nRun Code Online (Sandbox Code Playgroud)\n这不是Git别名。这是shell别名。 POSIX 现在需要 shell 别名(感谢 KamilCuk 的指点)。Bash 总是有它们,尽管一些非常古老的非 bash shell 可能没有它们。
\n| 归档时间: |
|
| 查看次数: |
1336 次 |
| 最近记录: |