假设我运行了一些进程:
#!/usr/bin/env bash
foo &
bar &
baz &
wait;
Run Code Online (Sandbox Code Playgroud)
我像这样运行上面的脚本:
foobarbaz | cat
Run Code Online (Sandbox Code Playgroud)
据我所知,当任何进程写入 stdout/stderr 时,它们的输出永远不会交错——stdio 的每一行似乎都是原子的。这是如何运作的?什么实用程序控制每行的原子性?
假设一个输出文件列表的脚本:
$> bash someScript.sh
path/to/some/file
path/to/the/file/i/want/to/work/with
path/to/yet/another/file
Run Code Online (Sandbox Code Playgroud)
现在我想将第二个文件路径作为另一个命令的参数,例如vim. 有没有办法直接访问它?
我想指出,我不一定要访问第二个文件,但下次可能是第三个或第 27 个。我希望能够尽可能轻松地选择第 N 行。
现在我用鼠标选择并通过单击鼠标中键插入或使用制表符完成输入路径。现在我想知道是否有更简单的方法。
我自己的解决方案的问题是我必须以这种方式编辑我的所有脚本。如果有一个更通用的解决方案来解决这个问题会很有趣,它可以与任何类型的命令一起使用,例如find.
我偶然发现了这个问题,所以我想知道这怎么可能?
命令的标准运行:
# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14
info from server: "Processed 0 Failed 1 Total 1 Seconds spent 0.000017"
sent: 1; skipped: 0; total: 1Run Code Online (Sandbox Code Playgroud)
好的,让我们尝试只获取第一行:
# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 | head -1
sent: 1; skipped: 0; total: 1Run Code Online (Sandbox Code Playgroud)
标准头呢?
# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 | head
sent: 1; skipped: 0; total: 1Run Code Online (Sandbox Code Playgroud)
反向grep?sed?球座?!?!?!!?
# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 | grep -v pero
sent: 1; skipped: 0; …Run Code Online (Sandbox Code Playgroud) 如何将命令的结果附加到文件并将 stderr 重定向到 null?
unbuffer(1) 和 stdbuf(1) 之间有区别吗?从我收集的信息来看,unbuffer 不仅仅是在开始时调用 libc 函数 set(X)buf 的“最大努力”,然后让事情发生?
echo 'main(){}' | gcc -xc - -o /dev/stdout | ???
Run Code Online (Sandbox Code Playgroud)
有没有办法在类 Unix 系统上运行输出二进制文件?
编辑:我需要它在沙盒环境中运行 g++ 的输出,在那里我不能写任何文件(我保证没有恶意)。
假设您打开了一个终端仿真器 (T1),PID 为 6350。
从另一个终端,键入以下命令 (C1):
echo "ls\n" > /proc/6350/fd/0
Run Code Online (Sandbox Code Playgroud)
这会写入lsT1 中的新行,但不会执行它。为什么?
我也尝试使用cat|bashwithecho "ls\n" > /proc/catid/fd/0但它仍然没有执行。
如何将命令回显到另一个终端并执行命令?
可能的答案:
$ mkfifo toto;
$ bash < toto;
$ echo "ls" > toto;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您不能再直接在终端中写入(所有内容的显示方式都与命令 (C1) 在此终端中显示的内容相同。
我需要检查一些笔记本电脑的键盘按键是否有问题,所以我想尽可能地加快速度。
对于这个特定的任务,我没有找到任何东西,所以我的想法是一个脚本,它读取按下的键并知道所有的键盘键,所以我可以快速敲击它们并报告哪些尚未按下。我想我可以使用showkeyor来完成xev,grepping 输出:
xev | grep keysym
Run Code Online (Sandbox Code Playgroud)
示例输出:
state 0x10, keycode 46 (keysym 0x6c, l), same_screen YES,
state 0x10, keycode 33 (keysym 0x70, p), same_screen YES,
state 0x11, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
state 0x10, keycode 51 (keysym 0x5d, bracketright), same_screen YES,
state 0x10, keycode 36 (keysym 0xff0d, Return), same_screen YES,
Run Code Online (Sandbox Code Playgroud)
可读的键符非常有用,但我一直在测试键码,因为它们不会随着修饰键的打开/关闭(大写锁定、数字锁定)而改变。我是 bash 新手,所以我正在整理一些东西。这是迄今为止最好的结果:
#!/bin/bash
function findInArray() {
local n=$#
local value=${!n}
for ((i=1;i < $#;i++)) {
if [[ ${!i} == ${value}* ]]; then …Run Code Online (Sandbox Code Playgroud) 除了使用临时文件来提供帮助之外,是否有一种方法/程序可以缓冲输入,stdin但在获取EOF. 我也不想使用 shell 变量(例如buffer=$(cat))。
该程序应如下所示(假设程序名称为buffered-cat):
$ buffered-cat
line 1
line 2
line 3
^D # Ctr-D here(End of Line)
Run Code Online (Sandbox Code Playgroud)
现在程序收到了^D,buffered-cat输出内容
line 1
line 2
line 3
Run Code Online (Sandbox Code Playgroud) 我给了一个问题的答案,并评论它,让我阅读的基本定义的POSIX一致性部分弄清楚是否/dev/stdin,/dev/stdout而/dev/stderr实际上需要符合POSIX标准。
事实证明他们不是:
系统可能提供非标准扩展。这些是 POSIX.1-2008 不需要的功能,可能包括但不限于: [...] 具有特殊属性的附加字符特殊文件(例如
/dev/stdin,/dev/stdout、 和/dev/stderr)
据我所知,这是标准中唯一提到这些文件的地方。
我只能访问一个没有实现它们的“系统”(环境,真的),那就是 Windows 上的 MinGW(/dev就我所见,根本没有)。据我所知,所有免费的 Unices 都有,Cygwin、Windows 的新 Linux 环境和 Darwin/macOS 也有。
不过,我对商业 Unices 并不熟悉。
是否有一个 POSIX 系统、Unix 或某种描述的类 Unix 环境,今天还活着,它没有实现/dev/stdin, /dev/stdout, 和/dev/stderr作为文件系统中的文件?