【发布时间】:2018-09-16 21:44:00
【问题描述】:
对于已经使用程序输出的半成品脚本,我还需要用于管道传输到我的脚本的程序的名称和参数。
所以我这样运行它:
yay something | ./myscript
现在我需要将“yay something”存储到一个变量中。
有一种方法可以使用set -o history -o histexpand 和echo !! 或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