Sedikit pengalihan shell

10 Mei 2009 oleh prashant · Komentar
Filed under: teknologi

Berikut adalah bagaimana kita biasanya melakukan pengalihan shell
$ ./pgm.sh args >out.txt 2>err.txt
Saya ingin memodifikasi sedikit dan berjalan sebagai berikut
$ ./pgm.sh args
dengan persyaratan bahwa output dan kesalahan harus pergi ke beberapa nama file dihitung dalam pgm.sh berdasarkan args. Satu kasus ilustratif bisa jadi saat saat ini adalah bagian dari args. Jadi Anda ingin stdout untuk pergi untuk mengatakan / / direktori / pgm_out_YYYYMMDD.txt 1

Masalah dengan cara standar untuk mengarahkan N>file.txt yaitu, menghubungkan file deskriptor N untuk file.txt, adalah bahwa ia bekerja hanya untuk proses yang baru bercabang dan bukan untuk proses saat ini.
jadi
$ echo hi 1>out.txt ; echo hii . akan mengirimkan hi ke out.txt tetapi akan mencetak hii ke stdout 2

Di sinilah exec datang untuk menyelamatkan kita. Jika kita menambahkan exec 1>somefile.txt maka output dari sisa script akan pergi ke somefile.txt

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh akan mengarahkan hi hii serta untuk out.txt

Demikian pula untuk mengarahkan stdout serta stderr kita akan melakukan sesuatu seperti ini
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp

Sekarang kembali ke titik awal dari mengarahkan ke beberapa file dari dalam shell, katakanlah nama file program yang dihitung dalam beberapa OUTFILE variabel, kita bisa saja dilakukan exec 1>$OUTFILE

Yang memecahkan masalah saat ini. Tapi Anda mungkin ingin pergi melalui contoh berikut yang mencapai 'random access' dari file di shell script. Contoh adalah dari sini
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

Dengan komentar, kode ini sendiri adalah jelas.
-
1 Hal ini juga dapat dilakukan dengan $ ./pgm.sh args >pgm_out`date +%Y%m%d` tetapi ide adalah untuk menghasilkan nama file ini didasarkan pada beberapa logika dalam program itu sendiri.
2 1 dalam 1> out.txt berlebihan tetapi menjelaskan di sini bahwa kita mengarahkan fd 1