2014-02-21 7 views
8

나는 폴더를 만들고 그 폴더에 파일을 복사하는 bash 스크립트를 작성하고있다. 명령 줄에서 작동하지만 내 스크립트에서는 작동하지 않습니다. 여기서 뭐가 잘못 됐니?와일드 카드 (*)가있는 파일을 bash 스크립트의 폴더에 복사하는 이유는 무엇입니까?

#! /bin/sh 
DIR_NAME=files 

ROOT=.. 
FOOD_DIR=food 
FRUITS_DIR=fruits 

rm -rf $DIR_NAME 
mkdir $DIR_NAME 
chmod 755 $DIR_NAME 

cp $ROOT/$FOOD_DIR/"*" $DIR_NAME/ 

내가 얻을 :

cp: cannot stat `../food/fruits/*': No such file or directory 
+3

와일드 카드를 따옴표로 묶는 것은'*'이름의 파일을 찾고 파일 목록으로 확장하지 않음을 의미합니다. –

+0

OMG ... 이전에 따옴표로 사용하지 않았지만 작동하지 않았지만 다른 이유로. 그것을 다시 바꾸려고 생각하지 않았습니다. * pacepalm *. 고맙습니다. –

답변

17

당신은 그 바로 뒤로 가지고 - 모든 제외 * 문자를 두 번 인용해야한다 :

#!/bin/sh 
dir_name=files 

root=.. 
food_dir=food 
fruits_dir=fruits 

rm -rf "$dir_name" 
mkdir "$dir_name" 
chmod 755 "$dir_name" 

cp "$root/$food_dir/"* "$dir_name/" 

또한,의 문제로 환경 변수 및 빌드와의 이름 충돌을 피하려면 모범 사례/규칙, 비 환경 변수 이름을 소문자로 사용해야합니다. 통.

+0

당신은 '환경 변수'이름이 무엇인지 자세히 설명 할 수 있습니까? – myol

+1

@ myol 환경 변수는 모든 하위 프로세스가 읽을 수있는 프로세스 공간에 저장된 변수입니다. 명명 규칙에 대한 POSIX 지침은 http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html에 나와 있으며 운영 체제 구성 요소에서 사용하거나 설정 한 변수는 모두 대문자 이름을 사용하고 해당 이름을 하나 이상의 소문자는 응용 프로그램 용으로 예약되어 있습니다. 따라서 적어도 하나의 소문자가있는 이름을 사용하면 OS 구성 요소 동작을 수정하는 변수 이름과 충돌 할 위험이 없습니다. –

+1

... 이것은 export되지 않은 쉘 변수에 대해서도 관련이 있습니다. 왜냐하면 쉘 변수에 환경 변수 이름도 지정하면 그 이름을 가진 환경 변수도 업데이트되어 덮어 쓰기가 가능하기 때문입니다 실수로 환경 변수. (이 효과로'PATH'를 업데이트 할 때'export'를 사용하는 것은 실제로 불필요합니다; 이미 환경에있는 한 업데이트를 가져옵니다). –