질문
:
파이프라인에서의 사용과 관련하여 의미는 무엇입니까?
이것배쉬 문서상태:
: [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와 유일한 차이점입니다. 물론 두 분기에는 여기에 표시된 것보다 더 많은 것이 있습니다.if
else
이제 나는 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
) 입니다.아무것도 하지 않았다. 입력에서 아무것도 읽지 않고 출력 스트림에 아무것도 쓰지 않습니다.
파이프에서는 그다지 유용하지 않습니다. 파이프가 막히는 역할을 합니다.