grep имеет разные результаты в командной строке терминала и скрипте bash

У меня была такая же проблема в OpenSUSE 42.3 с приложениями GTK 2.0. При поиске решения я часто натыкался на unity, а на форумах Ubuntu есть сообщение , в котором говорится, что это ошибка Unity .

Поскольку я не использую Unity, я попытался удалить связанные пакеты. Для меня пакеты для удаления были unity-gtk2-module, unity-gtk3-moduleи unity-gtk-module-common. Удаление этих пакетов решило мою проблему. Все строки меню вернулись после следующего входа в систему.

0
22.12.2020, 04:58
3 ответа

Мне удалось воспроизвести проблему. Это проблема экранирования bash в двух функциях. Попробуйте это:

generate_exclude_extensions() {
  echo '(cpp$'
}

generate_exclude_dirs() {
  echo '|^test)'
}

command=$(generate_exclude_extensions)$(generate_exclude_dirs)
echo "$command"
git ls-files | grep -vEe "$command"

мой код для воспроизведения

generate_exclude_extensions() {
  echo '(cpp$'
}

generate_exclude_dirs() {
  echo '|^test)'
}

command=$(generate_exclude_extensions)$(generate_exclude_dirs)
echo "$command"
echo -e 'cpp\n
test\n
test456\n
display?5\n' | grep -vEe "$command"

В вашем сценарии также есть две опечатки

generate_exclude_dir -> generate_exclude_dirs
generate_exclud_extensions -> generate_exclude_extensions

:)весело провести время

1
18.03.2021, 22:41

Другим подходом может быть:

generate_exclude_extensions() {
  echo 'cpp$'
}

generate_exclude_dirs() {
  echo '^test'
}

exclusions=$(
  generate_exclude_extensions
  generate_exclude_dir
)

printf '%s\n' "$exclusions"

git ls-files | grep -ve "$exclusions"

То есть одно исключение на строку, и тогда вам даже не нужно -E.

1
18.03.2021, 22:41

Вы можете использовать Gitexcludepathspecs для фильтрации вывода:

exclude_extensions=( '*cpp' '*.txt' ) # added `*.txt` as sample file extension
exclude_dirs=( 'test/*' )             # exclude files in relative directory `test`

git ls-files "${exclude_extensions[@]/#/:(exclude)}" "${exclude_dirs[@]/#/:(exclude)}"

Расширение параметра "${exclude_...[@]/#/:(exclude)}"расширяется до элементов массива, разделенных пробелами, с префиксом :(, спецификацией пути "волшебное слово" exclude, за которой следует ).

Результирующая команда эквивалентна

git ls-files ':(exclude)*cpp' ':(exclude)*.txt' ':(exclude)test/*'
0
18.03.2021, 22:41

Теги

Похожие вопросы