Что происходит с аргументами, переданными в bash /ash функции?

Вы можете обойтись просто awk:

awk -v ip=127.0.0.1 'substr($0, ip) > 0 {print FILENAME ": " $0} FNR > 500 {nextfile}' *.log

Если IP был найден в текущей строке, мы печатаем его и имя файла. Мы переходим к следующему файлу, если текущий номер строки для текущего файла(FNR)стал > 500.

1
04.05.2020, 20:52
1 ответ

"$@" расширяется до списка строк в кавычках. Если вы передадите два аргумента logreadи -fв свою функцию, то "$@"расширится до двух строк.

Таким образом, выполнение grep -- "$@"расширится до grep -- logread -f, что означает «grep для logreadв файле с именем -f».

Если вы хотите передать отдельные аргументы, а не одну строку, используйте "$*", чтобы преобразовать аргументы в одну строку в кавычках.

grep -e "$*"

расширится до grep -e "logread -f". Позиционные параметры будут разделены первым символом в $IFSпри использовании"$*"(по умолчанию, это пробел ). Также обратите внимание, что использование $*или$@без кавычек не имеет смысла.

Кроме того, я бы предпочел использовать pgrep/ pkillздесь:

if ! pgrep -xf "$*" >/dev/null; then
    printf 'No process matches "%s" exactly\n' "$*"
fi
3
28.04.2021, 23:16

Теги

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