git 别名现在不能说 "read: illegal option -t"

git alias now fails saying "read: illegal option -t"

我刚刚将 git 配置导入到我的新笔记本电脑 运行 Ubuntu20.04 中,但由于某些原因,我的 很少git 使用 Bash read 内置的别名现在失败了。

[alias]
    try = "!read -t 5 -n 1 -p 'Confirm? [Y|n] '"
$ echo "$SHELL, $(git --version)"
/bin/bash, git version 2.25.1

$ GIT_TRACE=1 git try
23:57:46.840752 git.c:703               trace: exec: git-try
23:57:46.840829 run-command.c:663       trace: run_command: git-try
23:57:46.841147 run-command.c:663       trace: run_command: 'read -t 5 -n 1 -p '\''Confirm? [Y|n] '\'''
read -t 5 -n 1 -p 'Confirm? [Y|n] ': 1: read: Illegal option -t

建议调用 sh 在这种情况下 read 内置没有 -t 选项。

考虑到它曾经在我以前的笔记本电脑上工作......而不是依赖一些变通方法,比如在别名命令前加上 bash -c,这里使用的 shell 是可以配置的东西吗?

谢谢。

一般来说,在Linux上,确保特定解释器运行是特定脚本的方法——脚本 这里的意思是 命令存储在标记为可执行的文件中 — 文件以 #! 开头,后跟解释器的路径名。 (您可以在 #! 和解释器之间放置一个 space,我通常这样做。)

在这种情况下,这意味着使用脚本 而不是 别名。将您的程序命名为 git-try,将其放在您的 $PATH 上的目录中,并且 git try 将 运行 您的 git-try 脚本。您现在可以让脚本以 #! /bin/bash 开头,以确保它以 bash.

获得 运行

如果您真的希望它成为别名而不是脚本,正确的解决方案是调用 bash -c,如 .

(有时解释器会四处移动,所以 #! /usr/bin/env python3 是解决不知道 python3/usr/bin 还是 /usr/local/bin 的问题的一种方法。因为bash 通常在 /bin/bash 中,这在这里不是什么大问题。)

我以前的笔记本电脑 运行 Fedora 33,其中 sh 指向 Bash。而在新笔记本电脑上 运行 Ubuntu,sh 指向 Dash 正如@KamilCuk 在评论中指出的那样。

现在,无法配置 git 以使用特定的 shell 作为别名。

在您的别名中使用 bash -c 有几个替代方法。

首先,您可以将 /bin/sh 设置为指向 bash 而不是 dash。在 Ubuntu 你这样做:

sudo dpkg-reconfigure dash

在对话框中选择“是”将其保留为 dash,选择“否”将其设置为 bash。某些脚本和启动过程中会出现一些减速,但您可能不会注意到。如果愿意,您可以随时使用相同的命令将其恢复原状。

其次,您可以通过以下方式下载 git 源代码:

git clone https://github.com/git/git

然后用 /bin/bash 替换所有出现的 /bin/sh 并编译您自己的自定义版本 git。这可能看起来有点极端,但如果你不偶尔做一些疯狂的事情,运行 Linux 有什么乐趣!