Простой ответ: не запускайте эти команды внутри `` или [ ]
.
Здесь нет необходимости ни для одной из этих конструкций.
Очевидно, я не могу быть уверен, что вы ожидаете, что
[ `echo \$- | grep -qs i` ]
будет тестировать, но я не думаю, что он тестирует то, что вы думаете, тестирует.
Этот код сделаетследующее:
- Выполнить
echo \$- | grep -qs i
внутри подоболочки (из-за ``). - Захватить стандартный вывод подоболочки.
- Заменить оригинальное выражение ``со строкой, содержащей этот вывод.
- Передайте эту строку в качестве аргумента в команду
[
или встроенную (в зависимости от вашей оболочки). - Создайте успешный код возврата из
[
только если эта строка была непустой (при условии, что строка не выглядела как опция [
).
Некоторые возможные проблемы:
-
-qs
опции grep
должны привести к тому, что он не будет выводить, поэтому я ожидаю, что [
будет тестировать пустую строку независимо от того,как выглядит $-
. - Также возможно, что обратный слеш экранирует знак доллара и приводит к тому, что буквенный «доллар минус» (а не содержимое переменной) отправляется на
grep
.
С другой стороны, если вы убрали [
и галочки и вместо этого сказали
if echo "$-" | grep -qs i ; then
, тогда:
- ваш текущийshell расширит
"$-"
значением, которое вы хотите проверить, echo ... |
отправит его на grep
на своем стандартном входе, grep
вернет успешный код возвратаесли этот ввод содержал букву i
, grep
не выводил бы выходные данные из-за флагов -qs
, а - оператор
if
использовал бы grep
's код возврата, чтобы решить, какую ветвь взять.
Также:
- никакие обратные помехи не заменят любые команды с выводом, полученным при их запуске, и
Подробнее о том, как использовать команду if
, см. этот раздел отличный БашГид.