在 RHEL/CentOS 上,包管理器dnf
可以在包的名称和摘要中搜索字符串。我怎样才能告诉它只列出名称(或名称和摘要)中的匹配项,而不是仅列出摘要中的匹配项?
我想要做的是要求用户输入一行并发送到标准输出。
我尝试获取输入以执行条件问题,但无法扩展输入(在本例中是输入 0,但可以是输出 1 或错误 2)。在这种情况下,我想询问并从标准输入读取用户输入并发送到标准输入/输出,然后验证是否有某些东西(如果非零)。代码看起来像(在这种情况下可能看起来很困惑,您可以跳过并使用上面的描述)
#!/usr/bin/bash
read>&0
if [[ -n $my_input_expanded ]] ; then
echo "hello word"
fi
这里read
起到询问用户输入的作用(可以是另一个命令,但我不知道哪个可以在这里),变量 $my_input_expaded 是一些类似输入重定向的操作0>
(我知道这只是文件,但是是这样的),但重定向是输入的扩展。
我想将 shell 脚本的输出(包括用户输入的文本)发送到终端和日志文件。
我认为一些组合可能会做到这一点tee
,exec
但到目前为止我还没有运气。我知道tee
它本身可以回显并捕获用户在终端中输入的内容:
$ tee logfile
Hello (I entered this at runtime)
Hello (I entered this at runtime)
^C
$ cat logfile
Hello (I entered this at runtime)
但我需要查看(在终端和日志文件中)用户输入的内容以响应在 shell 脚本中调用的命令。
tee
似乎无法始终如一地做到这一点。
例如:
$ read message 2>&1 | tee logfile
Hello (I entered this at runtime)
$ cat logfile
那里什么也没拍到。我希望Hello (I entered this at runtime)
像以前一样在文件中看到。
我还尝试在 shell 脚本中结合tee
使用,如下所示:exec
$ cat test.bash
#!bin/bash
# Note: in this simplified version of this file, I’m not looking at $1, $2, or anything else passed in, but will need to eventually
rm -f logfile
exec &> >(tee -a logfile)
echo “Say \”Hello\”” 2>&1
read -p “> “ 2>&1
不幸的是,添加exec
没有帮助:
$ ./test.bash
Say “Hello”
> Hello (I entered this at runtime)
$ cat logfile
Say “Hello”
>
如您所见,它捕获了echo
命令和read
命令的输出,但没有捕获我为响应read
命令而输入到终端的内容。
有没有办法做到这一点?
我知道script
命令(“制作终端会话的打字稿”)可以捕获屏幕上的所有内容并将其放入日志文件中。但是script
无法从 shell 脚本中以有用的方式调用该命令。(它可以?)
script
需要首先调用,然后用户必须调用所需的 shell 脚本。但我希望用户只需调用一个命令及其参数,然后让该命令负责运行其他所有内容并记录所有内容。
然后是脚本捕获的所有“额外”信息(例如颜色代码、退格),这使得在任意文本编辑器中读取生成的日志文件变得很困难。
我只想查看日志文件中的“人类可读”字符。而且我不想查看用户是否更正了拼写错误。我只想看到他们完成编辑并按 Enter 后屏幕上显示“Hello”。虽然我认为额外的信息可以在捕获后被剥离。
我发现当我运行一个命令时,该命令执行具有连续输出行的软件,例如 tcpdump 或 tshark 之类的流量监视器,该命令会不断计数屏幕上的数字,例如 4、8、12 ... 等等。
command... | awk -F ' ' '{ANY COMMAND}'
我希望我的 bash 脚本在每行输出而不是每千行之后执行操作。我怎样才能做到这一点?
运行一个产生大量输出的软件时有一个很好的例子,你可以像这样放置管道运算符:
command... | awk -F ' ' '{print $1}'
它将计算从 0 到 1000+ 的数字,然后仅打印一次所有正确信息,但不会在脚本执行时立即打印。
如果我使用以下命令将输出放入文件中:
command... > file.txt
...然后当命令提供任何输出时,数据会立即出现。我想知道使用管道操作员时导致延迟的原因是什么?
我正在提取每日备份档案。我只想查看自最后一天以来的新文件。档案包含许多已经存在的文件,我不想覆盖这些文件,所以我使用该--skip-old-files
选项,这很好。
但我只想列出那些实际提取的文件,并省略那些因为它们已经存在而被跳过的文件。
例子:
我当前的命令是:
tar --verbose --skip-old-files --extract --file=2019-02-10.tar.gz
并且输出是(其中 file1 和 file2 已经存在,而 file3 是新的):
file1.zip
tar: file1.zip: skipping existing file
file2.zip
tar: file2.zip: skipping existing file
file3.zip
我只需要输出中的 file3.zip。可能吗?
说CTRL+D停止输入执行而CTRL+C停止输出显示(作为纯数据,不执行)是真的吗?
我有一个 LAMP 环境,/var/www/html/x
它是一个 MediaWiki 网站。我还有几个 MediaWiki 网站,但我想将其版本打印x
到终端。
我需要这样做,以便在手动更新 MediaWiki 之前知道最新版本是什么。
在该目录中,有一个以RELEASE-NOTES-1.32
文本命名的文件:
== MediaWiki 1.32 ==
=== 自 MediaWiki 1.32.0-rc.2 以来的变化 ===
MORE_TEXT…………
也许我应该只打印第 3 行,awk 'NR>3' /var/www/html/x/RELEASE-NOTES-*
但也许有更好的方法来了解给定 MediaWiki 安装的完整版本。
进行此输出的最佳,最稳定的方法是什么?