bash가 행 해석을 수행하는 정확한 프로세스를 이해하고 싶습니다.
GNU bash 참조 매뉴얼에서:
When a simple command is executed, the shell performs the following expansions, assignments, and redirections, from left to right.
1. The words that the parser has marked as variable assignments (those preceding the command name) and redirections are saved for later processing.
2. The words that are not variable assignments or redirections are expanded (see Shell Expansions). If any words remain after expansion, the first word is taken to be the name of the command and the remaining words are the arguments.
3. Redirections are performed as described above (see Redirections).
4. The text after the ‘=’ in each variable assignment undergoes tilde expansion, parameter expansion, command substitution, arithmetic expansion, and quote removal before being assigned to the variable.
If no command name results, the variable assignments affect the current shell environment. Otherwise, the variables are added to the environment of the executed command and do not affect the current shell environment. If any of the assignments attempts to assign a value to a readonly variable, an error occurs, and the command exits with a non-zero status.
If no command name results, redirections are performed, but do not affect the current shell environment. A redirection error causes the command to exit with a non-zero status.
If there is a command name left after expansion, execution proceeds as described below. Otherwise, the command exits. If one of the expansions contained a command substitution, the exit status of the command is the exit status of the last command substitution performed. If there were no command substitutions, the command exits with a status of zero.
이제 간단한 예를 들어보겠습니다.
var="hello friend"
echo ${var}s > log.txt
지금 무슨 일이 일어나는거야?
참조에 따르면 var 할당(1)은 확장(4) 후에 발생하지만 쉘은 변수 할당을 먼저 수행하지 않고 어떻게 var를 확장합니까?
이것이 제가 여기서 놓친 부분인지 아니면 단지 매뉴얼에 대한 오해인지는 모르겠습니다.
좀 더 이해를 돕기 위해 더 많은 예를 들어주시면 감사하겠습니다.
감사해요
답변1
...왼쪽에서 오른쪽으로 확장, 할당 및 리디렉션합니다.
사실 설명서에 나와있어요아니요또한 다음과 같이 구문 분석한다고 언급했습니다.위에서 아래로, 한 줄씩. 그것은 단지 이야기간단한 명령.
언제든지 바꿀 수 있어
cmd1
cmd2
입력하다
cmd1; cmd2
하지만 일반적인 상황에서는
com ma nd 1
co mma nd 2
인간이 선호하는 것
com ma nd 1; co mma nd 2
=
Bash에는 vs.가 없으므로 ==
이 특별한 구문이 필요합니다.작업.리디렉션또한 다음과 같은 내용을 어디에나 넣을 수 있습니다.
> log.txt echo ${var}s
echo ${var}s>log.txt
줄 연속그 반대:
com \
mand 1
답변2
각 줄에 하나씩 2개의 간단한 명령문이 있습니다. 따라서 첫 번째 줄의 1, 2, 3단계는 아무 작업도 수행하지 않으며 4단계는 변수 할당입니다.
두 번째 행의 경우 변수는 1단계에서 확장됩니다.
답변3
이것은 같은 줄이 아닙니다. 쉘은 이러한 단계를 두 번 수행합니다.
또한 다음 사항에 유의하세요.
var="hello friend"; echo ${var}s > log.txt
또한 두 가지 간단한 명령이 있습니다. 하지만 이것은:
varr="hello friend" echo ${varr}s > log.txt
간단한 명령이다.이 경우 귀하의 쿼리가 적용됩니다: ${varr}
빈 문자열로 확장됩니다(이전에 할당되지 않은 경우; 이전 할당이 방해하지 않도록 의도적으로 새 이름을 사용했습니다).