Een beetje shell redirection
Hier is hoe we normaal gesproken shell redirection te doen
$ ./pgm.sh args >out.txt 2>err.txt
Ik wilde het een beetje te wijzigen en uit te voeren als volgt
$ ./pgm.sh args
met de eis dat de output en error moet gaan om een aantal bestandsnaam berekend binnen pgm.sh op basis van args. Een illustratief geval zou zijn wanneer de datum is een onderdeel van args. Dus u wilt stdout te gaan om te zeggen / uw / directory / pgm_out_YYYYMMDD.txt 1
Het probleem met standaard manier van omleiden van N>file.txt dat wil zeggen, associëren file descriptor N tot bestand.txt, is dat het werkt alleen voor de nieuw gevorkte proces en niet voor het huidige proces.
zo
$ echo hi 1>out.txt ; echo hii . zal hi te sturen naar out.txt maar zal HII afdrukken naar stdout 2
Dit is waar exec komt ons te hulp. Als we exec 1>somefile.txt dan uitgang van de rest van het script gaat naar somefile.txt
$. / Test.sh zal hi omleiden en HII out.txt
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
Net als stdout en stderr omleiden we iets doen als dit
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp
Nu weer terug naar oorspronkelijke punt van om te leiden naar een bestand vanuit de shell, laten we zeggen-programma berekend de bestandsnaam in sommige variabele OUTFILE, kunnen we zojuist hebben gedaan exec 1>$OUTFILE
Dat lost het huidige probleem. Maar je kunt houden om te gaan door volgende voorbeeld waarin 'random access' van het bestand in de schaal script bereikt. Voorbeeld is van hier
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
Met opmerkingen, deze code is voor zichzelf.
-
1 Het kan ook worden gedaan door $ ./pgm.sh args >pgm_out`date +%Y%m%d` , maar idee is het bestand deze naam te genereren op basis van enkele logica in het programma zelf.
2 1 op 1> out.txt is overbodig, maar het verduidelijkt hier dat we fd 1 omgeleid



































