파이프 옆의 공간


17

나는 본 적이 history | grep blahhistory |grep blah; 그리고 history|grep blah아무도 그것을 사용하는 것 없지만 또한, 작동합니다.

공간에 의미가 있습니까 (예 : 다른 명령과의 배관은 다른 공간을 사용해야 함) 또는 항상 임의적인가?


13
대부분 가독성.
jasonwryan

1
|파이프 또는 ;세미콜론은 대부분의 셸 (bash, ksh, tcsh)에서 명령 분리 자로 사용됩니다. 앞뒤에 따옴표로 묶지 않으면 무의미합니다.
Archemar

답변:


24

bash여러 메타 문자를 정의합니다 . 보낸 사람 man bash:

메타 문자
인용 부호가 없을 때 단어를 구분하는 문자입니다. 다음 중 하나 :
| &; () <> 스페이스 탭

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

그 주 [, ], {, }, 및 =입니다 하지 메타 문자. 대조적으로, 의미는 공백으로 둘러싸여 있는지 여부에 따라 크게 달라집니다.

공백이 필요하거나 필요하지 않은 경우의 예

알다시피 |공백으로 둘러싸여 있는지 여부 는 중요하지 않습니다 . 일반적으로 bash 사용자를 혼동하는 몇 가지 예를 살펴 보겠습니다. 치다:

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

위의 parens는 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

위에서 쉘은 일시적 v으로 비우기 로 설정 한 다음 date명령 을 실행합니다 .

=실패를 유발하기도하지만 다른 이유로 공백을 추가하십시오 .

$ v =date
bash: v: command not found

여기서 쉘 v은 인수를 사용 하여 명령을 실행하려고 시도합니다 =date. 오류는라는 이름의 명령을 찾지 못했기 때문 v입니다.


1
나는 최근에 과제 진술에 희생되었다. 전과 후에 공백이있었습니다 =. 디버깅하는 데 시간이 걸렸습니다.
topher

3

파이프 를 사용하면 프로그램의 출력을 다른 입력의 입력으로 사용할 수 있습니다 ...

공간에 관해서는 @jasonwryan과 같은 가독성 / 개인 취향의 문제가 언급되었습니다.

"|"앞뒤에 스페이스 바 1 개 표준입니다 ....

하나의 라이너를 깔끔하게 만들뿐만 아니라 출력을 만들기 위해 -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

2

공백을 사용하지 않는 것이 유용한 경우가 있습니다. 미국식 레이아웃을 사용하지 않는 경우 AltShiftL파이프 입력 과 같은 일부 조합을 사용해야 할 수 있습니다 . 이것은 그 자체로는 문제가 아니지만 한 가지 결과는 때로는 그 문자 앞이나 뒤에 문자가 아닌 문자를 입력하기도합니다. 예를 들어, 프랑스어 Macbook Pro 키보드에서는 AltShiftL을 입력해야합니다 |. 빠르게 입력하면 실수로 다음을 입력 할 수 있습니다. AltShift( L, Space)

$ 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


1

이 경우 공간의 중요성은 미학입니다.
즉, 사람이 명령을 더 읽기 쉽게 만드는 데 유용합니다.

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