相关疑难解决方法(0)

如何将输出从一个进程传送到另一个进程,但仅在第一个进程有输出时才执行?

如果有输出,我如何将此命令重写为仅电子邮件mailq | grep

mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -s 'dd' email@email
Run Code Online (Sandbox Code Playgroud)

这甚至可以在一条线上吗?

如果不是比发送电子邮件更一般的情况,请参阅检查管道是否为空并在数据上运行命令

shell pipe

24
推荐指数
5
解决办法
9112
查看次数

当没有找到任何东西时,使查找失败

find被调用以找不到任何内容时,它仍然以代码 0 退出。有没有办法让它在没有找到文件时返回一个指示失败的退出代码?

find exit-status

13
推荐指数
1
解决办法
4322
查看次数

如何使管道等待文件结束或在出错后停止?

在观看有关管道恶作剧的视频后,我尝试了以下命令。

man -k . | dmenu -l 20 | awk '{print $1}' | xargs -r man -Tpdf | zathura -
Run Code Online (Sandbox Code Playgroud)

它基本上将联机帮助页列表打印到 dmenu 供用户选择其中一个,然后使用 xargs 运行man -Tpdf %(从 xargs 的输入打印到标准输出联机帮助页 git 的 pdf)并将 pdf 传递给 pdf 阅读器(zathura )。

问题是(如您在视频中看到的)pdf 阅读器甚至在我在 dmenu 中选择一个联机帮助页之前就已启动。如果我单击 Esc 并选择无,则 pdf 阅读器仍处于打开状态,根本不显示任何文档。

如何使 pdf 阅读器(以及管道链中的任何其他命令)仅在其输入到达文件结尾或接收到输入时才运行?或者,或者,在链接的命令之一返回非零退出状态后,如何使管道链停止(以便如果 dmenu 返回未选择选项的错误,则不会运行以下命令)?

scripting pipe shell-script

12
推荐指数
3
解决办法
1526
查看次数

我如何分解像 split 到 stdout 这样的文件以通过管道传输到命令?

我有一个大.sql文件,里面装满了SELECT我想插入到我的 SQL Server 数据库中的数据的语句。我正在寻找如何基本上获取文件的内容,一次 100 行,并将其传递给我设置的命令来完成其余的工作。

基本上,我正在寻找split将输出到stdout,而不是文件。

我也在 Windows 上使用 CygWin,所以我无法访问全套工具。

shell text-processing split stdout

8
推荐指数
3
解决办法
5667
查看次数

如果标准输出上有任何输出,如何在标准输出之前打印条件标题

我有一个从目录中过滤文件列表的进程(find检查是否有超过特定时间段的文件以显示队列卡住了)。它可能会也可能不会返回任何东西,如果确实如此,则将其邮寄给cron.

我想知道的是,是否有一个程序或简单的bash方法可以将此输出通过管道传输到其中,并且如果有任何输出通过它,则在前面添加一个标题行(例如“这些是卡在队列中的文件”)。

shell pipe email text-processing

7
推荐指数
2
解决办法
671
查看次数

如果前一个命令失败,则退出管道

我试图通过解析输出,检查运行和排队的PBS作业的数量qstat -tn1bash脚本。到目前为止,这已经奏效:

count ()
{
    qstat -tn1 | awk '
        BEGIN { R = 0; Q = 0; }
        $10 == "R" { R++ }
        $10 == "Q" { Q++ }
        END { print R, Q }'
}

if read -r R Q < <(count)
    ...
Run Code Online (Sandbox Code Playgroud)

但是,我看到qstat偶尔会因未知原因而失败。在这种情况下,它不会向 打印任何内容stdout和一些错误消息stderr,并以非零状态(相当标准)退出。但是,awk不知道qstat失败了,并且很高兴地打印0 0了它收到的空输入。然后read将 0 分配给两者,R并且Q不知道qstat实际上失败了。

  1. 我需要在脚本块中初始化RQ使用 …

linux scripting bash

5
推荐指数
1
解决办法
2589
查看次数

测试命令的输出是否为空字符串,如果不为空则打印其结果

我正在使用“测试命令是否输出空字符串”中的解决方案。除了这些解决方案之外,我想打印命令的输出(如果它不为空)。

我想知道如果命令的输出不为空,是否可以通过仅调用命令一次来打印命令的输出。

我可以通过在 中重新调用相同的命令来完成此操作if condition,但现在第二次调用可能会消耗额外的 CPU 使用率,因为我们已经获得了其结果。


可能的方法是,同一命令被调用两次:

if [[ $(ls -A) ]]; then
    ls -A
else
    echo "no files found"
fi
Run Code Online (Sandbox Code Playgroud)
output=$(git diff --ignore-blank-lines --color-words HEAD | tr -d ' \n\r\t ' | wc -c)
if [ "$output" -gt 0 ]; then
    git diff --ignore-blank-lines --color-words HEAD 
else
    echo "diff is empty"
fi
Run Code Online (Sandbox Code Playgroud)

zsh test

4
推荐指数
1
解决办法
2万
查看次数

sh 脚本,循环直到标准输入关闭 - 我该如何测试它?

我正在尝试通过管道传递输入流,并希望捕获下游管道程序可能失败的情况,在这种情况下我需要重新启动它。所以我把它放到一个循环中:

step1 |while true ; do step2 ; done
Run Code Online (Sandbox Code Playgroud)

但是如果上游管道关闭,那么我希望该循环退出。我无法从 step2 的退出状态中看出这一点,否则我可能会说

step1 |until [ $? -ne 0 ] ; do step2 ; done
Run Code Online (Sandbox Code Playgroud)

我需要一个测试来检查 stdin 是否已关闭但实际上并未消耗 stdin 中的字符。

我正在考虑如何在 C 中做到这一点。零缓冲区的 read(2) 是否允许我对此进行测试?我不认为它。选择(2)怎么样?不。或者是吗?fcntl(2) 怎么样?我找不到任何东西。

除了消耗一个字节然后以某种方式再次将其取出之外,真的没有其他方法吗?没有关闭文件描述符测试?

shell stdin

2
推荐指数
1
解决办法
93
查看次数

标签 统计

shell ×4

pipe ×3

scripting ×2

text-processing ×2

bash ×1

email ×1

exit-status ×1

find ×1

linux ×1

shell-script ×1

split ×1

stdin ×1

stdout ×1

test ×1

zsh ×1