В списке статических архивных файлов в Ubuntu мне нужно получить конкретный архив, определяющий функцию. Вот сценарий, который я собрал:

for line in `find . -iname '*\.a'`; do
 nm $line 2>/dev/null | grep -H "T $1"
done

Проблема в том, что на grep подается стандартный ввод. Мне интересно, есть ли способ проверить, удалось ли grep, и, если да, отобразить имя файла. Или, может быть, есть лучший способ добиться того, чего я хочу. С Уважением.

0
Peter 5 Мар 2015 в 22:39

2 ответа

Лучший ответ
#!/bin/bash
# Use recursive globs to find files. This avoids problems with special chars.
shopt -s globstar nullglob
for file in ./**/*.[aA]
do
  # Ignore grep output and instead check its return code
  if nm "$file" 2> /dev/null | grep -q "T $1"
  then
    echo "$file matches"
  fi
done

Вот пример запуска:

/home/me $ cd /usr/lib
/usr/lib $ myscript __sha512_init_ctx
./x86_64-linux-gnu/libcrypt.a matches
/usr/lib $
2
that other guy 5 Мар 2015 в 19:47
for line in `find . -iname '*\.a'`; do
  nm $line 2>/dev/null | grep -H "T $1"
  [[ $PIPESTATUS[1] -eq 0 ]] && echo $line
done

Из man-страницы bash:

PIPESTATUS
       An array variable (see Arrays below) containing a list
       of exit status values from the processes in the
       most-recently-executed foreground pipeline (which may
       contain only a single command).
1
Cyrus 5 Мар 2015 в 19:46