Исключение переменных gawk для команд оболочки

Я пытаюсь запустить небольшой скрипт gawk, который будет запускать некоторые команды оболочки с помощью system() . Я хочу получить список файлов с помощью find и запустить скрипт следующим образом:

 find <arguments> -printf "%f\n" | script.awk 

Проблема в том, что в этих файлах есть специальные символы, такие как пробелы, кавычки и круглые скобки. Например:

  • Проблема с использованием expr
  • Как я могу сделать графический график последовательности чисел из стандартного ввода?
  • gawk с gawkextlib
  • использование gsub в awk для замены слова скобками
  • подстановка параметров оболочки для переименования файлов
  • существует ли служба pastebin, которая поддерживает терминальные escape-последовательности?
  •  $ ls 'Aujourd'\''hui C'\''est Toi (Orchestral).flac' 

    Я пробовал всевозможные цитаты:

     system("<command> \""$0"\"") 

    И это:

     system("<command> \'"$0"\'") 

    Я получаю всевозможные ошибки, некоторые из этих ошибок относятся к sh -c а некоторые из gawk

    Есть ли способ передать запись $0 или любые другие переменные из скрипта gawk в команду оболочки, не сталкиваясь с проблемами всех этих тезисов?

    Примечание. Я знаю, что было бы проще просто переименовать файлы временно, но я считаю более сложным избежать этого.

    РЕДАКТИРОВАТЬ:

    Ни один из предложенных ответов не решил мою проблему, поэтому вот более конкретное описание проблемы: я пытаюсь запустить команду, которая использует 2 awk-переменные. Примеры:

    Если я запустил:

     system("metaflac --show-tag=ARTIST \""FILE"\"") 

    Я не получаю ошибку, потому что я цитирую FILE и потому что он не содержит двойных кавычек, он идет ОК.

    Но если я убегу:

     system("metaflac --set-tag=ARTIST="AWK_VAR_WITH_ARTIST_VALUE" "\"FILE\") 

    Даже когда я цитирую его, я получаю сообщение об ошибке metaflac что файл flac не найден. При чтении сообщения об ошибке я вижу, что имя файла было разделено на отдельные слова.

  • Удаление управляющих символов с помощью sed
  • Нужна помощь в преобразовании строки из файла в дату
  • Извлечь имена хостов из не хэшированных ssh known_hosts
  • Как открыть новую строку с помощью цикла for?
  • Как найти все соответствия регулярному выражению в строке
  • Добавить строку в файл конфигурации из сценария bash?
  • 2 Solutions collect form web for “Исключение переменных gawk для команд оболочки”

    Вы можете заменить system("<command> \"$0\"") на способность awk писать в процесс, т. print $0 | "pre;<command> \"$v\"" print $0 | "pre;<command> \"$v\"" , где pre- часть будет читать stdin в переменной оболочки v. В bash это будет read -rv . Вы в конечном итоге с этим, например:

     awk 'BEGIN{ cmd="read -rv; ls -ld \"$v\"" } { print $0 | cmd; close(cmd); }' 

    Если вы хотите обрабатывать ужасные вещи, такие как новые строки в именах файлов, вы можете пойти в print0 в своей находке, и если ваш awk принимает RS='\0' , у вас есть для bash:

     find . -print0 | awk -v RS='\0' ' BEGIN{ cmd="read -r -d \"\" v; ls -ld \"$v\"" } { print $0 "\x00" | cmd; close(cmd); }' 

    Для конкретного случая пробелов и одинарных кавычек должно быть достаточно, чтобы обернуть строку в двойные кавычки:

     $ find -name 'Aujour*' -printf "%f\n" | awk '{system("ls -l \""$0"\"")}' -rw-rw-r-- 1 user user 0 May 26 11:27 Aujourd'hui C'est Toi (Orchestral).flac 

    В качестве альтернативы, если ваша оболочка предоставляет спецификатор формата оболочки, вы можете рассмотреть возможность использования этого вместо внутренней -printf :

     $ find -name 'Aujour*' -exec printf '%q\n' {} \; | awk '{system("ls -l "$0)}' -rw-rw-r-- 1 user user 0 May 26 11:27 ./Aujourd'hui C'est Toi (Orchestral).flac 

    Из help printf в bash например:

     %q quote the argument in a way that can be reused as shell input 
    Linux и Unix - лучшая ОС в мире.