Выполнять команду в переменной

Я пытаюсь выполнить команду, хранящуюся внутри переменной:

cmd="grep -i \"word1\" filename | grep -i \"word2\"" eval $cmd 

Но когда я выполняю скрипт, я получаю ошибки:

 grep: |: No such file or directory grep: grep: No such file or directory 

Как я могу выполнять команды, подобные примеру в моем примере, без ошибок?

3 Solutions collect form web for “Выполнять команду в переменной”

Вам нужно указать "$cmd" – и, возможно, избежать " двойных кавычек». В любом случае, чтобы запустить это, вам нужно его eval и это связано с |pipe . Переменная оболочки не выходит за пределы простая простая команда – и вы пытаетесь запустить составную команду.

Так:

 cmd='grep -i "word1" filename | grep -i "word2"' eval "$cmd" 

Вероятно, когда вы расширили $cmd без кавычек, вы столкнулись с созданием имени файла и / или проблемами $IFS . Просто убедитесь, что он надежно процитирован, и со мной все будет в порядке. Также проверьте, что все, что находится в "word[12]" , не содержит двойных кавычек или обратных косых черт или что-то еще, иначе вам нужно будет переоценить свой стиль цитирования.

Присмотревшись к вашей ошибке, я могу точно сказать, что это было:

 grep: |: No such file or directory grep: grep: No such file or directory 

Поэтому, если я это сделаю:

 echo | echo 

Первое echo печатает \n ewline во втором echo stdin . Если я сделаю:

 set \| echo echo "$@" 

Первое echo печатает каждый из его аргументов, которые | трубы и echo соответственно.

Разница в том, что | труба в первом случае интерпретируется анализатором оболочки как токен и интерпретируется как таковой. Во втором случае, в то же время оболочка сканирует для | токен канала также сканирует токен $ expand – и поэтому | трубы еще не найдены, потому что "$@" еще не заменено его значением.

Поэтому, если вы это сделаете:

 grep -i "word" filename \| grep -i "word2" 

… вы, вероятно, получите те же результаты, потому что | там не разграничиваются команды и вместо этого является аргументом grep в его позиции infiles .

Вот посмотрите, сколько полей вы получаете, когда вы разделяете $cmd с $IFS по умолчанию:

 printf '<%s> ' $cmd <grep> <-i> <"word1"> <filename> <|> <grep> <-i> <"word2"> 

И вот что может генерировать имя файла:

 touch 'echo 1simple &&' 'echo 2simple' eval echo* 

Для примера, который вы опубликовали, вам не нужно использовать eval. Просто выполните переменную так:

 cmd="grep -i \"word1\" filename | grep -i \"word2\""; # added missing " at the end $cmd 

Смотрите свои цитаты. Возможно, что-то вроде этого менее подвержено ошибкам:

 cmd='grep -i "word1" filename | grep -i "word2"'; 

Что касается меня, это неправильный способ использования переменной для сохранения и выполнения любой команды. Существует лучший выбор – функция :

 my_cmd() {grep -i "word1" filename | grep -i "word2"} 

Вот и все.

Или вы можете использовать разные аргументы, такие как:

 my_cmd() {grep -i "$1" "$3" | grep -i "$2"} 

Затем назовите его

 my_cmd word1 word2 filename 
  • Есть ли способ получить эффект объединения grep -v с grep -A?
  • Отфильтровать 2-й вхождение текста между цитатами с помощью sed?
  • Как использовать не жадное регулярное выражение в grep?
  • grep для n или более периодов на заданной строке
  • Как «grep» для длины строки в заданном диапазоне?
  • Цветной вывод из сценария Bash
  • Как grep все строки, где начальная строка заканчивается шаблоном, а конечная строка заканчивается другим?
  • grep --include действует как --exclude
  • Как совместить строку, содержащую символ «$» с grep?
  • Как объединить две команды grep и отобразить их результаты вместе?
  • Усреднение по многим строкам данных
  • Interesting Posts

    Установить изображение пользователя lightdm

    «. ~ / .bashrc "не устанавливает переменные, как ожидалось, в вызывающем скрипте

    Добавить фильтры в ffmpeg пресеты

    Unionfs vs Aufs vs Overlayfs vs mhddfs, который я использую

    Почему эта команда bash не запускается при вызове python?

    Как добавить runnable OpenSSH-сервер в Ubuntu ISO?

    Каков второй столбец ls -l?

    Ошибки в Syslog

    Как ограничить соединения с сервером OpenSSH с помощью секретных ключей обязательно с помощью фраз?

    Как найти драйвер (модуль), связанный с устройством в Linux?

    Возможно ли эффективное развитие андроида на vim?

    Эквивалент кнопок вперед / назад для оболочки unix (при навигации по каталогам)?

    Ubuntu говорит, что дисковое пространство исчерпано. Нет доступа к терминалу. Вход только гостя. КАК я могу стереть дисковое пространство сейчас?

    Установка Kali Linux перепуталась с MacBook Pro (без Wi-Fi)

    Как регистрировать все системные вызовы, выполненные процессом, и все его потомки с помощью auditd

    Linux и Unix - лучшая ОС в мире.