Я написал небольшой скрипт и по какой-то причине мне нужно избежать пробелов, переданных в параметрах, чтобы заставить его работать.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
Это не ваша проблема, но я не совсем понимаю ваше использование '' $ @ "' здесь. 'connections' кажется явно разработанным, чтобы принимать только один аргумент, и он будет ошибочным, если он получит несколько аргументов (в том, что он будет передавать все эти аргументы отдельно на' pgrep -nf', так что первый аргумент сопоставляется с командой строка и все последующие аргументы сопоставляются только с именем процесса). Так почему бы просто не использовать '' $ 1'' вместо этого? Или, еще лучше, дать какую-то ошибку или предупреждение, если есть несколько аргументов? – ruakh
Я уже пытался это сделать и имел ту же проблему. Если я заменяю все экземпляры $ @ на $ 1, то возникает одна и та же проблема (экранирование пространства работает, а не экранирование пространства, которое вытягивает pid текущей оболочки) –
Да: как я уже сказал, ваше неправильное использование '' $ @ "' это не проблема. Но я все еще не вижу * почему * вы хотите злоупотреблять им. – ruakh