Команда Bash не работает с bash -c, но работает в интерактивной оболочке

У меня есть эта достаточно простая команда, которая при запуске внутри 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 по какой-то причине не работают.

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


person bool3max    schedule 14.10.2018    source источник


Ответы (1)


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

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

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

person Corion    schedule 14.10.2018