【问题标题】:Bash: ${$(mycommand)%suffix} doesn't work to trim suffix from mycommand outputBash:${$(mycommand)%suffix} 无法从 mycommand 输出中修剪后缀
【发布时间】:2018-03-27 00:02:26
【问题描述】:

我正在尝试将目录更改为我的 git 存储库的远程位置。我正在使用命令:

cd ${$(git remote get-url origin)%.git}

命令不起作用:

bash: ${$(git remote get-url origin)%.git}: bad substitution

我不明白为什么这是不正确的。是因为$() 而不是使用变量名吗?如果是,为什么?我怎样才能正确地做到这一点?

【问题讨论】:

    标签: bash shell git-bash


    【解决方案1】:

    您不能在带有子字符串删除的参数扩展中使用命令替换。你需要一个两步:

    tmp=$(git remote get-url origin)
    cd "${tmp%.git}"
    

    这将消除不良替换。

    Parameter expansion 本身在shell parameter 上运行(包括名称引用的shell 变量、位置参数等)。因此,如果您使用%.git 从右侧删除.git,它必须包含在某个变量中,例如tmp 以上,则参数扩展按预期工作。

    【讨论】:

      【解决方案2】:

      您不能在bash 中使用嵌套字符串替换。

      相反,您可以使用这种单线:

      cd $(git remote get-url origin | sed 's/\.git$//')
      

      【讨论】:

      • 我也喜欢。如果我在那种情况下,我可能会这样做。
      • 它是单行的,但会引入不必要的子shell,更不用说外部工具而不是内置的shell..
      • 这只是一个偏好问题,sed 不是 bash 内置的,但在每个 *nix 系统上仍然可用
      • 它是可用的,我只是说它是不必要的性能开销(至少对于后缀删除这样简单的任务)。
      • 对于完整的管道(git+sed 与 git+bash repl),我看到了 1-2 毫秒的增益(5-6 与 3-4 毫秒)。在一个循环 (x1000) 中,始终有 200 毫秒的增益。如果我们只看没有 git 调用的替换(sed 与 bash),差异是 800 毫秒与 9 毫秒。
      猜你喜欢
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      相关资源
      最近更新 更多