我刚刚将我的git配置导入到运行 Ubuntu20.04 的新笔记本电脑上,但由于某种原因,使用 Bashread
内置的git别名现在很少失败。
[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 上,确保特定解释器运行特定脚本(此处的脚本是指存储在标记为可执行文件的文件中的命令)的方法是让文件以#!
开头,后跟解释器的路径名。 (你可以在#!
和口译员之间放一个空格,我通常会这样做。
在这种情况下,这意味着使用脚本而不是别名。 将程序命名为git-try
,将其放在$PATH
上的目录中,git try
将运行git-try
脚本。 现在,您可以让脚本以#! /bin/bash
开头,以确保它以 bash 运行。
如果你真的希望它是一个别名而不是一个脚本,正确的解决方案是调用bash -c
,正如KamilCuk在评论中所说。
(有时口译员会四处走动,因此#! /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/sh
替换为/bin/bash
并编译您自己的自定义版本的git
。这可能看起来有点极端,但是如果你不偶尔做一些疯狂的事情,那么运行Linux有什么乐趣呢!