Развернуть переменную среды из PIPE (SHELL)

У меня есть вопрос, который может иметь или не иметь ответа в форме, которую я ищу, но любой формы будет достаточно.

В настоящее время у меня есть файл конфигурации, в котором я буду использовать команду оболочки, которая использует grep для поиска определенной строки в файле, а затем я использую sed для получения всего текста после определенного символа. Оставшийся текст – это просто путь к файлу, который включает переменную среды. Результат команды возвращает что-то вроде этого:

$ LIGHTS_HOME / музыка / something.mp3

Затем я хочу передать это в mp3info, чтобы получить полезные метаданные из mp3-файла. Однако, когда я передаю это в mp3info, $ LIGHTS_HOME не расширяется до фактического пути к файлу, к которому он привязан. Как я могу расширить его в пределах одной строки? Возможно ли это?

Вот моя текущая команда:

$ sudo grep -w "file_path =" /home/pi/lightshowpi/config/state.cfg | sed 's/.*= //' | sed 's|'\$LIGHTS_HOME'| '/home/pi/lightshowpi'|' | xargs mp3info -p "Now Playing: %t by %a" | xargs sudo python /home/pi/lightshowpi/tweet/tweet.py 

Что делает команда (я отредактировал строку так, чтобы ее было легче читать, при ее использовании она должна быть одной строкой (желательно, если я готов к многострочной линии):

первая строка использует grep для поиска строки 'file_path =', которая возвращает строку 'file_path = $ LIGHTS_HOME / music / songname.mp3'

Затем он передается в sed, который анализирует оператор и возвращает все символы после «=», который возвращает в этом случае «$ LIGHTS_HOME / music / songname.mp3»,

Оттуда я использую вторую команду sed для замены $ LIGHTS_HOME с ее значением переменной / home / pi / lightshowpi / '

В идеале я хотел бы избавиться от этой второй команды sed в пользу чего-то, что оценивает «$ LIGHTS_HOME» для его значения »/ home / pi / lightshowpi / '

Затем будет использоваться mp3info для получения метаданных файла, который отформатирован как stdout, который затем передается по протоколу xargs, который подготавливает метаданные в формате stdin, который использует скрипт python, и чирирует значение с помощью нескольких других символы смайликов (которые сценарий python делает без проблем)

Однако вместо того, чтобы использовать вторую команду sed для замены $ LIGHTS_HOME для / home / pi / lightshowpi, я предпочел бы расширять $ LIGHTS_HOME, поскольку на других установках эта переменная может быть установлена ​​где-то, кроме домашнего каталога.

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

3 Solutions collect form web for “Развернуть переменную среды из PIPE (SHELL)”

С помощью ZSH вы можете «выполнить расширение параметра, подстановку команд и арифметическое расширение» с флагом расширения параметра (e) на что-то в данной переменной x (подробности см. В zshexpn(1) ):

 x='$HOME/blablah'; echo $x; echo ${(e)x} 

Или из файла:

 echo '$HOME/fromfile' > afile echo ${(e)$(<afile)} 

Это имеет различные преимущества перед eval , в зависимости от того, кто имеет доступ к конфигурационному файлу и как они непослушны:

 $ touch somefile $ echo 'hi; rm somefile' > x $ eval "echo `cat x`" hi $ ls somefile ls: somefile: No such file or directory $ exec zsh % touch somefile % echo ${(e)$(<x)} hi; rm somefile % ls somefile somefile % - $ touch somefile $ echo 'hi; rm somefile' > x $ eval "echo `cat x`" hi $ ls somefile ls: somefile: No such file or directory $ exec zsh % touch somefile % echo ${(e)$(<x)} hi; rm somefile % ls somefile somefile % 

По сути, эта строка кода ищет файл конфигурации /home/pi/lightshowpi/config/state.cfg для строки «file_path =», а затем расширяет переменную среды $ SYNCHRONIZED_LIGHTS_HOME до ее значения и передает ее в mp3info, которая извлекает метаданные из файл MP3 затем соединяет строку с скриптом Python, который принимает аргументы и удаляет нежелательные символы, включая смайлики из библиотеки emoji Python, чтобы твитнуть вашу учетную запись через API твиттеров.

 sed '/file_path =/!d;s|.*= ||;s|$SYNCHRONIZED_LIGHTS_HOME|'"$SYNCHRONIZED_LIGHTS_HOME|" /home/pi/lightshowpi/config/state.cfg | xargs mp3info -p "Now Playing %t by %a" | xargs sudo python /home/pi/lightshowpi/tweet/tweet.py 

Ключ к этой команде используется! чтобы исключить «file_path =», а затем использовать xargs для mp3info и tweet.py

Я буду отлаживать следующую /home/pi/lightshowpi/config/state.cfg использовать одну и ту же переменную $ SYNCHRONIZED_LIGHTS_HOME вместо / home / pi / lightshowpi, чтобы сделать эту команду универсальной для этого проекта с открытым исходным кодом.

Предполагая, что у вас есть значение $ LIGHTS_HOME / music / something.mp3 в переменной $ myvar

вы можете развернуть его через:

 mp3info $(eval echo $myvar) 
  • Ввод текста из сценария оболочки
  • cvs auto setenv и логин без повторного ввода пароля
  • Переименование файлов рекурсивно в sh
  • Извлечение запросов из файла журнала, которые не включают запрещенные строки
  • Как избежать <или> в параметре в оболочке?
  • Где найти ссылку на форматирование printf?
  • Скрипт инициализации запускается дважды в SSH
  • Сценарий Bash для подключения к интернету Teletalk
  • Почему scp говорит «Нет такого файла»?
  • Использование getline с NR в awk
  • Как навалом сжимать разные подпапки?
  • Interesting Posts

    .Xresources именование имен и подстановочные знаки

    Когда ни один сервер dhcp не отвечает, как заставить dhclient использовать статический лизинг из dhclient.conf вместо предыдущего аренды dhcp?

    Как мне заполнить мою новую программу в репозиторий Debian?

    Измените пароль в файловой системе LUKS, не зная пароля

    mount.cifs vs NFSv3 для данных, разделяемых между двумя веб-серверами

    Cron Bash Script – эхо на текущий терминал вместо / var / spool / mail / root

    Команда для отображения использования памяти, использования диска и загрузки процессора

    Как определить, что команда выполняется, а затем выполнить дополнительную команду после текущей команды

    Удалить последние n символов из -print0?

    Linux Source Routing, Сильная модель конечной системы / Сильная модель хоста?

    Поиск того, какой конкретный процесс Python был убит убийцей Linux OOM

    Cinnamon 2.0.14, когда второй драйвер включен с драйверами NVIDIA (Mint 16)

    Неверная корневая оболочка в файле / etc / passwd

    Сменная строка, содержащая шаблон со следующей строкой

    не может фильтровать сообщения printk

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