作为一个命令行爱好者,当我看到 Klaatu 的演讲《Unix Shell 人机界面指南》即将在 All Things Open 大会上展出时,我非常感兴趣。
虽然我一直被 Unix/Linux shell 的美妙简洁性所吸引——是的,真的——但能与分享这种欣赏的人交流总是很美好的。然而,Klaatu 更进一步,他定义了一些构成 shell 优雅性的属性。
在这次采访中,他向我们简要介绍了他在 ATO 大会上的演讲,我计划亲自去听听他对这个话题的看法。互联网上关于 HIG 的资料很少,所以我请 Klaatu 告诉我们 HIG 的含义以及它如何影响 Linux shell 的用户界面。当然,Klaatu 也会告诉我们他的名字的由来。
我不得不代表我自己和许多其他人问,你的名字 Klaatu 是向我最喜欢的电影之一《地球停转之日》致敬吗?你愿意详细解释一下吗?
这是一个双重致敬!首先,是向(原版,而不是翻拍版)《地球停转之日》致敬,其次,是向《鬼玩人3:魔界英豪》致敬。前者是一部各方面都很棒的电影,但我认为它最大的力量在于它如何利用期望和电影的比喻来传达与各个元素所代表的意义完全相反的信息。为了避免剧透,我将避免过于具体。后者当然是一部伟大的电影,尤其是它深入分析了分叉和分支如何影响软件项目。
当我刚开始接触 Unix 和开源时,我正在为一个名为 GNU World Order 的小型播客选择笔名。我天真地认为,在一个重视技术且经常关注推测小说的社区中,“Klaatu”这个名字是对我最喜欢的电影的古朴而晦涩的致敬。当然,我后来了解到,在科技界,使用“Klaatu”作为你的用户名就像在现实世界中使用“Bob Smith”一样普遍,因此在网上,我有时也被称为“notKlaatu”,以便将我与其他 Klaatu 区分开来。
你是如何开始接触 Unix 的?
嗯,我从来不是 Windows 用户。我一生中花在 Windows 上的累计时间可能只有 15 分钟,甚至更少。我是在另一个商业操作系统 (OS) 上长大的。从那个系统过渡到真正的 Unix 并没有那么困难。
话虽如此,我原本并没有打算从事计算机行业,而是想从事电影行业。我私下里其实很 Geek,但我去电影学院学习电影制作。
有一天,在去电影学院的路上,我正在阅读一本行业杂志,其中有一篇文章介绍了视觉特效公司如何使用 Unix,文章中说他们有一种神秘的能力,可以在不启动界面的情况下启动程序。从那时起,我就非常好奇想知道,我也如何才能在不麻烦使用实际 UI 的情况下使用应用程序。
当我了解到我从小使用的操作系统是“基于 Unix”时,我买了一本关于如何学习 Unix 的书(具体来说是 Unix 视觉快速入门指南)。我开始将书中的所有内容应用到我在那个操作系统中找到的终端上。在 Emacs 的文档中(我当时主要将其用作俄罗斯方块引擎),我了解了开源的概念和 GPL。最终,我厌倦了不断的编译器错误以及无法在不想启动桌面时避免启动桌面的问题,所以我转而使用 Slackware Linux,并且从未回头。
顺便说一句,我现在从事视觉特效工作。
Unix shell 最吸引你的是什么?
效率。我似乎对阻碍我实现既定目标的事情没有耐心,而 shell 是所有计算领域中唯一能让我完全按照我的意愿去做事情的东西。
其次是创建我自己的工作环境的能力。这花了一段时间,但一旦我学会了脚本编写的基础知识,编写自定义命令和脚本的能力就彻底改变了我的生活。
有很多其他好的理由来热爱 shell,但就目前而言,这两点最能引起我的共鸣。
HIG 代表什么?
“HIG”是我从 GNOME 那里学到的一个术语。它代表“人机界面指南”,它是一组规范,用于指导开发人员应用程序应如何向人们呈现其功能。
你是如何对人机界面指南产生兴趣的?
广义上讲,我不认为我对这个话题非常感兴趣,至少不像 UI 设计师那样感兴趣。但所有计算机用户都对人机界面指南有点感兴趣,因为这是我们使用计算设备的方式。对我来说,这只是一个关于我们应该如何共同地,至少在或多或少的方式上,同意计算机应该如何工作的问题。这是我们努力在应用程序的使用方式上形成共同趋势。
我不知道汽车制造商是如何做到的,但一般来说,如果你进入一辆汽车,即使是新西兰的汽车(驾驶座在左边),你基本上也知道所有东西的位置。但据我所知,没有人强迫任何人采用这种通用设计。这只是我们都同意的。我认为同样的实用主义在计算领域也很有用。
HIG 如何应用于 Unix shell 应用程序?
在某种程度上,HIG 是由 shell 应用程序使用的库和它们运行的环境强加给它们的。如果我编写一个在 BASH 或 (t)csh 或类似 shell 中运行的 Unix 应用程序,那么参数 $0 几乎必须是可执行文件的名称(这并不意味着键入的第一个字符串必须是 arg $0,就像在 BASH 中将 ENV 变量传递给命令的情况一样)。这是一件好事,它是那些无需质疑就存在的实用指南之一。如果有人设计了一个首先查找参数的 shell,我想那将是新的东西,并且最初可能会让大多数用户感到困惑。
但除此之外,还有很大的灵活性,例如选项和参数的顺序,是否需要提示确认等等。有些事情是大多数 Unix 用户期望的,但这并不总是事情的运作方式。
我认为,共同努力确定什么是“有道理的”,以及在设计应用程序时什么最有意义是有帮助的,无论该应用程序是供个人使用的简单 BASH 脚本,还是 Python 或 C++。
我认为现在开源和免费的 Unix 和 Linux 传统变得如此流行,这一点尤其重要。在 Unix 领域肯定有一些糟糕的实现;我希望我们能够通过一些智能设计共同同意避免这种情况。
HIG 应该适用于使用参数和选项的 CLI 命令和应用程序,以及菜单驱动的应用程序吗?
不是相同的 HIG,但应该有一些非强制性的指南。
话虽如此,但是,我们在两者中都默认遵循一些指南。许多 GUI 应用程序努力从左上角到右下角工作,这是一个指南。同样,我们倾向于从左到右构建命令,通常假设顺序是 COMMAND > SOURCE > DESTINATION。这一定是构建事物的最佳方式吗?应该暗示一个顺序吗?值得思考!
Unix shell 应用程序最重要的 HIG 指南有哪些?
shell 应用程序最重要的考虑因素包括
- 命令是否可以在纯文本中工作?或者它是否有一个界面(ncurses 或其他)。它可以两者都做吗?
- 应用程序是否强制执行特定的选项和命令顺序,如果是,用户如何知道这一点?是否有某种人性化的分隔符来帮助人们记住参数需要在哪一方才能产生预期的结果?
- 命令是否接受来自 stdin 的输入?
- 命令是否可以写入 stdout?
- 命令是否在明显的错误语法上提供有用的反馈?命令是否可以提供有用的反馈以防止错误语法?
- 命令是否是交互式的?是否有开关可以打开或关闭它?
- 我是否可以在命令中覆盖重要数据(例如配置文件)的位置?
- 命令是否对信号(HUP、USR 等)提供独特的响应?
你能举例说明哪些 Unix shell 应用程序符合 HIG 以及为什么吗?
简短的回答是来参加[我的]演讲并找出答案!
冗长的回答是,HIG 是一件大事,并且根据每个命令的目标而独特地应用。因此,有很多命令,我觉得,使用起来是一种乐趣。它们在您键入时顺畅地从手指上滑落;语法几乎不言自明。但是,您使用该命令执行的操作可能令人困惑,因此它可能感觉不是很友好,仅仅是因为您不真正理解您在做什么。
所以这是一件复杂的事情,我认为答案不是指向一个真实或想象中的“完美”命令,而是定义一套合理的期望,并在它们适合命令的自我声明目标时应用它们。
这有点像评论一个视频游戏。您可以将益智游戏与 RPG 进行比较,但您不能真正根据其中一个来判断另一个,因为它们都朝着独特的目标努力。Unix 命令在某种程度上也是如此;并非所有东西都应该以相同的方式工作,但一切都应该根据它们自己建立的规则集来理解。
而且,最重要的是,一切都应该像 shell 应用程序期望的那样工作。
您是否有一个 Unix shell 应用程序可以举例说明完全无视 HIG 以及为什么?
我有一两个,但没有必要点名道姓,不仅仅是因为我可能(或可能不)认识它们的作者,还因为这些命令本身可能正在做令人惊奇的事情。希望在这种情况下,开发人员会参加我的演讲,回家后思考一下他们的命令与其他命令相比如何。
但是,我要指出鲜为人知的[并且纯粹是假设的]命令 `hijinx`。这是一个令人憎恶的命令,我害怕使用它,并且由于它的作者在一次涉及过分热情的 CPU 风扇和功率过大的万用表的离奇事故中丧生,因此批评它不会造成任何实际危害。
例如,假设我们使用 hijinx,它令人困惑地提供了可执行文件 `hijink` 而不是 `hijinx`(我认为作者认为单数“hijink”比他的项目的复数名称更合乎逻辑)
$ hijink bar baz
只要我们完全按照这个顺序使用它,它就可以很好地工作:命令、选项、参数。但如果我们这样做
$ hijink baz bar
它就失败了。这很烦人,因为如果 'bar' 值是我发现自己最常更改的值怎么办?作者强迫我按向上箭头,然后按 alt-b,然后按 alt-d,然后键入一个新选项,这似乎很小气。
想想如果我可以这样做会好多少
$ hijinx -baz -o bar
$ hijinx -o bar -baz
并且每次都得到相同的结果?
与 GUI 相比,Unix shell 是否强制人机界面遵守有限的指南子集,如果是,如何强制?
凭我的直觉,我会说它甚至不是一个子集。我认为它更可能是一个不同的集合。我确信任何一种说法都有道理。我从来没有那样想过它。
重点与其说是关于具体定义的 HIG,不如说是关于它代表什么:人机界面指南。它是关于考虑您的用户,他们对界面的期望,以及开发人员可能希望做什么,以使界面减少障碍,更易于使用。
底层操作系统对 Unix shell 施加了哪些类型的用户界面限制?
我对非 POSIX 操作系统了解不够,无法确定,但我能想到的唯一一个是 Unix 信号,以及可能使用管道处理 stdin 和 stdout(我读到 Powershell 有管道,但从我所看到的来看,它们在技术上与 Unix 管道不同,但我显然没有看过代码,甚至没有使用过 Powershell,所以我不能确定)。我现在能想到的其他一切都由 shell 本身(BASH 或 tcsh 或 ksh 或 zsh)或您用来解析参数的方法(if/else 检查、解析库、何时处理参数等等)处理。
HIG 如何影响系统管理员的日常任务?
这取决于所讨论的系统管理员正在做什么。可用性的美妙之处在于,一旦你学会了一些东西,可用性就会从视野中消失。您知道如何使用应用程序,您知道它的工作原理以及您必须克服的障碍。
但是,当您学习新东西时,情况就会崩溃。那时可用性往往最重要。
重复操作有时也会暴露糟糕的界面。显然,如果您必须一遍又一遍地做某事,并且它强加了笨拙的解决方法,那么您就会开始希望获得一些人机界面方面的合理性。
您希望通过在 ATO 上的演讲实现什么目标?
我希望开发人员和即将成为开发人员的人员参加演讲,并思考如何通过仔细考虑界面设计来加强他们的应用程序。适合鹅的可能不适合公鹅,因此,一个灵活的命令,具有合理的语法,至少在良好的内部逻辑与 shell 用户的期望之间取得平衡,是一个人们和,理想情况下,发行版会乐于采用的命令。
我们的读者可以去哪里了解更多关于 HIG 的信息?
无处可去,因为 shell 还没有 HIG……不过。要了解 shell 是如何发展的,以及为什么我们倾向于以我们做事的方式做事,我强烈推荐 Mike Gancarz 的 Unix 哲学 和 Linux 与 Unix 哲学。它们绝不是直接关于界面设计的,但这些书部分解释了为什么 Unix 如此成功地以它工作的方式工作,并且在为 Unix shell 编程应用程序时可以考虑很多这一点。
演讲者访谈
本文是 All Things Open 演讲者访谈 系列的一部分。All Things Open 是一个探索企业中的开源、开放技术和开放网络的会议.
4 条评论