Трубка тут вообще ни при чем. cp
не имеет выходных данных, поэтому вы не можете направить его выходные данные в другую программу. Я предполагаю, что вы хотели ;
или &&
вместо:
## copy the file and then run sed
cp file.txt file.txt.bak; sed -i '1i#Backup file' file.txt.bak
Или
## copy the file and then run sed BUT only if the copy was successfull
cp file.txt file.txt.bak && sed -i '1i#Backup file' file.txt.bak
Однако, если все, что вам нужно, это копия исходного файла с измененной первой строкой, то sed действительно может сделать это за вас:
sed '1i#Backup file' file.txt > file.txt.bak
Оператор <
без кавычек является оператором перенаправления в оболочке. Ошибка указывает на то, что оболочка пытается выполнить перенаправление из файла с именем 3
. Скорее всего, вы хотели использовать -lt
для сравнения двух целых чисел.
Вот альтернативная реализация:
#!/bin/sh
if ! pkill -0 kafka; then
mail -s 'Kafka down on QA/Dev server' abc@.com <<END
Hi Support Team,
Kafka is down on QA/Dev server $hostname.
Please take immediate action
Regards,
Application Support Team
END
fi
Приведенный выше скрипт будет использовать pkill
для отправки «нулевого сигнала» каждому процессу kafka
(использовать pkill -0 -f kafka
для поиска подстроки kafka
во всей командной строке, а не только в имени команды ). Если такого процесса не существует, это приведет к выходу pkill
с не -нулевым статусом выхода -, что приведет к отправке электронной почты. «Нулевой сигнал» используется для проверки существования процесса и никак не влияет на процесс.
В качестве альтернативы, если вы хотите подсчитать количество kafka
процессов и запустить электронное письмо менее чем для трех:
#!/bin/sh
if [ "$( pgrep kafka | wc -l )" -lt 3 ]; then
mail -s 'Kafka down on QA/Dev server' abc@.com <<END
Hi Support Team,
Kafka is down on QA/Dev server $hostname.
Please take immediate action
Regards,
Application Support Team
END
fi
Вызов pgrep
выводит идентификаторы процессов для всех имен процессов, соответствующих данному шаблону, по одному в строке. Используйте pgrep -f kafka
для поиска подстроки kafka
во всей командной строке, а не только в имени команды.
Оба приведенных выше сценария предполагают, что переменная hostname
была установлена и экспортирована вне сценария. Вы можете использовать $(hostname)
вместо $hostname
для вызова утилиты hostname
в документе здесь -.