В моей командной строке OSX find направляет ошибки в STDOUT . Я нахожу это очень неудобным, и меня также раздражает добавление 2>/dev/null в конец команды каждый раз. Это поднимает несколько вопросов:

  • Является ли это общесистемной настройкой (например, делать ли ошибки непосредственно в STDOUT в OSX, но в /dev/null в Linux) или это нужно find?
  • Есть ли способ заставить find принять это поведение по умолчанию (без создания псевдонима)?
  • Если да, понадобится ли вторая команда для восстановления исходного поведения?
  • Если нет, есть ли ярлык короче 2>/dev/null (например, unzip -qq вместо unzip >/dev/null)?
  • Как бы вы сделали это изменение на Linux box?

1 ответ1

1

Хотя оба они появляются на вашем терминале одинаково, STDERR не перенаправляется на STDOUT.

Чтобы проверить, не лгу ли я, попробуйте выполнить любую команду find генерировала ошибки (без каких-либо перенаправлений) и поместив в конце > example.file . Если сгенерированные ошибки появляются на вашем экране, но не в сгенерированном файле с именем example.file , то вы знаете, что STDERR не перенаправляется, потому что если бы все это было, выходные данные были бы в сгенерированном файле.

Когда вы добавляете 2>/dev/null вы говорите: «взять все выходные данные из STDERR и записать их в файл /dev /null».

Является ли это общесистемной настройкой (например, делать ли ошибки непосредственно в STDOUT в OSX, но в /dev /null в Linux) или это нужно искать?

Нет; по умолчанию при запуске программ из терминала STDIN, STDOUT и STDERR все копируются в терминал, но внутренне обрабатываются по-разному (т. е. имеют псевдоним для разных файловых дескрипторов), как в Linux. По умолчанию ошибки всегда выводятся на консоль при запуске программы, поэтому, если что-то идет не так, вы знаете, что, когда и почему. /dev/null похож на черную дыру; как только информация поступает, вы не можете получить ее обратно. Большинство людей не хотят, чтобы вывод ошибок таинственным образом исчезал в эфире, поэтому (не знаю дистрибутив Linux) это делает по умолчанию.

Есть ли способ заставить find принять это поведение по умолчанию (без создания псевдонима)?

Если вы хотите, чтобы find всегда так себя вел, не используя псевдоним (который ...Я имею в виду, что псевдоним не будет работать в любом случае, потому что псевдонимы работают только тогда, когда вы хотите заменить только начало команды, и перенаправления должны быть в конце Belay; Я был неправ; перенаправления могут быть помещены между / перед аргументами без проблем), одним из способов будет определение функции в bash (я предполагаю, что вы используете bash; мои извинения, если это ошибка) следующим образом:

find() { command find "$@" 2>/dev/null }

Если нет, есть ли ярлык короче 2>/dev/null (например, unzip -qq вместо unzip>/dev/null)?

Нет никакого файла конфигурации, переменной среды или удобного флага опции, который вы можете использовать, если вы это имеете в виду.

Как бы вы сделали это изменение на Linux box?

То же, что и на OSX. Если вы не хотите переопределять эту функцию при каждом входе в систему, добавьте эту строку в файл ~/.bashrc . Хотя... Если подумать, я думаю, что в OSX все по-другому. В OSX я уверен, что вам нужно добавить его в ~/.bash_profile чтобы заставить его работать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .