[exec ls -h | grep '\.foo']

[exec ls -h | grep '\.foo']

특정 파일 목록을 예상 변수에 저장하려고 합니다.

내 스크립트에서는 .foo, .bar와 같은 다양한 파일 확장자를 가진 파일을 컴파일하려고 합니다.

이 예에는 다음 파일이 있습니다.

  • 뭔가.foo
  • 뭔가 새로운 것.foo
  • 다른 것들 .bar
  • this_is_the_wrong_one.sh

.foo 파일만 얻으려면 다음 명령을 실행해 보았습니다.

set files "[exec ls -h | grep -E '\.foo' | rev | cut -c5- | rev]"
send_user "$files\n"

나는 다음을 보기를 고대하고 있다:

  • 무엇
  • 새로운 것들

그러나 결국 다음과 같은 오류 메시지가 나타납니다.

하위 프로세스가 비정상적으로 종료됩니다.
    실행시
"exec ls -h | grep -E '\.foo' | rev | cut -c5- | rev"
    내부에서 호출됨
"설정 파일"[exec ls -h | grep -E '\.foo' | grep -E '\.foo' |turn|cut-c5-|turn]""
    (파일 "./runthis.sh" 라인 2)

find '*.foo', 등을 사용할 수 있다는 것을 알고 있습니다 ls -h *.foo. awk이 패턴을 발견했습니다... with (작은 따옴표)를 사용하면 가발이 예상되므로 , 및 를 사용할 생각이 find거의 없어집니다 . '사용했는데 파일이 존재하지 않으면 스크립트가 중지됩니다. 계속해서 다른 파일을 확인하고 나열해야 합니다.findawkgrepls -h *.foo

파일이 발견되면 결국 다음을 사용하여 배열로 분할됩니다.

업데이트 1:

set split_files "[split $files \n]"

답변1

문제는 작은따옴표가 에 특별한 것이 아니기 때문에 일반적으로 셸에서 제거하려는 따옴표를 포함하여 tcl실제로 grep인수를 사용하여 명령을 실행 한다는 것입니다.'\.foo'

이로 인해 grep일치가 실패하고 0이 아닌 오류 코드로 종료되므로 명령이 exec오류를 전달합니다.

간단한 대답은 tcl큰따옴표( grep -E "\\.foo")를 사용하거나 따옴표 없음( grep -E \\.foo) 또는 중괄호 따옴표( grep -E {\.foo})를 사용하는 것입니다. 그러나 또 다른 옵션은 쉘 명령에 의존하지 않는 것입니다. 이에 상응하는 내용은 tcl다음과 같습니다.

set fullfiles [glob *.foo]
foreach f $fullfiles { lappend files [string trimright $f .foo] }

관련 정보