1

ファイルを使用して、正しいディレクトリでバイナリを実行するために起動スクリプトで使用できる顧客ソフトウェアの現在のバージョン番号を保存したいと考えています。

たとえば、実行ディレクトリが次のようになっているとします。

.
..
1.2.1
1.2.2
1.3.0
run.sh
current_version

current_version には以下が含まれます。

1.2.2

run.sh1.2.2 に降りてプログラムを実行したいfoo

現在の解決策は次のとおりです。

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

動作しますが、あまり堅牢ではありません。ファイルの存在をチェックせず、複数行、先頭のスペース、コメント行、空白ファイルなどに対応できません。

シェルまたは perl スクリプトでこれを行う最も生き残る方法は何ですか?

4

6 に答える 6

5

それが一般的なアプローチです。"if [ -d "somedirectory" ]; then" または [ -t "somefile" ] などのテスト演算子を使用して、ディレクトリ/ファイルの存在を確認できます。

ただし、シンボリック リンクをより頻繁に使用します。次に、シンボリック リンクを変更して、必要なバージョンを使用できます。

例えば、

$ ln -s 1.2.2 current_version
$ ls -アル
合計 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

引数を受け入れるようにスクリプトを変更します。引数はファイル名でなければなりません。好みのスクリプト言語 [perl、python] を使用してファイルを開き、バージョンに一致するファイルが見つかるまでファイルをトラバースします。

私は正規表現を使用します... /\d\.\d\.\d/ の行に沿ったもの。次に、スクリプトを介してアプリケーションを実行します。

于 2008-09-15T19:39:38.587 に答える
0

&& と || を使用して存在を確認できます。演算子:

!$/ビン/sh
version = `cat current_version`
cd $バージョン && ./foo || echo "悪いバージョン"

&& 演算子により、最初のステートメントが成功した場合 (終了ステータス 0) にのみ 2 番目のステートメントが実行され、|| operator は、最初のステートメントが失敗した場合 (終了ステータスがゼロ以外) にのみ、2 番目のステートメントを実行させます。

複数の行、先頭のスペース、またはコメント行に対処するという意味がわかりません。

于 2008-09-15T19:40:31.330 に答える
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

バージョン管理が常に #.#.# 形式である場合は、次のようにすることができます。

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 に答える