内置命令Bash,OSx与Linux的比较

4
我注意到在OSx和Linux系统中,printf内置函数的表现似乎不同。我曾以为内置函数就是内置函数,这与我遇到的任何特定问题无关,只是我无法解释这种现象。

OSx

printf '%(+%s)T\n' -2
-bash: printf: `(': invalid format character

which printf
printf is a shell builtin
printf is /usr/bin/printf

Linux

printf '%(+%s)T\n' -2
+1431027100

which printf
printf is a shell builtin
printf is /usr/bin/printf

以下是有关测试的一些信息。在OSx上,我使用通过brew安装的bash版本。

OSx版本

bash --version
GNU bash, version 4.3.33(1)-release (x86_64-apple-darwin14.1.1)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

Linux版本

bash --version
GNU bash, version 4.3.11(1)-release (i686-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

1
在OSX上,help printf命令是否显示支持%(fmt)T格式说明符?也许bash是以不同的方式编译的。 - John Kugelman
1
жҲ‘йқһеёёпјҢйқһеёёжҖҖз–‘дҪ зҡ„и„ҡжң¬еңЁOS XдёӯиҝҗиЎҢзҡ„bashдёҺдҪ жЈҖжҹҘзүҲжң¬еҸ·зҡ„bashдёҚжҳҜеҗҢдёҖдёӘгҖӮ - Charles Duffy
1
顺便说一下,which printf 没有任何意义。请使用 type printf - Charles Duffy
在我的本地bash中,使用“help printf”命令无法显示fmt语法,但在我的Linux机器上可以。因此,虽然都是内置命令,但还是存在差异? - xeor
2
@xeor,使用 echo $BASH_VERSION 而非 bash --version 来检查每个版本的版本号。这将检查您当前运行的版本,而不是检查当前路径中的哪个版本是第一个。 - Charles Duffy
显示剩余2条评论
1个回答

4

%()T 是bash 4.x中的最新添加项;OS X使用bash 3.2(预计永远不会升级到4.x,因为Apple拒绝发布GPLv3许可的软件)。


如果 bash --version 告诉你你的OS X系统有bash 4,那么这可能是检查路径中的bash版本与 /bin/bash/usr/bin/bash 版本(用于您脚本的shebang或用户帐户配置的shell)不同造成的。

要检查当前bash版本,请不要使用 bash --version (它告诉你PATH中的 第一个bash解释器 的版本,而不是 当前解释器 的版本);而应该使用:

echo $BASH_VERSION

如果你想确保你的脚本使用PATH中的第一个bash解释器 (如果你安装了比苹果提供的更新的bash -- 比如通过macports或者homebrew),那么请使用#!/usr/bin/env bash,而不是#!/bin/bash

2
谢谢,这是bash --version欺骗了我。$BASH_VERSION确实是v3。我只需要在首选项中正确地指向iterm。在配置文件-->常规-->命令下添加"/usr/local/bin/bash -l"即可。现在一切都好了。 - edos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接