/dev/null 2>&1 에 관한 질문입니다

힘들다의 이미지

보통 출력,에러를 안보이게하기위해 rm -rf test.txt >/dev/null 2>&1 이런식으로 작성하는데

rm -rf test.txt 2>/dev/null해도 동일한 동작을 하는데 제가 잘못알고있는건가요??

만약 그렇다면 저 두 명령어의 차이가 무엇인가요???

익명 사용자의 이미지

rm -rf 하면 -f 옵션 때문에 에러가 발생하지 않습니다. 에러 메시지가 안 나옵니다.
rm -rf test.txt >/dev/null 는 표준출력을 /dev/null 로 보내라는 것. 아무것도 안나옵니다.
2>&1 은 표준 에러(2)를 표준 출력(1)으로 보내라는 것입니다.
rm -rf test.txt 2>/dev/null 은 표준 에러(2)를 /dev/null 보내라는 것. 아무것도 안나옵니다.
의미는 차이가 있지만, 결과는 아무것도 안나오므로 똑같습니다.

힘들다의 이미지

dd if=/dev/zero of=test.txt count=100 bs=1024 2>/dev/null 이라는 명령어를 입력하면 콘솔에 아무것도 안나오게되는데요, 2>/dev/null없이 입력하면 몇바이트가 복사됬다라는식의 출력이 나오게되는데 그럼 이출력이 표준에러인건가요?? 근데 echo $?하면 0으로나오거든요..

익명 사용자의 이미지

dd 가 출력을 표준에러(stderr) 에 하는거 같네요.

hodong@:/usr/home/hodong $ dd if=./sample.s of=/dev/null
2+1 records in
2+1 records out
1033 bytes transferred in 0.000070 secs (14732308 bytes/sec)
hodong@:/usr/home/hodong $ dd if=./sample.s of=/dev/null 2> /dev/null
hodong@:/usr/home/hodong $ dd if=./sample.s of=/dev/null 1> /dev/null
2+1 records in
2+1 records out
1033 bytes transferred in 0.000074 secs (13914707 bytes/sec)
hodong@:/usr/home/hodong $ echo $?
0
hodong@:/usr/home/hodong $ ls aaaaaaaaaa
ls: aaaaaaaaaa: No such file or directory
hodong@:/usr/home/hodong $ echo $?
1
hodong@:/usr/home/hodong $ rm -f aa
hodong@:/usr/home/hodong $ echo $?
0
hodong@:/usr/home/hodong $ rm aa
rm: aa: No such file or directory
hodong@:/usr/home/hodong $ echo $?
1

dd 성공하면 0 나오는게 맞아요.
어플 작성할 때,
int main (int argc, char **argv)
{
  if (1) /* success */
    return 0;
  else /* failure */
    return 1;
}

보통 이렇게 작성합니다.
일반적으로 어플은 성공하면 0 을 리턴합니다.
실패하면, 1, -1, -128 등... 0 이 아닌 값을 리턴합니다.
실패시 리턴값은 개발자가 임의로 정해서 에러 코드로 활용할 수 있습니다, 단, 어플이 관례적으로 실패할 경우 0 을 리턴하도록 개발하지는 않습니다.
익명 사용자의 이미지

"단, 어플이 관례적으로 실패할 경우 0 을 리턴하도록 개발하지는 않습니다." 표현이 좀 이상한데,,,

"단, 관례적으로, 개발자가 main() 함수 리턴값에, 어플이 실패할 경우 0 을 리턴시키지 않습니다."로 정정합니다. 성공할 경우, 0 을 리턴하도록 main() 함수에 return 0; 하죠. 관례입니다.

힘들다의 이미지

덕분에 잘 이해가 됬습니다. 감사합니다

bushi의 이미지

stdlib.h (혹은 cstdlib) 에 EXIT_SUCCESSS, EXIT_FAILURE 가 define 되어 있습니다.

김정균의 이미지

질문한 두 redirection 은 차이가 있습니다. 다만 결과가 동일할 뿐인거죠.

rm -rf test.txt >/dev/null 2>&1
rm -rf test.txt >& /dev/null
rm -rf test.txt &> /dev/null

standard out, standard error 로 출력되는 메시지들을 모두 /dev/null 로 redirection 하라는 표현입니다. 위의 3개의 redirection 은 동일한 동작을 합니다.

rm -rf test.txt 2>/dev/null

위의 redirection 은 standard error 로 출력되는 메시지를 /dev/null 로 변경하라는 의미입니다.
rm의 -f 명령은 non-interactive 하게 진행을 하므로 standard out 으로의 출력이 없기 때문에 " > /dev/null 2>&1" 과 동일한 결과를 보여주는 것이지, 동일한 동작을 하는 것은 아닙니다.

차이를 알고 싶다면 다음과 같이 실행해 보시면 차이가 확 나옵니다.

[user@host ~]$ ( rm -f test; echo "1234" ) > /dev/null 2>&1
[user@host ~]$ ( rm -f test; echo "1234" ) 2> /dev/null

이 2개의 명령은 전혀 다른 결과를 출력 합니다.

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 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>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 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>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 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>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.