파이프 옆 공간

파이프 옆 공간

나는 본 적이 history | grep blah있고 history |grep blah; history|grep blah그것도 효과가 있지만 아무도 그것을 사용하지 않은 것 같습니다.

공백에는 어떤 의미가 있습니까(예: 다른 명령을 파이핑하려면 다른 공백 사용법이 필요함) 아니면 항상 임의적입니까?

답변1

bash여러 가지가 정의되어 있습니다.메타 문자. 에서 man bash:

메타 문자
인용되지 않은 경우 단어를 구분하는 데 사용되는 문자입니다. 다음 중 하나:
&; ( ) < > 공백 탭 문자

메타 문자는 단어를 구분하기 때문에 공백으로 둘러싸여 있는지 여부는 중요하지 않습니다. 파이프 기호 |는 메타 문자이므로 알 수 있듯이 주위에 공백이 필요하지 않습니다.

[, ], {및 은( }는 )=아니요메타 문자. 대조적으로, 그 의미는 공간으로 둘러싸여 있는지 여부에 따라 크게 달라집니다.

공백이 필요한 경우와 필요하지 않은 경우의 예

|아시다시피, 공간에 둘러싸여 있는지 여부는 중요하지 않습니다. bash 사용자를 종종 혼란스럽게 만드는 몇 가지 예를 고려해 보겠습니다. 고려하다:

$ (date)
Sun Mar  1 12:47:07 PST 2015

위의 괄호는 date명령이 하위 쉘에서 실행되도록 강제합니다. (및 은 메타문자 이므로 )공백이 필요하지 않습니다. 비교해 보면:

$ {date}
bash: {date}: command not found

왜냐하면 {그리고 }아니요쉘이 {date}단어로 처리하는 메타 문자입니다. 명령을 찾는 것이 아니라 date이름이 지정된 명령을 찾습니다 {date}. 찾을 수 없기 때문에 오류가 발생합니다.

또 다른 일반적인 문제는 test명령입니다. 성공적인 실행은 다음과 같습니다.

$ [ abc ] && echo Yes
Yes

공백을 제거하면 오류가 발생합니다.

$ [abc] && echo Yes
bash: [abc]: command not found

왜냐하면 [그리고 ]아니요메타문자인 경우 쉘은 [.bashrc]이를 단일 단어로 처리하며 결과(예제에서와 같이 date)는 오류입니다.

할당 문은 공백에도 민감합니다. 아래와 같이 할당이 성공적으로 완료되었습니다.

$ v=date
$ echo $v
date

공백을 추가하면 할당이 실패합니다.

$ v= date
Sun Mar  1 12:55:05 PST 2015

위에서는 쉘을 임시로 비워둔 vdate명령을 실행합니다.

선행 공백을 추가하면 =오류가 발생하지만 이유는 다릅니다.

$ v =date
bash: v: command not found

여기서 쉘은 v인수를 사용하여 명령을 실행 하려고 시도합니다 =date. 오류는 이름이 지정된 명령을 찾을 수 없기 때문에 발생합니다 v.

답변2

공백을 사용하지 않는 것이 유용할 수 있는 상황이 있습니다. US 레이아웃을 사용하지 않는 경우 AltShiftL입력 배관 과 같은 일부 조합을 사용해야 할 수도 있습니다 . 이것이 그 자체로는 문제가 되지 않지만 한 가지 결과는 때때로 해당 문자 앞이나 뒤에 인쇄되지 않는 문자를 입력할 수도 있다는 것입니다. 예를 들어 프랑스어 Macbook Pro 키보드에서는 를 AltShiftL사용하여 입력 해야 합니다 |. 빠르게 입력할 때 다음과 같은 실수로 입력할 수 있습니다 AltShift.LSpace

$ sudo dmesg | tail
zsh: command not found:  tail

echo "sudo dmesg | tail" | od -a
0000000    s   u   d   o  sp   d   m   e   s   g  sp   |   �   �   t   a
0000020    i   l  nl

AltShiftSpace다른 공백(줄바꿈 없는 공백 (U+00A0)) 다음 오류는 이해하기 어려울 수 있습니다.zsh: command not found:  tail

답변3

관로한 프로그램의 출력을 다른 프로그램의 입력으로 사용할 수 있습니다.

공간에 관한 한 @jasonwryan이 언급한 것처럼 가독성/인간 선호도의 문제일 뿐입니다.

"|" 앞과 뒤의 스페이스바는 정상입니다....

-t 열과 함께 사용하면 한 줄을 깔끔하게 만들 수 있을 뿐만 아니라 출력도 할 수 있습니다.

lnydex99uhc:depot_r user$ lsof | grep my | column -t
Microsoft  290  user  txt  REG  1,4  9515016  170972    /Library/Fonts/PCmyoungjo.ttf
bash       359  user  cwd  DIR  1,4  714      12246074  /Users/zatef/hw2/base/active/myapp

답변4

이 경우 공간의 유일한 의미는 미학이다.
즉, 명령을 사람이 읽기 쉽게 만들 수 있습니다.

관련 정보