0

Subversion の作業コピーで diff を探す前に、perltidy を実行したいと考えています。svn config で私は書いた:

diff-cmd = /usr/bin/d.sh

David W がこの回答で言ったようにhttps://stackoverflow.com/a/5834900/1927848私はスクリプト /usr/bin/d.sh を作成します:

#!/usr/local/bin/bash
/usr/local/bin/perltidy "$1" > "/tmp/$1"
/usr/local/bin/perltidy "$2" > "/tmp/$2"
/usr/bin/diff "$1" "$2"
/bin/rm "/tmp/$1" "/tmp/$2"
exit 0

そして、作業コピーでsvn diffを作成すると、いくつかのエラーが発生しました:

dev# svn diff
Index: nodeny/new_month.pl
===================================================================
Unknown option: u
Error on command line; for help try 'perltidy -h'
Option l is ambiguous (libpods, line-up-parentheses, logfile, logfile-gap, long-block-line-count, look-for-autoloader, look-for-hash-bang, look-for-selfloader)
Error on command line; for help try 'perltidy -h'
diff: option requires an argument -- L
/usr/bin/diff: Try `/usr/bin/diff --help' for more information.

私のエラーはどこですか?

UPD: $1 と $2 はファイル名ではなく、 $6 と $7 にはファイル名が含まれています。池上コメントのおかげで、コードにいくつかの変更を加えました

#!/usr/local/bin/bash

/usr/local/bin/perltidy "$6" -st > "/tmp/tidy001"
/usr/local/bin/perltidy "$7" -st > "/tmp/tidy002"
/usr/bin/diff "/tmp/tidy001" "/tmp/tidy002"
/bin/rm "/tmp/tidy001" "/tmp/tidy002"
exit 0

しかし今、スクリプトは最初の perltidy コマンドを実行して待機するだけです...何が問題なのですか?
UPD2: 動作する perl スクリプト:

#!/usr/bin/perl

use Text::Diff;

if (-e $ARGV[-2] && -e $ARGV[-1]) {
    my $str1 = `/usr/local/bin/perltidy -npro -pbp -nst -se -et=4 -bar -l=200 $ARGV[-2] -st`;
    my $str2 = `/usr/local/bin/perltidy -npro -pbp -nst -se -et=4 -bar -l=200 $ARGV[-1] -st`;
    my $diff = diff(\$str1, \$str2);
    print $diff;
}
else {
    print "Error file $ARGV[-2] or $ARGV[-1] not exists\n";
}
exit 0;
4

1 に答える 1

1

私は経験豊富なbashコードではないため、特に冗長性を考えると、次のコードは最適ではない可能性がありますが、最後の 2 つの引数がファイル名であると想定することで問題を解決できます。

#!/bin/bash

args=("$@")

f1_idx=$(( ${#args[@]} - 2 ))
f1="${args[$f1_idx]}"
/usr/local/bin/perltidy "$f1" -st > "/tmp/$f1"
args[$f1_idx]="/tmp/$f1"

f2_idx=$(( ${#args[@]} - 1 ))
f2="${args[$f2_idx]}"
/usr/local/bin/perltidy "$f2" -st > "/tmp/$f2"
args[$f2_idx]="/tmp/$f2"

/usr/bin/diff "$args[@]"
/bin/rm "/tmp/$f1" "/tmp/$f2"

exit 0

または、実際のファイル名を気にしない場合 (更新が暗示するように)、一時ファイルを完全に避けることができます。

#!/bin/bash

args=("$@")

last_idx=$(( ${#args[@]} - 1 ))
f2="${args[$last_idx]}"
unset args[$last_idx]

last_idx=$(( ${#args[@]} - 1 ))
f1="${args[$last_idx]}"
unset args[$last_idx]

/usr/bin/diff "$args[@]" \
   <( /usr/local/bin/perltidy "$f1" -st ) \
   <( /usr/local/bin/perltidy "$f2" -st )

exit 0
于 2013-05-16T08:46:47.850 に答える