![Bash에서 "단어"를 확장하는 방법은 무엇입니까? 파일 와일드카드에 대한 논의 없음](https://linux55.com/image/177085/Bash%EC%97%90%EC%84%9C%20%22%EB%8B%A8%EC%96%B4%22%EB%A5%BC%20%ED%99%95%EC%9E%A5%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%ED%8C%8C%EC%9D%BC%20%EC%99%80%EC%9D%BC%EB%93%9C%EC%B9%B4%EB%93%9C%EC%97%90%20%EB%8C%80%ED%95%9C%20%EB%85%BC%EC%9D%98%20%EC%97%86%EC%9D%8C.png)
너무 간단한 질문이라 죄송하지만 스스로 해결책을 찾을 수 없습니다.
난 달린다:
$ echo {1..4}
1 2 3 4
그것은 나에게 문제가 되지 않습니다. 하지만 만약 내가:
$ echo "{1..4}" > file
$ cat file
{1..4}
$ echo $(<file)
{1..4}
$ echo $(cat file)
{1..4}
{1..4}
파일 내에서 문자열을 확장하는 데 사용할 수 있는 방법을 찾고 있지만 성공하지 못했습니다.file
echo
답변1
작업에 적합한 도구를 사용하고 있지 않습니다.
[user@host dir]$ ksh
$ echo "{1..4}" > file
$ cat file
{1..4}
$ echo $(<file)
1 2 3 4
$ echo $(cat file)
1 2 3 4
농담은 제쳐두고,Bash의 확장 순서예:
- 지원 확장;
- 물결표 확장, 매개변수 및 변수 확장, 산술 확장, 명령 대체(왼쪽에서 오른쪽으로 수행)
- 분사;
- 및 파일 이름 확장자.
따라서 에서 echo $(cat file)
(따옴표가 없는) 명령 대체의 출력은 토큰화 및 파일 이름 확장만 거치며, 패턴 일치 문자가 포함되지 않으므로 변경되지 않은 채로 유지됩니다(그리고 변수에 , 또는 가 IFS
포함되어 있지 않다고 가정 ) .{
1
.
4
}
일부 확장은 중첩될 수 있지만결과한 단계에서 현재 단계로 확장을 트리거하는 문자의 경우 확장된 문자는 일반적으로 다시 구문 분석되지 않습니다. (합당한 이유가 있습니다. 생각해 보세요 foo=\$foo; echo "$foo"
).
중괄호 확장을 적용하려면 file
새 명령줄을 구성하고 셸이 해당 내용을 구문 분석하고 실행하도록 해야 합니다. 한 가지 방법은 eval
그림과 같이이 다른 답변당신은 가지고 있습니다. 또는 프로세스 대체를 사용할 수 있습니다.
$ . <(printf '%s ' echo; cat file)
1 2 3 4
두 경우 모두에 유의하세요.의 전체 내용이 file
구문 분석되어 실행됩니다.현재 환경에서.
유사하지만 새 프로세스의 별도 환경에서 실행됩니다 bash
.
$ bash <<<$( printf "%s " echo; cat file; )
1 2 3 4
그런데 ksh93(첫 번째 코드 블록에서 사용하는 셸)은 독특한 방식으로 작동합니다. 중괄호 확장은 필드 분할의 일부로 이후 단계에서 수행되고 이전 확장의 결과는 다시 구문 분석됩니다. 중괄호 표현식 1을 감지하려면 :
$ bash -c 'echo {1..$(printf %s 3)}' mybash
{1..3}
$ ksh -c 'echo {1..$(printf %s 3)}' myksh
1 2 3
1
Stephen Chazeras 역댓글에서 지적한, ksh93의 이러한 동작은 버그로 $var
간주 될 수 있으며 var
.
답변2
나는 당신이 이것을 찾고 있다고 생각합니다 :
eval "echo $(cat file)"
eval은 쉘에 의해 실행되는 명령을 구성합니다.