Ожидайте парики, когда я использую одинарную кавычку в

Я пытаюсь сохранить список конкретных файлов в переменную ожидаемо.

В моем сценарии я пытаюсь скомпилировать файлы с разными расширениями, например .foo, .bar.

В этом примере у меня есть следующие файлы:

  • something.foo
  • something_new.foo
  • something_different.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' |  рев |  вырезать -c5- |  ред] «»
     (файл "./runthis.sh" строка 2)

Я знаю, что могу использовать find '*.foo' , ls -h *.foo , awk и т. Д. Я заметил шаблон … с find , ожидайте парики, если я использую ' (одинарная кавычка), так что в значительной степени устраняет идею использования find , awk и grep . Если я использую ls -h *.foo а файлы не существуют, сценарий остановится. Предполагается продолжить проверку и распечатку других файлов.

Если он найдет файлы, он будет разбит на массив с помощью этой команды:

Обновление 1:

 set split_files "[split $files \n]" 

Проблема в том, что одинарные кавычки не являются специальными для tcl , поэтому вы на самом деле запускаете команду grep с аргументом '\.foo' , включая кавычки, которые обычно вы ожидаете удалить из оболочки.

Это приводит к тому, что grep не может соответствовать, поэтому он завершается с ненулевым кодом ошибки, и поэтому команда 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] }