bash获取在管道符号之前使用的命令

时间:2018-09-16 21:44:00

标签: bash parameters pipe

对于已经使用程序输出的半成品脚本,我还需要用于传递到脚本的程序的名称和参数。

所以我这样运行它:     yay something | ./myscript 现在,我需要将“是的东西”存储到变量中。

有一种方法可以通过使用set -o history -o histexpandecho !!echo $0来获取先前运行的命令或当前命令,但这不包括我在管道之前写的内容。

也许您会建议将程序的名称及其参数作为参数传递给我的脚本,然后在其中运行它,但我不希望这样做(pass a command as an argument to bash script)。

1 个答案:

答案 0 :(得分:0)

更新后的解决方案(以下旧有):

#!/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(或yay或trizen之类的nano或包装助手一起使用,但不适用于echo,man或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实例所必需的,否则它将继续运行并最终干扰脚本的未来执行。