【问题标题】:What is the proper syntax for creating a bash alias that git clones, cds, and opens that repo in a text editor (atom .) all in one?创建一个 bash 别名的正确语法是什么?
【发布时间】:2017-11-25 05:20:21
【问题描述】:

如何将 bash 命令一个接一个地添加并动态地将变量(在本例中为 repo 名称)传递给下一个 bash 命令?我想 'git clone ' && 'cd' 到那个目录 && 'atom 。在 bash 中使用别名。

【问题讨论】:

  • 您是否有理由要使用别名,而不是函数或脚本?
  • 没有理由,任何可行的方法都可以通过简单的“克隆!”轻松调用! ' 在命令行中
  • 感叹号?这实际上是一个问题——shell 函数只能保证使用有效的 shell 变量名。 (有些 shell 更宽松,但 POSIX sh 标准不保证)。

标签: bash


【解决方案1】:

不要为这项工作使用别名; shell 函数是正确的工具。

clone_and_open() {
  local dest=${2:-${1##*/}}        # if we were passed $2, use it; otherwise, trim $1
  git clone "$1" "$dest" || return # attempt a git clone, abort otherwise
  cd "$dest"             || return # cd into directory, or abort otherwise
  atom .                           # actually start your editor
}

...将让您运行clone_and_open https://github.com/example/example 以克隆到名为example 的目录并在那里打开atom,或clone_and_open https://github.com/foobar/baz foobar-baz 以将baz 克隆到foobar-baz 目录。

如果您想使用对 shell 函数无效的名称,那么您也可以使用别名:alias clone!='clone_and_open'。

别名仅允许在末尾附加参数,因此您不能将它们放在多个单独的位置(此处需要);因此,就其本身而言,一个人不能胜任这项工作。

【讨论】:

    【解决方案2】:

    您可以使用function:

    function do-things {
        git clone $1 && cd $2 && echo $3 
    }  
    

    如果您经常为不同的项目进行这种样板设置,您可能需要考虑使用像 tmuxinator 这样的工具,它允许您为不同的项目创建“配置文件”并具有用于编写此类脚本的钩子设置/拆卸。 (完全披露:我是贡献者。)

    【讨论】:

    • 这里的引用被破坏了,并且使用 bashisms 而不是 POSIX 兼容的语法(在这种特殊情况下,扩展损害了可移植性但没有增加任何价值)是不幸的。 (需要明确的是,function 关键字是 bash 支持兼容性的 ksh-ism,但 不是 POSIX 函数声明语法的一部分)。
    • (...澄清“引用被破坏”:如果您传递的目录名称在$1 或$2 位置带有空格,而不是被视为一个名称将被拆分为两个单独的参数;类似地,名称中的任何*,即使在引号中传递,也将被替换为本地目录内容的列表。
    • ...并且请不要链接 TLDP。我们在 freenode #bash 频道中所做的一半是试图让人们忘记他们从文档中学到的不良做法。请参阅 wiki.bash-hackers.org/scripting/obsolete re: function 声明语法和 wiki.bash-hackers.org/syntax/… 以获取有关合规语法的维护良好的文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多