为什么echo和print命令会在shell脚本中生成箭头符号( - >)?

时间:2016-10-13 03:19:11

标签: shell ksh

我运行一个ksh脚本并且其中有“echo”和“print”命令,这有点棘手。输出包含箭头符号 - >。像:

->   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
->                                  Dload  Upload   Total   Spent    Left  Speed
-> 
  0  4374    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0  4374    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
101  4374    0     0  101  4374      0   2934  0:00:01  0:00:01 --:--:--  4072
100  4642  134   268  101  4374    152   2491  0:00:01  0:00:01 --:--:--  3264

-> This is FLAG!!!
   stty: standard input: Invalid argument
   stty: standard input: Invalid argument

代码段: 它会生成 - >输出在/data/home/user/bin/pushfile.sh /tmp/$ISSUE.$p4Cur $ RUN_ENV | awk'{print“\ t”$ 0}'2>& 1> $ tmplog之外

 #!/bin/ksh
 if [[ $ENV != "production" ]]
 then
    . $HOME/bin/getenv $RUN_ENV >> $RUN_LOGFILE
    if [[ ! -n $FILE_HOME ]]
    then
    echo "FILE_HOME could not be null"
    exit 1
    fi
    cd $FILE_HOME
    cat /tmp/$TICKET.$p4Cur | while read LINE
    do
    p4 sync -f "$LINE" 2>&1 > $tmpLog
            rc=$?
            cat $tmpLog | tee -a $RUN_LOGFILE
            if [[ $rc -gt 0 ]]
            then
            echo "Failed to sync file"
            exit $rc
            fi
    done
 fi

 if [[ $ENV != "production" ]]
 then
     echo "This is FLAG!!!"
    /data/home/user/bin/pushfile.sh /tmp/$ISSUE.$p4Cur $RUN_ENV | awk   '{print "\t" $0}' 2>&1 > $tmpLog

    cat $tmpLog | tee -a $RUN_LOGFILE

    errormsg=`grep "ERROR" $tmpLog `
    erc=$?
    if [[ $erc == 0 ]];then
            echo "Failed to run    /data/home/user/bin/pushfile.sh/tmp/$ISSUE.$p4Cur $BUILD_ENV ! script terminate!" 
            exit 1
    fi

2 个答案:

答案 0 :(得分:0)

也许这可能是解决方案;

首先运行此;

stty sane

然后运行你的脚本;

在男人身上;

stty changes and prints terminal line settings.

sane   same  as cread -ignbrk brkint -inlcr -igncr icrnl -iutf8 -ixoff -iuclc -ixany imaxbel opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh
              -xcase -tostop -echoprt echoctl echoke, all special characters to their default values

如果不起作用,你能否提供;

stty -a

答案 1 :(得分:0)

两个猜测:

  1. 代码来源此行包含$RUN_ENV。我们不知道是什么 那是。 Stdout被捕获到$RUN_LOGFILE,stderr没有被分解并转到终端。

    . $HOME/bin/getenv $RUN_ENV >> $RUN_LOGFILE

  2. 此构造将所有stderr(fd 2)重定向到屏幕,将p4(Perforce perchance?)重定向到$tmpLog

    p4 sync -f "$LINE" 2>& 1 > $tmpLog

    如果你想捕获标准输出和标准输出stderr进入文件,切换两个:

    ... > $tmpLog 2>& 1

  3. 简而言之,有两个命令可以产生任何类型的输出搞乱你的屏幕。 找出它是什么,并将该输出转移到合适的水槽。