
У меня странное поведение терминала.
Следующая команда ничего не выводит на мой терминал:
comment=$(
cat /usr/share/applications/brasero.desktop |
grep '^Comment=' |
grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
)
echo $comment
Точно такая же команда, такой же синтаксис прекрасно работает внутри bash-скрипта.
Обычно я вижу, как люди жалуются на противоположное поведение.
Я знаю, что вышеуказанную операцию можно выполнить сотнями способов, но я не могу понять, почему вышеуказанная команда не работает в моем терминале.
С другой стороны, эти команды работают нормально как в терминале, так и в скрипте:
comment=$(
cat /usr/share/applications/brasero.desktop |
grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
)
echo $comment
grep -Po '(?<=Exec=)[ --0-9A-Za-z/:space:]*' > /usr/share/applications/brasero.desktop
Я использую GNU bash, версии 4.4.0(1)-release (x86_64-pc-linux-gnu), под Debian 8 Sid, с grep (GNU grep) 2.26. Я пробовал и в xfce, и в терминале mate, но поведение одинаковое.
Спасибо
решение1
Если у вас возникли подобные проблемы, вам следует начать исключать некоторые элементы из теста, пока не получится что-то работающее.
Например, если вашей отправной точкой является:
comment=$(cat /usr/share/applications/brasero.desktop |grep '^Comment=' |grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*');echo $comment
Сначала удалим все переменные:
cat /usr/share/applications/brasero.desktop |grep '^Comment=' |grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
Затем снимите вторую grep
:
cat /usr/share/applications/brasero.desktop |grep '^Comment='
Затем другой grep:
cat /usr/share/applications/brasero.desktop
В конце концов вы найдете точку, где это начнет работать. В вашем конкретном случае это начнет работать с этим:
cat /usr/share/applications/brasero.desktop |grep '^Comment='
Так что grep
проблема именно в этом втором. Добавьте все остальное и посмотрите, работает ли оно по-прежнему:
comment=$(cat /usr/share/applications/brasero.desktop |grep '^Comment=');echo $comment
Действительно, так и есть. Так в чем проблема? Ну, обратите внимание, что в последнем случае вывод был цветным? В выводе есть коды цветового перехода ANSI. Это мешает второму grep
сопоставить.
Исправление — либо изменить grep
псевдоним на --color=auto
, или сделать unalias grep
, либо вручную добавить --color=never
команды.
Есть также другой подход, который можно применить к этому. Поскольку вы знаете, что это работает изнутри сценария, единственным объяснением является то, что это связано с окружающей средой.
Поэтому вы можете начать с чистой среды bash --noprofile --norc
и постепенно вносить свой профиль, пока он не сломается.
Однако в этой технике есть подвох. Даже с --noprofile --norc
, есть несколько различий между CLI и скриптом, например, расширение истории и управление заданиями. Вы также можете отключить их: set +H
и set -m
.