我正在尝试在ubuntu中编写一个简单的shell脚本,以dd为随机块编号 但由于某种原因,我无法完成这项简单的任务。 我试过这个食谱 http://www.shelldorado.com/newsletter/issues/2002-3-Aug.html 通过从我的调用他们的兰德脚本(删除不相关的部分)
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变量包含一个字符串,而不是实际的invokation
$ ./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脚本会产生一个打印到控制台的完美的随机数。 有人可以帮忙指出我做错了什么吗?
如果之前有人问我,我很抱歉,我没有找到相关的帖子。 谢谢
答案 0 :(得分:1)
错误消息来自dd
抱怨它无法找到要打开的文件,这可能显示为空字符串。
鉴于您已在评论中指出这不是失败的代码,我们无法帮助您 - 问题不在您认为的位置,这就是为什么在{{1}中查找问题的原因没有帮助。
最有可能的是,您的命令行有一些变体,例如:
rand
并且您实际上在命令行中有dd if=$filel of=$file2 bs=4096 seek=$offset
的{{1}}错字。例如:
l
如果缺少输出文件,则会收到相同的消息。你应该立即调试:
1
当然,您也可以添加诊断打印,例如:
$ dd if= of=/dev/null bs=23 count=2
dd: opening `': No such file or directory
$
(或者,既然你可能从来没有受过那些在“sh -x yourscript
”符号中出现错误的shell的折磨,你实际上可以放弃echo rand=$offset 1>&2
因为经验不好而反复地放在那里在运行DOS / Windows shell模拟器的机器上过去几年。)
答案 1 :(得分:0)
您使用的rand脚本需要一个数字参数。结果数字将介于0和N-1之间。我怀疑你没有得到一个号码,因为你没有提供这个参数。
另一种可能性是如果脚本无法执行。您确定它是正确的目录并且该文件是可执行的吗?也许在测试时尝试使用完整路径以确保。
注意:我认为你想在DD上使用count=1
,因为听起来你想复制一个块。如果不这样做,它将继续写入块,直到到达输入文件的末尾。