grep работает в скрипте bash, но не в терминале

grep работает в скрипте bash, но не в терминале

У меня странное поведение терминала.

Следующая команда ничего не выводит на мой терминал:

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.

Связанный контент