以下脚本在 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
添加初始行没有什么意义#!
,因为这个脚本只能被source
d (可能用.
,同样取决于 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