Это заметка из цикла вольных переводов (возможно, слишком вольных) статьи IBM «Learn 10 good Unix usage habits». Вольные они не только потому, что автор плох в английском, но и из-за спорного их содержания. Поэтому давайте выправим акценты и разберёмся в интересных возможностях bash (*sh). Предыдущую заметку можно найти здесь.
3. Комбинируйте свои команды с управляющими операторами.
Возможно, вы знаете, что многие команды bash можно комбинировать. К примеру, чтобы выполнять команды одну за другой, можно использовать «;» между ними. Точка с запятой — управляющий оператор. Он позволяет выполнять операции одну за другой в большинстве случаев. Но это далеко не единственный управляющий оператор. Многие другие мы рассмотрим ниже.
Всегда бесили таки «вступления-рекламы». Так, к примеру, в книге «Совершенный код» первые страниц 100 рекламируют остальные 500 страниц. А можно поберечь моё время и перейти к сути?
Используйте оператор «&&», чтобы комбинировать две команды, первая из которых должна завершиться 0-ым кодом возврата.
Вообще, формулировка была бы забавной, если бы не была печальной правдой. «Правильнее» было бы написать: чтобы выполнить 2-ую команду при правильно выполненной 1-ой, используйте «&&». Но суровая правда жизни глаголет о том, что многие разработчики возвращают «0», даже если что-то пошло не так. yum install bla-bla-bla… Поставились не все пакеты? Всё ок — сама же программа не упала! Stderr в stdout — вообще молчу. В общем, бывает, что «всё плохо».
Например:
~ $ cd tmp/a/b/c && tar xvf ~/archive.tar
— перейти в папку и разархивировать туда tar архив. Если же директории tmp/a/b/c нет, то и распаковывать никто ничего не будет.
Используйте оператор «||», чтобы комбинировать две команды, первая из которых должна завершиться не-0-ым кодом возврата.
В противопоставление оператору «&&» есть «||», который используется, чтобы обработать ситуацию, когда предыдущая команда завершилась с ошибкой. К примеру:
~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c
— если директории нет, создай её.
Тут, конечно, может быть проблема не в отсутствии директории, а, например, в отсутствии прав на переход по ней. Но для иллюстрации данный пример подойдёт.
Ну и, естественно, вы можете комбинировать сразу оба этих оператора в одной строке. Например, так:
~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c && tar xvf -C tmp/a/b/c ~/archive.tar
По сути, это:
- перейди в директорию,
- если не получилось — создай её,
- если получилось — пропускаем создание,
- если успешно перешли в директорию или успешно создали её — разархивируй в директорию архив.
Довольно запутанно, но зато в одну строчку…
Также добавлю, что после исполнения команды можно посмотреть, с каким статусом она исполнилась:
~ $ echo $?
$? — специальная переменная, в которой содержится код возврата последней выполненной программы.
В следующей заметке мы разберёмся с кавычками.