
나는 다음 명령을 시도했다
variable='one|name'
echo $variable
출력은 다음과 같습니다
one|name
반면에 echo one|name
오류가 발생합니다 No command 'name' found
. Bash는 |
파이프로 취급하고 입력으로 name
명령 을 실행하려고 시도하기 때문에 이는 합리적입니다 .one
그런데 왜 echo $variable
인쇄 합니까 one|name
? 매개변수 및 변수 확장 후에는 echo one|name
?
버전:
GNU bash, version 4.3.11(1)-release (i686-pc-linux-gnu)
답변1
아니요, 그러면 안 됩니다. 방식 때문에bash
명령을 실행하다.
를 입력하면 echo one|name
명령 bash
을 구문 분석하고 |
파이프 토큰으로 처리하므로 |
파이프라인을 수행합니다.
를 입력하면 echo $variable
변수 확장 전에 토큰 구문 분석이 발생하므로 bash
명령을 과 의 두 부분으로 구문 분석 합니다 echo
. $variable
그 후 변수 확장을 수행 $variable
하여 one|name
. 이 경우 one|name
문자열이고 |
문자열의 일부이므로 파이프 토큰으로 처리할 수 없습니다(물론토큰 인식 문구완료되었습니다). IFS
변수에 가 포함된 |
경우 특별할 수 있는 유일한 것은 필드 분할을 수행하기 위해 구분 기호로 bash
사용됩니다 .|
$ variable='one|name'
$ IFS='|'
$ echo $variable
one name
답변2
Bash
그 이유는 변수를 확장하는 방식 때문입니다 .
변수를 확장하는 대신 one|name
변수를 "one|name"
. 따라서 여기서 값은 따옴표로 묶여 있으므로 명령 대신 문자열로 처리됩니다.
strace
다음은 명령이 확장되는 방법을 보여주는 명령의 출력 입니다 .
$ variable='one|name'
$ strace echo $variable
execve("/bin/echo", ["echo", "one|name"], [/* 33 vars */]) = 0
brk(0) = 0x9cc7000
답변3
따옴표는 생성한 문자열의 일부입니다.
만약 당신이 그랬다면
variable=one|name
echo $variable
결과는 예상대로일 것이다. 하지만 이 작업은 스크립트에서만 수행할 수 있습니다(유용한 설명에 감사드립니다).