2011-03-21 2 views
3

좋아, 우스운 일이 일어난다. 이 테스트 작업하는 데 사용bash 테스트 결과 "echo : command not found"

for i in `cat /mnt/usb/liste.txt `; do [ -f /mnt/usb/lsdvd.xml/$i ] || echo $i; done 

미세 (파일의 모든 항목이 해당 디렉토리를 찾아보십시오 liste.txt에 대한 발견되지 않는 경우는, 이름을 인쇄) 누락 된 디렉토리의 이름을 얻을하는 데 사용됩니다. 이제이 명령 수익률은

 echo: command not found 
 echo: command not found 
 echo: command not found 
(...) 

나는 [[...]]를 사용하는 대신 "[..]"하지만 아무런 소용이의 "테스트"시도했습니다.

내가보고 있지 않은 동안 어떤 생각이 내 사랑하는 배쉬와 일어 났을 수도 있습니다. :)?

감사합니다. 크리스천.

편집 (-x 출력 설정) : 당신은 단순히 실행하면 어떻게됩니까

(...) 
+ for i in '`cat /mnt/usb/liste.txt`' 
+ '[' -f /mnt/usb/lsdvd.xml/THE_GHOST_WRITER.lsdvd.xml ']' 
+ for i in '`cat /mnt/usb/liste.txt`' 
+ '[' -f /mnt/usb/lsdvd.xml/THE_IMAGINARIUM_OF_DOCTOR_PARNASSUS.lsdvd.xml ']' 
+ for i in '`cat /mnt/usb/liste.txt`' 
+ '[' -f /mnt/usb/lsdvd.xml/THE_INFORMANT.lsdvd.xml ']' 
+ for i in '`cat /mnt/usb/liste.txt`' 
+ '[' -f /mnt/usb/lsdvd.xml/THE_INTERNATIONAL.lsdvd.xml ']' 
+ for i in '`cat /mnt/usb/liste.txt`' 
+ '[' -f /mnt/usb/lsdvd.xml/THE_MEN_WHO_STARE_AT_GOATS.lsdvd.xml ']' 
+ for i in '`cat /mnt/usb/liste.txt`' 
+ '[' -f /mnt/usb/lsdvd.xml/THE_OTHER_MAN.lsdvd.xml ']' 
+ for i in '`cat /mnt/usb/liste.txt`' 
+ '[' -f /mnt/usb/lsdvd.xml/THE_QUEEN.lsdvd.xml ']' 
+ for i in '`cat /mnt/usb/liste.txt`' 
+ '[' -f /mnt/usb/lsdvd.xml/THE_READER.lsdvd.xml ']' 
+ for i in '`cat /mnt/usb/liste.txt`' 
+ '[' -f /mnt/usb/lsdvd.xml/THE_REBOUND.lsdvd.xml ']' 
+ $'\302\240echo' THE_REBOUND 
+ '[' -x /usr/lib/command-not-found ']' 
+ /usr/bin/python /usr/lib/command-not-found -- $'\302\240echo' 
 echo: command not found 
+ return 127 
(...) 
+0

당신이 i' $'따옴표 시도가? –

+0

줄의 끝을'echooooo $ 1; done', 'echooooo : command not found'라는 에러가 나옵니까? "command not found"오류는 bash 명령 프롬프트에 정크를 입력 할 때 발생하는 오류입니다. '/ bin/echo'로 바꾸면 어떨까요? –

+1

'set -x'를 스크립트 상단에 추가하고 쉘이 실행하는 각 명령을 살펴보십시오. – bobbogo

답변

0

:

한 가지를 들어
for i in `cat /mnt/usb/liste.txt `; do 
    echo $i 
done 

, 당신은 파일 이름 (공백, 줄 바꿈에 대한 이상 아무것도 알 않습니다, 특수 문자 등)? 그렇다면 쉘이 파일을 잘못 해석하지 않도록 파일 이름을 인용해야합니다. 또한

는 논리 대신 일반 if 문을 사용하려고 OR :

for i in `cat /mnt/usb/liste.txt `; do 
    if [ ! -f /mnt/usb/lsdvd.xml/$i ]; then 
     echo $i 
    fi 
done 
+0

단순한 for-echo-done 루프는 잘 동작하며, 파일 이름에 특별한 것은 없습니다. 사실, 꽤 괜찮습니다. 공백이없고 숫자가 아닙니다. – Christian

+0

for-then-then-fi-done 루프는 잘 동작하므로, || 이상한 따옴표로 묶지 않은 문자열을 사용하지만 파일과 이름에 대해 이상한 것을 찾지 못하는 것 같습니다. – Christian

2

편집 : 아래의 코드는 여전히 괜찮지 만, 문제는 $'\302\240echo'에 아마 : 알 수없는 문자이있는 것 같습니다 텍스트 파일에. echo하기 전에 부부 문자를 제거한 다음 다시 입력하십시오.

호가 될 수 있습니다. 나를 위해

while IFS= read -r; do [ -f "/mnt/usb/lsdvd.xml/$REPLY" ] || echo "$REPLY"; done < /mnt/usb/liste.txt 
0

작품 : 또한, 당신은 useless use of cat을 피함으로써 시간을 절약 할 수 그냥 내 자신의 파일 이름, 디렉토리

for f in $(< d2.lst); do [ -f ./d2/$f ] || echo $f ; done 

을 대신 역 따옴표의 구조에 $ (...)를 제안, 고양이 대신 <으로 표시됩니다.

아마도 목록에 dos/windows 줄 바꿈이 있습니까? less으로보기. 대신, 선두 공간

echo: command not found 

:가 인쇄 할 때

echo: command not found 

set -x이 훨씬 명확하게 : 당신이 자세히 보면

11

, 당신은 인쇄의 볼

$'\302\240echo' THE_REBOUND 

0302 0240non-breaking space의 경우 8 진수 UTF-8입니다. .

|echo 사이의 공백을 삭제하고 일반 공백을 입력 해보십시오.


기회는 파일은 공간과 동시에 옵션를 누르면 비 분리 공백 실수로 입력 할 수 있습니다 맥에 편집 된입니다.

Vim을 사용하는 경우 listchars option을 사용하면 줄 바꿈하지 않는 공백을보다 명확하게 지정할 수 있습니다. 예를 들어 :

set listchars+=nbsp:% list 

좀 더 아이디어를 Making Vim highlight suspicious characters를 참조하십시오.

리눅스에

, 비 분리 공백은 아마 당신은 입력하지 않을거야, 그래서 + 시프트 + U0 Ctrl 키공간 또는 중 하나 작성공간입니다 그건 우연히. 관심있는 사람들을위한


, 그것은 수동으로 UTF-8 Wikipedia 기사에서 UTF-8 table를 사용하여 UTF-8로 8 진수 바이트를 변환 할 수 있습니다.

그러나 지금까지 내가 찾은 가장 쉬운 방법은 파이썬 사용 된

:

>>> import unicodedata 
>>> unicodedata.name('\302\240'.decode('utf-8')) 
'NO-BREAK SPACE'