Действие команд в bash_profile и терминале отличается

Я бы использовал find :

mygrep() (
  pattern=$1; shift
  find "$@" -type d -path '*/app/lib/bower' -exec sh -c '
    printf >&2 "Warning: ignoring \"%s\" directory\n" "$@"
    ' sh {} + -prune -o -type f -exec grep -IHne "$pattern" {} +
)

( -I и -H являются расширениями GNU).

Используйте как:

mygrep pattern dir1 dir2

(убедитесь, что dir1 и dir2 не похожи на предикаты find ).

Удалите -exec sh ... + , если вас не интересуют эти предупреждающие сообщения.

Плохая идея использовать grep в качестве псевдонима, когда вы так резко меняете его поведение.

Если вам нужно передать параметры в grep , вы можете использовать переменную GREP_OPTIONS , например:

GREP_OPTIONS=-i mygrep foo dir

Но обратите внимание, что поддержка этой опции будет удалена в будущих версиях grep , поэтому лучшим вариантом может быть предоставление возможности в mygrep передавать параметры в grep , как с выделенным массивом, если ваша оболочка их поддерживает:

mygrep() (
  pattern=$1; shift
  find "$@" -type d -path '*/app/lib/bower' -exec sh -c '
    printf >&2 "Warning: ignoring \"%s\" directory\n" "$@"
    ' sh {} + -prune -o -type f -exec \
    grep -IHne "${g[@]}" "$pattern" {} +
)

g=(-i --exclude-dir=.git); mygrep foo dir1 dir2

Или используйте - , чтобы указать mygrep , где останавливаются параметры:

mygrep() (
  grep_options=()
  for i do
    grep_options+=("$i")
    shift
    [ "$i" != "--" ] || break
  done
  pattern=${1?need a pattern}; shift
  find "$@" -type d -path '*/app/lib/bower' -exec sh -c '
    printf >&2 "Warning: ignoring \"%s\" directory\n" "$@"
    ' sh {} + -prune -o -type f -exec \
    grep -H "${grep_options[@]}" "$pattern" {} +
)

mygrep -nI --exclude-dir=.git -- pattern dir1 dir2

(и убедитесь, что вы не передаете - в качестве аргументов параметров, поскольку in, если вы хотите исключить файлы - , используйте - exclude = - , а не - exclude - , например. Это также исключает использование например mygrep -e pattern1 -e pattern2 - dir или mygrep -f patternfile - dir ).

2
13.10.2017, 01:11
0 ответов

Теги

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