Я хочу запускать несколько команд в сценарии Bash в ssh с помощью этих команд, и я хотел бы выполнять каждую команду после завершения каждой .
#!/bin/bash
/usr/bin/php indexer.php --reindex catalog_product_attribute
/usr/bin/php indexer.php --reindex catalog_product_price
/usr/bin/php indexer.php --reindex catalog_url
/usr/bin/php indexer.php --reindex catalog_product_flat
/usr/bin/php indexer.php --reindex catalog_category_flat
/usr/bin/php indexer.php --reindex catalog_category_product
/usr/bin/php indexer.php --reindex catalogsearch_fulltext
/usr/bin/php indexer.php --reindex cataloginventory_stock
/usr/bin/php indexer.php --reindex tag_summary
Любая помощь приветствуется.
По сути, вам просто нужно разделить команды двумя амперсандами &&
.
Итак, вы должны написать следующее:
#!/bin/bash
/usr/bin/php indexer.php --reindex catalog_product_attribute && /usr/bin/php indexer.php --reindex catalog_product_price
Используя &&
чтобы добавить следующую команду.
&& - правильный способ сделать это, однако, если у вас много задач, визуально это сбивает с толку. Более элегантное решение - это что-то вроде следующих строк:
$phppath = /usr/bin/php
array = (catalog_product_attribute, ...)
for item in ${array[*]}
$phppath indexer.php --reindex $item`
ПРИМЕЧАНИЕ: код не тестировался, но концептуально верен.
Вы можете использовать каналы для отправки содержимого скрипта в удаленную систему.
Попробуйте что-то вроде этого: cat file | ssh remote bash
Как сказал NickW, вы можете использовать двойные амперсанды для разделения команд в одну строку.
Однако вы также должны понимать, что делает двойной амперсанд, и решать, нужно ли вам используйте его или просто точку с запятой.
Двойные амперсанды выполнят следующую команду , только если предыдущая команда завершится с нулевым статусом. В приведенном ниже примере command3
не будет запущен, если command1
или command2
завершится неудачно.
ssh user @ host "command1 && command2 && command3"
Точки с запятой будут выполнять все команды независимо от статуса выхода. В приведенном ниже примере будут выполнены все три команды.
ssh user @ host"command1; command2; command3"
Вкратце: если команды зависят друг от друга, следует использовать двойные амперсанды, в противном случае следует использовать точку с запятой.
Однако в этом конкретном примере вы следует рассмотреть возможность переноса / развертывания сценария на целевой сервер и его вызова через SSH, поскольку объединение всех этих команд приведет к большой и громоздкой команде SSH.
ssh user @ host "/path/to/script.sh"