sh: Как мне избежать путаницы в файловых дескрипторах? - PullRequest
7 голосов
/ 30 июня 2011

Когда у меня

  exec 3>>file               # file descriptor 3 now points to file
  [ $dryrun ] && exec 3>&1   # or possibly to stdout
  echo "running">&3
  exec 3>&-                  # and is now closed

Я беспокоюсь о том, на что файловый дескриптор 3 мог указывать вне рассматриваемой функции. Как я могу справиться с этим?

  • Есть ли встроенный next_available_fd?
  • Есть ли способ дублировать fd3 в переменную, а затем дублировать ее после завершения функции?
    • и стоит ли мне беспокоиться о многопоточности и одновременной записи в fd3 в этом случае?
  • Я нахожусь в sh, но, возможно, у bash / ksh / zsh есть ответ на этот вопрос?

Ответы [ 3 ]

1 голос
/ 01 июля 2011

Вместо использования exec для перенаправления файлового дескриптора в функции, вы можете (с bash, я не пробовал с другими оболочками) сделать:

foo() {
  test $dryrun && exec 3>&1
  echo running >&3
} 3>>file

foo
more_commands

В этой настройке "running" будетперейдите либо к файлу, либо к исходному stdout в зависимости от $ dryrun, и у more_commands будет fd 3, как это было до вызова foo.

1 голос
/ 30 июня 2011

Я не знаю ничего более простого, чем next_available_fd, но получить желаемую функциональность (временное перенаправление дескриптора файла, не затрагивая его вне функции) можно в bash следующим образом (я не знать о ш):

exec 3>file3
exec 1>file1

echo "something">&3
echo "something else"

f31 () {
        echo "something">&3
}
f31 3>&1

f13 () {
        echo "something else"
}
f13 >&3

echo "something">&3
echo "something else"

Полученный file1:

something else
something
something else

И file3:

something
something else
something

Что показывает, что перенаправление ограничено вызовом функции в каждом случае.

0 голосов
/ 01 июля 2011

Если ваша система использует файловую систему /proc, загляните внутрь /proc/$$/fd, чтобы увидеть, что используется.

...