Он работает .
Различные части конвейера выполняются одновременно. Единственное, что синхронизирует/сериализует процессы в конвейере, — это ввод-вывод, то есть один процесс записывает в следующий процесс в конвейере, а следующий процесс читает то, что пишет первый. Кроме того, они выполняются независимо друг от друга.
Поскольку между процессами в вашем конвейере не происходит чтения или записи, время выполнения конвейера равно времени самого длинного sleep
вызова.
С тем же успехом можно было написать
time ( foo.sh & bar.sh &; wait )
Тердон разместил пару немного измененных примеров скриптов в чате:
#!/bin/sh
# This is "foo.sh"
echo 1; sleep 1
echo 2; sleep 1
echo 3; sleep 1
echo 4
и
#!/bin/sh
# This is "bar.sh"
sleep 2
while read line; do
echo "LL $line"
done
sleep 1
Вопрос был "почему time ( sh foo.sh | sh bar.sh )
возвращает 4 секунды, а не 3+3 = 6 секунд?"
Чтобы увидеть, что происходит, включая примерное время выполнения каждой команды, можно сделать это (вывод содержит мои аннотации):
$ time ( env PS4='$SECONDS foo: ' sh -x foo.sh | PS4='$SECONDS bar: ' sh -x bar.sh )
0 bar: sleep 2
0 foo: echo 1 ; The output is buffered
0 foo: sleep 1
1 foo: echo 2 ; The output is buffered
1 foo: sleep 1
2 bar: read line ; "bar" wakes up and reads the two first echoes
2 bar: echo LL 1
LL 1
2 bar: read line
2 bar: echo LL 2
LL 2
2 bar: read line ; "bar" waits for more
2 foo: echo 3 ; "foo" wakes up from its second sleep
2 bar: echo LL 3
LL 3
2 bar: read line
2 foo: sleep 1
3 foo: echo 4 ; "foo" does the last echo and exits
3 bar: echo LL 4
LL 4
3 bar: read line ; "bar" fails to read more
3 bar: sleep 1 ;... and goes to sleep for one second
real 0m4.14s
user 0m0.00s
sys 0m0.10s
Итак, в заключение, конвейер занимает 4 секунды, а не 6, из-за буферизации вывода первых двух вызовов echo
в foo.sh
.
Это достаточно просто:
Если вы используете bash
, сохраните такой фрагмент...
if [ -f "$HOME/.bash_aliases" ]; then
source "$HOME/.bash_aliases"
fi
для каждого файла, который вы хотите импортировать в свой ~/.bashrc
. Вы могли бы написать .
вместо source
, но лично мне больше нравится длинная форма.