2012-04-03 2 views
1

Я написал небольшой скрипт и по какой-то причине мне нужно избежать пробелов, переданных в параметрах, чтобы заставить его работать.pgrep печатает другой pid, чем ожидалось

Я читал множество других статей о людях с этой проблемой, и обычно это связано с тем, что они не цитируют $ @, но все мои переменные цитируются в сценарии и параметры, указанные в командной строке. Кроме того, если я запускаю сценарий в режиме отладки, возвращаемая строка может быть успешно запущена с помощью скопирования, но не выполняется при выполнении из сценария.

КОД:

connections() 
{ 
    args="[email protected]" 
    pid="$(pgrep -nf "$args")" 
    echo $pid 
    # code that shows TCP and UDP connections for $pid 
} 
connections "[email protected]" 

Пример:

bash test.sh "blah blah"

терпит неудачу, и вместо этого возвращает идентификатор процесса, выполняемого в данный оболочки

bash test.sh "blah\ blah"

успешно и возвращает идентификатор процесса процесс ess, который вы ищете через pgrep

+0

Это не ваша проблема, но я не совсем понимаю ваше использование '' $ @ "' здесь. 'connections' кажется явно разработанным, чтобы принимать только один аргумент, и он будет ошибочным, если он получит несколько аргументов (в том, что он будет передавать все эти аргументы отдельно на' pgrep -nf', так что первый аргумент сопоставляется с командой строка и все последующие аргументы сопоставляются только с именем процесса). Так почему бы просто не использовать '' $ 1'' вместо этого? Или, еще лучше, дать какую-то ошибку или предупреждение, если есть несколько аргументов? – ruakh

+0

Я уже пытался это сделать и имел ту же проблему. Если я заменяю все экземпляры $ @ на $ 1, то возникает одна и та же проблема (экранирование пространства работает, а не экранирование пространства, которое вытягивает pid текущей оболочки) –

+0

Да: как я уже сказал, ваше неправильное использование '' $ @ "' это не проблема. Но я все еще не вижу * почему * вы хотите злоупотреблять им. – ruakh

ответ

1

Ваша проблема не имеет отношения к "[email protected]".

Если добавить -l опции pgrep, вы можете увидеть, почему это соответствие текущего процесса.

Сценарий, который вы используете , также включает в себя то, что вы пытаетесь найти в своих собственных аргументах.

Это как делать это, и видя grep:

$ ps -U $USER -o pid,cmd | grep gnome-terminal 
12410 grep gnome-terminal 
26622 gnome-terminal --geometry=180x65+135+0 

Причина обратной косой черты делает разницу? pgrep считает обратную косую черту + пространство просто означает пространство. Он не находит ваш скрипт, потому что он содержит blah\ blah, а не blah blah.