Остановить сообщение grep от публикации - PullRequest
0 голосов
/ 20 сентября 2019

Я работаю над сценарием, который принимает 1 строковый аргумент и файл.Я хочу, чтобы, если файл помещен в несуществующий файл, он отобразит сообщение " имя файла не может быть прочитано".

Эта часть работает, но также отображаетсообщение «grep: grep.txt: Нет такого файла или каталога».Можно ли как-нибудь помешать сообщению grep опубликовать и завершить скрипт, если первый оператор if верен?

#! /bin/sh
if [ ! -f "$2" ]
then
    echo "$0" cannot be read 1>&2
fi

if [ $# -eq 2 ]
then
    grep "$1" $2
else
    echo there is more or less than 2 arguments 1>&2
fi

Ответы [ 3 ]

0 голосов
/ 20 сентября 2019

Выйдите из сценария с ненулевым кодом завершения, чтобы указать сбой, и прекратите его продолжение до grep.

if [ ! -f "$2" ]
then
    echo "$0" cannot be read 1>&2
    exit 1
fi
0 голосов
/ 20 сентября 2019

Вы можете перенаправить все ошибки из grep, например:

grep "$1" $2 2>/dev/null

(2> означает стандартную ошибку перенаправления, в отличие от стандартного вывода с > или 1>).

Однако это приводит к состоянию гонки: если файл исчезает во время работы сценария, он может все еще существовать, если вы проверите его, но он исчезнет к моменту запуска grep.

Вы могли бы справиться с этим, проверив состояние выхода ...

grep "$1" $2 2>/dev/null
if [[ $? -gt 1 ]]; then
  echo "grep failed unexpectedly" >&2
fi

ИМХО, в этом примере было бы лучше просто позволить grep напечатать ошибку.

0 голосов
/ 20 сентября 2019

Вы можете добавить / dev / null в команду grep, это подавит часть ошибки.

grep "$1" $2 2>/dev/null

Оператор> обычно перенаправляет вывод в файл, но может быть на устройство.Вы также можете использовать >>, чтобы добавить.

2> file перенаправляет stderr в файл

/ dev / null - это нулевое устройство, которое принимает любой желаемый ввод и выбрасывает его.Может использоваться для подавления любого выхода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...