gpt4 book ai didi

git - 我应该使用 `sh -c\"...\"` 还是 `"!f() {... ; }; f"在 git 别名脚本中?

转载 作者:太空狗 更新时间:2023-10-29 13:31:09 33 4
gpt4 key购买 nike

我一直在尝试编写带参数的 git 别名。我见过一些人用

运行 shell 脚本
[alias]
shAlias = !sh -c \" ... \"

和其他运行功能的

[alias]
fAlias = "!f() { ... ; }; f"

似乎(一旦我加快了 Bash 的速度——这还不是我的水平)我想做的任何事情都可以用任何一种形式完成。

在什么情况下一个比另一个更可取?

除了可行性之外,是否存在加工差异?内存使用/速度/等?

最佳答案

TL;DR:对最简单的命令使用函数方法,并在遇到任何引用问题时切换到外部脚本。一起避免 sh -c


我们可以have a look at the git source .它以 git 特定方式解析引号,如果结果没有 shell 元字符(包括空格)则作为文件执行,或者执行等同于 execlp("sh", "-c ", "result\"$@\"", "result\"$@\"", args...) 否则。

基于此,创建别名的最佳方式肯定是创建一个外部脚本并使用:

[alias]
myAlias = !/path/to/script

它需要一个外部文件,但在所有其他方面它更好:

  • 你可以和任何你想要的口译员一起运行。你甚至可以运行 bash 代码,因为你要求,而其他形式只允许你运行 sh 代码(区别就像 C++ 与 C)。
  • 除非您愿意,否则不会启动额外的 shell。 git 将直接execve 你的可执行文件。
  • 不需要转义。这只是一个普通的脚本。
  • 不需要任何意外或 git 知识。这只是一个脚本。

在您的建议中,亚军是:

[alias]
fAlias = "!f() { ... ; }; f"

这不是那么棒,因为:

  • 很遗憾,您只能使用 sh 运行,因此不能使用任何 bash 功能。
  • 总是启动一个 shell,但至少它只是一个。
  • 引号需要一些 git 特定的转义。
  • 您需要了解 git 的转义,但通常无需确切知道它是如何执行命令的,因为您将只使用函数的参数。

最后一个是迄今为止最糟糕的:

[alias]
shAlias = !sh -c \" ... \"

这很糟糕,因为:

  • 您只能使用 sh 运行。
  • 它会无缘无故地启动一个额外的 shell。
  • 您需要两者 git 转义以及额外级别的 sh 转义。
  • 你需要知道如何为 sh 转义代码,如何使用 git 对其进行双重转义,以及 git 如何附加 "$@" 到您的命令(如果有其他参数),并将其他参数作为 $1$2 传递。

为了演示实际的区别,假设您想为此命令创建一个别名,以通过 ssh 获取远程服务器上的路径:

ssh "$1" 'echo "$PATH"'

您可以将其逐字复制粘贴到一个文件中,添加一个 shebang,然后使用:

[alias]
get-remote-path = !/path/to/my/script

或者你可以添加一些 git 转义并使用函数方法:

[alias]
get-remote-path = "!f() { ssh \"$1\" 'echo \"$PATH\"'; }; f"

或者我们可以用 sh -c 方法费力地逃脱并再次逃脱(不,没有最后一句话是行不通的):

[alias]
get-remote-path = !sh -c 'ssh \"$1\" '\\''echo \"$PATH\"'\\' cthulhu

显然,最好使用脚本,或者在最坏的情况下使用函数方法,直到您需要可以轻松引用的更复杂的命令。

关于git - 我应该使用 `sh -c\"...\"` 还是 `"!f() {... ; }; f"在 git 别名脚本中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46695859/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com