Вопрос или проблема
Я хочу использовать команду watch
, чтобы непрерывно отслеживать следующую piped-команду, но watch
всегда не срабатывает, независимо от того, как я ее оформляю:
dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:org.mpris.MediaPlayer2.Player string:Metadata | sed -n '/title/{n;p}' | cut -d '"' -f 2
Перейдите на двойные кавычки в вашей команде, чтобы упростить себе жизнь:
watch 'dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:org.mpris.MediaPlayer2.Player string:Metadata | sed -n "/title/{n;p}" | cut -d \" -f 2'
.
Ответ или решение
Для того чтобы корректно использовать команду watch
для непрерывного мониторинга сложной команды, которая включает в себя конвейер (pipe), требуется правильное экранирование и использование кавычек. Давайте разберем вашу команду по частям и предложим эффективное решение.
Описание проблемы
Вы хотите использовать команду watch
для непрерывного выполнения следующего конвейера:
dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:org.mpris.MediaPlayer2.Player string:Metadata | sed -n '/title/{n;p}' | cut -d '"' -f 2
Тем не менее, при попытке использования watch
ваша команда не срабатывает должным образом. Это происходит из-за некорректного экранирования кавычек.
Решение
Во-первых, важно понимать, как кавычки обрабатываются в командной оболочке. Когда вы используете одинарные кавычки ('
), все внутри них интерпретируется буквально. Поэтому если ваша команда содержит двойные кавычки ("
), они будут трактоваться как часть строки, а не как ограничители. В отличие от этого, использование двойных кавычек позволяет интерпретировать переменные и некоторые специальные символы.
Рекомендуется использовать двойные кавычки для большей гибкости. Вот как вы можете правильно оформить вашу команду:
watch "dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:org.mpris.MediaPlayer2.Player string:Metadata | sed -n '/title/{n;p}' | cut -d '\"' -f 2"
Разбор команды
-
Команда
watch
: Она используется для выполнения заданной команды с определенным интервалом времени, чтобы вы могли отслеживать изменения вывода. -
Команда
dbus-send
: Эта команда отправляет сообщения через D-Bus и используется для взаимодействия с сервисами в Linux (в данном случае, с медиаплеером Spotify). -
Пайп (|): Он соединяет выход одной команды со входом другой. Это позволяет последовательно обрабатывать данные.
-
sed
иcut
: Эти утилиты обрабатывают текст. Ваша командаsed
находит строку с заголовком, аcut
разделяет строку и извлекает нужное значение из кавычек.
Итог
Теперь, используя команду с правильно оформленными кавычками, вы сможете беспрепятственно запустить watch
и отслеживать изменения:
watch "dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:org.mpris.MediaPlayer2.Player string:Metadata | sed -n '/title/{n;p}' | cut -d '\"' -f 2"
Таким образом, вы сможете эффективно использовать watch
для мониторинга метаданных вашего медиаплеера без проблем с экранированием.