在我的noob python代码中找不到命令“cat”的bug

时间:2017-01-30 04:18:13

标签: python shell python-3.x

我正在使用Python实现一个Shell,我有一个小错误,我已经尝试修复了几个小时,但无法弄清楚问题。

当我运行程序并开始用“cat”命令键入一行时,一切正常,直到我在stdout和文件名之间放置一个空格。

例如:

1)cat <test >toto完美运行,现在toto有内部测试。

2)cat < test >toto完美运行,现在toto有内部测试。

3)cat < test > toto完美运行,现在toto有内部测试,但我在终端中得到以下行(cat:toto:输入文件是输出文件)

4)cat <test > toto不起作用,我得到同一行(cat:toto ....)

当我在“&gt;”之间放置一个空格时出了什么问题和文件的名称,为什么一直说输入文件与输出文件相同?! 这是我的代码

#!/usr/bin/python3

 import os
 import sys
 from shutil import copyfile
 def main():
    while True:
        sys.stdout.write("%% ")
        line = input()
        line2 = line[0:len(line)]
        line = ""
        dirs = os.listdir()
        d = ""
        for j in range(0, len(dirs)):
            d += dirs[j] + " "
        for i in range(0, len(line2)):
            if line2[i] == "*":
                line += d
            else:
                line += line2[i]
        args=list(filter(None,line.split(" ")))
        list_arg=[]  
        src=""
        dst=""
        sr_c=0
        ds_t=0  
        cmd=args[0]
        for temp in args:
            if temp=="<":
                sr_c=1
                src=args[args.index("<")+1]             
            elif temp[0]=="<":
                sr_c=1
                src+=temp[1:]
            elif temp==">":
                ds_t=1
                dst=args[args.index(">")+1]
            elif temp[0]==">":
                ds_t=1
                dst+=temp[1:]
            else:
                list_arg+=[temp]
        if ds_t:
            output=os.open(dst,os.O_CREAT |os.O_WRONLY |os.O_TRUNC)
        else: output=1

        if sr_c:
            inputt=os.open(src,os.O_RDONLY)
        else: inputt=0

        pid = os.fork() 
        if pid == 0:
            os.dup2(inputt,0)
            os.dup2(output,1) 
            os.execvp(cmd,list_arg)
        else:
            os.waitpid(pid,0)       
    sys.stdout.write("Bye!\n")
    sys.exit(0)

      main()

1 个答案:

答案 0 :(得分:1)

cat < test > toto问题中,您不会删除testtoto,因此您获得['cat', 'test', 'toto']并指定testtotostdinstdout所以最后系统会将其视为cat test toto <test >toto,以便您从toto阅读并写信至toto

您可以使用data = iter(args)创建iterator,您可以像以前一样使用for temp in data,但您也可以使用next(data)从数据中获取下一个元素{{1}将跳过此元素 - 因此它不会将此元素添加到for

list_arg