我正在使用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()
答案 0 :(得分:1)
在cat < test > toto
问题中,您不会删除test
和toto
,因此您获得['cat', 'test', 'toto']
并指定test
和toto
到stdin
,stdout
所以最后系统会将其视为cat test toto <test >toto
,以便您从toto
阅读并写信至toto
您可以使用data = iter(args)
创建iterator
,您可以像以前一样使用for temp in data
,但您也可以使用next(data)
从数据中获取下一个元素{{1}将跳过此元素 - 因此它不会将此元素添加到for
list_arg