Любой процесс в Unix имеет три открытых файла по умолчанию, (но он может их потом закрыть/переоткрыть, например перенаправляя вывод в log file):
-
0 (stdin)
-
1 (stdout)
-
2 (stderr)
примечание: stderr, отличается от stdout тем, что он не использует буфер для вывода.
Процессы unix могут выполняться асинхронно, как параллельно, так и последовательно, например:
$ cmd1 & cmd2;(cmd3 && cmd4) & (cmd5 || cmd6)
Разберем приведенную вязь команд по косточкам:
cmd1 & cmd2; — вначале параллельно запустятся cmd1 и cmd2
(cmd3 && cmd4) & (cmd5 || cmd6) — после завершения cmd1,параллельно запустятся условные цепочки cmd3,cmd4 и cmd5,cmd6. При этом:
cmd4 запуститься если cmd3 завершиться успешно, то есть ее код возврата будет 0,
cmd6, только в том случае, если cmd5 вернёт ненулевой код возврата.
host2$ nc -l -p 44665|tar xvf -
host1$ tar cvf - /home/mydata | nc host2 44665
Прокомментирую последний пример: Тут используется команда netcat (или nc), которая открывает сетевой канал для проброса канала tar/untar.
При копировании больших объёмов, это может дать в разы большую скорость, чем стандартное scp. Например, у меня при копировании 1500G backup database c одной VM на другую, скорость выросла в пять раз без сильной нагрузки на CPU.