выполнить, если команда не пуста

sudo kill $(ps aux | grep '[p]ostgres'|awk '{print $2}')

Для команды выше, я хочу, чтобы она выполнялась только в том случае, если

$(ps aux | grep '[p]ostgres'|awk '{print $2}')

не пуст, иначе это вызовет ошибку, подобную этой

Как мне это достичь?

0
задан 23 January 2018 в 07:32

3 ответа

steeldriver правильно упомянул в комментариях, что для вашей конкретной цели лучше использовать pkill -f, так как выход фильтра ps через grep имеет недостаток в команде grep, которая появляется в списке ps. Напротив, pkill doeesn't делать это и выполняет чисто.

Что касается общего случая, когда вы хотите запустить любую команду, если позиционный параметр для нее пуст, есть два способа приблизиться к нему. Один, сохранить в переменной и проверить, не является ли переменная пустой:

var=$(ps aux | grep '[p]ostgres'|awk '{print $2}')
if ! [ "x$var" = "x"  ]; then
    sudo kill "$var"
fi

Другой способ - через xargs и --no-run-if-empty (или короткий -r):

[ f2]
1
ответ дан 22 May 2018 в 15:22
  • 1
    Спасибо, это то же самое, если я использую if [ -n $var ] then или if [ "$var" != "" ] then в условии? – william007 24 January 2018 в 05:09
  • 2
    @ william007 Эффективно, да - они эквивалентны в результате, но логически различны; один проверяет содержимое переменной, другой сравнивает строки. Остерегайтесь [ ! "$var" = "" ], которые могут выглядеть одинаково, но если вы работаете в разных оболочках, есть случаи, когда этот тест может работать неправильно (см. этот ответ ). [F2] в порядке, и не забудьте указать здесь переменные. – Sergiy Kolodyazhnyy 24 January 2018 в 05:30
  • 3
    Также см. это . К сожалению, есть много угловых случаев, когда дело доходит до сценариев оболочки. Синтаксис, который я использую здесь, должен быть безопасным и более или менее портативным. – Sergiy Kolodyazhnyy 24 January 2018 в 05:30

steeldriver правильно упомянул в комментариях, что для вашей конкретной цели лучше использовать pkill -f, так как выход фильтра ps через grep имеет недостаток в команде grep, которая появляется в списке ps. Напротив, pkill doeesn't делать это и выполняет чисто.

Что касается общего случая, когда вы хотите запустить любую команду, если позиционный параметр для нее пуст, есть два способа приблизиться к нему. Один, сохранить в переменной и проверить, не является ли переменная пустой:

var=$(ps aux | grep '[p]ostgres'|awk '{print $2}') if ! [ "x$var" = "x" ]; then sudo kill "$var" fi

Другой способ - через xargs и --no-run-if-empty (или короткий -r):

ps aux | grep '[p]ostgres'|awk '{print $2}' | xargs --no-run-if-empty kill
1
ответ дан 17 July 2018 в 22:25

steeldriver правильно упомянул в комментариях, что для вашей конкретной цели лучше использовать pkill -f, так как выход фильтра ps через grep имеет недостаток в команде grep, которая появляется в списке ps. Напротив, pkill doeesn't делать это и выполняет чисто.

Что касается общего случая, когда вы хотите запустить любую команду, если позиционный параметр для нее пуст, есть два способа приблизиться к нему. Один, сохранить в переменной и проверить, не является ли переменная пустой:

var=$(ps aux | grep '[p]ostgres'|awk '{print $2}') if ! [ "x$var" = "x" ]; then sudo kill "$var" fi

Другой способ - через xargs и --no-run-if-empty (или короткий -r):

ps aux | grep '[p]ostgres'|awk '{print $2}' | xargs --no-run-if-empty kill
1
ответ дан 23 July 2018 в 23:04

Другие вопросы по тегам:

Похожие вопросы: