명명된 파이프에 문자열을 올바르게 쓰는 방법과 echo와 printf의 차이점

명명된 파이프에 문자열을 올바르게 쓰는 방법과 echo와 printf의 차이점

질문:

명명된 파이프에 명령을 보내야 하며 오류나 "엉뚱한" 문자가 아닌 명령만 전송되는지 확인해야 합니다.

예:

나는 다음을 사용하고 있습니다 :

echo "command" > /path/to/namedPipe

이것은 잘 작동하지만 잘못된 키 입력이 파이프로 전송될 수 있다는 이상한 점을 발견했습니다. 예를 들어:

echo "command" > /path/to/namedPipe straycharacters

그런 다음 <command>둘 다 및 <straycharacters>가 명명된 파이프에 기록됩니다. 이런 일이 일어날 거라고는 상상도 못했는데 어떤 경우에는 내 프로그램이 정말 엉망이 됐어요. 또한 echo에는 따옴표가 필요하지 않은 것 같습니다. 내 명령에는 따옴표가 필요하지 않고 실제 따옴표만 필요합니다 <command>. <command>파이프에만 쓰는 가장 좋은 방법은 무엇입니까?

가능한 해결책:

printf "command" > /path/to/namedPipe straycharacters

내 터미널에서는 인쇄만 <command>하고 인쇄는 하지 않습니다 <straycharacters>. 지금까지는 내 프로그램과 호환되는 것 같습니다. 그러나 새 줄을 포함하지 않는 것처럼 보인다는 점에서 echo와 약간 다릅니다.

답변1

이 명령

echo "command" > /path/to/namedPipe straycharacters

동등하다

echo "command" straycharacters >/path/to/namedPipe

(비교하다이것) echo이 경우에도 모든 피연산자를 인쇄합니다 straycharacters. 다시 말하지만, "작동하는" 솔루션은 다음과 같습니다.

printf "command" straycharacters >/path/to/namedPipe

단순히 "작동"하는 이유는

  • command분명히 셸에서 문자 그대로 해석되지 않는 조각(예: )은 포함되지 않습니다 ${PATH}.
  • commandprintf문자 그대로 해석되지 않은 조각은 분명히 포함되지 않습니다. 메모는 형식 command으로 해석됩니다( man 1 printf자세한 내용 참조) .%sstraycharacters

command그것을 (및 개행 문자) 전달하는 올바른 방법 은 다음과 같습니다.

printf '%s\n' 'command' >/path/to/namedPipe    # straycharacters

어디

  • \n개행 문자 인쇄를 담당합니다.
  • straycharacters댓글에 나타납니다;
  • 문자 그대로 전달되어야 하는 모든 문자열은 작은따옴표로 묶입니다( 예를 들어 의도적으로 매개변수 대체에 의존하는 경우 printf큰따옴표를 원할 수도 있음 ).command

코드에 "잘못되거나 어색한 문자"를 포함하는 것은 잘못된 것입니다. 이를 무시하는 구문을 찾으려고 하지 말고 쓰레기를 삭제하고 주의를 기울이십시오. 이렇게 하면 코드가 멋지고 깔끔해집니다.

straycharacters그렇지 않더라도 echo여전히 올바른 도구는 아닙니다. 바라보다왜 printf가 echo보다 나은가요?

관련 정보