正如大多数人已经做过很多次一样,使用less以下命令查看长文本很方便:
some_command | less
Run Code Online (Sandbox Code Playgroud)
现在它的标准输入连接到一个管道(FIFO)。它怎么还能读取像 up/down/quit 这样的命令?
我正在使用以下命令清空某些 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 字节?
假设我用以下行编写了一个程序:
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 的系统。
我有一个程序在读取给定流中的 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) 据我了解,目录的“读取”权限允许列出该目录下的所有名称,仅此而已。
基于对 FS 设计的普遍理解,如果一个目录存储为文件,那么它的内容除了文件名之外,还至少应该包含对其 inode 的引用。使用 Unix 的“一切都是文件”哲学,“读取”权限授予对目录本身的“文件内容”的访问权限,因此应该足以检索每个文件的索引节点号。然而,这种情况并非如此。
我在这里缺少什么?
说如果我想找到包含小写字母和数字的东西,这很容易
生产文本| grep -E '[0-9a-z]'
括号对于匹配一组字符很有用,但是那些有点特殊的呢?
如果我想使用括号,匹配任何字符,但其中之一:一个右括号],破折号(或连字符)“ - ”,两个斜线/和\,插入符号^,一个冒号:。
它看起来像这样(我知道这行不通)?
[^]-/\^:]
虽然两者都被称为“链接器”并用于链接二进制文件,但我真的无法弄清楚它们之间的区别。谁能告诉我他们的区别?
我想设置了 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 …
当我查看一个很大的差异时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。
谁能告诉我有什么不同并解释为什么?
在 中/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) less ×2
linux ×2
command-line ×1
devices ×1
directory ×1
fifo ×1
filesystems ×1
git ×1
inode ×1
io ×1
ld ×1
linker ×1
null ×1
permissions ×1
programming ×1
root ×1
setuid ×1
shell ×1
shell-script ×1
sudo ×1