Как я подавляю stderr предупреждающие сообщения от команды в замене команды?

Простое решение состоит в том, чтобы использовать поддержку Bash замены процесса, как это:

myCommand <(grep "xyz" somefile)

Это соединит вывод grep управляйте к дескриптору файла и затем передайте /dev/fd/NNN (где NNN fd число) к Вашей команде как входной файл (например, Ваша команда могла бы на самом деле быть выполнена как myCommand /dev/fd/63). Это решение не создает временный файл.

Можно также создать именованный канал и использование что передать данные вокруг:

$ mkfifo /tmp/myfifo
$ grep "xyz somefile > /tmp/myfifo &
$ myCommand /tmp/myfifo

Но действительно, первое решение просто.

Stephane Chazelas комментирует:

zsh также имеет myCommand = (grep xyz somefile), который использует регулярный временный файл (для случаев, где myCommand не может принять канал).

Это важно, потому что некоторые команды ожидают мочь выполнить произвольный доступ на своем входном файле, который не будет работать с каналом. Используя этот синтаксис Вы извлекаете пользу из временных файлов, не будучи должен волноваться об очистке их сами.

3
05.04.2019, 06:00
3 ответа

Некоторые расширения выполняются до перенаправления, поэтому вы должны поместить его прямо напротив вашей команды tr :

touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\' 2> /dev/null)
3
27.01.2020, 21:10

Сообщение об ошибке означает, что у вас обратная косая черта. В мире *nix специальные символы 'экранируются' путем добавления обратного слеша перед ними. Это означает, что они интерпретируются как простые символы, а не как специальные. Например:

$ printf 'foo\nbar'
foo
bar

\n - это специальный символ, означающий newline. Но если мы избавимся от слэша, то получим:

$ printf 'foo\\nbar'
foo\nbar

Так что от него можно избавиться либо экранированием обратного слеша:

touch ~/deleted/"$(echo "directory_$(readlink -f -- "$1")"|tr '/' '\\')

, либо перенаправлением вывода ошибки tr (а не touch, что вы делали):

touch ~/deleted/"$(echo "directory_$(readlink -f -- "$1")"|tr '/' '\' 2> /dev/null)

Однако, я не могу в достаточной мере подчеркнуть, что это очень плохая идея® для создания имен файлов с обратным слешем. Действительно. В дальнейшем с ними будет чертовски сложно разобраться и разобраться. Почему бы не использовать другой символ?

4
27.01.2020, 21:10

Используйте одинарные кавычки с двойной обратной косой чертой, и вы не получите никаких ошибок.

touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\\')
2
27.01.2020, 21:10

Теги

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