bash 중괄호 확장이 명령에 대해 작동하지 않는 이유는 무엇입니까?

bash 중괄호 확장이 명령에 대해 작동하지 않는 이유는 무엇입니까?

이것이 작동하는 이유:

mkdir /dir/test{1,2,3}

그렇지 않나요?

{chown httpd,chmod 700} /dir/test1
-bash: {chown: command not found

내 Bash 버전은 다음과 같습니다: GNU bash, 버전 4.2.46(2)-릴리스

답변1

중괄호 확장이 잘못되었습니다. 버팀대 확장은 다음과 같아야 합니다.단어껍질에.

단어는 따옴표가 없는 공백(기본적으로 탭 또는 줄 바꿈)으로 구분된 문자열이며, 문자열은 {chown httpd,chmod 700}세 개의 개별 단어로 구성되며 {chmod중괄호 확장으로 인식되지 않습니다.http,chmod700}

대신, 쉘은 행을 {chown명령으로 해석하고 인수와 함께 실행 합니다 http,chmod.700}/dir/test1

이를 테스트하는 가장 쉬운 방법은 다음과 같습니다 echo.

$ echo {chown httpd,chmod 700} /dir/test1
{chown httpd,chmod 700} /dir/test1

$ echo {"chown httpd","chmod 700"} /dir/test1
chown httpd chmod 700 /dir/test1

중괄호 확장이 작동하더라도 이 명령은 의미가 없습니다.

두 가지 명령만 작성하면 됩니다.

chown http /dir/test1
chmod 700  /dir/test1

답변2

매뉴얼 페이지에서 언급했듯이 bash는 각 단어에 대해 중괄호 확장을 수행하기 때문입니다.뒤쪽에명령줄을 단어로 분할합니다.

{chown따라서 명령줄은 먼저 , httpd,chmod및 로 분할됩니다. 700}그런 다음 {chown유효한 중괄호 확장 모드가 아니기 때문에 그대로 유지되고 bash는 해당 이름으로 명령을 실행하려고 시도합니다.

맨 페이지의 인용문은 다음과 같습니다.

확장은 명령줄에서 수행됩니다.단어로 나눈 후. 중괄호 확장, 물결표 확장, 매개변수 및 변수 확장, 명령 대체, 산술 확장, 토큰화, 경로 이름 확장 등 7가지 유형의 확장이 수행됩니다.

zsh다른 쉘( 산술 확장 다음에 중괄호 확장이 따르고 추가 단어 분리가 전혀 수행되지 않음) 과 달리 순서에 유의하십시오 .

다음은 또는 , 및 1 2에서 인쇄 됩니다 .zshkshx ybash

f=; f1=x; f2=y; echo $f{1,2}

답변3

다른 답변에서는 버팀대 확장이 작동하지 않는 이유를 이미 설명했습니다. 지금은 이 문제를 무시하고 파일 이름이 중복되는 것을 피하고 싶을 수도 있으며 이를 수행하는 다른 방법이 있습니다. 파일 이름을 변수에 할당하거나 $_특수 변수(이전 명령의 마지막 쉘 단어가 포함되어 있음)를 사용하십시오.

f="some long and ugly filename"
chown httpd "$f"
chmod 700 "$f"

또는

chown httpd "some long and ugly filename"
chmod 700 "$_"

관련 정보