2016-12-22 2 views
1

У меня есть Makefile, который преуспевает, где он должен не потому, что линия, как этот`cat <does_not_exist | perl` успешно

./preprocess.sh <PARTIAL_SOURCE | perl >FINAL_SOURCE 

успешно, хотя PARTIAL_SOURCE еще не существует.

Это не причуда preprocess.sh, это, кажется, что-то делать с Баш/ш

$> cat <does_not_exist && echo ok || echo no 
bash: does_not_exist: No such file or directory 
no 
$> cat <does_not_exist | perl && echo ok || echo no 
bash: does_not_exist: No such file or directory 
ok 

Почему первый провал, но второй успех?

+0

Что такое ваше требование? и чего вы намереваетесь достичь? – Inian

+0

Требование «FINAL_SOURCE» должно быть записано тогда и только тогда, когда полная цепочка команд, которые его генерируют, преуспевает. – spraff

+0

Ваше требование довольно расплывчато. 'Preprocess.sh' читает из' PARTIAL_SOURCE' и вы передаете вывод команды 'perl' в' FINAL_SOURCE' (не уверен файл или переменную) только в том случае, если предыдущая команда завершается успешно? – Inian

ответ

2

Второй успех завершен, потому что perl преуспевает. Код выхода конвейера - это код выхода последней команды в конвейере. В этом примере это perl. Он получает пустой ввод, ничего не делает с ним, поэтому он выходит с 0, как и должно быть.

В качестве другого примера, это удается слишком:

$ a | b | perl && echo ok || echo no 
-bash: a: command not found 
-bash: b: command not found 
ok 

Если вы не хотите, чтобы perl выполняться до PARTIAL_SOURCE готова, вам необходимо проверить для него до трубопровода:

if [ ! -f "$input" ]; then 
    ./preprocess.sh < "$input" | perl >FINAL_SOURCE 
fi 

Или ждать ввода, чтобы быть готовым:

while [ ! -f "$input" ]; do sleep 1; done 
+0

Очевидное наблюдение, как я могу заставить его потерпеть неудачу? – spraff

+0

@spraff Я обновил свой ответ – janos

Смежные вопросы