我们是否应该在bash / shell脚本中使用UTF-8字符(如⏰)?


36

如果使用bash以下命令启动,则这里的简单代码可以在我的机器上按预期工作:

function ⏰(){
 date
}

使用此工具的其他人可能会遇到问题,还是通用?

我想知道,因为到目前为止,我从未在其他源代码中看到过类似的东西。

编辑:有无限的可能性,例如,可以通过使用表情符号来快速区分功能角色。

💣表示可以修改或删除文件的内容,a表示正在进行的工作,📃表示交互式菜单...

我想我们应该为所有这些创建一个标准,但这似乎是一个有趣的想法。
也许〜5个字符的随机行可以帮助我们了解代码的功能。(当然,我们需要学习如何阅读它们。)

更多编辑:我正在试一试。现在,如果我在编辑器(Or cat myscript.sh|grep function)中折叠所有函数,它们将看起来像这样。(geany与此处相比,我的unicode在终端中看起来要好得多。)

function _1(){
function ⬚⬚_2(){
function ⬚⬚⬚_📃_D(){
function ⬚⬚⬚⬚_📃_X(){
function ⬚⬚⬚⬚⬚_📃_Y(){
function ⬚⬚⬚⬚⬚⬚__P(){
function ⬚⬚⬚⬚_📃_Z(){
function ⬚⬚⬚⬚⬚__U(){
function ⬚⬚⬚⬚⬚__O(){

我使用一个奇怪的缩进⬚来展示功能之间的相互关系,并使用符号📃/❓来清楚地区分它们的作用。(当然,这些不是我的真实函数名称,我只是在最后加上一个随机字母,但是即使没有它们,我们也可以清楚地看到它们之间的关系。)


8
我会说这出于不兼容的原因是不安全的,如果您必须在旧服务器上使用脚本,则由于bash表情符号支持是最近的,因此无法使用。但在最近的Linux上可能还可以。
Kiwy

18
@Ipor不,它代表Unicode(而Unicode中的“ Uni”代表通用)。
斯蒂芬·基特

5
您希望通用性如何“通用”?可以在Cygwin上正常运行UTF-8和UTF-16问题?在现代IBM z / OS系统服务上,哪些仍然需要处理EBCDIC字符集?在不使用8位字节作为最小单位的历史Unix计算机上吗?POSIX限制的存在是有原因的……
dirkt,

6
根据POSIX,功能名称必须由可移植字符集中的字符组成。如果“通用”的意思是“任何壳”,那么从这个意义上讲它不是通用的。
库萨兰达

6
如果您发现自己在shell脚本中执行<whatever>是否安全,答案很可能是“否”。哎呀,即使不做echo $foo也是安全的。
Matteo Italia

Answers:


55

对此有用的指南是“可移植操作系统接口”(POSIX),它是由大多数类Unix系统实现的一系列标准。通常最好将Shell脚本限制为POSIX要求的功能,以确保它们可在不同的Shell和平台上使用。

根据“ Shell命令语言”中的POSIX 函数定义规范:

该函数名为fname; 应用程序应确保它是一个名称(请参阅IEEE Std 1003.1-2001的Base Definitions卷,第3.230节,名称)。一个实现可以允许函数名称中的其他字符作为扩展名。

在指向“名称”定义的链接之后:

在shell命令语言中,是仅由可移植字符集中的下划线,数字和字母组成的单词。

该字符集仅包含U0000和U007E之间的字符。
因此,在兼容POSIX的标识符中,“⏰”(U23F0)之类的字符无效。

您的外壳可能会接受它们,但这并不能保证其他人也会接受它们。
为了能够在不同的平台和软件版本上使用脚本,您应该避免使用像这样的不兼容标识符。


18
好的经验法则...如果您的标准键盘没有按键,请不要使用它。
SnakeDoc '18

6
@SnakeDoc youtube.com/watch?v=3AtBE9BOvvk “标准”表情符号键盘;)
Jorn

9
@Jorn也许我应该说“如果您不能从普通的零售店购买键盘”……大声笑
SnakeDoc

4
@SnakeDoc这是一个很好的开始-但是我在其上输入此键盘的键盘具有用于£,€和¬的键,所有这些键均不在便携式字符集中。更严重的是,一些同事的键盘上带有ä,ö,ü,è,é和ß。它们全是字母,但不适用于可移植的函数名称。
Martin Bonner

2
兼容POSIX但不限于POSIX?
鲍勃迪伦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.