【问题标题】:What level of expertise would this interview item suggest? unset foo; echo bar | read foo; echo $foo [closed]这个采访项目会建议什么水平的专业知识?取消设置 foo;回声吧 |读 foo;回声 $foo [关闭]
【发布时间】:2026-01-26 16:10:01
【问题描述】:

假设您正在准备一次深入的技术面试,并要求您对自己在 shell 脚本方面的专业知识进行评分(假设为 1 到 10)。然后看下面的 shell 命令行示例并回答问题:这是做什么的?为什么?

unset foo; echo bar | read foo; echo "$foo"

对于一般情况(不仅仅是针对某个或另一个特定版本的 shell),您会根据什么水平的专业知识正确回答这个问题?

现在假设您得到了以下示例:

cat "$SOMELIST_OF_HOSTS" | while read host; do ssh $host "$some_cmd"; done

...面试官解释说这个命令“不起作用”并且它似乎只在(大)文件中列出的一些主机上执行 ssh 命令(每隔几百个主机名就有类似的东西,似乎分散在列表中)。他或她自然会问:为什么要这样做?你会如何解决它?

然后评估您将把能够正确回答这些问题的人映射到的专业水平。

【问题讨论】:

  • 一个新手......也许是一个 4......如果他们不能毫不犹豫地识别和回答这两个问题,他们不会考虑雇用某人。
  • 第二个只能在第一个主机上运行。

标签: bash ksh zsh sh


【解决方案1】:

第一个是新手 中级(见下文)级别。 unsetechoread 和基本的变量使用应该在 Bash 的前 1000 行左右,处理典型的 shell 代码。

第二个是中级IMO;在我发现诸如ssh 吞噬标准输入之类的无害命令之前,我已经使用 Bash 几年了。这是对ssh 命令的一个很好的测试,但由于它有点反常,所以最好用简单的cat 进行测试,看看候选人是否理解问题的根源。

但正如我认为@IgnacioVazquez-Abrams 指出的那样,您不能仅根据两个狭隘的问题来评价太多 - 作为others have pointed out,为什么不给他们一个实际的问题来解决?您将无限了解他们实际完成工作的能力。

编辑:正如@IgnacioVazquez-Abrams 也指出的那样,这些本质上测试的是同一件事。因此,我将两者都评为中级。

【讨论】:

  • 你错过了第一个原因。
  • @IgnacioVazquez-Abrams:哦,他们都在测试同一个东西。嗯,我的水平就这么多了:)
【解决方案2】:

请注意,第一个示例依赖于 shell。管道是一个 IPC(进程间通信)运算符,shell 可以通过在管道的任一侧创建一个子shell 来实现它。 (从技术上讲,我认为某些 shell 甚至可以在单独的子进程中评估双方)。

read 命令是内置的(必须,本来就是这样)。因此,在诸如bash 和经典的 Bourne shell 派生类等 shell 中,suprocess(子 shell)位于管道的右侧(从当前 shell 读取),并且该进程在其 read 之后结束(在本例中为分号)。 Korn shell(至少早在 93 年)和zsh 将它们的子shell 放在管道的另一侧,并从这些子shell 中读取数据到当前进程中。

这就是面试问题的重点。

我的问题的重点是寻找一些共识或指标来评估这个级别的问题。这不是小事,因为它确实会影响现实世界的脚本和 shell 脚本的可移植性,而且它依赖于对底层 UNIX 和 shell 语义(IPC、管道和子进程/子shell)的基本理解。

第二个例子类似但更微妙。我会指出以下更改“有效”(ssh 将在文件中的每个主机上执行):

cat $SOME_FILE | while read host; do ssh "$host" "$some_cmd" < /dev/null; done

这里的问题是ssh 命令缓冲输入,即使远程上的命令从不从其 stdin 读取。因为 shell/subshel​​l(从管道读取)和ssh 共享相同的输入流,ssh 正在“窃取”来自管道的大部分输入,只留下read 命令的偶尔行.

这不是一个人为的问题。我实际上在工作中遇到了它,不得不弄清楚它。我从经验中知道,理解第二个例子至少比第一个例子高出一两个档次。根据多年的经验,我还知道,在我面试过的候选人(系统管理员和编程职位)中,只有不到 10% 的人可以立即得到第一个问题。

我从未在现场采访中使用过第二个问题,因此我一直不鼓励这样做。

【讨论】:

  • 您花了多长时间才发现 ssh 正在吃掉输入?如果超过几分钟,这可能是一个糟糕的问题,因为你知道一个还没有看过它的候选人必须比你更好地了解 shell 才能在面试环境中解决它。
  • 当然,除非他们是通过我或其他人这样的帖子了解到的。 :)
  • 顺便说一句,我通常更关心候选人在回答问题的方式以及他们如何谈论可能性,然后我更关心他们是否正确回答问题。如果他们能立即说出正确的答案,那么我对他们的了解很少。如果他们通过考虑假设并消除它们(可能通过提出澄清问题或提出可能的答案)的过程来工作,那么我所学到的东西具有更多的预测价值。我更关心他们如何处理更难的问题和未知的事物,而不是他们是否知道琐事。