回显版本或不

回显版本或不

在行https://stackoverflow.com/questions/906590/echo-version-doesnt-works我需要知道版本echo

$ type -a echo | cut -d " " -f 3- | xargs -d '\n'
a shell builtin /usr/bin/echo /bin/echo
$ /usr/bin/echo -v
-v
$ /bin/echo -v
-v

答案1

标准echo不接受任何选项(或者使用 XSI 扩展,仅识别参数-n)。在许多情况下,echo您使用的是 shell 中内置的 shell,并且在我测试的所有 shell 中,内置程序都echo无法识别--version.不过,他们至少确实以不同的方式认识到-e。我发现唯一可以识别的是 GNU coreutils 中的一个,即安装在许多 Linux 系统上的那个。-E-necho--version/bin/echo

因此,在大多数情况下,识别版本的问题echo归结为识别您正在运行的 shell。或者运行/bin/echo,如果您知道您所在的系统是 GNU,而不是 Busybox。另外,正如上所看到的手册页,GNU coreutils 版本仅支持--version, 不支持-v-V


但一般来说,如果您尝试完成某件事,则不需要依赖于某件事的特定版本,只需依赖支持的功能即可。从这个角度来看,直接使用printfecho.

如果您想按原样打印字符串,请使用

printf "%s\n" "$var"

如果要处理字符串中的反斜杠转义符,请使用

printf "%b\n" "$var"

如果您想跳过最后的换行符,请\n从第一个参数中删除 。

为什么 printf 比 echo 更好?如何使用 echo 打印“-e”?

答案2

从@ilkkachu 的回答出发:

在我的 macOS 10.15 笔记本电脑上使用zsh,我得到以下信息:

% which echo
echo: shell built-in command 

% whereis echo
/bin/echo

% /bin/echo --version
--version

这是通过参考以下内容进行解释的:Apple在其新笔记本电脑中man echo打包了 2002 BSD 版本- 它仅支持该参数。 :)echo-n

答案3

我认为有 2 个echo程序:来自 GNU Bash 和来自 GNU Coreutils。

echo来自 GNU Bash

  • 要找出echo(GNU Bash),您可以使用此命令helphelp echo

  • 运行echo(GNU Bash)只需尝试使用echo

    echo "Hello World"
    echo -e "line 1\ttab\nline2"
    echo --help    # will return error "--help"
    echo --version # will return error "--version"
    help echo
    
  • 要知道 Bash 版本试试bash --version,有没有 echo GNU Bash 版本

echo来自 GNU Coreutils

  • 要找出 echo (GNU Coreutils),您可以使用此命令
    dpkg-query --listfiles coreutils | egrep '/bin/|/sbin/'
    man echo
    which echo
    
  • 要运行 echo (GNU Coreutils) 你应该调用/bin/echo
    /bin/echo "Hello World"
    /bin/echo -e "line 1\ttab\nline2"
    /bin/echo --help    # will return GNU Coreutils help
    /bin/echo --version # will return GNU Coreutils version
    help /bin/echo      # will return error
    

相关内容