Зачем ссылаться на $? эксплицитно - PullRequest
1 голос
/ 22 декабря 2009

Большая часть кода sh выглядит следующим образом:

$cmd
if [ $? = 0 ]; then $cmd2; fi

Вместо:

if $cmd; then $cmd2; fi

Я обычно предполагал, что люди используют первое просто потому, что не знают, что синтаксиспоследнее действительно, но мне интересно, есть ли другая причина (хотя единственная возможность, которая приходит на ум, - это мобильность).Есть ли причина предпочитать явную ссылку на $ {?}?.

Ответы [ 4 ]

5 голосов
/ 22 декабря 2009

Вы должны ссылаться на $?, если вы действительно хотите использовать код ошибки для чего-либо (ведение журнала, обработка ожидаемых ошибок и т. Д.). Для конкретного сценария, о котором вы упомянули, вторая конструкция if является более четкой и короткой, и я не вижу причин ее использовать.

2 голосов
/ 22 декабря 2009

На мой взгляд, потому что многие люди не понимают, что вы можете более или менее протестировать статус команды, как и вы. Точно так же люди тоже не понимают, что можно написать:

if cmd1
   cmd2
   cmd3
then
    ...do this after executing cmd1, cmd2 and cmd3, but ...
    ...only if cmd3 exits with with status 0!
fi

Вы также можете упростить свой код (за счет краткости) до:

cmd1 && cmd2

(я вижу, что @shin отметил это в комментарии, за который я проголосовал).

Я также вижу много кода оболочки 'Bourne', который использует:

if ( ... )
then ...
fi

Иногда это уместно - но чаще всего это вещи, которые программист оболочки C написал, не понимая, что обозначение означает «запустить под-оболочку» в оболочке Bourne и ее производных, таких как оболочка Korn, POSIX-совместимые оболочки, и Баш.

1 голос
/ 23 декабря 2009

Да, многие не знают о последней, более элегантной форме. Я уже упоминал об этом в: http://www.pixelbeat.org/programming/shell_script_mistakes.html

1 голос
/ 22 декабря 2009

Поскольку вы проверяете флаг состояния команды, а не проверяете вывод команды.

Если команда печатает на стандартный вывод, но устанавливает флаг, вы получите разные результаты с двумя приведенными вами примерами.

Стою исправлено, после тестирования. Мне показалось, что я много лет назад столкнулся с проблемой на Solaris (под ksh?), Но я не могу воссоздать на машинах, к которым у меня есть доступ, кроме как для тестирования:

если [$cmd]

...