Проблема в том, что по умолчанию pgrep
ищет только процесс name. Имя - это усеченная версия всей команды. Вы можете узнать, что это за имя, посмотрев /proc/PID/status
, где PID
- это идентификатор соответствующего процесса. Например:
$ ./aout_abcdefgh_ver27 &
[1] 14255 ## this is the PID
$ grep Name /proc/14255/status
Name: aout_abcdefgh_v
Так что да, pgrep
без флагов считывает только первые 15 символов имени исполняемого файла. Для поиска полной командной строки, использованной для его запуска, вам нужен флаг -f
(из man pgrep
):
-f, --full
The pattern is normally only matched against the process name.
When -f is set, the full command line is used.
Итак, если вы используете -f
:
$ pgrep -f aout_abcdefgh_ver27
14255
Как насчет использования подоболочки:
$ (PATH="$PATH:$(readlink -f prog)"; myprog && myprog)
YES
YES
Это зависит от того, что вы считаете "временным". Например, вы можете просто выполнить:
$ PATH="$PATH":$(readlink -f prog)
И тогда вы сможете запускать myprog
до конца сеанса оболочки. Изменения, внесенные вами в PATH
, исчезнут, как только вы выйдете из системы. Вы можете просто открыть новый терминал - если работаете графически, или переключиться на другой tty, если нет - или запустить новую сессию:
$ bash
$ PATH="$PATH":$(readlink -f prog)
## Do your stuff here
$ exit
Другой способ выполнить то же самое:
PATH="$PATH":$(readlink -f prog) bash
Это запустит новую сессию bash с измененной переменной PATH. Как только вы закончите, выполните exit
, чтобы вернуться к родителю.
Если вы хотите, чтобы путь изменялся только на время действия команды.
Затем вам нужно устанавливать его для каждого вызова команды.
Идеально подходит для псевдонима:
alias myprog='PATH="$PATH":$(readlink -f prog) myprog'
Использовать как:
$ myprog && myprog
YES
YES
Конечно, функция с таким же именем не будет работать:
$ myprog(){ PATH="$PATH":$(readlink -f prog) myprog; } ### DO NOT USE !!
Я просто интересно, действительно ли вам это нужно. Если вы создаете сценарий внутри ~ / bin
(после входа в систему с созданным каталогом ~ / bin
), переменная PATH
уже будет включать этот путь, а скрипт будет выполнен, просто назвав его:
$ cd ~/bin ### create the dir if it didn't exist.
$ echo "echo YES" >> myprog
$ chmod u+x myprog
$ cd ~
$ myprog ### remember to reload ~/.bashrc (re-login).
YES