среда, 6 октября 2010 г.

Определяем наличие перенаправления stdout в Bash и Ruby

Момент, в принципе, тривиальный и во всех документациях расписанный. Однако, выпишу, чтобы самому не забыть.

Задался я недавно вопросом: как определить, отправляется ли стандартный вывод на консоль, или же перенаправлен другой программе или в файл. Зачем это нужно? Например, может возникнуть желание в консоли его «раскрасить» разными цветами. Тогда как в случае перенаправления красивости будут лишними и, вероятно, даже мешающими.

Изначально такая задача у меня возникла на Ruby. Решение выглядит примерно так (пусть это будет “test_stdout.rb”):

#!/usr/bin/ruby

if $stdout.stat.chardev?
    puts "Test stdout console: \e[1mYES\e[0m."
else
    puts "Test stdout console: no."
end

А вот как эту проверку организовать в bash-скриптах (“test_stdout.sh”):

#!/bin/bash

if [ -c "/dev/stdout" ]; then
    echo -e "Test stdout console: \e[1mYES\e[0m.";
else
    echo "Test stdout console: no.";
fi

Можно сделать эти файлики исполняемыми и посмотреть, что получится при следующих вызовах:

 $ ./test_stdout.rb
 $ ./test_stdout.rb | cat
 $ ./test_stdout.rb > test.txt && cat test.txt

Аналогично и с “test_stdout.sh”.

Пример практического примения этого на Ruby, не отличающийся по сути от описанного выше, можно увидеть в моем скрипте “rdot”, выложенном на GitHub — строки 6–10.

Комментариев нет:

Отправить комментарий