Trochę Przekierowywanie powłoki
Oto w jaki sposób normalnie zrobić Przekierowywanie powłoki
$ ./pgm.sh args >out.txt 2>err.txt
Chciałem zmodyfikować go trochę i uruchomić w następujący sposób
$ ./pgm.sh args
z wymogiem, że produkcja i błąd powinien udać się do jakiegoś pliku obliczonego wewnątrz pgm.sh na podstawie argumentów. Jeden ilustracyjny sprawa może być, gdy data jest częścią argumentów. Więc chcesz stdout, aby przejść do powiedzenia / twój / katalog / pgm_out_YYYYMMDD.txt 1
Problem z standardowego sposobu przekierowanie N>file.txt tj. kojarzenie pliku o numerze n do plik.txt, że to działa tylko dla procesu nowo odłam, a nie dla bieżącego procesu.
tak
$ echo hi 1>out.txt ; echo hii . wyśle Witam out.txt ale wypisze hii na standardowe wyjście 2
To tam exec przychodzi nam z pomocą. Jeśli dodamy exec 1>somefile.txt a następnie wyjście z resztą skrypt trafi do plik.txt
$. / Test.sh przekieruje hi jak hii do out.txt
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
Podobnie jak przekierować stdout oraz stderr zrobimy coś takiego
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp
Wracając do pierwotnego punktu przekierowanie do jakiegoś pliku od wewnątrz powłoki, powiedzmy Program oblicza nazwę pliku w jakimś zmiennym OUTFILE, moglibyśmy tylko zrobić exec 1>$OUTFILE
To rozwiązuje bieżącego problemu. Ale może chcesz przejść poniższym przykładzie, w którym osiąga 'Losowo dostęp' do pliku w skrypcie powłoki. Przykładem jest od tutaj
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
Z komentarzy, ten kod jest oczywista.
-
1 może być również wykonywane przez $ ./pgm.sh args >pgm_out`date +%Y%m%d` ale pomysł jest do wygenerowania tego nazwę pliku na podstawie jakiejś logiki w samym programie.
2 1 w 1> out.txt jest zbędna, ale wyjaśnia tu, że jesteśmy przekierowanie fd 1



































