小编iBu*_*Bug的帖子

`less` 如何从标准输入获取数据,同时仍然能够读取用户的命令?

正如大多数人已经做过很多次一样,使用less以下命令查看长文本很方便:

some_command | less
Run Code Online (Sandbox Code Playgroud)

现在它的标准输入连接到一个管道(FIFO)。它怎么还能读取像 up/down/quit 这样的命令?

less

48
推荐指数
2
解决办法
3593
查看次数

为什么不从 /dev/zero 读取计数为 IO_RBYTES?

我正在使用以下命令清空某些 Linux 4.x 操作系统上的硬盘驱动器:

sudo sh -c 'pv -pterb /dev/zero > /dev/sda'
Run Code Online (Sandbox Code Playgroud)

我打开另一个 tty 并开始sudo htop注意到这一点:

  PID USER      PRI  NI CPU%   RES   SHR   IO_RBYTES   IO_WBYTES S   TIME+  Command
 4598 root       20   0 15.5  1820  1596        4096    17223823 D  1:14.11 pv -pterb /dev/zero
Run Code Online (Sandbox Code Playgroud)

的值IO_WBYTES看起来很正常,但IO_RBYTES保持在 4 KiB 并且永远不会改变。

例如,我运行了一些其他程序

dd if=/dev/zero of=/dev/zero
cat /dev/zero > /dev/zero
Run Code Online (Sandbox Code Playgroud)

并且惊讶地发现它们中没有一个生成大量IO_RBYTESor IO_WBYTES

我认为这不是特定于任何程序的,但是为什么不读取/dev/zero和写入以/dev/{zero,null}计为 I/O 字节?

linux io devices null

26
推荐指数
1
解决办法
3005
查看次数

程序是否可以在 POSIX 中获取命令行参数之间的空格数?

假设我用以下行编写了一个程序:

int main(int argc, char** argv)
Run Code Online (Sandbox Code Playgroud)

现在它通过检查argv.

程序可以检测参数之间有多少个空格吗?就像我在 bash 中输入这些一样:

ibug@linux:~ $ ./myprog aaa bbb
ibug@linux:~ $ ./myprog       aaa      bbb
Run Code Online (Sandbox Code Playgroud)

环境是现代 Linux(如 Ubuntu 16.04),但我想答案应该适用于任何符合 POSIX 的系统。

command-line shell programming

23
推荐指数
4
解决办法
4405
查看次数

防止自动 EOF 到命名管道,并在需要时发送 EOF

我有一个程序在读取给定流中的 EOF 时自动退出(在以下情况下为 stdin )。
现在我想制作一个 shell 脚本,它创建一个命名管道并将程序的 stdin 连接到它。然后脚本使用and (以及其他在退出时自动生成 EOF 的工具)多次写入管道。我面临的问题是,当第一个完成时,它会向管道发送一个 EOF 并使程序退出。如果我使用类似的东西,那么当我打算退出程序时,我将无法发送 EOF。我正在研究一个平衡的解决方案,但无济于事。 我已经找到了如何防止 EOF 以及如何手动发送 EOF,但我无法将它们结合起来。有什么提示吗? echocatechotail -f

#!/bin/sh
mkfifo P
program < P & : # Run in background
# < P tail -n +1 -f | program
echo some stuff > P # Prevent EOF?
cat more_stuff.txt > P # Prevent EOF?
send_eof > P # How can I do this?
# fg
Run Code Online (Sandbox Code Playgroud)

shell-script text-processing fifo

18
推荐指数
1
解决办法
6796
查看次数

为什么目录的读取权限不显示索引节点号?

据我了解,目录的“读取”权限允许列出该目录下的所有名称,仅此而已。

基于对 FS 设计的普遍理解,如果一个目录存储为文件,那么它的内容除了文件名之外,还至少应该包含对其 inode 的引用。使用 Unix 的“一切都是文件”哲学,“读取”权限授予对目录本身的“文件内容”的访问权限,因此应该足以检索每个文件的索引节点号。然而,这种情况并非如此。

我在这里缺少什么?

filesystems permissions directory inode

15
推荐指数
3
解决办法
1361
查看次数

用正则表达式匹配特殊字符

说如果我想找到包含小写字母和数字的东西,这很容易

生产文本| grep -E '[0-9a-z]'

括号对于匹配一组字符很有用,但是那些有点特殊的呢?
如果我想使用括号,匹配任何字符,但其中之一:一个右括号],破折号(或连字符)“ - ”,两个斜线/\,插入符号^,一个冒号:
它看起来像这样(我知道这行不通)?

[^]-/\^:]

regular-expression

10
推荐指数
2
解决办法
4285
查看次数

“ld”和“ld.so”之间的区别?

虽然两者都被称为“链接器”并用于链接二进制文件,但我真的无法弄清楚它们之间的区别。谁能告诉我他们的区别?

linker ld

10
推荐指数
1
解决办法
3809
查看次数

SetUID 位在 Ubuntu 中不起作用?

我想设置了 SetUID 位的可执行文件应该以其所有者身份运行,但我无法真正重现它。我尝试了以下方法。

$ cat prepare.sh
cp /bin/bash 。
chown root.root bash
chmod 4770 bash # 已验证
$ sudo sh prepare.sh
$ ./bash
$ id -u
1000
$退出
$
$ cat test.c
#include<stdio.h>
#include<unistd.h>
int main(){
    printf("%d,%d\n", getuid(), geteuid());
    返回0;
}
$ gcc -o test test.c
$ chmod 4770 测试 # 验证
$ sudo chown root.root 测试
$ ./测试
1000,1000
$# 为什么???

然而

$苏
# ./bash
# id -u
0
# 。/测试
0,0
# 出口
# 出口
$

注意:挂载点没有nosuid …

setuid

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

`less` 在从 Bash 和 Git 调用时表现不同

当我查看一个很大的差异时git diff,它会被分页less。这是通过打开另一个窗口,从检查的数据证实ps -aux/proc

但是,当less被 Git 调用时,它不会将终端内容在命中后恢复到之前的状态q(差异内容保留在终端中)。但是当我这样做时

git diff commit1 commit2 --color | less -R
Run Code Online (Sandbox Code Playgroud)

并按less键退出q,内容消失,终端恢复到之前的状态。

更有趣的是,如果我做这些

export PAGER=less LESS='-R'
Run Code Online (Sandbox Code Playgroud)

和 invoke git diff(或任何其他调用寻呼机的命令)的less行为与直接从 Bash shell 调用一样。

一世

这是描述我的问题的简短屏幕截图。在左侧窗格中,命令执行如下:

unset PAGER GIT_PAGER LESS
git diff HEAD^ HEAD
Run Code Online (Sandbox Code Playgroud)

在右侧窗格中,您会看到命令。最新的提交是 100 多行y写入文件。在两个窗格上less都使用 key 退出q

谁能告诉我有什么不同并解释为什么?

less git

6
推荐指数
1
解决办法
1128
查看次数

为什么即使 /etc/sudoers 中没有写入“NOPASSWD:ALL”,root 也不需要密码来运行“sudo”

在 中/etc/sudoers,总是有:

root    ALL=(ALL:ALL) ALL
Run Code Online (Sandbox Code Playgroud)

但是,root 用户(UID 为 0)在运行时不需要输入密码sudo command

对于其他用户,除非他们的条目包含NOPASSWD或之前的身份验证未超时,否则需要密码:

user    ALL=(ALL:ALL) NOPASSWD:ALL
                      ^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

linux root sudo

6
推荐指数
1
解决办法
1058
查看次数