Я использую cygwin для поиска файла в cygdrive.
Однако мне нужно отключить отклоненные разрешения (в противном случае результаты будут скрыты в сообщениях об ошибках). Следующая команда работает:
find -name 'myfile.*' |& grep -v "Permission denied"
Я не понимаю, почему амперсанд должен быть помещен в эту команду, ожидал, что это сработает, но это не так.
find -name 'myfile.*' | grep -v "Permission denied"
Пожалуйста, объясните значение амперсанда.
В Unix-подобных системах есть два выходных пути, которые, если оставить неизмененным, будут отправлять выходные данные на ваш экран. Стандартная ошибка (или stderr) - это та, которая фиксирует большинство отказов и условий ошибки.
Чтобы передать сообщение об отказе в разрешении в stderr в тот же выходной поток, что и «регулярный вывод», вы должны объединить эти два. В вашем примере, чтобы ваш grep -v правильно работал на нем, вы комбинируете stdout (стандартный вывод) и stderr с тайным синтаксисом, который вы видите.
Из раздела руководства GNU Bash 3.2.2 Трубопроводы:
Если используется «|&», стандартная ошибка command1, в дополнение к ее стандартным выводам, подключается к стандартным входам команды 2 через трубу; это сокращение для 2>&1 |. Это неявное перенаправление стандартной ошибки на стандартный вывод выполняется после любых переназначений, указанных в команде.Кроме того, как указывает Geirha, если вы хотите просто избавиться от вывода stderr, вы хотели бы сделать что-то вроде
find -name 'myfile.*' 2> /dev/null
или, возможно,
find -name 'myfile.*' 2> /tmp/errorlog
И обратите внимание, что если у вас есть команды команд, например find, передающие свой вывод на xargs, вам нужно будет поместить весь конвейер команд в круглые скобки, чтобы захватить вывод из всех компонентов команды. Например,
(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 ) 2> /dev/null
Если вы оставили круглые скобки и сделали это вместо этого -
find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null
, вы все равно увидели бы, что разрешения отклонили ошибки из find или egrep, но stderr было бы перенаправлено на xargs.
Как вы видели, вы, вероятно, выбросите stderr только после просмотра его содержимого во время тестового прогона.
Обратите внимание, что с GNU find и, насколько я могу судить, любой POSIX-совместимый find, -print вариант неявный. Вы по-прежнему можете указать его, если хотите.
В Unix-подобных системах есть два выходных пути, которые, если оставить неизмененным, будут отправлять выходные данные на ваш экран. Стандартная ошибка (или stderr) - это та, которая фиксирует большинство отказов и условий ошибки.
Чтобы передать сообщение об отказе в разрешении в stderr в тот же выходной поток, что и «регулярный вывод», вы должны объединить эти два. В вашем примере, чтобы ваш grep -v правильно работал на нем, вы комбинируете stdout (стандартный вывод) и stderr с тайным синтаксисом, который вы видите.
Из раздела руководства GNU Bash 3.2.2 Трубопроводы:
Если используется «|&», стандартная ошибка command1, в дополнение к ее стандартным выводам, подключается к стандартным входам команды 2 через трубу; это сокращение для 2>&1 |. Это неявное перенаправление стандартной ошибки на стандартный вывод выполняется после любых переназначений, указанных в команде.Кроме того, как указывает Geirha, если вы хотите просто избавиться от вывода stderr, вы хотели бы сделать что-то вроде
find -name 'myfile.*' 2> /dev/null
или, возможно,
find -name 'myfile.*' 2> /tmp/errorlog
И обратите внимание, что если у вас есть команды команд, например find, передающие свой вывод на xargs, вам нужно будет поместить весь конвейер команд в круглые скобки, чтобы захватить вывод из всех компонентов команды. Например,
(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 ) 2> /dev/null
Если вы оставили круглые скобки и сделали это вместо этого -
find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null
, вы все равно увидели бы, что разрешения отклонили ошибки из find или egrep, но stderr было бы перенаправлено на xargs.
Как вы видели, вы, вероятно, выбросите stderr только после просмотра его содержимого во время тестового прогона.
Обратите внимание, что с GNU find и, насколько я могу судить, любой POSIX-совместимый find, -print вариант неявный. Вы по-прежнему можете указать его, если хотите.
В Unix-подобных системах есть два выходных пути, которые, если оставить неизмененным, будут отправлять выходные данные на ваш экран. Стандартная ошибка (или stderr) - это та, которая фиксирует большинство отказов и условий ошибки.
Чтобы передать сообщение об отказе в разрешении в stderr в тот же выходной поток, что и «регулярный вывод», вы должны объединить эти два. В вашем примере, чтобы ваш grep -v правильно работал на нем, вы комбинируете stdout (стандартный вывод) и stderr с тайным синтаксисом, который вы видите.
Из раздела руководства GNU Bash 3.2.2 Трубопроводы:
Если используется «|&», стандартная ошибка command1, в дополнение к ее стандартным выводам, подключается к стандартным входам команды 2 через трубу; это сокращение для 2>&1 |. Это неявное перенаправление стандартной ошибки на стандартный вывод выполняется после любых переназначений, указанных в команде.Кроме того, как указывает Geirha, если вы хотите просто избавиться от вывода stderr, вы хотели бы сделать что-то вроде
find -name 'myfile.*' 2> /dev/null
или, возможно,
find -name 'myfile.*' 2> /tmp/errorlog
И обратите внимание, что если у вас есть команды команд, например find, передающие свой вывод на xargs, вам нужно будет поместить весь конвейер команд в круглые скобки, чтобы захватить вывод из всех компонентов команды. Например,
(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 ) 2> /dev/null
Если вы оставили круглые скобки и сделали это вместо этого -
find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null
, вы все равно увидели бы, что разрешения отклонили ошибки из find или egrep, но stderr было бы перенаправлено на xargs.
Как вы видели, вы, вероятно, выбросите stderr только после просмотра его содержимого во время тестового прогона.
Обратите внимание, что с GNU find и, насколько я могу судить, любой POSIX-совместимый find, -print вариант неявный. Вы по-прежнему можете указать его, если хотите.
В Unix-подобных системах есть два выходных пути, которые, если оставить неизмененным, будут отправлять выходные данные на ваш экран. Стандартная ошибка (или stderr) - это та, которая фиксирует большинство отказов и условий ошибки.
Чтобы передать сообщение об отказе в разрешении в stderr в тот же выходной поток, что и «регулярный вывод», вы должны объединить эти два. В вашем примере, чтобы ваш grep -v правильно работал на нем, вы комбинируете stdout (стандартный вывод) и stderr с тайным синтаксисом, который вы видите.
Из раздела руководства GNU Bash 3.2.2 Трубопроводы:
Если используется «|&», стандартная ошибка command1, в дополнение к ее стандартным выводам, подключается к стандартным входам команды 2 через трубу; это сокращение для 2>&1 |. Это неявное перенаправление стандартной ошибки на стандартный вывод выполняется после любых переназначений, указанных в команде.Кроме того, как указывает Geirha, если вы хотите просто избавиться от вывода stderr, вы хотели бы сделать что-то вроде
find -name 'myfile.*' 2> /dev/null
или, возможно,
find -name 'myfile.*' 2> /tmp/errorlog
И обратите внимание, что если у вас есть команды команд, например find, передающие свой вывод на xargs, вам нужно будет поместить весь конвейер команд в круглые скобки, чтобы захватить вывод из всех компонентов команды. Например,
(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 ) 2> /dev/null
Если вы оставили круглые скобки и сделали это вместо этого -
find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null
, вы все равно увидели бы, что разрешения отклонили ошибки из find или egrep, но stderr было бы перенаправлено на xargs.
Как вы видели, вы, вероятно, выбросите stderr только после просмотра его содержимого во время тестового прогона.
Обратите внимание, что с GNU find и, насколько я могу судить, любой POSIX-совместимый find, -print вариант неявный. Вы по-прежнему можете указать его, если хотите.
В Unix-подобных системах есть два выходных пути, которые, если оставить неизмененным, будут отправлять выходные данные на ваш экран. Стандартная ошибка (или stderr) - это та, которая фиксирует большинство отказов и условий ошибки.
Чтобы передать сообщение об отказе в разрешении в stderr в тот же выходной поток, что и «регулярный вывод», вы должны объединить эти два. В вашем примере, чтобы ваш grep -v правильно работал на нем, вы комбинируете stdout (стандартный вывод) и stderr с тайным синтаксисом, который вы видите.
Из раздела руководства GNU Bash 3.2.2 Трубопроводы:
Если используется «|&», стандартная ошибка command1, в дополнение к ее стандартным выводам, подключается к стандартным входам команды 2 через трубу; это сокращение для 2>&1 |. Это неявное перенаправление стандартной ошибки на стандартный вывод выполняется после любых переназначений, указанных в команде.Кроме того, как указывает Geirha, если вы хотите просто избавиться от вывода stderr, вы хотели бы сделать что-то вроде
find -name 'myfile.*' 2> /dev/null
или, возможно,
find -name 'myfile.*' 2> /tmp/errorlog
И обратите внимание, что если у вас есть команды команд, например find, передающие свой вывод на xargs, вам нужно будет поместить весь конвейер команд в круглые скобки, чтобы захватить вывод из всех компонентов команды. Например,
(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 ) 2> /dev/null
Если вы оставили круглые скобки и сделали это вместо этого -
find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null
, вы все равно увидели бы, что разрешения отклонили ошибки из find или egrep, но stderr было бы перенаправлено на xargs.
Как вы видели, вы, вероятно, выбросите stderr только после просмотра его содержимого во время тестового прогона.
Обратите внимание, что с GNU find и, насколько я могу судить, любой POSIX-совместимый find, -print вариант неявный. Вы по-прежнему можете указать его, если хотите.
В Unix-подобных системах есть два выходных пути, которые, если оставить немодифицированным, отправят вывод на ваш экран. Стандартная ошибка (или stderr) - это та, которая фиксирует большинство сбоев и ошибок.
Чтобы передать сообщение об отказе в разрешении в stderr в тот же выходной поток, что и «регулярный вывод», вы должны объединить эти два. В вашем примере, чтобы ваш grep -v
правильно работал на нем, вы комбинируете stdout (стандартный вывод) и stderr с тайным синтаксисом, который вы видите.
From ] GNU Bash manual section 3.2.2 Трубопроводы :
Если используется '
blockquote>| & amp;
', Стандартная ошибка command1 , в дополнение к ее стандартным выходам, подключена к стандарту ввода [2] через трубу; это сокращение для2 & amp; 1 |
. Это неявное перенаправление стандартной ошибки на стандартный вывод выполняется после любых переназначений, заданных командой.Кроме того, как указывает geirha, если вы хотите просто избавиться от вывода stderr, вы хотели бы сделать что-то вроде
find -name 'myfile. *' 2 & gt; / dev / null
или, возможно,
find -name 'myfile. *' 2 & gt; / tmp / errorlog
И обратите внимание, что если у вас есть команды команд, такие как
find
, передающие свой вывод наxargs
, вы бы необходимо поместить весь конвейер команд в круглые скобки, чтобы захватить вывод из всех компонентов команды. Например,(find | egrep ^ [RS]. [0-9] + /. Svg] | xargs head -1) 2 & gt; / dev / null
Если вы оставили круглые скобки и сделали это вместо этого -
find | egrep ^ [RS]. [0-9] + /. svg] | xargs head -1 2 & gt; / dev / null
вы все равно увидите, что разрешения отклонили ошибки из find или egrep, но stderr будет перенаправлен на xargs.
Как вы видели, вы вероятно, выкинет stderr только после просмотра его содержимого во время тестового прогона.
Обратите внимание, что с GNU
найдите
, и, насколько я могу судить, любой POSIX-совместимыйfind
, параметр
В Unix-подобных системах есть два выходных пути, которые, если оставить неизмененным, будут отправлять выходные данные на ваш экран. Стандартная ошибка (или stderr) - это та, которая фиксирует большинство отказов и условий ошибки.
Чтобы передать сообщение об отказе в разрешении в stderr в тот же выходной поток, что и «регулярный вывод», вы должны объединить эти два. В вашем примере, чтобы ваш grep -v правильно работал на нем, вы комбинируете stdout (стандартный вывод) и stderr с тайным синтаксисом, который вы видите.
Из раздела руководства GNU Bash 3.2.2 Трубопроводы:
Если используется «|&», стандартная ошибка command1, в дополнение к ее стандартным выводам, подключается к стандартным входам команды 2 через трубу; это сокращение для 2>&1 |. Это неявное перенаправление стандартной ошибки на стандартный вывод выполняется после любых переназначений, указанных в команде.Кроме того, как указывает Geirha, если вы хотите просто избавиться от вывода stderr, вы хотели бы сделать что-то вроде
find -name 'myfile.*' 2> /dev/null
или, возможно,
find -name 'myfile.*' 2> /tmp/errorlog
И обратите внимание, что если у вас есть команды команд, например find, передающие свой вывод на xargs, вам нужно будет поместить весь конвейер команд в круглые скобки, чтобы захватить вывод из всех компонентов команды. Например,
(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 ) 2> /dev/null
Если вы оставили круглые скобки и сделали это вместо этого -
find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null
, вы все равно увидели бы, что разрешения отклонили ошибки из find или egrep, но stderr было бы перенаправлено на xargs.
Как вы видели, вы, вероятно, выбросите stderr только после просмотра его содержимого во время тестового прогона.
Обратите внимание, что с GNU find и, насколько я могу судить, любой POSIX-совместимый find, -print вариант неявный. Вы по-прежнему можете указать его, если хотите.
В Unix-подобных системах есть два выходных пути, которые, если оставить немодифицированным, отправят вывод на ваш экран. Стандартная ошибка (или stderr) - это та, которая фиксирует большинство сбоев и ошибок.
Чтобы передать сообщение об отказе в разрешении в stderr в тот же выходной поток, что и «регулярный вывод», вы должны объединить эти два. В вашем примере, чтобы ваш grep -v
правильно работал на нем, вы комбинируете stdout (стандартный вывод) и stderr с тайным синтаксисом, который вы видите.
From ] GNU Bash manual section 3.2.2 Трубопроводы :
Если используется '
blockquote>| & amp;
', Стандартная ошибка command1 , в дополнение к ее стандартным выходам, подключена к стандарту ввода [2] через трубу; это сокращение для2 & amp; 1 |
. Это неявное перенаправление стандартной ошибки на стандартный вывод выполняется после любых переназначений, заданных командой.Кроме того, как указывает geirha, если вы хотите просто избавиться от вывода stderr, вы хотели бы сделать что-то вроде
find -name 'myfile. *' 2 & gt; / dev / null
или, возможно,
find -name 'myfile. *' 2 & gt; / tmp / errorlog
И обратите внимание, что если у вас есть команды команд, такие как
find
, передающие свой вывод наxargs
, вы бы необходимо поместить весь конвейер команд в круглые скобки, чтобы захватить вывод из всех компонентов команды. Например,(find | egrep ^ [RS]. [0-9] + /. Svg] | xargs head -1) 2 & gt; / dev / null
Если вы оставили круглые скобки и сделали это вместо этого -
find | egrep ^ [RS]. [0-9] + /. svg] | xargs head -1 2 & gt; / dev / null
вы все равно увидите, что разрешения отклонили ошибки из find или egrep, но stderr будет перенаправлен на xargs.
Как вы видели, вы вероятно, выкинет stderr только после просмотра его содержимого во время тестового прогона.
Обратите внимание, что с GNU
найдите
, и насколько я могу судить, любой POSIX-совместимыйfind
, параметр
В Unix-подобных системах есть два выходных пути, которые, если оставить немодифицированным, отправят вывод на ваш экран. Стандартная ошибка (или stderr) - это та, которая фиксирует большинство сбоев и ошибок.
Чтобы передать сообщение об отказе в разрешении в stderr в тот же выходной поток, что и «регулярный вывод», вы должны объединить эти два. В вашем примере, чтобы ваш grep -v
правильно работал на нем, вы комбинируете stdout (стандартный вывод) и stderr с тайным синтаксисом, который вы видите.
From ] GNU Bash manual section 3.2.2 Трубопроводы :
Если используется '
blockquote>| & amp;
', Стандартная ошибка command1 , в дополнение к ее стандартным выходам, подключена к стандарту ввода [2] через трубу; это сокращение для2 & amp; 1 |
. Это неявное перенаправление стандартной ошибки на стандартный вывод выполняется после любых переназначений, заданных командой.Кроме того, как указывает geirha, если вы хотите просто избавиться от вывода stderr, вы хотели бы сделать что-то вроде
find -name 'myfile. *' 2 & gt; / dev / null
или, возможно,
find -name 'myfile. *' 2 & gt; / tmp / errorlog
И обратите внимание, что если у вас есть команды команд, такие как
find
, передающие свой вывод наxargs
, вы бы необходимо поместить весь конвейер команд в круглые скобки, чтобы захватить вывод из всех компонентов команды. Например,(find | egrep ^ [RS]. [0-9] + /. Svg] | xargs head -1) 2 & gt; / dev / null
Если вы оставили круглые скобки и сделали это вместо этого -
find | egrep ^ [RS]. [0-9] + /. svg] | xargs head -1 2 & gt; / dev / null
вы все равно увидите, что разрешения отклонили ошибки из find или egrep, но stderr будет перенаправлен на xargs.
Как вы видели, вы вероятно, выкинет stderr только после просмотра его содержимого во время тестового прогона.
Обратите внимание, что с GNU
найдите
, и насколько я могу судить, любой POSIX-совместимыйfind
, параметр
В Unix-подобных системах есть два выходных пути, которые, если оставить немодифицированным, отправят вывод на ваш экран. Стандартная ошибка (или stderr) - это та, которая фиксирует большинство сбоев и ошибок.
Чтобы передать сообщение об отказе в разрешении в stderr в тот же выходной поток, что и «регулярный вывод», вы должны объединить эти два. В вашем примере, чтобы ваш grep -v
правильно работал на нем, вы комбинируете stdout (стандартный вывод) и stderr с тайным синтаксисом, который вы видите.
From ] GNU Bash manual section 3.2.2 Трубопроводы :
Если используется '
blockquote>| & amp;
', Стандартная ошибка command1 , в дополнение к ее стандартным выходам, подключена к стандарту ввода [2] через трубу; это сокращение для2 & amp; 1 |
. Это неявное перенаправление стандартной ошибки на стандартный вывод выполняется после любых переназначений, заданных командой.Кроме того, как указывает geirha, если вы хотите просто избавиться от вывода stderr, вы хотели бы сделать что-то вроде
find -name 'myfile. *' 2 & gt; / dev / null
или, возможно,
find -name 'myfile. *' 2 & gt; / tmp / errorlog
И обратите внимание, что если у вас есть команды команд, такие как
find
, передающие свой вывод наxargs
, вы бы необходимо поместить весь конвейер команд в круглые скобки, чтобы захватить вывод из всех компонентов команды. Например,(find | egrep ^ [RS]. [0-9] + /. Svg] | xargs head -1) 2 & gt; / dev / null
Если вы оставили круглые скобки и сделали это вместо этого -
find | egrep ^ [RS]. [0-9] + /. svg] | xargs head -1 2 & gt; / dev / null
вы все равно увидите, что разрешения отклонили ошибки из find или egrep, но stderr будет перенаправлен на xargs.
Как вы видели, вы вероятно, выкинет stderr только после просмотра его содержимого во время тестового прогона.
Обратите внимание, что с GNU
найдите
, и насколько я могу судить, любой POSIX-совместимыйfind
, параметр
2 & amp; 1 |
может использоваться вместо | & amp;
(т. Е. Можно явно перенаправить stderr в stdout, а затем передать это на следующую команда в конвейере).
– Eliah Kagan
10 January 2017 в 23:29
Сообщения об ошибках записываются в stderr, а не в stdout, но | выполняет только stdout.
Вероятно, вы хотите |&, stderr .
Если вы хотите игнорировать сообщения об ошибках, просто переадресовывайте stderr в /dev/null.
find . -name 'myfile.*' -print 2>/dev/null
Кроме того, рассмотрите возможность чтения http://mywiki.wooledge.org/UsingFind.[!d1 ]
Сообщения об ошибках записываются в stderr , а не stdout , но |
только для труб stdout .
Вероятно, вы захотите | & amp;
, , который соединяет stderr, а также stdout .
Если вы хотите игнорировать сообщения об ошибках, просто переадресовывайте stderr в /dev/null.
find . -name 'myfile.*' -print 2>/dev/null
Кроме того, рассмотрите возможность чтения http://mywiki.wooledge.org/UsingFind.
Сообщения об ошибках записываются в stderr, а не в stdout, но | выполняет только stdout.
Вероятно, вы хотите |&, stderr .
Если вы хотите игнорировать сообщения об ошибках, просто переадресовывайте stderr в /dev/null.
find . -name 'myfile.*' -print 2>/dev/null
Кроме того, рассмотрите возможность чтения http://mywiki.wooledge.org/UsingFind.
Сообщения об ошибках записываются в stderr, а не в stdout, но | выполняет только stdout.
Вероятно, вы хотите |&, stderr .
Если вы хотите игнорировать сообщения об ошибках, просто переадресовывайте stderr в /dev/null.
find . -name 'myfile.*' -print 2>/dev/null
Кроме того, рассмотрите возможность чтения http://mywiki.wooledge.org/UsingFind.
Сообщения об ошибках записываются в stderr, а не в stdout, но | выполняет только stdout.
Вероятно, вы хотите |&, stderr .
Если вы хотите игнорировать сообщения об ошибках, просто переадресовывайте stderr в /dev/null.
find . -name 'myfile.*' -print 2>/dev/null
Кроме того, рассмотрите возможность чтения http://mywiki.wooledge.org/UsingFind.
Сообщения об ошибках записываются в stderr, а не в stdout, но | выполняет только stdout.
Вероятно, вы хотите |&, stderr .
Если вы хотите игнорировать сообщения об ошибках, просто переадресовывайте stderr в /dev/null.
find . -name 'myfile.*' -print 2>/dev/null
Кроме того, рассмотрите возможность чтения http://mywiki.wooledge.org/UsingFind.
Сообщения об ошибках записываются в stderr , а не stdout , но |
только для труб stdout .
Вероятно, вы захотите | & amp;
, , который соединяет stderr, а также stdout .
Если вы хотите игнорировать сообщения об ошибках, просто переадресовывайте stderr в /dev/null.
find . -name 'myfile.*' -print 2>/dev/null
Кроме того, рассмотрите возможность чтения http://mywiki.wooledge.org/UsingFind.
Если вы хотите игнорировать сообщения об ошибках, просто перенаправьте stderr на /dev/null.
find. -name 'myfile. *' -print 2 & gt; / dev / null
Также рассмотрим чтение http://mywiki.wooledge.org/UsingFind . [ ! d3]
Сообщения об ошибках записываются в stderr , а не stdout , но |
только для труб stdout .
Вероятно, вы захотите | & amp;
, , который соединяет stderr, а также stdout .
Если вы хотите игнорировать сообщения об ошибках, просто перенаправьте stderr на /dev/null.
find. -name 'myfile. *' -print 2 & gt; / dev / null
Также рассмотрим чтение http://mywiki.wooledge.org/UsingFind . [ ! d3]
Сообщения об ошибках записываются в stderr , а не stdout , но |
только для труб stdout .
Вероятно, вы захотите | & amp;
, , который соединяет stderr, а также stdout .
Если вы хотите игнорировать сообщения об ошибках, просто перенаправьте stderr на /dev/null.
find. -name 'myfile. *' -print 2 & gt; / dev / null
Также рассмотрим чтение http://mywiki.wooledge.org/UsingFind . [ ! d3]
Сообщения об ошибках записываются в stderr , а не stdout , но |
только для труб stdout .
Вероятно, вы захотите | & amp;
, , который соединяет stderr, а также stdout .