gpt4 book ai didi

bash - 使用 bash 命令(带管道)的输出作为另一个命令的参数

转载 作者:行者123 更新时间:2023-11-29 08:51:05 25 4
gpt4 key购买 nike

我正在寻找一种方法来使用命令(比如 command1)的输出作为另一个命令(比如 command2)的参数。

我在尝试 grep who 命令但使用另一组命令(实际上是 tty)给出的模式时遇到了这个问题通过管道传输到 sed)。

上下文:

如果 tty 显示:

/dev/pts/5

显示:

root     pts/4        2012-01-15 16:01 (xxxx)
root pts/5 2012-02-25 10:02 (yyyy)
root pts/2 2012-03-09 12:03 (zzzz)

目标:

我只想要有关“pts/5”的行所以我将 tty 通过管道传输到 sed,如下所示:

$ tty | sed 's/\/dev\///'
pts/5

测试:

尝试的以下命令不起作用:

$ who | grep $(echo $(tty) | sed 's/\/dev\///')"

可能的解决方案:

我发现以下工作正常:

$ eval "who | grep $(echo $(tty) | sed 's/\/dev\///')"

但我确信可以避免使用 eval

作为最后一个边节点:我注意到 who 的“-m”参数给出了我想要的(只得到 who 行code> 链接到当前用户)。但我仍然很好奇如何让这种管道和命令嵌套的组合发挥作用......

最佳答案

通常使用 xargs使一个命令的输出成为另一个命令的选项。例如:

$ cat command1
#!/bin/sh

echo "one"
echo "two"
echo "three"

$ cat command2
#!/bin/sh

printf '1 = %s\n' "$1"

$ ./command1 | xargs -n 1 ./command2
1 = one
1 = two
1 = three
$

但是……虽然这是您的问题,但这并不是您真正想知道的。

如果您不介意将您的 tty 存储在一个变量中,您可以使用 bash 变量重整来进行替换:

$ tty=`tty`; who | grep -w "${tty#/dev/}"
ghoti pts/198 Mar 8 17:01 (:0.0)

(你想要 -w 因为如果你在 pts/6 上你不应该看到 pts/60 的登录。)

您仅限于在变量中执行此操作,因为如果您尝试将 tty 命令放入管道,它会认为它不再与终端相关联地运行。

$ true | echo `tty | sed 's:/dev/::'`
not a tty
$

请注意,到目前为止,此答案中没有任何内容是特定于 bash 的。由于您使用的是 bash,因此解决此问题的另一种方法是使用进程替换。例如,虽然这不起作用:

$ who | grep "$(tty | sed 's:/dev/::')"

这样做:

$ grep $(tty | sed 's:/dev/::') < <(who)

关于bash - 使用 bash 命令(带管道)的输出作为另一个命令的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9635705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com