2017-09-07 5 views
8

나는 ps aux에서 출력을 캡처하고 있습니다 :왜 큰 따옴표가 linux에서 이러한 echo 문을 인쇄하는 데 영향을 줍니까?

:

current_processes=`ps aux | grep "tempdir" | tail -3` 

을하고 내가 에코 경우,이

echo $current_processes 
19984 10089 17784 

처럼 보인다 및 I echo 플러스 따옴표는,이처럼 보이는 경우

echo "$current_processes" 
19984 
10089 
17784  

왜 큰 따옴표를 사용하지만 큰 따옴표가없는 경우이 값을 새 줄에 삽입합니까?

답변

3

효과는 쉘에서 발생합니다. 큰 따옴표가 없으면 쉘은 줄 바꿈, 탭 및 공백을 공백으로 대체합니다. 이 대체는 큰 따옴표로 피할 수 있습니다. 자세한 내용은 bash(1)의 사람 페이지의 섹션 Word Splitting을 참조하십시오

말씀 분할

쉘은 이중 내에서 발생하지 않은 매개 변수 확장, 명령 치환, 및 연산 확장의 결과를 검색 단어 분리를위한 따옴표.

셸은 IFS의 각 문자를 구분 기호로 처리하고 다른 확장의 결과를 이러한 문자의 단어로 분할합니다. IFS 이 설정되어 있지 않거나이 값이 정확히 기본값 인 이면 모든 IFS 문자 시퀀스가 ​​단어를 구분합니다. IFS 에 기본값이 아닌 값이 있으면 공백 문자가 IFS 값에있는 한 문자 공백 및 탭의 시퀀스가 ​​ 단어의 시작과 끝에서 무시됩니다 ( IFS 공백 캐릭터). IFS의 흰색 문자가 아닌 문자 인 은 인접한 IFS 공백 문자와 함께 필드로 구분됩니다. IFS 공백 문자 시퀀스는 구분 기호로 취급됩니다. IFS의 값이 널이면 단어 분할이 발생하지 않습니다.

IFS의 내용은 echo "$IFS" | xxd입니다. 그것은 공간이 (가 0x20), 탭 (은 0x09) 및 줄 바꿈 (0x0a)를 의미하는 당신

00000000: 2009 0a0a         ... 

에게 표시됩니다. 두 번째 0x0a는 echo 명령에서 나옵니다.

당신은 빈 문자열로 IFS을 설정하여이 대체를 방지 할 수 있습니다

IFS="" 
echo "$current_processes" 
19984 
10089 
17784 

하지만이를 추천하지 않을 것입니다.

+0

감사합니다. @macmoonshine! – Hunle