Развернуть переменную среды из 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) 
  • Xargs и rm с a *
  • Возврат только части строки после соответствующего шаблона
  • Ключ удаления не работает должным образом в интерактивной оболочке PHP
  • Расширенное использование / команда оболочки
  • Как я могу сказать dict для вывода из подмножества словарей?
  • Перенаправление вывода в зависимости от регулярного выражения grep
  • Написание сценария установки для CentOS
  • Замена шаблонов
  • Что-то запутанное в отношении «su -» и «su»
  • Как назначить переменную из другой переменной в отдельном файле
  • Есть ли способ переключиться на «su -» после переключения пользователей через «su»?
  • Linux и Unix - лучшая ОС в мире.