[완료] shell 의 output redirection 기능의 활성화 여부를 알아내는 방법?

ssehoony의 이미지

ls 나 grep 같은 툴을 보면 --color=auto 라는 옵션이 있습니다.
auto의 의미는 stdout이 redirection 되면 color 를 off하고, stdout으로 출력할 때는 color를 on을 하는 기능인데요.
기능의 장점은 "ls > file.txt"와 같이 실행 했을 때, color 표시 기능으로 인해 file.txt에 ansi color code가 들어가면 가독성이 나뻐지는 경우 이 문제를 해결하는 기능입니다.
저 역시 이런 문제에 직면해 있습니다.
그냥 shell에서 실행할 때는 colorful하게 표시되면 가독성 면에서 좋은 반면에 cron job 등으로 주기적으로 실행 시키고 정상 작동 여부를 확인하기 위해 output 을 file로 남기면 ansi color code때문에 file의 가독성이 떨어집니다.
그래서 ls나 grep의 --color=auto 와 같은 기능을 구현하고 싶은데요.
어떻게 하면 redirection 방향이 표준출력인지 아니면, file등 다른 곳으로 redirection 됐는지 알아 낼 수 있을까요?

aero의 이미지

cron에서 다른 결과가 나온다면.

cron으로 돌릴때 주의해야 하는 건 일반 로그인 계정에서 적용되는 환경변수등이
그대로 적용되지 않기 때문에 필요시 수동으로 추가해줘야 합니다.

일반 계정에서는 ls가
alias ls='ls --color=auto'
로 alias가 걸려있어서 문제가 없는거라면
cron으로 돌리는 스크립트에서 ls가 저 alias가 걸려있지 않으면
스크립트 상단에 alias를 추가해주면 될 것이고.

alias된 명령때문에 생기는 문제라면 명령어 앞에 \를 붙여서
\ls 식으로 명령을 내리면 alias를 무시하고 raw명령(?)을 실행하니깐
그렇게 하면 될 것 같네요.

ssehoony의 이미지

질문을 약간 오해 하신 것 같네요.
cron에서 말씀하신 환경 설정 문제로 서로 다른 작동을 한다는 의미가 아닙니다.
cron job은 예를 하나 든 것에 불과하고요.
제가 말한 상황은 "$ ls --color=auto" 와 "$ ls --color=auto > ls.txt" 라는 결과가 서로 다르다는 것입니다.
ls.txt에는 컬러 표시를 위한 ansi code가 포함되어있어야 하는데 사실 그렇지 안다는거지요.
"$ ls --color=always > ls_color.txt" 라고 해서 ls_color.txt를 vi로 열어보시면 ls.txt와는 다른다는 것을 알 수 있습니다.
이는 ls의 옵션이 --color=auto일 때는 output이 파일로 redirection되면 ansi code를 추가하지 않기 때문인데요.
어떻게 output이 redirection 됐는지 체크해서 상황에 따라 다른게 작동하는 건지가 궁금하다는 것입니다.

aero의 이미지

제가 잘못 이해했군요

ls 소스를 보니 isatty함수로 판단하는 것 같네요.

test.c

#include<stdio.h>
 
int main(void) {
    if (isatty(1)) {  /* STDOUT 1 */
        printf("Not Redirected or Piped\n");
    }
    else {
        printf("Redirected or Piped\n");
    }
}

테스트
$ ./test
Not Redirected or Piped
$ ./test | cat
Redirected or Piped

esrevinu의 이미지

man ls 해보면

Quote:
color codes are output only if standard output is connected to a terminal (tty).

stdout이 어디에 연결되어 있는지는 process 정보 중 file descriptor 정보를 보면 알 수 있는 것 같습니다.
lsof -p <pid> 를 하니까 나오네요.
참고 : http://www.cyberciti.biz/tips/linux-procfs-file-descriptors.html

송효진의 이미지

간단하게 bash 스크립트로 확인해봤습니다.

# ls -al /dev/fd/
합계 0
dr-x------ 2 root root  0 2008-12-17 17:22 .
dr-xr-xr-x 6 root root  0 2008-12-17 17:22 ..
lrwx------ 1 root root 64 2008-12-17 17:22 0 -> /dev/pts/1
lrwx------ 1 root root 64 2008-12-17 17:22 1 -> /dev/pts/1
lrwx------ 1 root root 64 2008-12-17 17:22 2 -> /dev/pts/1
lr-x------ 1 root root 64 2008-12-17 17:22 3 -> /proc/14537/fd
# ls -al /dev/fd/ | cat
합계 0
dr-x------ 2 root root  0 2008-12-17 17:22 .
dr-xr-xr-x 6 root root  0 2008-12-17 17:22 ..
lrwx------ 1 root root 64 2008-12-17 17:22 0 -> /dev/pts/1
l-wx------ 1 root root 64 2008-12-17 17:22 1 -> pipe:[204942]
lrwx------ 1 root root 64 2008-12-17 17:22 2 -> /dev/pts/1
lr-x------ 1 root root 64 2008-12-17 17:22 3 -> /proc/14837/fd

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇개 안되요~
http://xenosi.de/

ssehoony의 이미지

오~ 그렇군요. 감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.