Сбой вызова grep в подстановке команд - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь выполнить вызов grep в подстановке команд в bash, например:

status=$(dpkg -s elasticsearch | grep "Status")

Но когда я запускаю это в скрипте с именем elk.sh, я получаю следующий вывод:

./elk.sh: 47: ./elk.sh:  grep: not found

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

Вы представляете, что может быть не так?

РЕДАКТИРОВАТЬ: в качестве моего кодане секретно, я делюсь этим здесь, так как это может помочь вам понять, что не так.

Обратите внимание, что file elk.sh возвращает:

elk.sh: POSIX shell script, UTF-8 Unicode text executable

Вот код:

#!/bin/sh

pInfo() {
    if [ "$#" -ne 1 ]; then
        echo "Invalid arguments: pInfo needs one string as argument."
        exit 1
    fi
    echo "\033[32m[INFO]\033[0m $1"
}

pError() {
    if [ "$#" -ne 1 ]; then
        echo "Invalid arguments: pError needs one string as arguments."
        exit 1
    fi
    echo "\033[31m[ERROR]\033[0m $1"
}

install_elk() {
    wget "https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.2.deb" -q --show-progress
    sudo dpkg -i "elasticsearch-6.4.2.deb"
    sudo apt-get install -f
    sudo rm -rRf "elasticsearch-6.4.2.deb"
}

which grep
echo $PATH
pInfo "Verifying ElasticSearch installation."
status=$(dpkg -s elasticsearch | grep Status)
if [ "$?" -ne 0 ] || [ -z "$status" ]; then
    pError "ElasticSearch is not installed."
    pInfo "Start the installation ? (y/n)"
    read answer
    if [ "$answer" != "y" ] && [ "$answer" != "n" ]; then
        pError "Invalid answer. Just type 'y' (yes) or 'n' (no)."
        exit 1
    fi
    if [ "$answer" = "y" ]; then
        pInfo "Installing ElasticSearch..."
        install_elk
    else
        pInfo "Not installing ElasticSearch."
        exit 2
    fi
fi

pInfo "ElasticSearch installed."

ps ax | grep -v grep | grep "elasticsearch" > /dev/null
if [ "$?" -eq 1 ]; then
    pInfo "ElasticSearch not running. Starting..."
    if [ ! -z "$(ps -p 1 | grep "systemd")" ]; then
        pInfo "System running systemd."
        sudo systemctl start elasticsearch.service
    else
        pInfo "System running init."
        sudo -i service elasticsearch start
    fi
fi

pInfo "ElasticSearch started."

exit 0

Вызов elk.sh дает следующий вывод:

$ ./elk.sh
/bin/grep
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
[INFO] Verifying ElasticSearch installation
[INFO] ElasticSearch installed
./elk.sh: 49: ./elk.sh:  grep: not found
[INFO] ElasticSearch not running. Starting...
[INFO] System running systemd.
[INFO] ElasticSearch started.

EDIT : Я обнаружил проблему: переписать строку так:

status=$(dpkg -s elasticsearch |grep "Status")

делает команды работает просто отлично.Мне просто нужно было удалить пробел между каналом и командой grep.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...