相同命令在不同终端/系统/Shell的不同效果
今天在用make编译一个终端help文档的时候有人提到,在不同的系统上echo有时候会自动展开转义字符有时候不会。最后问题解决是在makefile中显式指定使用的shell为/bin/bash
,对于其他文件也可以类似的在需要执行的文件开头显式声明执行使用的shell
各个echo中默认的转义选项
但我还是觉得这个问题很奇妙,于是我输入man echo
查看文档是怎么说的
发现文档中说的很清楚,默认是禁止转义字符的。但是不同版本的终端中可能会有所不同。
ECHO(1) User Commands ECHO(1)
NAME
echo - display a line of text
SYNOPSIS
echo [SHORT-OPTION]... [STRING]...
echo LONG-OPTION
DESCRIPTION
Echo the STRING(s) to standard output.
-n do not output the trailing newline
-e enable interpretation of backslash escapes
-E disable interpretation of backslash escapes (default)
--help display this help and exit
NOTE: your shell may have its own version of echo, which usually supersedes the version described here. Please refer to your shell's
documentation for details about the options it supports.
然后我发现我的zsh默认就是展开转义字符的。而bash和sh就如文档中所说一般,默认禁止转义字符。
这里就要提到另一个问题,就是不同的终端为了加快命令的执行速度,会内置一些常用命令,其中就包括了echo,但是他们各自的默认实现有不一样。这一点一般是可以手动设置的,但是比较麻烦,所以下面整理一下看到的几个。
在zsh的在线文档里搜索echo就可以看到其内建的echo默认是识别转义的,可以通过设置BSD_ECHO来改变这种默认行为(通常而言这都没必要)关于zsh的选项看这个文档
bash有中文文档的,可以设置xpg_echo 选项来改变是否转义。
如何获得echo的帮助文档
在bash
里可以help echo
,还可以
enable -n echo
echo --help
系统echo可以/bin/echo --help
,在其他内置的echo命令中无法使用这种形式。
而通常我们用的基本都是各个shell内置的echo,内置命令的说明一般的做法就是man sh
,man bash
,man zsh
然后再shell的文档里搜索echo命令