Команда bash get, которая использовалась перед символом канала - PullRequest
0 голосов
/ 17 сентября 2018

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

Поэтому я запускаю его так:yay something | ./myscript Теперь мне нужно сохранить «yay что-то» в переменной.

Существует способ получить предыдущие запущенные команды или текущую команду, используя set -o history -o histexpand и echo !! или echo $0, но это не включает в себя то, что я написал прямо перед конвейером.

Может быть, вы предложите передать имя программы и ее параметр моему сценарию в качестве параметров, а затем запустить его там, но я не хочу этого ( передать команду в качестве аргумента сценарию bash).

1 Ответ

0 голосов
/ 22 сентября 2018

ОБНОВЛЕННОЕ РЕШЕНИЕ (старое ниже):

#!/bin/bash -i

#get processes
processes=$(> >(ps -f))

echo beginning:
echo "$processes"

#filter bin/bash -i
pac=$(echo "$processes" | sed '1,/bin\/bash -i/!d')
pac=$(echo "$pac" | tail -2 | head -1)


#kill
delete=$(echo $pac | grep -oP "(?<=$USER\s)\w+")
pac=$(echo "$pac" | grep -o -P '(?<=00:00:00).*(?=)')
echo "$delete"
kill -9 "$delete"

#print
echo " "
echo end:
echo "${pac:1}"

Примечание. Когда вы используете echo, man или cat, $ pac будет пустым.

СТАРЫЙ Текст:

Спасибо Чарльзу за его огромные усилия и его связь, которая в конечном итоге привела меня к processes=$(> >(ps -f)). Вот рабочий пример. Вы можете, например, используйте его с vi test | ./testprocesses (или с nano или помощниками пакетов, такими как yay или trizen, но он не будет работать ни с echo, ни с человеком, ни с cat):

#!/bin/bash -i

#get processes
processes=$(> >(ps -f))

echo beginning:
echo $processes

#filter
pac=$(echo $processes | grep -o -P '(?<=CM).*(?=testprocesses)' | grep -o -P '(?<=D).*(?=testprocesses)' | grep -o -P "(?<=00:00:00).*(?=$USER)")

#kill
delete=$(echo $pac | grep -oP "(?<=$USER\s)\w+")
pac=$(echo $pac | grep -o -P '(?<=00:00:00).*(?=)')
kill -9 $delete

#print
echo " "
echo end:
echo $pac

Часть kill необходима для уничтожения экземпляра vi, иначе он все еще будет работать и в конечном итоге мешать выполнению сценария в будущем.

...