Здравствуйте.
Подскажите пожалуйста, как решить задачу.
Есть скрипт:#!/bin/bash
e=`ps xa | grep \" $* \"`
echo $eСкрипт запускается так:
./temp.sh 1 2 3
Задача - грепнуть по про процессам командой:
ps xa | grep "1 2 3"Это нужно т.к. одновременно может быть запущено очень много экземпляров скрипта с разными параметрами.
Проблема в том, что не получается кавычки передать на выполнение, т.е. всегда получается что-то типа:
bash -x ./temp.sh 1 2 3
++ ps xa
++ grep '"' 1 2 3 '"'
grep: 2: No such file or directory
grep: 3: No such file or directory
grep: ": No such file or directory
+ e=
+ echoпробовал разные комбинации окавычивания и экранирования, не помогает.
Зачем экранировать кавычки?
> Зачем экранировать кавычки?а если их не экранировать, то получается так:
скрипт:
#!/bin/bash
e=`ps xa | grep "$*"`
echo $eрезультат выполнения:
bash -x ./temp.sh 1 2 3
++ ps xa
++ grep '1 2 3'
+ e='23424 pts/5 S+ 0:00 bash -x ./temp.sh 1 2 3
23426 pts/5 S+ 0:00 bash -x ./temp.sh 1 2 3
23428 pts/5 S+ 0:00 grep 1 2 3'
+ echo 23424 pts/5 S+ 0:00 bash -x ./temp.sh 1 2 3 23426 pts/5 S+ 0:00 bash -x ./temp.sh 1 2 3 23428 pts/5 S+ 0:00 grep 1 2 3
23424 pts/5 S+ 0:00 bash -x ./temp.sh 1 2 3 23426 pts/5 S+ 0:00 bash -x ./temp.sh 1 2 3 23428 pts/5 S+ 0:00 grep 1 2 3
The special parameters * and @ have special meaning when in double quotes (see PARAMETERS below).Он заменяется на то что вы передали в параметрах + кавычки с двух сторон
Параметры Вы сами должны экранировать при передаче их скрипту.
Скрипт вроде правильно выполнился.
> The special parameters * and @ have special meaning when in double
> quotes (see PARAMETERS below).
> Он заменяется на то что вы передали в параметрах + кавычки с
> двух сторон
> Параметры Вы сами должны экранировать при передаче их скрипту.в том и дело, что скрипт запускается так
./temp.sh 1 2 3
он выполняется в течении некоторого времени и висит в процессах соответственно также, для примера:
3854 pts/5 S+ 0:00 /bin/bash ./temp.sh 1 2 3соответственно, что бы grep его нашел, нужно дать команду ps xa | grep "1 2 3" или ps xa | grep "./temp.sh 1 2 3" что эквивалентно ps xa | grep "$@", или ps xa | grep "$*" или ps xa | grep "$0 $*"
Дело в том, что мне нужно дать эту команду из скрипта, распарсить результат и присвоить некоторое значение переменной.
Не могу понять, как правильно это сделать
хм кажется понял, скрипт который грепает, тоже попадает в результат выполнения..
#!/bin/bash
ps xa | grep "$*" |while read line
do
echo $line
done
sh ./test.sh 1 2 3
24837 pts/25 S+ 0:00 sh ./test.sh 1 2 3
24839 pts/25 S+ 0:00 grep 1 2 3
24840 pts/25 S+ 0:00 sh ./test.sh 1 2 3
ps xa | grep "$*" | grep -v grep |while... - уберет из вывод grep
> пробовал разные комбинации окавычивания и экранирования, не помогает.И Вас также с Новым Учебным Годом!
>> пробовал разные комбинации окавычивания и экранирования, не помогает.
> И Вас также с Новым Учебным Годом!:D
эрм, мне уже поздновато...
хотя учиться никогда не поздно ;)
>[оверквотинг удален]
> получается что-то типа:
> bash -x ./temp.sh 1 2 3
> ++ ps xa
> ++ grep '"' 1 2 3 '"'
> grep: 2: No such file or directory
> grep: 3: No such file or directory
> grep: ": No such file or directory
> + e=
> + echo
> пробовал разные комбинации окавычивания и экранирования, не помогает.Man pgrep
О, Домашнее задание:Как вывести ОДНОЙ командой результат grep, исключая сам grep?
P.S.
Кто будет пользоваться гуглой/поисковиками - считайте вы насрали себе в карму!
Бонусы в карму за отказ от манов!Mitrofanov не подсказывай, пущай мучаются.
> О, Домашнее задание:
> Как вывести ОДНОЙ командой результат grep, исключая сам grep?На пять с плюсом: чего хотел сказать павлин.
На шесть с плюсом: сформулировать русским языком для троечников.
>> О, Домашнее задание:
>> Как вывести ОДНОЙ командой результат grep, исключая сам grep?
> На пять с плюсом: чего хотел сказать павлин.grep something | grep -v grep, без "grep -v grep"
>>> О, Домашнее задание:
>>> Как вывести ОДНОЙ командой результат grep, исключая сам grep?
>> На пять с плюсом: чего хотел сказать павлин.
> grep something | grep -v grep, без "grep -v grep"Ты про pgrep?
>>>> О, Домашнее задание:
>>>> Как вывести ОДНОЙ командой результат grep, исключая сам grep?
>>> На пять с плюсом: чего хотел сказать павлин.
>> grep something | grep -v grep, без "grep -v grep"
> Ты про pgrep?Нет, простой grep.
>>>>> О, Домашнее задание:
>>>>> Как вывести ОДНОЙ командой результат grep, исключая сам grep?
>>>> На пять с плюсом: чего хотел сказать павлин.
>>> grep something | grep -v grep, без "grep -v grep"
>> Ты про pgrep?
> Нет, простой grep.ps ax | grep 'b[a]sh'
> ps ax | grep 'b[a]sh'::[||||||\ \||||||||||||||||||||||||||]::
Этот знак означает "Баян порванный" .
>>>>>> О, Домашнее задание:
>>>>>> Как вывести ОДНОЙ командой результат grep, исключая сам grep?
>>>>> На пять с плюсом: чего хотел сказать павлин.
>>>> grep something | grep -v grep, без "grep -v grep"
>>> Ты про pgrep?
>> Нет, простой grep.
> ps ax | grep 'b[a]sh'Садись, пять! Кавычки кстати необязательно
> Садись, пять! Кавычки кстати необязательноА я бы в морду дал за то что рыбу распугал :)