Bash에서 "단어"를 확장하는 방법은 무엇입니까? 파일 와일드카드에 대한 논의 없음

Bash에서 "단어"를 확장하는 방법은 무엇입니까? 파일 와일드카드에 대한 논의 없음

너무 간단한 질문이라 죄송하지만 스스로 해결책을 찾을 수 없습니다.

난 달린다:

$ 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}파일 내에서 문자열을 확장하는 데 사용할 수 있는 방법을 찾고 있지만 성공하지 못했습니다.fileecho

답변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의 확장 순서예:

  1. 지원 확장;
  2. 물결표 확장, 매개변수 및 변수 확장, 산술 확장, 명령 대체(왼쪽에서 오른쪽으로 수행)
  3. 분사;
  4. 및 파일 이름 확장자.

따라서 에서 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은 쉘에 의해 실행되는 명령을 구성합니다.

관련 정보