2014-11-26 8 views
1

foo bar (touch foo\ bar 명령 사용)이라는 파일을 만들었습니다. findbar"라는 이름의 파일을 다음 "foo라는 이름의 파일을 찾고, 첫 번째로변수 매개 변수를 전달할 때 find의 이상한 동작

s='"foo bar"'; find $s 
s='"foo bar"'; find "$s" 
s="foo bar"; find "$s" 

:

그런 다음 배쉬에서 나는 다음과 같은 명령을 시도했다.

find"foo bar"이라는 파일을 찾습니다.

두 명령이 모두 실패합니다. find은 파일을 찾지 못합니다.

마지막으로 세 번째 명령의 예상 동작은 다음과 같습니다. findfoo bar을 찾아 보여줍니다.

공백 문자를 벗어나지 않는 것이 좋지만 다른 사람이 나에게 무슨 일이 일어나는지 설명 할 수 있습니까? 두 번째 명령이 작동하지 않는 이유는 무엇입니까?

답변

1

공백 문자를 피하지 않는 것이 좋지만, 여기 사람이 나를 설명 할 수 있습니까? 두 번째 명령이 작동하지 않는 이유는 무엇입니까?

"foo bar"이라는 것을 찾고 있습니다. 당신은 너무 많이 인용 :

말을함으로써 :

s='"foo bar"' 

당신이 변수 $s 사실 "foo bar"에 있음을 나타냅니다. 즉, 따옴표는 변수 content에입니다.

  • 당신이 말할 때 :

    find "$s" 
    

당신은 따옴표로 이름이 "foo bar"은 정확히 그 파일을 찾기 위해 노력하고 있습니다. 우리가이 정확히 이름의 파일을 만들 경우, 그것은 작동합니다

$ touch '"foo bar"' 
$ s='"foo bar"'; find "$s" 
"foo bar" 
  • 당신이 말할 때 :

    $ find \"foo bar\" 
    find: ‘"foo’: No such file or directory 
    find: ‘bar"’: No such file or directory 
    
    :

    $ s='"foo bar"'; find $s 
    find: ‘"foo’: No such file or directory 
    find: ‘bar"’: No such file or directory 
    

당신이 말하는 사실에

즉, 두 개의 인수와 함께 find을 사용하고 있습니다. "foo 또는 bar". 그리고이 파일들도 존재하지 않습니다. 그러나, 다시, 만약 당신이 그들 중 하나를 만들면, 보일 것입니다!

$ find a b 
find: ‘a’: No such file or directory 
find: ‘b’: No such file or directory 
+0

그래서 (I 변수없이 전체 명령을 입력하는 것처럼) 따옴표 변수 매개 변수를 전달하는 유일한 방법은 다음과 같습니다

$ touch '"foo' $ find \"foo bar\" "foo find: ‘bar"’: No such file or directory 

참고 find X Y의 동작은 XY을 찾는 것입니다 변수를 "$ s"로 둘러 쌉니다. 그렇지 않으면 일반 문자가됩니다. 맞습니까? – Mizar

+0

음, 무슨 뜻인지 알 수 없습니다. 확실한 것은 조심해야합니다. 따옴표를 쓰지 않는 것입니다 :) 당신이 찾고있는 이름은''foo bar''가 아니라''foo bar''입니다. 즉,'foo bar'를 찾고 있다면 그냥'var = "foo bar"변수를 할당하면 따옴표로 변수가'foo bar'라는 것을 알 수 있습니다. 그런 다음, 큰 따옴표로'find'를 사용하여 변수가 전체적이고 유일한 문자열로 해석되는지 확인하십시오 :'find "$ var"'. – fedorqui

+1

좋습니다, 감사합니다. 내가 말한 의미는 (만약 내가 이해했다면) 배쉬가 변수를 확장 할 때, 변수에 포함 된 따옴표를 일반 문자로 취급하고 더 이상 단어를 그룹화하라는 기호로 취급하지 않는다는 것입니다. – Mizar