【发布时间】:2018-01-03 22:44:47
【问题描述】:
我正在尝试运行带有一些参数的 C 可执行文件 (rtklib)。相同的命令在终端中似乎可以正常工作,但是当我在 sh 文件中运行它时,可执行文件会引发错误。
bash 脚本:
#!/bin/bash
# path to CUI executables
convbindir="/home/odroid/gitLibs/RTKLIB-master/app/convbin/gcc"
rnx2rtkpdir="/home/odroid/gitLibs/RTKLIB-master/app/rnx2rtkp/gcc"
datafiledir="/home/odroid/bashExample/datafiles"
basedir="$datafiledir/base*/"
cd $rnx2rtkpdir
# Do post process from each base to rover (should be 2)
for roverdir in $datafiledir/rover*/; do
#echo "$roverdir" # absolute path to rover folder i.e. /home/odroid/bashExample/datafiles/rover2/
#echo "basedir = $basedir"
rovernum="${roverdir: -2:-1}"
#echo "$rovernum"
ls
#echo "****************"
echo "executing: $ ./rnx2rtkp -k optsEmlid.conf -o "$roverdir"rover"$rovernum".pos "$roverdir"*.obs "$basedir"*.obs "$basedir"*.nav"
./rnx2rtkp -k optsEmlid.conf -o "$roverdir"rover"$rovernum".pos "$roverdir"*.obs "$basedir"*.obs "$basedir"*.nav
#echo "****************"
done
输出(无导航数据导航数据错误):
odroid@odroid:~/bashExample$ ./autopostprocess.sh
ephemeris.o makefile opts4.conf ppp_ar.o rnx2rtkp rtcm.o
geoid.o options.o optsEmlid.conf ppp.o rnx2rtkp.o rtkcmn.o
gpsdata opts1.conf out.pos preceph.o rtcm2.o rtkpos.o
ionex.o opts2.conf pntpos.o qzslex.o rtcm3e.o sbas.o
lambda.o opts3.conf postpos.o rinex.o rtcm3.o solution.o
executing: $ ./rnx2rtkp -k optsEmlid.conf -o /home/odroid/bashExample/datafiles/rover2/rover2.pos /home/odroid/bashExample/datafiles/rover2/*.obs /home/odroid/bashExample/datafiles/base*/*.obs /home/odroid/bashExample/datafiles/base*/*.nav
invalid option value pos1-snrmask (optsEmlid.conf:7)
no nav datanav data
ephemeris.o makefile opts4.conf ppp_ar.o rnx2rtkp rtcm.o
geoid.o options.o optsEmlid.conf ppp.o rnx2rtkp.o rtkcmn.o
gpsdata opts1.conf out.pos preceph.o rtcm2.o rtkpos.o
ionex.o opts2.conf pntpos.o qzslex.o rtcm3e.o sbas.o
lambda.o opts3.conf postpos.o rinex.o rtcm3.o solution.o
executing: $ ./rnx2rtkp -k optsEmlid.conf -o /home/odroid/bashExample/datafiles/rover3/rover3.pos /home/odroid/bashExample/datafiles/rover3/*.obs /home/odroid/bashExample/datafiles/base*/*.obs /home/odroid/bashExample/datafiles/base*/*.nav
invalid option value pos1-snrmask (optsEmlid.conf:7)
no nav datanav data
手动在终端上执行(我 ctr+c 提前退出,注意我复制粘贴了我在脚本中打印的确切命令,即执行后的文本:$)):
odroid@odroid:~/gitLibs/RTKLIB-master/app/rnx2rtkp/gcc$ ./rnx2rtkp -k optsEmlid.conf -o /home/odroid/bashExample/datafiles/rover2/rover2.pos /home/odroid/bashExample/datafiles/rover2/*.obs /home/odroid/bashExample/datafiles/base*/*.obs /home/odroid/bashExample/datafiles/base*/*.nav
invalid option value pos1-snrmask (optsEmlid.conf:7)
^Cocessing : 2018/01/03 21:05:47 Q=0
odroid@odroid:~/gitLibs/RTKLIB-master/app/rnx2rtkp/gcc$
【问题讨论】:
-
当您引用扩展时,会阻止 glob 被扩展。
-
@CharlesDuffy 你能在答案中澄清更多吗?我是 bash 的新手,谢谢。
-
您希望
"$datafiledir"/base*/匹配多少个不同的目录?如果只有一个,那就写basedir=( "$datafiledir"/base*/ ) -
不要使用
echo来表示命令在运行时会做什么,而是使用bash -x your-script。 -
作为为什么使用
echo这种方式是错误的简化示例,将printf '%s\n' "hello world"与echo printf '%s\n' "hello world"的输出进行比较。