Un peu de redirection du shell

10 mai 2009 par Prashant
Filed under: la technologie

Voici comment nous le faisons normalement redirection du shell
$ ./pgm.sh args >out.txt 2>err.txt
J'ai voulu modifier un peu et se présenter comme suit
$ ./pgm.sh args
avec l'exigence que la production et l'erreur devrait aller à un certain nom de fichier à l'intérieur calculé sur la base de pgm.sh args. Un cas illustratif pourrait être lorsque la date fait partie des arguments. Donc, vous souhaitez stdout pour aller dire / votre / répertoire / pgm_out_YYYYMMDD.txt 1

Le problème avec la façon standard de redirection N>file.txt dire, associant descripteur de fichier N à fichier.txt, c'est qu'il ne fonctionne que pour le nouveau processus fourchue et non pour le processus actuel.
si
$ echo hi 1>out.txt ; echo hii . enverra salut à out.txt mais permet d'imprimer sur la sortie standard hii 2

C'est là que exec vient à notre secours. Si l'on ajoute exec 1>somefile.txt puis la sortie du reste du script aller à somefile.txt

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh redirigera Salut ainsi que hii à out.txt

De même pour rediriger stdout stderr ainsi que nous ferons quelque chose comme ceci
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp

Maintenant revenir au point initial de la redirection vers un fichier à l'intérieur de la coquille, disons programme calcule le nom du fichier dans certains OUTFILE variable, nous aurions pu simplement faire exec 1>$OUTFILE

Cela résout le problème actuel. Mais vous aimerez passer par exemple suivant qui réalise «à accès aléatoire" du fichier en script shell. L'exemple est d' ici
echo 1234567890 > File # Write string to "File".
exec 3<> File # Open "File" and assign fd 3 to it.
read -n 4 <&3 # Read only 4 characters.
echo -n . >&3 # Write a decimal point there.
exec 3>&- # Close fd 3.
cat File # ==> 1234.67890

Avec les commentaires, ce code est explicite.
-
1 Il peut également être effectué par $ ./pgm.sh args >pgm_out`date +%Y%m%d` mais l'idée est de générer ce nom de fichier basé sur une certaine logique dans le programme lui-même.
2 1 1> out.txt est redondant, mais il précise ici que nous redirigeons fd 1

Commentaires

    blog comments powered by Disqus