【问题标题】:bash get command that was used before pipe symbol在管道符号之前使用的 bash get 命令
【发布时间】:2018-09-16 21:44:00
【问题描述】:

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

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

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

也许你会建议将程序的名称和它的参数作为参数传递给我的脚本,然后在那里运行它,但我不想要这个 (pass a command as an argument to bash script)。

【问题讨论】:

  • 无法完成。这些是完全独立的过程;他们彼此不了解,或者除了前者的标准输出被定向到后者的标准输入之外,还有任何通信方式。也就是说,上下文是什么?将整个管道封装到一个函数中并不少见。
  • ...如果您向我们展示了更多关于您要实现的更大目标的信息,我们可以描述解决该问题的常规方法。顺便说一句,请注意 history 和朋友无论如何不能保证在脚本或其他非交互式 shell 中工作。
  • ...f/e,调用./myscript yay something 通常更合适(常规等),并让myscript 负责从使用参数调用的命令重定向其标准输入就在眼前。
  • ...如果myscript 在shebang f/e 之前有exec < <(exec "$@") 行,那将执行我刚刚描述的重定向(重新指向stdin 来自具有来自其参数的程序)命令行)。
  • 顺便说一句,只是为了证明在一般情况下你所要求的是不可能的,想想yay something | ssh somehost ./myscript。从./myscript 的角度来看,yay something 甚至不在同一台计算机上运行;它无法可能确定该标准输入的来源。在许多其他情况下,您也会遇到同样的问题——想想你有p1 = subprocess.Popen(['yay', 'something'], stdout=PIPE); p2 = subprocess.Popen(['./myscript'], stdin=p1.stdout) 的 Python 或 C 代码——现在你有两个命令一起通过管道传输,但是没有 的 shell曾经连接过他们。

标签: bash parameters pipe


【解决方案1】:

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

#!/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 将为空。

旧文字:

感谢 Charles 付出的巨大努力以及最终将我引至 processes=$(&gt; &gt;(ps -f)) 的链接。 这是一个工作示例。你可以例如将它与vi test | ./testprocesses 一起使用(或 nano 或像 yay 或 trizen 这样的包助手,但它不适用于 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 实例所必需的,否则它仍将运行并最终干扰脚本的未来执行。

【讨论】:

  • 考虑运行shellcheck.net 并解决它发现的问题——主要是由于缺乏对echo 参数引用的副作用。 (要了解为什么这很重要,请参阅 I just assigned a variable but echo $variable shows something else!
  • 感谢您的建议。我想知道如何保留该表格视图,事实证明,当使用“”时它会被保留..呵呵。好吧,多亏了这一点,我可以添加一个更好的解决方案。编辑:更新了上面的答案。
  • 顺便说一句,在编辑时可以直接替换内容——旧版本和它们之间的差异仍然可以通过点击“edited [at time]”链接看到。
  • 是的,但旧的工作可靠,这就是我保留它的原因。我有几个更新版本,一段时间后我遇到了一些严重的错误,这些错误不值得保留。我刚刚更新的当前版本应该非常可靠。它仍然不适用于 echo,man 或 cat,但我想想要的人可以弄清楚。也许我会在有时间并发布更新时尝试一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 2015-05-25
  • 2012-06-07
  • 2011-11-11
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多