Больше вероятное, Вы вводите его. В man date
Вы видите, что он берет формат [MMDDhhmm[[CC]YY][.ss]]
Таким образом, вышеупомянутое считало бы 12:49 26 апреля 2005
Прямо сейчас в Техасе это 041122292011 (22:29 11 апреля 2011)
Переданные по каналу команды выполняются одновременно. Когда Вы работаете ps | grep …
, это - чистая случайность (или вопрос деталей работ оболочки, объединенной с планировщиком, подстраивающим глубоко в кишечнике ядра) относительно ли ps
или grep
запускается сначала, и в любом случае они продолжают выполняться одновременно.
Это является очень наиболее часто используемым, чтобы позволить второй программе обрабатывать данные, как это прибывает из первой программы, прежде чем первая программа завершила свою операцию. Например,
grep pattern very-large-file | tr a-z A-Z
начинает отображать согласующие отрезки длинной линии в верхнем регистре даже прежде grep
закончил пересекать большой файл.
grep pattern very-large-file | head -n 1
отображает первый согласующий отрезок длинной линии и может прекратить обрабатывать задолго до того grep
закончил читать его входной файл.
Если Вы читаете где-нибудь, что переданные по каналу программы, запущенные в последовательности, сбегите из этого документа. Переданные по каналу программы, запущенные одновременно и всегда, имеют.
Порядок команды выполняются на самом деле, не имеет значения и не гарантируется. Не принятие во внимание тайных деталей pipe()
, fork()
, dup()
и execve()
, оболочка сначала создает канал, кабелепровод для данных, которые будут течь между процессами и затем создают процессы с концами канала, подключенного к ним. Первый процесс, который выполняется, может заблокировать ожидание входа от второго процесса или блок, ожидающий второго процесса, чтобы начать считывать данные с канала. Они ожидают, может быть произвольно длинным и не имеют значения. Какой бы ни приказывают, чтобы процессы были выполнены, данные в конечном счете переданы, и все работает.
Обычно Вы выполняете это под ударом. работа процесса и запуск одновременно, но работают оболочкой параллельно. Как это возможно?
система не гарантирует, как быстрое должностное лицо будет выполняться и указало, что команда запускается. это независимо к оболочке, но системе. Это вызвано тем, что:
ps auxww| grep ps | cat
однажды шоу grep
и/или ps
команда, и затем теперь. Это зависит, как быстрое ядро действительно запускает процессы с помощью системной исполнительной функции.
exec()
выполняется, но как exec()
вызовы и осуществление программ в канале чередованы.
– Thomas Nyman
06.09.2013, 13:25
Рискуя побить мертвую лошадь, кажется, заблуждение заключается в том, что
A | B
эквивалентно
A > temporary_file B < temporary_file rm temporary_file
, но еще в то время, когда была создана Unix и дети ездили на динозаврах в школу,
Диски были очень маленькие, и это было обычным делом для довольно доброй команды.
потреблять все свободное место в файловой системе.
Если бы B
было что-то вроде
grep some_very_obscure_string
,
конечный выход трубопровода может быть намного меньше, чем этот промежуточный файл.
Таким образом, труба была разработана, а не как сокращение для
сначала "запустите A, а затем запустите B с входом из модели A",
но как способ одновременного выполнения B
с A
и устранения необходимости хранения промежуточного файла на диске.
Вы спрашивали о порядке, и я думаю, что это очень важный аспект дела. Это не случайно (, как пытается сказать Жиль в своем ответе ).
Вот ps -ef
, переданный в команду grep
:
$ ps -ef | grep.
...
alexis 37188 55443 0 20:17 pts/4 00:00:00 ps -ef
alexis 37189 55443 0 20:17 pts/4 00:00:00 grep --color=auto.
...
Примечание. :Я удалил все остальные процессы из вывода, так как они не имеют значения для данного вопроса.
Как мы видим, в выводе есть ps -ef
и grep --color=auto.
. Вы можете сейчас ответить на свой вопрос?
Да. Команда ps
имеет PID 37 188, а команда grep
имеет PID 37 189. Ясно, что они были созданы слева направо, и никакая оболочка не должна делать это по-другому.
Технически, в C мы создаем каналы с помощью функции pipe(2)
, которая дает нам два файловых дескриптора. Один будет использоваться как stdout
из ps
, а другой как stdin
из grep
. Достаточно просто сохранить файловый дескриптор для stdin
до тех пор, пока вы не запустите ps
.
Далее,если вы посмотрите на конфигурацию вашей системы так:
$ getconf -a | grep PIPE_BUF
PIPE_BUF 4096
_POSIX_PIPE_BUF 4096
вы заметили два параметра, которые определяют размер канала в байтах. Это максимальное количество байтов, которое может быть в канале. Как только канал заполнен, устройство вывода(ps
в нашем первом примере )блокируется до тех пор, пока данные не будут прочитаны процессом на другой стороне канала(grep
в нашем первом примере ).
Другими словами, поскольку выход ps
намного больше, чем размер трубы:
$ ps -ef | wc
1132 10819 121435
(т.е. около 120Кб выходных данных на моем компьютере на данный момент...)
Конвейер заблокировался бы очень быстро, если бы все выходные данные ps
были необходимы до запуска grep
.
Таким образом, процессы очень быстро запускаются один за другим, но большую часть времени они выполняются параллельно (или одновременно, если у вас один процессор ). То есть команда ps
умрет первой. Это помечает канал как «готовый» (, вы получаете сигнал EOF
при чтении данных из него ), и именно так следующий инструмент узнает, что это сделано, и он также умирает, когда обрабатывает последние несколько байтов, которые он получил.
И наоборот, если процесс на правой стороне конвейера завершается раньше (до того, как процесс слева закончит запись в конвейер ), то процесс слева получает сигнал SIGPIPE
как только когда он пытается писать в трубу. Это делается для того, чтобы убедиться, что конвейер быстро умирает, если какой-либо из процессов внутри него умирает.
grep
программа, и существует буфер, управляемый ядром в самом канале. Для последнего посмотрите, Насколько большой буфер канала? спасибо – Gilles 'SO- stop being evil' 24.11.2013, 23:29