Browse Source

[enh] handle closing redirection.

- add unit tests.
Moul 4 years ago
parent
commit
22d3078119
3 changed files with 12 additions and 2 deletions
  1. 1 1
      README.md
  2. 5 0
      src/redirect.c
  3. 6 1
      tests.sh

+ 1 - 1
README.md

@@ -101,7 +101,7 @@ Three entries:
 
 #### Redirections
 * [x] Gestion 2>&1, 2<&1 : https://stackoverflow.com/questions/818255/in-the-shell-what-does-21-mean
-* [ ] gérer la fermeture de fd avec `2>&-"`
+* [x] gérer la fermeture de fd avec `2>&-"`
 * [ ] La redirection n’est pas bien faite de 2 dans 1. Vérifier avec cat. Ajouter tests unitaires correspondant.
 
 #### Autres

+ 5 - 0
src/redirect.c

@@ -117,6 +117,7 @@ void	redirections(t_e *e, char *cmd, char *operator, char *ofd, char *file)
 /*
 ** for file writting: open, append or trunc
 ** for fd redirecting: ofd: output fd: dup ofd
+** for '>&-': open '/dev/null'
 ** save stdfd, dup new fd in STDIN
 */
 
@@ -127,7 +128,11 @@ void	right_redirections(int *fd, char *operator, char *ofd, char *file)
 	else if (ofd == NULL)
 		fd[0] = open(file, O_TRUNC | O_WRONLY | O_CREAT, 0644);
 	else if (ofd != NULL)
+	{
 		fd[0] = ofd[0] == '2' ? dup(STDERR) : dup(STDOUT);
+		if (ofd[0] == '-')
+			fd[0] = open("/dev/null", O_WRONLY);
+	}
 	fd[1] = operator[0] == '2' ? dup(STDERR) : dup(STDOUT);
 	operator[0] == '2' ? dup2(fd[0], STDERR) : dup2(fd[0], STDOUT);
 }

+ 6 - 1
tests.sh

@@ -76,7 +76,12 @@ tests=(
 #"cat << toto\nnrstai\nrsnati\nairnst\ntoto" # double gauche avec autre string de fin
 
 ## Redirections avec fd de sortie spécifié
-"echo test 2>&-" # de fd2 dans le vide ? non
+### Redirection closed
+"ls 1>&-"
+"ls 2>&-"
+"mkdir -p 2>&-"
+"mkdir -p 1>&-"
+### Redirection opened
 "echo test 1>&2"
 "echo test >&2"
 "echo test 2>&1"