无法为长命令创建 bash 别名或函数

Posted

技术标签:

【中文标题】无法为长命令创建 bash 别名或函数【英文标题】:Cannot create a bash alias or function for long command 【发布时间】:2022-01-16 17:19:03 【问题描述】:

我一直在尝试创建一个长 Git 命令的别名。命令格式如下:

git clone "https://MyUserName@MyDomain.com/a/PathToRepo/RepoName" && (cd "RepoName" && mkdir -p .git/hooks && curl -Lo `git rev-parse --git-dir`/hooks/commit-msg https://MyUserName@MyDomain.com/tools/hooks/commit-msg; chmod +x `git rev-parse --git-dir`/hooks/commit-msg)

我可以使用别名或 bash 函数来帮助我完成此任务。

【问题讨论】:

【参考方案1】:

不要使用别名。它们在各个方面都不如功能。

将其编写为函数还可以避免在尝试创建别名时可能遇到的引用错误(尽管解决这些问题也不是不可能的;但如果这是你想要的,可能会问一个新问题与你的实际尝试)。

与您的原始版本相比,以下内容只有很小的变化(并且就原始版本的工作而言,它本来可以在没有任何变化的情况下工作)。

func () 
    git clone "https://MyUserName@MyDomain.com/a/PathToRepo/RepoName" &&
    (
      cd "RepoName" &&
      mkdir -p .git/hooks &&
      curl -Lo "$(git rev-parse --git-dir)/hooks/commit-msg" "https://MyUserName@MyDomain.com/tools/hooks/commit-msg" &&
      chmod +x "$(git rev-parse --git-dir)/hooks/commit-msg"
    )

从传统的`command substitution` 语法切换到现代的$(command substitution) 语法主要是出于审美原因。添加double quotes is crucial for handling file names with spaces or other shell metacharacters in them。在chmod +x 之前添加&& 而不是; 似乎对一致性有意义。

就个人而言,我会调用git rev-parse --git-dir 两次,然后创建一个带有目录名称的变量:

func () 
    git clone "https://MyUserName@MyDomain.com/a/PathToRepo/RepoName" &&
    local hookdir=RepoName/$(git -C "RepoName" rev-parse --git-dir)/hooks &&
    mkdir -p "$hookdir" &&
    curl -Lo "$hookdir/commit-msg" "https://MyUserName@MyDomain.com/tools/hooks/commit-msg" &&
    chmod +x "$hookdir/commit-msg"

如果您想让存储库名称和/或 URL 可配置参数,我建议将存储库名称作为第一个参数,将基本 URL 作为第二个参数,但这显然取决于您的用例。

func () 
    git clone "$2-https://MyUserName@MyDomain.com/a/PathToRepo/$1" &&
    local hookdir="$1"/$(git -C "$1" rev-parse --git-dir)/hooks &&
    mkdir -p "$hookdir" &&
    curl -Lo "$hookdir/commit-msg" "https://MyUserName@MyDomain.com/tools/hooks/commit-msg" &&
    chmod +x "$hookdir/commit-msg"

如果 $2 未设置,则语法 $2-default 回退到 default

【讨论】:

git -C "RepoName" rev-parse --git-dir 代替 cd "RepoName" && git rev-parse --git-dir 怎么样? $2:-default 不是比$2-default 更安全吗? 感谢-C的建议;这确实是一种改进。我发现很难想象用户会明确地传入一个空字符串并期望它被替换为默认值,所以我会传递这个建议。 好吧,用户可以简单地写func RepoName "$ulr"而不是func RepoName "$url"... 默默地不做他们想做的事似乎比失败更糟糕。 没错。你说服了我,$2-default 肯定更好。谢谢。

以上是关于无法为长命令创建 bash 别名或函数的主要内容,如果未能解决你的问题,请参考以下文章

不可或缺的 Bash 别名

不可或缺的 Bash 别名

Linux上的10个超级方便的Bash别名

Linux:alias 起别名

linux下alias命令具体解释

xargs 无法识别 bash 别名