【问题标题】:referencing stdout in a command that has been piped into在已通过管道输入的命令中引用标准输出
【发布时间】:2016-03-24 00:57:17
【问题描述】:

我想做一个简单的 dmenu 命令来读取命令和名称的文件。然后获取名称并使用 dmenu 显示它们,然后获取 dmenu 的输出并再次使用该文件运行相关命令。

我已经到了 dmenu 显示名称的地步,但我真的不知道从那里去哪里。学习 bash 对我来说是一项非常艰巨的任务,我真的不知道从这个看似简单的脚本/命令开始。

这是文件:

Pushbullet
google-chrome-stable --app=https://www.pushbullet.com
Steam
steam
Chrome
google-chrome-stable
Libre Office
libreoffice
Transmission
transmission-qt
Audio Control Panel
sudo pavucontrol & bluberry

这是我目前的命令:

awk 'NR % 2 != 0' /home/rocco/programlist | dmenu | ??(grep -l "stdout" /home/rocco/programlist....)

我的想法是,我可以以某种方式将应用程序的名称输入到 grep 或 awk 中,然后获取行号,然后添加一个并将其输入到 sh 中。

谢谢

【问题讨论】:

标签: linux bash shell awk grep


【解决方案1】:

我没有使用 dmenu 的经验,但如果我了解它是如何正常工作的,那么这应该可以满足您的需求。将命令包装在 $(…) 中会将输出作为变量返回,我们可以将其传递给另一个命令。

#!/bin/bash
plist="/home/rocco/programlist"
# pipe every second line to dmenu
selected=$(awk 'NR % 2 != 0' "$plist" | dmenu)
# search for the selected item, get the command after it
cmd=$(grep -A1 "$selected" "$plist" | tail -n 1)
# run the command
$cmd

值得一提的是您的问题中有一个错误。 dmenu 发送到stdout 或标准输出,但下一个程序将读取stdin 或标准输入。在任何情况下,grep 无法在标准输入上采用模式,这就是为什么我将其保存到变量而不是尝试通过管道传递到某个地方。

【讨论】:

    【解决方案2】:

    假设您在工作目录中有programlist.txt,您可以使用:

    awk 'NR%2 !=0' programlist.txt |dmenu |awk '{system("grep --no-group-separator -A 1 '"'"'"$0"'"'"' programlist.txt");}' |awk '{if(NR==2){system($0);}}'

    注意在第一个 awk 调用中对 $0 的引用。这是获取名称中包含空格的必要条件,例如“Libre Office”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      相关资源
      最近更新 更多