나는 본 적이 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
위에서는 쉘을 임시로 비워둔 v
후 date
명령을 실행합니다.
선행 공백을 추가하면 =
오류가 발생하지만 이유는 다릅니다.
$ 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
이 경우 공간의 유일한 의미는 미학이다.
즉, 명령을 사람이 읽기 쉽게 만들 수 있습니다.