Как подавить ошибки перенаправления файлов?

Извините, что пишу много лет спустя...

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

А может, проблема в этом :Попробуйте поместить color_bad = "#FF0000"внутрь battery 0 {...}. Если бы у меня был цвет _плохой только внутри general {...}не работал... если я хорошо помню.

3
20.02.2020, 22:58
5 ответов

Вы могли бы использовать находку с котом.

find. -name file.txt -exec cat {} \;

Если будет возвращено содержимое файла, а если не найдено, просто вернется к подсказке. Либо бегите оттуда, где вы ищете, либо измените файл. на путь типа /tmp или что-то вроде

find /tmp/ -name file.txt -exec cat {} \;
1
28.04.2021, 23:23

Ваш первый пример будет делать то, что вы хотите.

Ваш второй пример не принесет ничего полезного, потому что у вас нет команды. Если вы пытаетесь представить перенаправление stdin в такой команде, как cat <file, чтобы ошибка, возникающая, когда fileне существует, была скрыта, у вас есть несколько вариантов; вот три

[ -f file ] && cat <file           # subject to race condition

( exec 2>/dev/null; cat <file )    # subshell discards all error output

( cat <file ) 2>/dev/null          # subshell discards all error output

Если вы используете bash, вы можете заменить (... )на {...; }и [... ]на [[... ]].

2
28.04.2021, 23:23

How can I print the file contents if the file is found, but hide errors if it is not?

Сначала проверьте, существует ли файл?

if [ -f "$file" ]; then
    cat "$file"     # or whatever it is you're running
fi

или если он читаем

if [ -r "$file" ]; then...

Оба из них страдают от TOCTTOU (времени -из -проверки времени -из -использования )уязвимости , поскольку файл может быть удален или его разрешения изменились сразу после теста, до запуска cat. Это, вероятно, все равно даст вам ошибку. Точно так же какой-то странный файл устройства или что-то подобное может казаться читаемым, но все равно выдавать ошибку при чтении.


Если у вас запущен конвейер, вы можете поместить туда catдля чтения файла. Таким образом, проблема времени не существовала бы :

.
cat "$file" 2>/dev/null | whatever...

Я знаю, что вы не просили об этом, но catздесь не бесполезно. Он используется для отделения ошибок чтения $fileот любых других ошибок, которые может произвести правая -сторона конвейера.

1
28.04.2021, 23:23

Просто измените порядок и выполните перенаправление stderr на /dev/nullFIRST:

%% <file.txt 2>/dev/null
bash: file.txt: No such file or directory
%% 2>/dev/null <file.txt
%%

Имейте в виду, что перенаправления всегда выполняются слева направо; идея состоит в том, чтобы stderr уже был перенаправлен, когда выполняется ошибочное перенаправление.


Однако, насколько мне известно, только zshпозволяет использовать только <fileкак эквивалентcat file(или more fileс учетом его опций NULLCMDи READNULLCMD).

Хотя bash и некоторые другие оболочки обманчиво поддерживают $(<file)как особую форму подстановки команд, они поддерживают только эту форму, не более того:

bash% echo text > file
bash% <file
bash% echo $(<file)
text
bash% echo $(<file;<file)

bash%

В зш:

zsh$ <file
text
zsh$ <file >out
zsh$ <out
text
zsh$ echo $(<file;<file)
text text
3
28.04.2021, 23:23

Попробуйте это,

find. -maxdepth 1 -name file.txt -type f -readable -exec cat {} \;
  • -maxdepth 1проверить только в текущем каталоге
  • -nameОснова имени файла соответствует шаблону.
  • -type -fтип файла как обычный файл
  • -readableСоответствует файлам, которые доступны для чтения
  • exec catвыполните команду cat, которая удовлетворяет указанным выше условиям.

Так мы не получим ошибку об отсутствии файла и нечитаемости.

ПРИМЕЧАНИЕ. :Все файлы доступны для чтения пользователю root.

0
28.04.2021, 23:23

Теги

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