сохранить возвращаемое значение вложенного скрипта в скрипте оболочки - PullRequest
2 голосов
/ 20 декабря 2010

Я пытаюсь написать простой сценарий оболочки в Ubuntu для dd со случайным номером блока, но по какой-то причине мне не удается выполнить эту простую задачу.Я попробовал этот рецепт http://www.shelldorado.com/newsletter/issues/2002-3-Aug.html, вызвав мой скрипт rand из моего (вырезав ненужные части)

DEV=$1
DD=dd
IF=$2

DEV_BLOCKS=4182000
BLK_SIZE=4096

# actual test
GB=$((1024*1024*1024))
for ((  i = 0 ;  i <= $(($GB * 2));  i++  ))
do
  #echo "$i times"
  offset=`./rand`    
#  offset=$(($offset%$DEV_BLOCKS))
  $DD if=$IF of=$DEV bs=$BLK_SIZE seek=$offset count=1
done

, но у меня всегда получалась переменная $ offset, содержащая строку, а не фактический вызов

$ ./rand
5732148894262698848
$ ./random
dd: opening `': No such file or directory

$ sh -x random infile outfile 2>&1 | tee log.file
+ DEV=infile
+ DD=dd
+ IF=outfile
+ DEV_BLOCKS=4182000
+ BLK_SIZE=4096
+ GB=1073741824
random: 14: Syntax error: Bad for loop variable

Прямой вызов сценария rand дает совершенно хорошее случайное число, выводимое на консоль.Может кто-нибудь помочь и указать мне, что я делаю неправильно?

Прошу прощения, если об этом спрашивали раньше, я не нашел соответствующего поста.Спасибо

Ответы [ 2 ]

1 голос
/ 20 декабря 2010

Сообщение об ошибке от dd с жалобой на то, что не удается найти файл, который можно открыть, что может выглядеть как пустая строка.

Учитывая, что вы указали в комментарии, что это не такточно код, который дает сбой, мы не можем вам помочь - проблема не там, где вы думаете, поэтому поиск проблемы в rand не поможет.

Скорее всего, у вас естьнекоторый вариант вашей командной строки, такой как:

dd if=$filel of=$file2 bs=4096 seek=$offset

, и у вас фактически есть опечатка, такая как l для 1 в командной строке.Например:

$ dd if= of=/dev/null bs=23 count=2
dd: opening `': No such file or directory
$ 

Вы получите то же сообщение, если выходной файл отсутствует.Вы должны немедленно выполнить отладку с помощью:

sh -x yourscript

Вы также можете, конечно, добавить диагностический отпечаток, например:

echo rand=$offset 1>&2

(или, поскольку вы, вероятно, никогда не были пораженыс оболочкой, у которой были ошибки в нотации >&2, на самом деле вы можете отбросить 1, который я поместил туда рефлексивно, из-за плохого опыта в прошлые годы на машинах, работающих под эмулятором оболочки DOS / Windows.)

0 голосов
/ 20 декабря 2010

Для используемого вами сценария rand требуется один числовой параметр. Полученное число будет между 0 и N-1. Я подозреваю, что вы не получаете номер, потому что вы не указали этот параметр.

Другая возможность будет, если сценарий не может быть выполнен. Вы уверены, что это правильный каталог и что файл является исполняемым? Возможно, попробуйте использовать полный путь при тестировании, чтобы быть уверенным.

Примечание: я думаю, что вы хотели использовать count=1 для DD, так как кажется, что вы хотели скопировать один блок. Если вы этого не сделаете, он будет продолжать записывать блоки, пока не будет достигнут конец входного файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...