Возможно, вы ищете флаг setuid/setgid. При установке этого флага на исполняемом файле исполняемый файл запускается с разрешения владельца исполняемого файла, а не пользователя, выполняющего вызов.
Вот статья в Википедии об этом
БУДЕТ КАЧЕСТВЕННОСТЬ С ЭТОЙ. Если вы устанавливаете это в сценарии bash и разрешаете запись в сценарий, вы, по сути, разрешаете любому, у кого есть разрешение на запись, выполнять любую команду в системе в качестве setuid/setgid. вам, вероятно, лучше использовать sudo.
Вы можете сначала присвоить результат grep
переменной. Затем вы можете проверить код выхода, предложенный @Mark в комментариях, или проверить, является ли результат пустой строкой, как это:
foo=$(grep $PATTERN $sourcefile)
if [ ! -z "$foo" ]
then
echo "$foo" | gzip > compressedfile.gz
fi
или в виде одного -вкладыша:
foo=$(grep $PATTERN $sourcefile); [ -z "$foo" ] || echo "$foo" | gzip > compressedfile.gz
grep 'PATTERN' "$sourcefile" >compressedfile
if [ -s compressedfile ]; then
gzip -f compressedfile
else
rm -f compressedfile
fi
Тест -s
будет верным, если данное имя файла существует и если оно ссылается на файл, размер которого больше нуля. Файл будет существовать (перенаправление всегда создает файл, если он еще не существует )и размер будет больше нуля, если был какой-либо результат от grep
.
Флаг -f
для gzip
принудительно сжимает, даже если файл будет увеличиваться (, что будет происходить, если он мал для начала ).
То же самое, почти (, так как он не сжимает вывод grep
, если дляgrep
)возникает какая-то ошибка чтения/записи, но использует статус выходаgrep
:
if grep 'PATTERN' "$sourcefile" >compressedfile; then
gzip -f compressedfile
else
rm -f compressedfile
fi
или просто
grep 'PATTERN' "$sourcefile" >compressedfile && gzip -f compressedfile
rm -f compressedfile
Здесь rm
попытается удалить несжатый файл в любом случае, но поскольку мы используем rm -f
, об ошибке не будет сообщено, если файл не существует (его не будет, если gzip
сжал его ).
В самом общем случае я бы не советовал сохранять результат grep
в переменной, так как это может вернуть гигабайты данных (мы этого не знаем ).