Сценарий оболочки для синхронизации моей программы измеряет его в 0 секунд

Мой профессор написал этот сценарий оболочки, чтобы определить время моей программы и отобразить результаты. По какой-то причине он просто выводит 0 с моей программой. Он предоставил следующие файлы:

timeit.csh
sequence
ecoli2500.txt   
ecoli3000.txt    
ecoli5000.txt    
ecoli7000.txt    
ecoli8000.txt    
ecoli9000.txt    
ecoli10000.txt

Вот содержание последовательности

java EditDistance

Содержимое timeit.csh находится ниже.

Java EditDistance

На самом деле программа работает безупречно с каждым из перечисленных выше файлов, кроме последовательности.

Что я не понимаю, почему

./timeit.csh sequence

выдает все нули

Вот timeit.csh... (далее ниже EditDistance.java):

#!/bin/csh
# 
# A Unix script to time programs.
#
# Command line: timeit sequence


# the array of programs from the commandline
set program = $argv[1]

# adjust as needed
set CPULIMIT = 120
limit cpu $CPULIMIT seconds
limit core 0

# input files
set input = ( stx1230.txt      \
    ecoli2500.txt    \
    ecoli3000.txt    \
    ecoli5000.txt    \
    ecoli7000.txt    \
    ecoli8000.txt    \
    ecoli9000.txt    \
    ecoli10000.txt)

# adjust as needed
set inputpath = `pwd`

# print header
printf "CPU limit = %d seconds\n\n" $CPULIMIT
printf "%-25s" "Data File"
foreach program ($argv)
printf "%16s" $program
end
printf "\n"

# print right number of = for table
@ i = 25 + 16 * $#argv 
while ($i > 0)
printf "="
@ i = $i - 1
end
printf "\n"


# time it and print out row for each data file and  column for each program
foreach datafile ($input)
printf "%-25s" $datafile
if (-f $inputpath/$datafile) then
    foreach program ($argv)
    # printing running time of program on datafile
    # -p flag with time to ensure its output is measured in seconds and not minutes
    nice /usr/bin/time -p $program <                    \
        $inputpath/$datafile |&                        \
        egrep '^user[ ]*[0-9]' |                       \
        awk '{ if ($2 >= '$CPULIMIT') printf "       CPU limit"; else printf("%16.2f", $2) }'
    # egrep, awk commands extract second column of row corresponding to user time

    end
else printf "could not open" $datafile
endif
printf "\n"

end

Вот EditDistance.java

import java.util.*;

class EditDistance {
    public static int min(int a, int b, int c) {
        return Math.min(a,Math.min(b,c));
    }
    public static int distance(String one, String two) {
        if (one.length()>two.length()) {
            String temp1 = one;
            String temp2 = two;
            one = temp2;
            two = temp1;
        }
        int[][] d = new int[one.length()+1][two.length()+1];
        d[0][0] = 0;
        int top, left, topleft, cost;
        for (int i = 1; i <= one.length(); i++) {
            d[0][i] = 2*i;
            d[i][0] = 2*i;
        }
        for (int i = 1; i <= one.length(); i++) {
            for (int j = 1; j <= two.length(); j++) {

                if (one.charAt(i-1) == two.charAt(j-1))
                    cost = 0;
                else
                    cost = 1;

                top = d[i][j-1];
                left = d[i-1][j];
                topleft = d[i-1][j-1];
                d[i][j] = min(top+2,left+2,topleft+cost);
            }
        }
        return d[one.length()][two.length()];
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String one = scanner.next();
        String two = scanner.next();
        System.out.println(distance(one,two));
    }
}

Любые идеи, почему вещи не работают? Я не знаю много о сценариях оболочки, но этот раздел сценария оболочки:

nice /usr/bin/time -p $program <                    \
    $inputpath/$datafile |&                        \
    egrep '^user[ ]*[0-9]' |                       \
    awk '{ if ($2 >= '$CPULIMIT') printf "       CPU limit"; else printf("%16.2f", $2) }'

в моей голове подтверждается, что моя программа должна ожидать эту команду:

java EditDistance < ecoli2500.txt
java EditDistance...etc. etc. 

но программа работает с этими командами. Мне нужно настроить мою программу так, чтобы она правильно реагировала на сценарий оболочки. Может быть, некоторые из вас могут помочь.

2 ответа

Исправлена. Проблема была здесь:

 nice /usr/bin/time -p $program < 

в сценарии. Мой компьютер не выполняет сценарии оболочки без "./" перед командой. Мой профессорский компьютер должен быть другим. Изменение сценария на

nice /usr/bin/time -p ./$program <

Запустил программу отлично.

Я точно знаю, что мы с моим профессором используем Fedora 8. Какая разница, которая позволит мне запускать программы в терминале, просто набрав их имя?

Я не уверен, каково состояние среды (например, PATH) или состояние файлов и разрешений, но это может быть так же просто, как проблема с разрешениями в сценарии оболочки последовательности (который, как вы думаете, содержит 'Java EditDistance'). Если вы 'chmod +x sequence', это работает? Другая проблема заключается в том, что он может не совпадать с вашим путем, вы можете запустить последовательность, набрав: './sequence

Другие вопросы по тегам