为什么这个带有 sbcl --version 的 shell 脚本会在 echo 输出之前打印换行符?

为什么这个带有 sbcl --version 的 shell 脚本会在 echo 输出之前打印换行符?

以下脚本在 echo 打印的第一个单词前打印一个换行符。为什么?

环境:

  • macOS Mojave
  • 使用系统 sh(即 GNU bash 3.2.57(1) 或 GNU bash 5.1.8(1)

描述

下面是我尝试使用不同的 shebang 行(bash 或 sh)的脚本,但最终出现了同样的问题:

#!/bin/sh
which sbcl  > /dev/null
status=$?
if [ $status -eq 0 ]; then
    export PGMFOR_LISP=`which sbcl`
    echo -1-
    echo "Using Common Lisp - " `sbcl --version` "- from:" $PGMFOR_LISP
    echo -2-
else
    echo "**Error!** Request to use SBCL, but fail to find it in PATH!"
fi

它打印以下内容:

-1-

Using Common Lisp -  SBCL 2.1.4 - from: /usr/local/bin/sbcl
-2-

我遇到的问题是-1-行与Using Common Lisp ...行之间的空行。

上面的代码用于sbcl --version获取版本。它在 stdout 上打印,并在输出的字符串前打印换行符。我猜问题就出在这里,但我无法用tr -d例如来修复它。

以下是额外的测试:

>Pierres-iMac@Fri May 14@07:25:39[~]
> sbcl --version 2>/dev/null | od -tc
0000000    S   B   C   L       2   .   1   .   4  \n                    
0000013

>Pierres-iMac@Fri May 14@07:26:06[~]
> sbcl --version 2>/dev/null | hexdump
0000000 53 42 43 4c 20 32 2e 31 2e 34 0a               
000000b

>Pierres-iMac@Fri May 14@07:30:19[~]
> 

我怎样才能去掉那条多余的空行?

答案1

# source me
if which sbcl >/dev/null
then
    export PGMFOR_LISP=`which sbcl`
    printf "%s\n" '-1-'
    printf "Using Common Lisp - %s - from %s\n" "$(sbcl --version 2>/dev/null)" "$PGMFOR_LISP"
    printf "%s\n" '-2-'
else
    echo '**Error!** Request to use SBCL, but fail to find it in PATH!'
fi

添加初始行没有什么意义#!,因为这个脚本只能被sourced (可能用.,同样取决于 shell) 来使用。

我已经替换了echo -1-类型行,因为使用echo以破折号开头的参数定义不明确 - 不同的 shell 会做不同的事情。


为了测试的明显奇怪行为sbcl --version,我使用了这个模型测试脚本,可执行并在我的$PATH

#!/bin/bash
echo >&2
echo "SBCL 2.1.4"

我无法重现您报告的额外空白行

export PGMFOR_LISP=`which sbcl`
printf "Using Common Lisp - %s - from %s\n" "$(sbcl --version 2>/dev/null)" "$PGMFOR_LISP"

结果只有一行

Using Common Lisp - SBCL 2.1.4 - from /home/roaima/bin/sbcl

相关内容