diff --git a/Makefile b/Makefile
index c1099d4512022c6e402b3ab4d9b7e03401c55820..5d5d2fef8c81cbb6520cbc67d4cc5445305ef921 100644
--- a/Makefile
+++ b/Makefile
@@ -128,8 +128,8 @@ rm : rm.o $(ULIB)
 mkfs : mkfs.c fs.h
 	cc -o mkfs mkfs.c
 
-fs.img : mkfs userfs usertests echo cat readme init sh ls mkdir rm fstests
-	./mkfs fs.img userfs usertests echo cat readme init sh ls mkdir rm fstests
+fs.img : mkfs userfs usertests echo cat README init sh ls mkdir rm fstests
+	./mkfs fs.img userfs usertests echo cat README init sh ls mkdir rm fstests
 
 -include *.d
 
diff --git a/sh.c b/sh.c
index 5da556e0b28bd2479b6e321edd9e1dabdab0d8e4..b2905e75a1d24337ab90aa7a2eef9d5e2be0e09e 100644
--- a/sh.c
+++ b/sh.c
@@ -162,37 +162,24 @@ ioredirection(void)
   for (i = 0; i < nextnode; i++) {
     switch (list[i].token) {
     case '<':
+      if (close(0) < 0)
+	printf(2, "close 0 failed\n");
       if ((fd = open(list[i].s, O_RDONLY)) < 0) {
 	printf(2, "failed to open %s for read: %d", list[i].s, fd);
 	return -1;
       }
-
       if (debug)
 	printf(2, "redirect 0 from %s\n", list[i].s);
-
-      close(0);
-      if ((dfd = dup(fd)) < 0)
-	printf(2, "dup failed\n");
-      if (debug)
-	printf(2, "dup returns %d\n", dfd);
-      close(fd);
       break;
     case '>':
+      if (close(1) < 0)
+	printf(2, "close 1 failed\n");
       if ((fd = open(list[i].s, O_WRONLY|O_CREATE)) < 0) {
 	printf(2, "failed to open %s for write: %d", list[i].s, fd);
 	exit();
       }
-
       if (debug)
 	printf(2, "redirect 1 to %s\n", list[i].s);
-
-      if (close(1) < 0)
-	printf(2, "close 1 failed\n");
-      if ((dfd = dup(fd)) < 0)
-	printf(2, "dup failed\n");
-      if (debug)
-	printf(2, "dup returns %d\n", dfd);
-      close(fd);
       break;
     }
   }
diff --git a/user.h b/user.h
index 428d786b4a2c9bbadab9367e9a4e60fe1ee13ee8..8016eacdfa30f372443bb11af8e1a2c6cc841c0f 100644
--- a/user.h
+++ b/user.h
@@ -1,14 +1,12 @@
+// system calls
 int fork(void);
 int exit(void) __attribute__((noreturn));
 int wait(void);
-int cons_putc(int);
 int pipe(int*);
 int write(int, void*, int);
 int read(int, void*, int);
 int close(int);
 int kill(int);
-int panic(char*);
-int cons_puts(char*);
 int exec(char *, char **);
 int open(char *, int);
 int mknod (char*,short,short,short);
@@ -21,6 +19,7 @@ int dup(int);
 int getpid();
 char *sbrk(int);
 
+// ulib.c
 int stat(char *, struct stat *stat);
 int puts(char*);
 char* strcpy(char*, char*);