Truputis korpuso peradresavimo
Štai kaip mes paprastai padaryti shell peradresavimą
$ ./pgm.sh args >out.txt 2>err.txt
Norėjau pakeisti, jis šiek tiek ir taip paleisti
$ ./pgm.sh args
reikalavimo, kad išėjimo ir klaidos turėtų eiti tam tikru failo vardą, apskaičiuotą args pagrįstas viduje pgm.sh. Vienas pavyzdinis atvejis galėtų būti, kai data args dalis. Taigi norėtumėte STDOUT eiti say / jūsų / katalogą / pgm_out_YYYYMMDD.txt 1
Su standartiniu būdu nukreipiant problema N>file.txt ty, derinant failo deskriptorius N į plik.txt, yra, kad jis veikia tik naujai išsišakojęs, o ne dabartiniu metu.
taip
$ echo hi 1>out.txt ; echo hii . bus išsiųsti hi į out.txt, bet spausdinti hii stdout 2
Tai kur exec ateina į mūsų gelbėjimo. Jei mes pridėti exec 1>somefile.txt tada produkcija nuo likusios scenarijaus vyks somefile.txt
$. / Test.sh bus nukreipti hi kaip gerai kaip hii out.txt
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
Panašiai nukreipti STDOUT taip pat stderr mes padarysime kažką panašaus į tai
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp
Dabar grįžtant prie pradinio taško, nukreipiant tam tikra failą iš korpuso viduje, tegul sako, kad programa skaičiuojamas failo pavadinimą, kai kintamojo OUTFILE, mes galėjo tik padaryti exec 1>$OUTFILE
Tai išsprendžia problemą. Bet tu gali eiti per tokiu pavyzdžiu, kuriuo pasiekiamas "laisvą prieigą failo apvalkalo scenarijus. Pavyzdys yra iš čia
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
Su pastabomis, šis kodas yra savaime suprantama.
-
1 Jis taip pat gali būti padaryta $ ./pgm.sh args >pgm_out`date +%Y%m%d` , tačiau idėja yra sukurti šio failo pavadinimą, nors pačios programos logika.
2 1 1> out.txt yra nereikalingas, bet jis paaiškina, kad mes nukreipiant fd 1



































