读取命令不适用于 Git 别名



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蒙特雷使用 terminal.app 和zsh。谢谢。

[使用原始所需的别名,您可以得到:]

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

Git 通过将别名提供给/bin/sh来运行别名。 这:

read var?"prompt string"

语法是内置的 zshread所特有的(例如,参见 https://zsh.sourceforge.io/Doc/Release/Shell-Builtin-Commands.html);在/bin/sh 中,这是尝试读取名为var?prompt string的变量,由于嵌入的问号和空格,该变量名称不是有效的变量名。

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

git sp

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

当我运行[简化版本]时,"名称"按预期打印,我可以输入一些内容进行读取; 但是在回车并尝试echo $name时,什么都没有。

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

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

只有当 future-Git 决定使用torek.*设置时,我才会在这里遇到麻烦。 (也许它正在由一个斯洛文尼亚人在星期二工作。

最新更新