Когда я должен использовать перенаправление ввода?

Это похоже на аппаратную проблему - или диски или контроллер. С тех пор существуют ошибки на обоих ad4 и ad6, это может быть контроллер. Я рекомендую создать резервную копию любых важных данных как можно скорее.

Вы могли бы попытаться установить sysutils/smartmontools видеть, сообщают ли о каких-либо УМНЫХ ошибках.

Относительно Вашего Использования оперативной памяти, которое кажется странным. Даже если бы Вы используете дедупликацию v28 ZFS, я не ожидал бы, что файловая система на 1.5 ТБ поднимет так много RAM. Вы могли бы попытаться работать top -S -osize видеть, что использует память.

21
02.04.2013, 02:38
2 ответа

От man grep страница (на Debian):

ОПИСАНИЕ

   grep  searches the named input FILEs (or standard input if no files are
   named, or if a single hyphen-minus (-) is given as file name) for lines
   containing  a  match to the given PATTERN.  By default, grep prints the
   matching lines.

В первом случае, grep открывает файл; во втором оболочка открывает файл и присваивает его стандартному входу grep, и grep не будучи переданным никакой аргумент имени файла предполагает, что ему нужен к grep его стандартный вход.

Профессионалы 1:

  • grep может grep больше чем один файл ¹.
  • grep может отобразить имя файла где каждое возникновение line найден.

Профессионалы 2:

  • Если файл не может быть открыт, оболочка возвращает ошибку, которая будет включать более релевантную информацию (как номер строки в сценарии) и более последовательным способом (если Вы позволите оболочке открыть файлы для других команд также) чем тогда, когда grep открывает его. И если файл не может быть открыт, grep даже не назван (который для некоторых команд - возможно, нет grep - может иметь большое значение).
  • в grep line < in > out, если in не может быть открыт, out не будет создан или не усеченный.
  • Нет никакой проблемы с некоторыми файлами с необычными именами (как - или имена файлов, запускающиеся с -) ².
  • косметический: можно поместить <file где угодно на командной строке для показа команды текут более естественно, как <in grep line >out если Вы предпочитаете.
  • косметический: с GNU grep, можно выбрать что маркировку использовать перед согласующим отрезком длинной линии вместо просто имени файла как в:

    <file grep --label='Found in file at line' -Hn line
    

С точки зрения производительности, если файл не может быть открыт, Вы сохраняете выполнение grep при использовании перенаправления, но иначе для grep Я не ожидаю большого различия.

С перенаправлением Вы сохраняете необходимость передать дополнительный аргумент grep, Вы делаете grepаргумент, анализирующий немного легче. С другой стороны, оболочке будет нужен (по крайней мере), дополнительный системный вызов dup2() дескриптор файла на дескриптор файла 0.

В { grep -m1 line; next command; } < file, grep (здесь GNU grep) захочет seek() назад к сразу после согласующего отрезка длинной линии так next command видит остальную часть файла (это должно будет также определить, seekable ли файл или не). Другими словами, положение в stdin - другой grepвывод. С grep -m1 line file, это может оптимизировать это, это - то меньше вещи для grep заботиться о.


Примечания

¹ С zsh, можно сделать:

grep line < file1 < file2

но это делает эквивалент cat file1 file2 | grep line (не вызывая cat утилита), и так менее эффективно, может вызвать беспорядок, если первый файл не заканчивается в символе новой строки и не сообщит, в котором регистрируют шаблон, найден.

² В случае ksh93 и bash хотя, существуют файлы как /dev/tcp/host/port/dev/fd/x в некоторых системах в bash) который при использовании в цели перенаправлений прерывания оболочки для особых целей вместо того, чтобы действительно открыть файл в файловой системе (хотя обычно, те файлы не существуют в файловой системе). /dev/stdin служит той же цели как - распознанный grep, но по крайней мере, здесь это более правильно namespaced (кто-либо может создать названный файл - в любом каталоге, в то время как только администраторы могут создать названный файл /dev/tcp/host/port и администраторы должны знать лучше).

28
27.01.2020, 19:43
  • 1
    +1 для хорошего объяснения. У меня есть одно сомнение: в 2-м случае, когда оболочка открывает файл, это передает открытое содержание файла стандартному входу (клавиатура)?? (Я запутался с термином 'стандартный вход grep'). –  Ankit 01.04.2013, 19:09
  • 2
    @Ankit результата, stdin - то, где приложения читают свой вход по умолчанию, дескриптор файла 0. Когда в терминале, fd 0 открыт от чтения на оконечном устройстве (что-то как/dev/ttyxx или/dev/pts/n). Это - то, как они заканчивают тем, что получили то, что Вы вводите на клавиатуре. Перенаправление Shell stdin команды просто открывает fd 0 для некоторого другого файла прежде, чем выполнить команду. –  Stéphane Chazelas 01.04.2013, 21:58

Ответ покрытиями StephaneChazelas grep(1), и большинство команд происхождения Unix прокладывает себе путь, но не все. Это стандартно для чтения любого из стандартного входа (с клавиатуры, из файла, перенаправленного через < file, или от вывода, переданного по каналу другой командой, глупым примером ls * | grep '^ab*c$'), или из файла (файлов), данного как аргументы, как grep comment file1 file2 file3. Некоторые команды используют конвенцию там, которую назвал файл - стандартный вход, таким образом, можно сказать make-middle | cat head - tail получить поток с head, безотносительно gen-middle генерирует, сопровождаемый tail. Это дизайном, для предоставления гибкости в использовании команд.

Который лучше? Пока это работает, cmd file короче, чем cmd < file; могла быть крошечная разница во времени между оболочкой, делающей файл frobbing (<) и команда, делающая его отдельно, но вероятно непримечательный, если Вы целый день не делаете ничего иного. Это будет зависеть от соображений как профессионалы, упомянутые в ответе Stephane.

6
27.01.2020, 19:43
  • 1
    cmd file не короче, чем cmd<file все же. –  Stéphane Chazelas 02.02.2016, 15:14

Теги

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