Команда Bash не работает с bash -c, но работает в интерактивной оболочке - PullRequest
0 голосов
/ 14 октября 2018

У меня есть довольно простая команда, которая при запуске внутри bash выводит оставшееся дисковое пространство в stdout:

echo -n "External1TB: $(grep -Poi '(\/mnt\/External1TB\s+)\K(.*)' <(df -H --output=target,avail))B"

Я использую перенаправление процесса <()передать поток от df до grep, который затем обрабатывает выходные данные и отфильтровывает только оставшееся пространство.Все это упаковано в подоболочку $() и передано в echo, поэтому я могу добавить к выводу имя диска.

Пример вывода: External1TB: 882GB

Работает довольно хорошокогда он запускается внутри интерактивной оболочки bash, однако, если я пытаюсь запустить его, используя bash -c, например:

bash -c "echo -n "External1TB: $(grep -Poi '(\/mnt\/External1TB\s+)\K(.*)' <(df -H --output=target,avail))B"",

, то всегда выводится: External1TB:.Похоже, что либо grep, либо df по какой-то причине терпят неудачу.

Что я делаю не так?

1 Ответ

0 голосов
/ 14 октября 2018

Ваша кавычка для внутренней части должна быть экранирована:

bash -c "echo -n \"External1TB: $(grep -Poi '(\/mnt\/External1TB\s+)\K(.*)' <(df -H --output=target,avail))B\"",

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

...