这个面试问题提示需要哪种程度的专业知识?unset foo; echo bar | read foo; echo $foo

3

假设你正在为一次深入的技术面试做准备,被要求在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命令(大约每隔几百个主机名就会有一个,看起来是从列表中散布出来的)。自然地,他或她会问:为什么会这样?以及你如何修复它?

然后,评估您将正确回答这些问题的专业水平。


一个初学者...也许是四级水平...如果不能毫不犹豫地回答上述两个问题,就不会考虑雇佣他人。 - Ryan Kempt
1
第二个只能在第一个主机上运行。 - Ignacio Vazquez-Abrams
2个回答

1
第一个是中级(请见下文)。在编写典型的shell代码时,应该在前1000行Bash中遇到unsetechoread和基本变量使用。
第二个问题在我看来是中级水平。在我发现无害命令ssh会吞噬标准输入之前,我已经使用Bash几年了。这是一个测试ssh命令的好方法,但由于它有点不寻常,也许最好用cat来测试,看看应聘者是否理解了问题的基础。
但正如@IgnacioVazquez-Abrams所指出的,仅仅基于两个狭窄的问题不能评价太多。正如其他人所指出的那样,为什么不给他们一个实际的问题来解决呢? 这样你就能更好地了解他们实际完成工作的能力。

编辑:正如@IgnacioVazquez-Abrams所指出的那样,它们本质上测试的是相同的东西。因此我会将它们都评为中级。


1
你错过了第一个的原因。 - Ignacio Vazquez-Abrams
@IgnacioVazquez-Abrams:糟糕,它们都在测试同一件事。哎呀,我的水平就这样了 :) - l0b0

0
请注意,第一个示例依赖于shell。管道是IPC(进程间通信)运算符,shell可以通过在管道的任一侧创建子shell来实现它。(从技术上讲,我想某些shell甚至可以在单独的子进程中评估两侧)。
“read”命令是内置的(必须如此)。因此,在像bash和经典的Bourne shell衍生版本这样的shell中,子进程(子shell)位于管道的右侧(从当前shell读取),并且该进程在其“read”之后结束(在此示例中为分号)。至少从'93年开始,Korn shell和zsh将它们的子shell放在管道的另一侧,并从中读取数据到当前进程中。
这就是面试问题的重点。
我在这里提出问题的重点是寻找一些共识或度量标准,以确定如何高度评价这种水平的问题。这不是琐事,因为它确实影响真实世界的脚本和shell脚本的可移植性,并且依赖于对底层UNIX和shell语义(IPC、管道和子进程/子shell)的基本理解。
第二个例子类似但更微妙。我要指出以下更改“有效”(ssh将在文件中的每个主机上执行):
cat $SOME_FILE | while read host; do ssh "$host" "$some_cmd" < /dev/null; done

这里的问题是,即使远程命令从其stdin中没有读取内容,ssh命令仍会缓冲输入。因为shell /子shell(从管道读取)和ssh共享相同的输入流,ssh“窃取”了大部分来自管道的输入,只留下偶尔的一行给read命令。

这不是一个人工问题。我在工作中真正遇到过这个问题,并且必须解决它。我知道从经验上讲,理解第二个示例至少比第一个高出一两个级别。我也知道,从多年的经验来看,我面试的候选人(系统管理员和编程职位)中少于10%的人可以立即回答第一个问题。

我从未在现场面试中使用过第二个问题,并且被劝阻这样做。


1
你花了多少时间才发现ssh在吃输入?如果超过几分钟,那可能是一个不好的问题,因为这样你就知道一个还没有见过它的候选人在面试中要想弄清楚它,就必须比你更好地理解shell。 - Graham
除非他们通过像我或其他人发布的帖子了解到它。 :) - Jim Dennis
顺便说一句,对我而言,一个候选人如何解答问题、如何从各种可能性中进行思考与表达所展现出的工作方式比起他们是否正确回答问题更为重要。如果他们可以立即背诵正确答案,则我无法了解太多有关他们的信息。但是如果他们能够通过构建假设并排除它们(可能通过提出澄清问题或提出可能的答案)来解决问题,则我所得到的信息具有更好的预测价值。相对于知道琐碎的细节,我更加关注他们将如何处理更困难的问题和未知情况。 - Jim Dennis

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