Как подавить символ одинарной кавычки в команде echo? - PullRequest
1 голос
/ 25 января 2020

Если я выполняю эту команду непосредственно из CLI, у меня не возникает никаких проблем:

~ # apt autoremove 1>$- 2>$-
~ # 

Но если я вызываю ее из скрипта, у меня возникают ошибки: Вот скрипт:

#!/bin/bash -x
NOVERBOSE='1>$- 2>$-'
apt autoremove $(echo ${NOVERBOSE})

А вот вывод:

~ # /bin/bash -x test2.sh
+ NOVERBOSE='1>$- 2>$-'
++ echo '1>$-' '2>$-'
+ apt autoremove '1>$-' '2>$-'
Reading package lists ... Done
Building the dependency tree
Reading status information ... Done
E: Unable to find package 1> $
E: Unable to find a package matching the regular expression "1> $"
E: Unable to find package 2> $
E: Unable to find a package matching the regular expression "2> $"

Я не понимаю, почему echo добавляет несколько одиночных кавычек вокруг каждой части переменной.

Ответы [ 2 ]

4 голосов
/ 25 января 2020

NOVERBOSE должен быть флагом, который указывает желание подавлять вывод, а не синтаксис для этого. Затем вы проверяете значение и перенаправляете вывод (или нет) соответствующим образом.

if [[ $NOVERBOSE = [Yy]* ]]; then  # e.g., y, Y, yes, Yes, etc
    apt autoremove > /dev/null 2> /dev/null
else
    apt autoremove
fi

Если вам не нравится запускать apt «дважды», как это, вы можете перенаправить на /dev/stdout и /dev/stderr явно как перенаправление без операции.

if [[ $NOVERBOSE = [Yy]* ]]; then
  out=/dev/null
  err=/dev/null
else
  out=/dev/stdout
  err=/dev/stderr
fi

apt autoremove > "$out" 2> "$err"
2 голосов
/ 25 января 2020

echo не добавляет кавычки, просто опция -x показывает, где начинается и заканчивается каждый аргумент.

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

eval "apt autoremove $NOVERBOSE"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...