Малко на корпуса пренасочване

10 май 2009 г. от Prashant
Пила под: технология

Ето как правим обикновено черупка пренасочване
$ ./pgm.sh args >out.txt 2>err.txt
Исках да го променят малко и да работи, както следва
$ ./pgm.sh args
с изискването, че производството и грешки, трябва да отидете на някои името на файла, изчислен отвътре pgm.sh, въз основа на аргументи. Един примерен случай би могло да бъде, когато датата е част от аргументи. Така че бихте искали стандартния изход, за да отидете да се каже / директорията / / pgm_out_YYYYMMDD.txt 1

Проблемът с стандартен начин за пренасочване N>file.txt т.е., обединяващ файлов дескриптор N да file.txt е, че той работи само за наскоро чаталест процес, а не за текущия процес.
така
$ echo hi 1>out.txt ; echo hii ще изпрати Hi на out.txt но ще отпечата hii към стандартния изход 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 ще се пренасочат Hi както като hii за out.txt

По същия начин да се пренасочи стандартния изход, както и 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

Коментари

    Блог коментари захранва от Disqus