קצת ניתוב מחדש של פגז
כאן הוא איך אנחנו עושים בדרך כלל פגז ניתוב מחדש
$ ./pgm.sh args >out.txt 2>err.txt
רציתי לשנות את זה קצת ולהפעיל כדלקמן
$ ./pgm.sh args
עם דרישה כי פלט השגיאה צריך ללכת קובץ כלשהו מחושב בתוך pgm.sh מבוסס על ארגומנטים. מקרה אחד יכול להיות המחשה, כאשר התאריך הוא חלק ארגומנטים. אז אתה רוצה ללכת stdout להגיד / מדריך / שלך / pgm_out_YYYYMMDD.txt 1
הבעיה עם הדרך הסטנדרטית של הפניית N>file.txt כלומר, שיוך מתאר קובץ N כדי file.txt, היא שזה עובד רק עבור התהליך החדש מפוצל ולא עבור התהליך הנוכחי.
כך
$ echo hi 1>out.txt ; echo hii . ישלח שלום out.txt אבל ידפיס hii ל stdout 2
זה המקום שבו exec בא להציל שלנו. אם נוסיף exec 1>somefile.txt ואז פלט שאר התסריט יהיה ללכת somefile.txt
$. / Test.sh יפנה היי וכן hii כדי out.txt
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
באופן דומה כדי להפנות stdout וכן נציג stderr לעשות משהו כזה
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp
עכשיו חוזר לנקודה המקורית של מעביר קובץ כלשהו מתוך מעטפת, נניח תוכנית לחשב את שם הקובץ ב OUTFILE קצת משתנה, היינו יכולים לעשות רק exec 1>$OUTFILE
זה פותר את הבעיה הנוכחית. אבל ייתכן רוצה לעבור את הדוגמה הבאה, אשר משיגה 'גישה אקראית "של הקובץ סקריפט מעטפת. דוגמה לכך היא מפני כאן
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
עם הערות, קוד זה הוא מסביר את עצמי.
-
1 זה גם יכול להיעשות על ידי $ ./pgm.sh args >pgm_out`date +%Y%m%d` אבל הרעיון הוא ליצור את שם הקובץ מבוסס על היגיון כלשהו בתוכנית עצמה.
2 1 על 1> out.txt הוא מיותר אך מבהיר כאן כי אנו הפניית FD 1



































