繁体   English   中英

Bash命令在终端中有效,但在脚本中无效

[英]Bash command works in terminal but not in script

我正在尝试使用一些参数运行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$ 

问题是您在执行命令时引用了$basedir ,因此它不会扩展*通配符,而是在寻找一个名叫base*的目录。 改成:

    ./rnx2rtkp -k optsEmlid.conf -o "$roverdir"rover"$rovernum".pos "$roverdir"*.obs $basedir*.obs $basedir*.nav

但是,这是有问题的,因为如果$basedir任何目录的名称中都有空格,它将无法正常工作,因为单词拆分也已完成。

echo的输出不表示是否对内容加了引号,尽管引号在解释命令的方式方面很重要。

执行此操作的安全方法是将您的glob扩展为一个数组,然后验证该数组的内容以检查glob是否已精确扩展到一项(如您期望的那样)。 可能看起来像以下内容:

shopt -s nullglob
base_inputs=( "$datafiledir"/base*/*.{obs,nav} )

for roverdir in "$datafiledir"/rover*/; do
  roverdir=${roverdir%/}; rovernum=${roverdir##*/rover}
  ./rnx2rtkp \
    -k optsEmlid.conf \
    -o "${roverdir}/rover${rovernum}.pos" \
    "$roverdir"/*.obs \
    "${base_inputs[@]}"
done

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM