Bash one-liner для временного добавления пути для цепочки команд без дополнительного вызова bash?

Проблема в том, что по умолчанию 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
4
26.03.2016, 17:34
3 ответа

Как насчет использования подоболочки:

$ (PATH="$PATH:$(readlink -f prog)"; myprog && myprog)
YES
YES
7
27.01.2020, 20:50

Это зависит от того, что вы считаете "временным". Например, вы можете просто выполнить:

$ 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, чтобы вернуться к родителю.

1
27.01.2020, 20:50

Если вы хотите, чтобы путь изменялся только на время действия команды.
Затем вам нужно устанавливать его для каждого вызова команды.
Идеально подходит для псевдонима:

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
0
27.01.2020, 20:50

Теги

Похожие вопросы