2016-10-26 5 views
4

Я пытаюсь получить текущее перенаправление stdout и иметь некоторые проблемы.Файловый дескриптор Linux - получение текущего перенаправления файла stdout?

У меня есть сценарий, который всегда выполняется с STDOUT переназначения, а именно:

myscript.sh > /tmp/output.log 

В myscript.sh, мне нужно, чтобы узнать, какой файл он выводится на.

Я пытаюсь это в настоящее время (не работает):

logfile=$(readlink -f /proc/self/fd/1) 

Вот выводящий логфайл = /tmp/sflq.r3f, например. Мне нужно вместо этого найти, что это будет /tmp/output.log

Возможно ли это?

Я использую оболочки Korn, если это имеет значение ...

Спасибо!

ответ

4

$() использует трубу (или, как представляется, для ksh - tempfile, который, как представляется, ksh используется для эмуляции того, что обычно является каналом в других оболочках) для захвата вывода readlink.

Внутри $(), этапом является то, что труба (или временный файл в случае ksh).

Вы можете обойти это вставленный файл стандартного вывода что-то вроде:

{ logfile=$(readlink -f /proc/self/fd/3); } 3>&1 
# my ksh 93 needs the { ;} -- dash, and zsh don't 
echo "The logfile is: $logfile" 

Сейчас:

./myscript.sh > /tmp/output.log 
echo OUTPUT.LOG 
cat /tmp/output.log 

должен дать вам:

OUTPUT.LOG 
The logfile is: /tmp/output.log 

Другой вариант подумайте о том, как избежать переменной в целом:

echo -n "The logfile is: " 
readlink -f /proc/self/fd/1 #goes straight to stdout so no need to capture 
+0

Файл журнала:/proc/18117/fd/3 – John

+0

@John Извините, должен был протестировать его в ksh. Для 'ksh', мне нужно добавить к фигурным скобкам, как показано выше. Тогда это работает для меня ('ksh version sh (AT & T Research) 93u + 2012-08-01') – PSkocik

+0

, который сделал это! Есть ли короткая версия, почему нужны скобки, или это то, что я должен потратить некоторое время после работы, глядя вверх? Спасибо, сэр! – John

0

Folks, вы, кажется, совсем зациклились на /proc/*self*/fd. Считают ли, что именно это делает само означает в контексте вашего кода вызова, и если использовать что-то вроде /proc/$$/fd в теле скрипта не будет лучшей идеей ...

(Подсказка:. $(readlink …) выполняется в субоболочке)

+0

Это хороший момент и делает гораздо более простое решение, хотя написание этого решения было бы более полезным (возможно, отсутствие этого, в сочетании с народной доставкой - вот что подсказало проголосовать). – mklement0

+0

@ mklement0 К счастью, я не здесь для голосов; и ответ все равно - '/ proc/$$/fd'. Возможно, я должен был четко это изложить ... – Jubal

+0

Я рад это слышать, но я предполагаю, что вы здесь, чтобы эффективно обмениваться знаниями. Да, ваш ответ содержит всю соответствующую информацию (и я проголосовал за нее), но ее _form_ мешает эффективно передавать эту информацию. Также подумайте, что если ваш ответ будет _recognizably_ превосходит, он будет привлекать голоса, и со временем акцент на его контрасте с неоптимальным подходом ('self') станет менее важным. – mklement0

 Смежные вопросы

  • Нет связанных вопросов^_^