קצת ניתוב מחדש של פגז

10 מאי 2009 על ידי Prashant · תגובות
מתויק תחת: טכנולוגיה

כאן הוא איך אנחנו עושים בדרך כלל פגז ניתוב מחדש
$ ./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

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh יפנה היי וכן hii כדי out.txt

באופן דומה כדי להפנות 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