Почему "grep" выдает ошибку при использовании / "/"? - PullRequest
0 голосов
/ 25 января 2019

Фон

Я пытаюсь получить PID команды, которая выполняется с использованием sh -c, и сохранить ее в переменной для дальнейшего использования.

#!/bin/bash

execute() {
   CMDS="$1"

   # x-terminal-emulator executes the quoted text by executing 'sh -c "$CMDS"'
   # Which is why "ps ax | grep ..." is used to search for the PID that
   # matches "sh -c $CMDS"
   x-terminal-emulator -e "$CMDS" &> /dev/null 

   cmdsPID="$(ps ax | grep \"sh -c "$CMDS"\" | xargs | cut -d ' ' -f 1)"

   echo "$cmdsPID"
}

execute "apt full-upgrade -y"

⚠️ Ошибка

Однако после выполнения вышеуказанного скрипта он возвращает: grep: apt full-upgrade -y": No such file or directory, почему?

1 Ответ

0 голосов
/ 25 января 2019

Хорошо, так что я, очевидно, задумался над тем, что мне нужно было избежать кавычек, чтобы это работало. Однако это именно то, что я не должен делать! Мне просто нужны без кавычек цитаты, и это работает.

Это потому, что, как указал @ biffen :

" Что касается ошибки: вы по неизвестной причине экранируете кавычки, делаете их не кавычками и, таким образом, передаете три аргумента grep (" sh, -c и apt full-upgrade -y"), говорит ему подсчитать количество «sh» в файле apt full-upgrade -y", и говорит, что не может найти этот файл. »

#!/bin/bash

execute() {
    CMDS="$1"

    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    # x-terminal-emulator executes the quoted text by executing 'sh -c "$CMDS"'
    # Which is why "ps ax | grep ..." is used to search for the PID that
    # matches "sh -c $CMDS"
    x-terminal-emulator -e "$CMDS" &> /dev/null 

    cmdsPID="$(ps ax | grep -v "grep" | grep -v "S+" | grep "sh -c" | grep "$CMDS" | xargs | cut -d ' ' -f 1)"

    echo "$cmdsPID"
}

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