LINUX.ORG.RU

Bash скрипт

 


0

1

Linux. Есть исполняемый файл ./a.out, он принимаем 2 аргумента, нужно в цикле, передавать ему аргументы, замерять время выполнения с помощью time и эти замеры класть в файл. Написал такой вот скрипт, но он работает не так как я хочу.

#!/bin/bash

M_SIZE=500
S_SIZE=1
 
(time (echo "$M_SIZE $S_SIZE" | ./a.out)) > data
echo "$M_SIZE $S_SIZE" >> data


for (( S_SIZE=2; S_SIZE <= M_SIZE; S_SIZE++))
do
  (time (echo "$M_SIZE $S_SIZE" | ./a.out)) >> data
  echo "$M_SIZE $S_SIZE" >> data
done
Он запускает программу с нужными мне аргументами, эти аргументы кладёт в файл, а результат работы time выводит на экран. В общем всё шиворот-навыворот. Подскажите, что нужно поправить.

{ time CMD; } 2> FILE

// stderr в FILE, вместо {..} можно и ( time cmd )

anonymous ()
Ответ на: комментарий от anonymous

Немного изменил программу, она теперь принимает аргументы через командную строку.

Почему данный скрипт не кладёт результаты time в файл? Как это сделать?

#!/bin/bash

M_SIZE=500
S_SIZE=1
 
(time ./a.out $M_SIZE $S_SIZE) > data
echo "$M_SIZE $S_SIZE" >> data
main51 ()
Ответ на: комментарий от teod0r

Благодарю, просто я думал, что time возвращает в stdout, и не сразу понял, почему речь идёт об stderr. А теперь в идеале было бы ещё отфильтровать grep-ом вывод, оставив там только строку содержащую user. Я написал вот так:

(time ./a.out $M_SIZE $S_SIZE) 2> grep "real" > data
но скрипт снова не хочет работать. Может кто-нибудь пояснить, что я делаю не так?

main51 ()
Ответ на: комментарий от aedeph_

Я начал сейчас читать книгу по башу, но это долго, мне бы вкратце хотя бы объясните, почему не работает данный пример. Я ведь частично понимаю, как он работает, но видимо этого мало, чтобы написать данный скрипт.

main51 ()

Он запускает программу с нужными мне аргументами, эти аргументы кладёт в файл, а результат работы time выводит на экран. В общем всё шиворот-навыворот.

Не мог бы ты изъясняться на каком-нибудь из земных языков? Что ты хочешь?

Ну и да: чтобы избегать многочисленных перенаправлений заключи всю конструкцию в перенаправление. Например

(
echo 1
echo 2
) > data

выведет 1\n2 в файл data

ziemin ★★ ()
Ответ на: комментарий от ziemin

Всё, до меня дошло, как написать:

(time ./a.out $M_SIZE $S_SIZE) 2>&1 | grep "user" > data

Не уверен, что это самый грамотный код, но работает, как надо. Я ведь выше написал, мне нужно было перенаправить вывод time в файл, а потом добавил, что этот вывод вдобавок нужно отфильтровать с помощью grep-а.

main51 ()
Ответ на: комментарий от main51

2> перенаправляет в файл, а ты ожидаешь, что 2> перенаправит в процесс grep. Юзай пайп.

devsdc ★★ ()
Ответ на: комментарий от main51

Кого ты обманываешь, тебе не интересно, почему не работает, тебе интересно, чтобы за тебя написали скрипт.

man bash по диагонали, но вдумчиво читается часа за 2.

aedeph_ ★★ ()
Ответ на: комментарий от aedeph_

Ну я бы не стал делать таких громких заявлений, мне лучше знать, что мне интересно, а что нет. Мне проще разобраться, чем спрашивать одну и ту же вещь каждый раз на форуме - это во-первых. Во-вторых, в английском я не очень силён, поэтому man для меня непроходимые дебри и я его не то, что за 2 часа, за 2 дня не прочитаю.

main51 ()
Ответ на: комментарий от main51

Если бы оно тебе могло больше понравиться, то ты бы не создал такую тему.

А так ABS штука знатная, часто её рекомендую.

aedeph_ ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.