我正在尝试测试一个带有几个输入文件的程序(TP3),并在另一个文件中打印输出。因此,我已经设计了以下Bash脚本名称Runner来同时完成所有操作:
#!/bin/bash
rm $2
clear
FILES=(`ls ${1}`)
cmd='./tp3'
for f in ${FILES[*]}
do
echo "$f"
echo "--------------<$f>--------------" >> $2
$cmd < $1$f 2>> $2 >> $2
done
每次运行此脚本时,我都会收到以下错误:
./runner: line 10: $2: ambiguous redirect
./runner: line 11: testtest: No such file or directory
运行我要做的bash脚本:
./runner test
脚本中有什么问题?
修改使其起作用:首先,我引用了变量,然后我替换了名为" test"的文件的第二个参数" $ 2",现在一切正常。
新代码:
#!/bin/bash
rm TEST
clear
FILES=(`ls *.in`)
cmd='./tp3'
for f in ${FILES[*]}
do
echo "$f"
echo "--------------<"$f">--------------" >> "TEST"
"$cmd" < "$1$f" >> "TEST" 2>> "TEST"
done
感谢大家的帮助。
您正在运行./runner test
,其中test
为$1
,$2
是空的。您的重定向是非法的。还要在指向相同的输出时尝试对stdout和stderr进行求助。这可以如下完成:command arguments > output 2>&1
。这将发送STDERR输出发送到发送stdout输出的位置。
另外,正如Wintermute所指出的:引用变量。变量中的空间将使其解释为单独的参数。例如如果$1
等于some string
,则command $1
向command
提供两个参数。
这转化为以下内容:您使用 $f
,如果其中包含一个空间,它将分配参数,并且在空间之后将所有内容视为额外的参数或命令,而不是一个参数。