读取命令不适用于 Git 别名

Read command not working with Git aliases

sp = "!echo name && read name"

我已将其添加到我的别名列表中。当我 运行 它按预期打印“名称”时,我可以输入一些内容进行阅读;但在回车和尝试 echo $name 时,什么也没有。

当我直接 运行 终端中的命令并且我输入的任何内容都存储在 $name 中时,它工作正常。

我还有另一个问题,这是第一个问题,我试图尽可能地简化它以解决上述问题,但这是原始问题:

sp = "!read branch\"?Branch Name: \""

每当我通过 git sp 运行 时,我都会收到错误消息 read branch"?Branch Name:": line 0: read: `branch?Branch Name:': not a valid identifier

将错误的第一位(即命令文本)复制粘贴到终端中,然后直接 运行 使其完美运行,因此它不可能是某处的某种无效隐藏字符,但我不能确定 git 是如何替换东西的。

我在 macos monterey 上使用 terminal.app 和 zsh。谢谢。

[有了最初想要的别名,你得到:]

read branch"?Branch Name:": line 0: read: `branch?Branch Name:': not a valid identifier

Git 运行 将别名输入 /bin/sh。该:

read var?"prompt string"

语法是内置 zsh read 所特有的(参见,例如,https://zsh.sourceforge.io/Doc/Release/Shell-Builtin-Commands.html);在 /bin/sh 中,这是试图读入名为 var?prompt string 的变量,由于嵌入了 question-mark 和 space.

,这不是有效的变量名称

要直接使用 zsh 脚本,请使脚本可执行,将其放在您的 $PATH 中,并将其命名为 git-sp。那么:

git sp

将 运行 您的 git-sp 脚本。由于您的脚本将以 #! /bin/zsh 开头,您将获得 zsh 而不是普通的 sh,并且您将可以访问所需的 read built-in。此外,您不必处理将整个命令作为单行别名嵌入所产生的所有复杂情况:

When I run [a simplified version,] "name" is printed as expected and I can input something into read; but on carriage returning and trying echo $name, nothing's there.

每个命令都是 运行 通过 单独的 shell 调用。读入变量的值一直存在,直到 shell 调用退出(或者您在同一调用中覆盖或取消设置它们);然后他们蒸发了。要更永久地存储一些东西,请使用文件系统。考虑将设置存储在 git config 数据库中(--global 和 per-repository):您可以在此处自行命名。您冒着 运行 未来某些 Git 版本(git version 3.1415?)可能窃取您的名字并将其用于自己目的的风险,但这取决于您选择的名字space ,你可以让这不太可能。例如:

git config --global torek.user.setting1 value1
git config --global torek.user.setting2 value2

如果 future-Git 决定使用 torek.* 设置,我只会在这里遇到麻烦。 (Perhaps it's being worked on by a Slovenian on a Tuesday.)