<p>当前代码中有几个错误:</p>
<ol>
<li><p>首先,您有一些混乱的缩进,包括用于缩进的制表符和空格的混合。这在Python中非常糟糕,因为不正确的缩进是一种语法错误。我已经修复了问题中的代码以正确显示(每个选项卡使用8个空格),但是您也需要在文件中修复它。另外,请注意Python约定是每个块缩进四个空格,因此您可能希望将编辑器设置为默认情况下缩进四个空格。</p></li>
<li><p>第二,顶层检查的逻辑不正确。您正在测试整个命令字符串是否包含在<code>commandAvail</code>变量中的命令字符串中。如果命令除了命令名之外还有参数,那么这样做是错误的。我建议您<code>split</code>使用命令字符串来获取术语列表,然后只针对可用的命令测试第一个术语。我建议将<code>commandAvail</code>拆分为一组字符串,而不是进行子字符串搜索:</p>
<pre><code># make a set of commands that we recognize
commandAvail = set('ls where chdir mk mkdir cp'.split()) # trimmed for space
# then later, test against it
command = input().split()
if command[0] in commandAvail: # this is much more efficient!
# do stuff
</code></pre></li>
<li><p>最后,您试图从命令字符串中删除命令本身的方法是错误的。你不能从另一个字符串中减去一个字符串(如果你尝试的话,你会得到一个<code>TypeError</code>)。幸运的是,我为上一个问题建议的解决方案在这里会有所帮助。由于<code>split</code>调用,您将获得一个术语列表,而不是进行字符串操作。现在,只需对第一项(命令)进行测试,并将其余项作为参数传递。你知道吗</p>
<p>事实上,这意味着一个比当前拥有的<code>if</code>/<code>elif</code>块的大链要简单得多的实现。使用字典在命令字符串和实现它们的函数之间进行映射:</p>
<pre><code># map command names to the functions that implement them
command_dict = {"ls":ls, "where":where, "chdir":chdir} # snipped
# the main loop
while True:
# command is first term, the rest go into args
command, *args = input().split()
try: # use "easier to ask forgiveness than permission" idiom
command_dict[command](*args) # call function from command_dict
except KeyError:
print("Unknown command: {}".format(command))
</code></pre></li>
</ol>