&>와 2> & 1의 차이점은 무엇입니까?


30

표준 출력표준 오류표준 출력 으로 리디렉션하는 두 가지 형태가 있습니다 . 그러나 어느 것이 더 낫습니까? 그리고 왜 &>완벽한 것으로 간주됩니까?

차이점이 무엇인지 찾을 수 없으므로 많은 자습서와 심지어 수동 상태를 &>더 좋게 만듭니다!

그래서 왜 사용 &>하지 않습니까?2>&1

주로 bash쉘 사용


편집 : 의견을 주셔서 감사합니다

> & 만 csh 또는 tcsh에서 작동

ksh에서는 2> & 1 만 작동합니다.

대시 사용> 파일 2> & 1 리디렉션 만

그런 다음 사용 된 쉘이 무엇이든 내 스크립트가 다른 시스템과 호환되는지 확인하는 데 사용할 수 있습니다!


더 좋은 것은 당신이해야 할 일을하는 것입니다. 이것들은 매우 다른 일을합니다. 어떤 쉘을 사용하고 있습니까?
Skaperen 2016 년

bash를 사용하여 @Skaperen
Maythux

1
무엇을 당신은 달성하고 싶다?
Skaperen 2016 년

난 그냥 내가 원하는 것은 모두 해달라고하지만 한번 다른 이상 preffred되도록 내가 바로이 차이가 있는지 알고 필요 차이점이 무엇인지 알고 싶어
Maythux

2
&> somewhere단지 bash는 속기이다 > somewhere 2>&1: bash는 설명서의 말에, 그들은있다 "symantically 해당"
steeldriver

답변:


23

배쉬의 매뉴얼 페이지 리디렉션에 대한 두 가지 방법이있다 언급 표준 에러와 표준 출력 : &> file>& file. 이제 stderr과 stdout을 모두 나타냅니다.

이 경우 >file 2>&1stdout (1)을 파일로 리디렉션하지만 stderr (2)를 stdout과 동일한 위치로 리디렉션하도록 지시합니다! 따라서 목적은 동일 할 수 있지만 아이디어는 약간 다릅니다. 다시 말해 "존, 학교에 가십시오; Suzzie는 존이가는 곳으로 가십시오"

선호는 어떻습니까? &>A는 bash것. 따라서 스크립트를 이식하는 경우에는 그렇지 않습니다. 그러나 100 % 확신한다면 스크립트는 bash가있는 시스템에서만 작동합니다-선호 사항은 없습니다

dash우분투의 기본값 인 데비안 애퀴 스트 쉘 (Debian Amquist Shell) 예제가 있습니다.

$ grep "YOLO" * &> /dev/null
$ grep: Desktop: Is a directory
grep: Documents: Is a directory
grep: Downloads: Is a directory
grep: Music: Is a directory
grep: Pictures: Is a directory
grep: Public: Is a directory
grep: Templates: Is a directory
grep: Videos: Is a directory
grep: YOLO: Is a directory
grep: bin: Is a directory

보시다시피 stderr은 리디렉션되지 않습니다

질문의 편집 내용을 해결하기 위해 if 문을 사용하여 $ SHELL 변수를 확인하고 그에 따라 리디렉션을 변경할 수 있습니다

그러나 대부분의 경우 > file 2>&1작동해야합니다.


보다 기술적 인 용어로, 양식 [integer]>&wordDuplicating Output File Descriptor 라고 하며 POSIX 셸 명령 언어 표준에 의해 지정된 기능으로 대부분의 POSIX 호환 및 Brourne과 같은 셸에서 지원됩니다.

참조 및 출력 재 지정에 정확히 의미합니까 무엇?


그러면 다른 쉘에서 사용할 때 어떻게됩니까?
Maythux

zsh을 지원하는 &>지원하지 않습니다 .... @Maythux에서 쉘 &>예를 들어, dash당신은 사소한 사용할 필요가 >file 2>&1리디렉션을 ..
heemayl

그런 다음 스크립트가 다른 쉘과 호환되는지 확인하려면 어떤 것을 사용해야합니까
Maythux

3
@ Maythux 사용 >file 2>&1. 이것은 모든 포탄에 관한 연구
Sergiy Kolodyazhnyy

1
/etc/passwd각 사용자 에 대해 설정된 @ TSJNachos117 쉘 은 대화식 쉘입니다. 시스템 스크립트는 dash 달리 지정하지 않는 한 일반적으로 사용 됩니다. 기본 설정은 /bin/shIn Ubuntu의 경우에 연결 되어있는 것에 따라 결정됩니다 dash. RHEL에서 그것은 bashFreeBSD에서 tcsh 소스 이고 또 다른 소스입니다
Sergiy Kolodyazhnyy

6

bash는 아마도 가장 인기있는 유닉스 쉘이기 때문에 일반적으로 Bourne-again SHell 의 작업 방식을 따르는 것이 좋습니다 . Bash는 일반적으로 &>또는을 사용합니다 2>&1. IMHO도 "완벽"하지 않기 때문에 난센스를 잊어 버리는 것이 좋습니다. 실제로 어떤 것을 사용해야하는지에 따라 다릅니다.

2>&1stderr을 stdout과 병합합니다. 예를 들어 stderr 텍스트를 파이프하려는 경우 유용 할 수 있습니다. 예를 들어 프로그램이 특정 stderr 메시지를 인쇄하지만 화면에 (중요하지 않은) 가비지 쓰레기가 가득 차게하지 않으려는 경우와 같은 작업을 수행 program 2>&1 | grep crashed하면 프로그램에서 stdout 및 stderr을 검색 할 수 있습니다 "충돌"이라는 단어를 "프로그램"이라고합니다.

다른 한편으로, 프로그램이 아무것도 인쇄하지 않기를 원한다면 간단하게 실행할 수 program &> /dev/null있습니다. stderr 및 stdout을 / dev / null로 리디렉션하여 마술처럼 사라지는 특수 파일입니다. 또는 프로그램의 출력을 저장하려면 (버그 등을보고) stderr 및 stdout을 모두 파일로 리디렉션 할 수 있습니다. program &> log.txt모든 데이터를 "log.txt"라는 파일로 리디렉션합니다. 당신이 원한다면, 당신은 표준 출력과 표준 에러를 통해 리디렉션 할 수 program 2> log.txt > log.txt또는 program 2>&1 | cat > log.txt사용하는 것과 같은 효과를 가질 것입니다 둘을 &>. 와 같은 작업을 수행하면 program 2>&1 > filestdout 만 리디렉션되지만 stderr는 cat과 같은 다른 프로그램으로 파이프로 연결될 수 있으며 위와 같이 리디렉션 될 수 있습니다. 그러나 입력&>더 적은 문자를 입력해야하기 때문에 위의 예보다 더 쉽습니다 (그리고 사람이 읽는 것이 조금 더 쉽습니다). 참고 수행 program 2> log.txt > log.txt비 bash는 껍질 작업에 더 많은 가능성이있을 수 있습니다.

추신 : 다른 쉘을 사용하는 사람들이 걱정된다면, "매직 넘버"또는 "셰방"이라는 스크립트의 첫 번째 줄에 추가 할 수있는 것이 있습니다. 이것은 본질적으로 다른 컴퓨터 (특히 유닉스 계열 운영 체제를 실행하는 컴퓨터)가 스크립트를 실행하는 데 사용할 프로그램을 알 수있게하는 방법입니다. 다른 스크립트는 다른 shebang을 사용합니다. bash 스크립트의 shebang은 다음과 같습니다.

#!/bin/bash

주어진 스크립트의 첫 번째 줄로 위의 내용을 사용하면 일반적으로 bash가 해당 스크립트를 실행하는 데 사용됩니다. 이렇게하면 누군가가 잘못된 쉘로 스크립트를 실수로 실행하는 것이 훨씬 더 어려워집니다.

추신 : 나는 거짓말을하지 않을 것입니다 : 지금까지, 나는 사용할 수있는 사람을 몰랐지만 >&bash가가는 한,와 같은 것으로 보입니다 &>. 매일 새로운 것을 배웁니다.


#!명시 적으로 요청하기 위해 회선 사용에 대해 귀하에게 동의하지만 bash다른 시스템에서 항상 사용할 수있는 것은 아닙니다. 개발자 / 시스템 관리자는 시스템을 사용할 bash수없고 설치 권한이없는 시스템에 대해 이식 가능한 스크립트를 작성해야하는 경우가 종종 있습니다 bash. 는 >file 2>&1단지 많은 휴대용입니다.
Sergiy Kolodyazhnyy

당신은 당신이 주장하거나 원하는 결과를 생성하지 않는 위의 반전 오류를 만들었습니다. stderr을 stdout으로 리디렉션 한 다음 stdout을 리디렉션하면 stdout이 원래 stdout에 남습니다.
ubfan1

Serg : 나는 배쉬가 보편적이라는 것을 의미하지는 않았다. 그러나 나는 (t) csh보다 더 많은 사람들이 그것을 사용하고 있다고 생각합니다. 다른 사람이 무엇을 사용하는지 모르고 맹목적으로 추측 해야하는 경우 bash가 가장 좋은 방법 일 것입니다. 또한 bash 만 사용하기 때문에 일반적으로 이식성에 대해 알지 못합니다. >file 2>&1휴대가 더 쉽다는 사실 을 아는 것이 좋습니다. 이를 반영하여 수정하겠습니다.
TSJNachos117

Ubfan1, 정보 주셔서 감사합니다. 백만 년 동안 bash가 stderr을 파일로 리디렉션하지 않을 것이라고 결코 추측하지 못했을 것입니다. 방금 다른 사람이 같은 실수를 저 지르지 않도록 답변을 편집했습니다.
TSJNachos117

4

에서 배쉬 참조 설명서 -> 3.6.4 리디렉션 표준 출력 및 표준 오류 :

이 구문을 사용하면 표준 출력 (파일 설명자 1)과 표준 오류 출력 (파일 설명자 2)을 모두 이름이 단어 확장 인 파일로 리디렉션 할 수 있습니다.

표준 출력 및 표준 오류를 재 지정하기위한 두 가지 형식이 있습니다.

&>word

>&word

두 가지 형태 중 첫 번째 형태가 선호됩니다. 이것은 의미 상으로

>word 2>&1

두 번째 양식을 사용할 때 단어는 숫자 나 '-'로 확장되지 않을 수 있습니다. 그렇다면 호환성 문제로 인해 다른 리디렉션 연산자가 적용됩니다 (아래 파일 설명자 복제 참조).

입력 및 출력-> 4.2에서 Greg의 위키 를 참조하는 것도 좋습니다 . 파일 디스크립터 조작 :

편의상 Bash는 또 다른 형태의 리디렉션을 제공합니다. &> 리디렉션 연산자는 실제로 우리가 여기서 한 것보다 짧은 버전입니다 2>&1. [ ]; stdout 및 stderr을 파일로 리디렉션합니다.


4

그렇다면 왜 2> & 1이 아닌 &>를 사용해야합니까?

2>&1 표준 Bourne / POSIX 쉘입니다.

&>떠들썩한 확장되지 않고 합법적의 표준입니다.

bash 확장을 사용하여 스크립트를 작성하면 조만간 표준 쉘에서 실행되기 때문에 암호 구문 오류 메시지와 함께 헤드 스크래칭 오류가 발생합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.