1

我想使用一个文件来存储一个客户软件的当前版本号,启动脚本可以使用该文件在正确的目录中运行二进制文件。

例如,如果运行目录如下所示:

.
..
1.2.1
1.2.2
1.3.0
run.sh
current_version

current_version 包含:

1.2.2

我想run.sh降到 1.2.2 并运行程序foo

目前的解决方案是这样的:

#!/bin/sh
version = `cat current_version`
cd $version
./foo

它可以工作,但不是很健壮。它不检查文件是否存在,不能处理多行、前导空格、注释行、空白文件等。

使用 shell 或 perl 脚本执行此操作的最可行的方法是什么?

4

6 回答 6

5

这是一种常见的做法。您可以使用测试运算符检查目录/文件是否存在,例如“if [ -d "somedirectory" ]; then" 或 [ -t "somefile" ]

不过,我更经常使用符号链接。然后,您可以更改符号链接以使用您想要的版本。

例如,

$ ln -s 1.2.2 当前版本
$ ls -al
共 20 个
drwxr-xr-x 5 dbreese dbreese 4096 2008-09-15 13:34。
drwxr-xr-x 3 dbreese dbreese 4096 2008-09-15 13:34 ..
drwxr-xr-x 2 dbreese dbreese 4096 2008-09-15 13:34 1.2.1
drwxr-xr-x 2 dbreese dbreese 4096 2008-09-15 13:34 1.2.2
drwxr-xr-x 2 dbreese dbreese 4096 2008-09-15 13:34 1.3.0
lrwxrwxrwx 1 dbreese dbreese 6 2008-09-15 13:34 current_version -> 1.2.2/

然后你的脚本可以只使用“cd current_version”。

于 2008-09-15T19:38:40.307 回答
0

关于什么:

#!/usr/bin/perl -w
use strict;
use warnings;

my $version_file = 'current_version';
open my $fh, '<', $version_file or die "Can't open $version_file: $!";

# Read version from file
my $version = <$fh>;
chomp $version;

# Remove whitespace (and match version)
die "Version format not recognized" if $version !~ m/(\d+\.\d+\.\d+)/;

my $dir = $1;
die "Directory not found: $dir" unless -d $dir;

# Execute program in versioned directory.
chdir $dir;
system("./foo");
于 2008-09-16T14:02:55.313 回答
0

我会更改脚本以接受参数。参数应该是一个文件名。使用您喜欢的任何脚本语言 [perl, python] 打开文件并遍历文件,直到找到与您的版本匹配的文件。

我会使用正则表达式...类似于 /\d\.\d\.\d/ 的东西。然后让它通过您的脚本执行应用程序。

于 2008-09-15T19:39:38.587 回答
0

您可以使用 && 和 || 检查是否存在 运营商:

!$/bin/sh
版本 = `cat current_version`
cd $版本 && ./foo || echo "坏版本"

&& 运算符使第二个语句仅在第一个语句成功(退出状态 0)时执行,而 || 运算符仅在第一个语句失败(退出状态非零)时才执行第二个语句。

我不确定您处理多行、前导空格或注释行是什么意思。

于 2008-09-15T19:40:31.330 回答
0

如果版本控制将始终采用 #.#.# 格式,您可以这样做:

ls | grep ^[0-9]\.[0-9]\.[0-9]$ | sort -nr | head -n 1

这将按数字降序列出版本,然后选择其中的第一个

于 2008-09-15T19:44:17.467 回答
-4
!#/bin/sh

if [ -e 'current_version' ]; then
    version=`cat current_version`;
    version=`echo $version | tr -ds [[:blank:]]`
    if [ -n "$version" ]; then
      if [ -d "$version" ]; then
         cd "$version"
      else
         echo $version is not a directory
      fi
    else
      echo version_file contained only blanks
    fi
else 
   No file named current_version exists
fi
于 2008-09-15T19:40:51.797 回答