【问题标题】:How do i append some text to pipe without temporary file如何在没有临时文件的情况下将一些文本附加到管道
【发布时间】:2013-03-04 17:15:02
【问题描述】:

我正在尝试从我有一个程序的多个版本的目录中获取最大版本号

例如,如果 ls 的输出是

something01_1.sh
something02_0.1.2.sh
something02_0.1.sh
something02_1.1.sh
something02_1.2.sh
something02_2.0.sh
something02_2.1.sh
something02_2.3.sh
something02_3.1.2.sh
something.sh

我通过以下方式获得最大版本号 -

ls somedir | grep some_prefix | cut -d '_' -f2 | sort -t '.' -k1 -r | head -n 1

现在,如果我想同时检查系统中已有的版本号,最好的方法是什么...

在 bash 中我得到了这个工作(如果 2.5 是当前版本)

(ls somedir | grep some_prefix | cut -d '_' -f2; echo 2.5) | sort -t '.' -k1 -r | head -n 1

还有其他正确的方法吗?

编辑:在上面的例子中 some_prefix 是 something02。

编辑:这里的实际问题是

(ls smthing; echo more) | sort 

这是将两个命令/程序的输出合并到第三个的最佳方法吗?

【问题讨论】:

  • 你有没有考虑使用像git这样的真正的版本控制系统????
  • 这个决定不是我做的。

标签: linux bash shell unix pipe


【解决方案1】:

我找到了解决方案。似乎最好的方法是使用进程替换。

cat <(ls smthing) <(echo more) | sort

对于我的版本示例

cat <(ls somedir | grep some_prefix | cut -d '_' -f2) <(echo 2.5) | sort -t '.' -k1 -r | head -n 1

为了未来读者的利益,我建议 - 请放弃单线的诱惑,并按照chepner 的建议使用 glob。

superuser 上提出了几乎类似的问题。

关于process substitution的更多信息。

【讨论】:

    【解决方案2】:

    你可以试试这样的:

    #! /bin/bash
    
    lastversion() { # prefix
      local prefix="$1" a=0 b=0 c=0 r f vmax=0
    
      for f in "$prefix"* ; do
        test -f "$f" || continue
        read a b c r <<< $(echo "${f#$prefix} 0 0 0" | tr -C '[0-9]' ' ')
        v=$(((a*100+b)*100+c))
        if ((v>vmax)); then vmax=$v; fi
      done
      echo $vmax  
    }
    
    lastversion "something02"
    

    它将打印:30102

    【讨论】:

    • 感谢您的回答。我最终在 perl 中做了同样的事情。但问题仍然悬而未决。怎么办### (ls smthing; echo more) |仅使用管道对 ### 进行排序。
    【解决方案3】:

    以下代码是否更适合您要查找的内容:

    #/bin/bash
    
    highest_version=$(ls something* | sort -V | tail -1 | sed "s/something02_\|\.sh//g")
    current_version=$(echo $0 | sed "s/something02_\|\.sh//g")
    
    if [ $current_version > $highest_version ]; then
        echo "Uh oh! Looks like we need to update!";
    fi
    

    【讨论】:

    • 这能满足你的需要吗?
    • 你确定吗?在我知道的每个 shell 中,$0 是正在运行的程序的名称,而不是版本号。祝大家好运!
    • @Paul - 对不起。但我认为你误解了我的问题。我的意思是我想在目录中存在的文件和我正在运行的文件中获取最大版本号。我没有在有问题的程序中进行此检查。如示例中所述。我正在运行 something02 的 2.5 版,它可能存在也可能不存在于更新目录中。我需要弄清楚当前的运行是否是最新的,是否需要更换。更换对我来说很昂贵。我不能不先检查就开始最新的。
    • 啊……我明白你的意思了
    • mywiki.wooledge.org/ParsingLs 解释了解析ls 输出的问题和替代方法。
    猜你喜欢
    • 2015-11-30
    • 2011-09-25
    • 2020-11-08
    • 1970-01-01
    • 2013-07-05
    • 2015-09-18
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多