2017-02-05 12 views
0

Написание небольшого скрипта в bash (фактически MacOS), и я хочу использовать найти, с несколькими источниками. Обычно это не проблема, но список исходных каталогов для поиска сохраняется как строка в переменной. Опять же, обычно это не проблема, но некоторые из них содержат пробелы в их имени.Найти космический побег

Я могу построить полную командную строку и, если ее ввести непосредственно в командной строке (скопируйте и вставьте на самом деле), она работает по мере необходимости и ожидается. Но когда я пытаюсь запустить его внутри скрипта, он разбивается на пробелы в названии, и мне не удалось обойти это.

Я не могу процитировать всю исходную строку, так как это просто рассматривается как один элемент, который, конечно, не существует. Я избегаю каждого пространства с обратной косой чертой внутри строки, хранящейся в переменной, и просто теряется. Если я использую двойную обратную косую черту, они оба остаются на месте, и снова он терпит неудачу. Любой метод цитирования, который я пробовал, в основном игнорируется, кавычки рассматриваются как обычные символы, а разбиение выполняется в каждом пространстве.

Я до сих пор только мог использовать eval на всей командной строке, чтобы заставить его работать, но я чувствовал, что это должно быть лучшим решением, чем это.

По иронии судьбы, если я использую AppleScript Я могу создать подходящую командную строку и отлично ее запустить с помощью doShellScript (хорошо, это использование JXA, но это то же самое с фактическим AppleScript). Тем не менее, я до сих пор не смог найти правильный механизм эвакуации только в сценарии bash, не прибегая к eval.

Кто-нибудь предлагает решение?

+0

Меньше слов и больше кода, чтобы показать, что проблемные части были бы лучше .... – jm666

+0

Прошу прощения, если вам трудно читать слова. – UKenGB

ответ

0

Если возможно, не храните все пути в одной строке. Массив является более безопасным и более удобным:

paths=("first path" "second path" "and so on") 
find "${paths[@]}" 

Команда находкой будет расширяться

find "first path" "second path" "and so on" 

Если вы должны использовать строку и не хотите использовать Eval, split the string в массив:

string="first\ path second\ path and\ so\ on" 
read -a paths <<< "$string" 
find "${paths[@]}" 

Пути внутри строки должны использовать \ для избежания пробелов; скребковые пути внутри "" или '' не будут работать. eval может быть лучшим вариантом здесь.

+0

Но, как я уже сказал, пути (ну, только имена каталогов) находятся в строке, а не в массиве. – UKenGB

+0

@UKenGB Извините, ваш вопрос был не очень ясен для меня. Не могли бы вы точно описать, как они хранятся в строке. Сделайте пример. Является ли формат «первым путем» «вторым путем» или «первым», «вторым путем» или «первым путем второго пути»? – Socowi

+0

Для Apple/JavaScript они хранятся как «iTmeDIRS =» Аудиокниги Главная \\ Видеоролики Музыкальные подкасты TV \\ Показывает и iTmeDIRS могут быть отправлены в команду find, которая будет использоваться в качестве исходных каталогов, в которых нужно искать. Это работает. Но я не могу найти способ в сценарии bash для хранения этого списка каталогов в переменной, которую можно использовать таким же образом для команды find. Однако я пытаюсь процитировать/избегать пробелов в именах, это просто терпит неудачу. – UKenGB

 Смежные вопросы

  • Нет связанных вопросов^_^