이것이 작동하는 이유:
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,chmod
700}
대신, 쉘은 행을 {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
에서 인쇄 됩니다 .zsh
ksh
x y
bash
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 "$_"