我开始在后台下载一个大文件使用
$ nohup wget http://example.tld/big.iso &
Run Code Online (Sandbox Code Playgroud)
这也给了我一个nohup.out包含wget.
现在,如果我以后想观看下载过程,我可以使用,$ tail -f nohup.out但这会比我希望的更快地填满我的终端窗口。我想看到的是最后一行不断更新(就像wget单独使用时一样)。
我试过了,$ tail -n 1 -f nohup.out但它似乎只影响最初的tailin'。
一般来说,如果可以限制(在这种情况下为 1)命令的输出可用/可见的行数,它将解决这个问题。有点在循环缓冲区中输出- 想想正常的进度条$ wget example.tld/big.iso会打印。
有这样的解决方案吗?
还是我爬树的方式不对?(意思是,限制nohup输出或做其他事情会更容易吗?)
可能的重复:
Bash while 循环和从管道读取
我来自 Web 编程背景,发现自己对使用本地 shell 的一个特性很感兴趣。我知道当程序从文件中读取时,它可以以任何必要的速率读取。但是我很想知道,当一个程序通过管道接收其他程序的输入并且无法实时处理它时,它是如何工作的?
一个很好的例子是视频编码。假设我将解码器指向视频文件,然后它的输出作为编码器的输入通过管道输入。解码视频的总大小超过 ram+swap,所以我想没有办法完全缓冲它。我发现了对 stdin 和 stdout 的读写调用,但我很想知道当这个例子的编码器不能同时处理所有数据时实际发生了什么。它是否以某种方式通知解码器所需的速率?解码器程序是否需要专门为这样的信号准备并相应地修改它的处理速度?如果没有,最后如何平衡?
我想要一个程序P,它从 读取stdin和写入stdout,但将它连接到nc或任何其他端口,以便它从某个端口读取并输出到另一个端口。
# The reading is easy, here P reads from port 50505
nc -l 50505 | P
Run Code Online (Sandbox Code Playgroud)
我如何让它写回端口 60606?
侏儒终端:
$ sudo update-grub
[sudo] password for user:
Generating grub configuration file ...
Found background image: .background_cache.png
Found linux image: /boot/vmlinuz-3.16.0-4-amd64
Found initrd image: /boot/initrd.img-3.16.0-4-amd64
done
Run Code Online (Sandbox Code Playgroud)
从tty1由作为访问Ctrl+ Alt+ F1:
$ sudo update-grub
[sudo] password for user:
Generating grub configuration file ...
Found background image: .background_cache.png
Found linux image: /boot/vmlinuz-3.16.0-4-amd64
Found initrd image: /boot/initrd.img-3.16.0-4-amd64
[ 1603.545926] EXT4-fs (sda2): unable to read superblock
... (repeats twice)
[ 1603.560671] FAT-fs (sda2): invalid media value (0x4c)
... (repeats once)
[ …Run Code Online (Sandbox Code Playgroud) 编写命令行应用程序时是否有使用错误的指南?令我惊讶的是,我在谷歌搜索时没有找到任何东西。
特别是,我现在关心的问题是是否使用stdout或stderr用户何时使用非法参数调用程序。但是,非常感谢更全面的答案,因为这肯定不是需要明确规则来编写按照用户期望的方式运行的程序的唯一情况。
我在看一本书,上面写着:
每个进程至少有三个可用的通信通道:“标准输入”(STDIN)、“标准输出”(STDOUT)和“标准错误”(STDERR)。
大多数命令接受来自 STDIN 的输入并将其输出写入 STDOUT。他们将错误消息写入 STDERR。此约定允许您像构建块一样将命令串在一起以创建复合管道。
Shell 将符号
<、>和解释>>为将命令的输入或输出重新路由到文件或从文件重新路由的指令。要将一个命令的 STDOUT 连接到另一个命令的 STDIN,请使用
|通常称为管道的符号。Run Code Online (Sandbox Code Playgroud)ps -ef | grep httpd
所以基本上这就是说标准输入是一个允许用户写入文件的命令,而标准输出是一个命令让 bash shell 将输出写入 shell,而标准错误就像输出一样,但它只是当文件系统出现错误时调用。然后我们到了连接 STDOUT 和 STDIN 的部分,我迷路了。
如果您从终端启动应用程序,您可以看到 stdout 和 stderr 的输出,但是如果应用程序从窗口管理器启动,那么这些文件的输出通常会去哪里?到 /dev/null?
我想知道子进程的默认标准输入和标准输出是什么(如果有这样的默认值)。子进程的 stdin 和 stdout 是否与其父进程相同?这是从父母那里继承的东西还是父母设置的东西?还是子进程的标准输入和标准输出插入父进程的标准输入和标准输出?
在我的理解中,父母和孩子不是通过管道传输的,而是首先是克隆,所以我认为孩子的标准输入和标准输出与父母完全一样,但我不确定。
例如,在bash作为登录 shell运行的终端中,如果我键入sh它将创建一个子 shell 进程,它将作为 stdin 键盘和 stdout 终端屏幕,因此与其父进程相同。我想了解孩子的标准输入和标准输出是如何定义的以及它们是什么。
我想知道例如在这种情况下,如果孩子的标准输入和标准输出与父母的标准输入一样,这是因为父母的标准输入通过管道传输到孩子的标准输入中,而父母只是将其输入“重定向”给孩子,或者孩子是否得到了它的直接从键盘输入。
在同样的情况下,如果父级和子级具有相同的标准输入,这是否意味着父级处理输入给子级的相同命令?为什么我们只能在终端中看到孩子的标准输入/输出而不是它的父母?
我在 C++ 代码 (prog2) 上运行内存检查工具 (prog1),这两者都给了我一个巨大而详细的输出。为了解决一些错误,我需要将此输出保存到文件中。
我尝试将标准输出重定向到一个文件:
prog1 prog2 > outfile.txt
Run Code Online (Sandbox Code Playgroud)
但这给了我一个包含 prog2 输出的文件,而 prog1 的输出仍然到终端。
任何人都知道一种指定我希望两个输出都转到文件的方法吗?喜欢(prog1 prog2) > outfile.txt?
我想使用 keepassxc 向 neomutt 进行身份验证。我找不到将密码发送到 neomutt 的标准输入的方法。我怎样才能做到这一点 ?
我想象这样的事情:
keepassxc-cli exportpass mydatabase.kdbx mymail@gmail.com
Run Code Online (Sandbox Code Playgroud)
最终输出将是密码本身。我怎样才能做到这一点?
编辑:我已经发现了keepassxc-cli show Database.kdbx accounts.google.com。但它不显示密码。相反,它返回PROTECTED.
谢谢你的帮助