파이프에서 사용될 때 Bash의 ":"(콜론) 함수의 의미는 무엇입니까?

파이프에서 사용될 때 Bash의 ":"(콜론) 함수의 의미는 무엇입니까?

질문

:파이프라인에서의 사용과 관련하여 의미는 무엇입니까?

이것배쉬 문서상태:

: [arguments]
효과가 없습니다. 명령은 매개변수를 확장하고 지정된 리디렉션을 수행하는 것 외에는 아무 작업도 수행하지 않습니다. 반환 상태는 0입니다.

:그러나 파이프라인에서 사용할 때 어떤 동작을 예상해야 하는지는 확실하지 않습니다. 그냥 통과되나요 std{in,out,err}?

:매개변수는 다른 명령으로 대체될 수 있는 것 같습니다 . 하지만 파이프라인에서의 사용법을 명확히 해야 합니다. 설명은 관찰을 기반으로 할 뿐만 아니라권위 있는 출처 인용.

배경

tr -d '\r'스크립트가 실행되는 환경에 따라 출력에서 ​​캐리지 리턴을 제거하기 위해 출력을 실행해야 하는 상황이 발생했습니다 .

아아, 현재 이는 if/else/fi다음과 같은 블록을 의미합니다.함수 내부):

if [[ "$OSTYPE" == "cygwin" ]]; then
    my_commands | tr -d '\r' || return $?
else
    my_commands || return $?
fi

여기서 는 | tr -d '\r'Branch와 유일한 차이점입니다. 물론 두 분기에는 여기에 표시된 것보다 더 많은 것이 있습니다.ifelse

이제 나는 tr -d '\r'이것이 캐리지 리턴 없이도 문제가 없다는 것을 알고 있습니다. 그러나 이는 호출이므로 (Windows에서는) 오버헤드를 피할 수 있습니다(함수는 "핫" 코드 경로입니다). 그래서 tr내장된 쉘 함수로 대체하자고 생각했습니다 :.

답변1

이 경우 전이적 대체는 cat입력을 출력으로 복사하는 것입니다. :아무 작업도 수행하지 않으므로 입력 내용이 손실됩니다.

$ echo hello | :
$

실제로 :입력을 읽지 않기 때문에 파이프에 입력하는 명령은 하나를 수신하므로 SIGPIPE작업을 완료하거나 시작하지 못할 수도 있습니다.

$ (seq 1 10000 | tee /dev/stderr; echo $? 1>&2) | :
141

사용은 cat외부 호출을 의미합니다 tr. (하지만 작업량이 약간 적음) Bash에는 이러한 유형의 패스에 대한 내장 패스가 없습니다.

답변2

이상한 이름에 관계없이 :이는 여전히 명령이고 명령처럼 작동하므로 아무 작업도 수행하지 않으면 파이프에서도 아무것도 읽지 않는다는 의미입니다. 어떤 의미에서 이것은 쉘의 특별한 구문이 아니며 | : |다시 |.POSIX 설명:표준 입력이나 표준 출력을 "사용"하지 않는다고 말하지만 물론 파이프에 대해 명시적으로 언급하지는 않습니다.

이에 대한 몇 가지 해결책이 있습니다.조건부 파이프라인cat, 그러나 대부분의 경우 중간에 복사본을 실행하지 않는 것이 어렵거나 어색합니다.

(작은 글씨: POSIX 텍스트는 "유틸리티"라는 용어를 사용하지만 여전히 예를 들어 사용되는 용어와 동일합니다. ls또한 :이는 정확히 일반 명령이 아니라 "특수 내장"입니다. 여기에는 약간의 다른 경우가 있지만 여기서는 그렇지 않습니다. ).

답변3

매뉴얼 페이지의 핵심 문구는 :(동의어와 동일 true) 입니다.아무것도 하지 않았다. 입력에서 아무것도 읽지 않고 출력 스트림에 아무것도 쓰지 않습니다.

파이프에서는 그다지 유용하지 않습니다. 파이프가 막히는 역할을 합니다.

관련 정보