В списке статических архивных файлов в Ubuntu мне нужно получить конкретный архив, определяющий функцию. Вот сценарий, который я собрал:
for line in `find . -iname '*\.a'`; do
nm $line 2>/dev/null | grep -H "T $1"
done
Проблема в том, что на grep
подается стандартный ввод. Мне интересно, есть ли способ проверить, удалось ли grep
, и, если да, отобразить имя файла. Или, может быть, есть лучший способ добиться того, чего я хочу. С Уважением.
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 $
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).
Похожие вопросы
Новые вопросы
bash
Этот тег предназначен для вопросов о сценариях, написанных для командной оболочки Bash. Сценарии оболочки с синтаксисом или другими ошибками, пожалуйста, проверьте их на https://shellcheck.net, прежде чем публиковать здесь. Вопросы об интерактивном использовании Bash, скорее всего, будут актуальны на Unix & Linux Stack Exchange или Super User, чем на Stack Overflow.