小编Geo*_*iou的帖子

BASH 和回车行为

我有一个简单的问题。
bash(我使用的是 4.4.11)不显示分隔/以纯文本结尾的行/文本是否正常\r

看到这种行为,我有点惊讶:

$ a=$(printf "hello\ragain\rgeorge\r\n")
$ echo "$a"
george
Run Code Online (Sandbox Code Playgroud)

但是“你好再次”文本仍然存在,不知何故“隐藏”:

$ echo "$a" |od -w32 -t x1c
0000000  68  65  6c  6c  6f  0d  61  67  61  69  6e  0d  67  65  6f  72  67  65  0d  0a
          h   e   l   l   o  \r   a   g   a   i   n  \r   g   e   o   r   g   e  \r  \n
Run Code Online (Sandbox Code Playgroud)

只要我们玩 bash 就可以了……但这是否存在潜在的安全风险?如果变量“a”的内容来自外部世界并包含“坏命令”而不是“你好”怎么办?

另一个测试,这次有点不安全:

$ a=$(printf "ls;\rGeorge\n")
$ echo "$a"
George
$ eval "$a"
0                   awkprof.out       event-tester.log  helloworld.c …
Run Code Online (Sandbox Code Playgroud)

bash special-characters shell-script newlines

14
推荐指数
2
解决办法
5万
查看次数

来自终端的在线手册页

冒着提出可能已经有答案的问题的风险,我想问一下是否有人知道是否以及如何阅读我的终端中未使用在线资源安装在我的系统中的程序/应用程序的手册页/在线工具。

我进行了 stackexchange 和 google 搜索,但没有发现有关此问题的任何信息。

例如,man grep将按预期提高 grep 手册。另一方面,man agrep由于agrep未安装,会出现错误。为了阅读agrep manual我必须google agrep man pages得到这样的结果:https : //linux.die.net/man/1/agrep

PS:顺便说一句,http: //man7.org/linux/man-pages/dir_all_alphabetic.html 不提供 agrep对我来说似乎很奇怪...

我想知道是否可以man agrep从我的终端运行或类似的命令(不安装 agrep)并像往常一样在终端中阅读 agrep 手册页。

我不希望世界上所有的手册页都在本地可用;我只是想知道是否有任何棘手的方法可以使用 man(甚至其他命令)来搜索和显示未安装 prog 的手册页,而无需打开浏览器、键入关键字、在结果中搜索等。

PS:正如 Kusalananda 所注意到的,提出 Web 查询可能会导致结果不适合特定发行版(不同版本的结果会弹出)。所以最好的(在我的梦想中)是如果有一种特定于发行版的(在我的情况下是 Debian)内部/内置命令(甚至是一个开关)可以专门为我的设置检索在线手册页(即类似:man --online agreponlineman agrep)。似乎没有。

linux man debian documentation

4
推荐指数
1
解决办法
874
查看次数

在 Unix 中只搜索单个单词

有没有办法对具有以下内容的文件进行分类:

field1,field2,field number 3,field4,field5

field1,field2,field3,field4,field5
Run Code Online (Sandbox Code Playgroud)

(有些字段有空格,有些字段没有)

我想使用awk$1 和 $3打印,但只打印字段 3 中没有空格的行。
我不知道是否有任何方法可以让 awk 仅在以 开头并以 结尾时打印某些内容,

grep awk

2
推荐指数
1
解决办法
204
查看次数

grep 在 bash 脚本中工作,但在终端中不起作用

我的终端中有一个奇怪的行为。

以下命令不会向我的终端打印任何内容:

comment=$(
    cat /usr/share/applications/brasero.desktop | 
    grep '^Comment=' |
    grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
)
echo $comment
Run Code Online (Sandbox Code Playgroud)

完全相同的命令,相同的语法在 bash 脚本中完美运行。

通常,我看到人们抱怨相反的行为。

我知道上述操作可以通过数百种方式完成,但我不明白为什么上述命令在我的终端中没有运行。

另一方面,这些命令在终端和脚本中都可以正常工作:

comment=$(
    cat /usr/share/applications/brasero.desktop |
    grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
)
echo $comment

grep -Po '(?<=Exec=)[ --0-9A-Za-z/:space:]*' > /usr/share/applications/brasero.desktop
Run Code Online (Sandbox Code Playgroud)

我在 Debian 8 Sid 下使用 GNU bash,版本 4.4.0(1)-release (x86_64-pc-linux-gnu),grep (GNU grep) 2.26。我在 xfce 和 mate 终端都尝试过,但行为相同。

谢谢

grep bash terminal

0
推荐指数
1
解决办法
862
查看次数

为什么默认情况下 grep 不从 find 命令中删除终端输出行?

我经常对这个简单的命令感到沮丧:

find / | fgrep somestuff.ext
Run Code Online (Sandbox Code Playgroud)

当我不使用时sudo,我会得到一行又一行的拒绝权限——这很公平,但是当 grep 从管道读取它时,为什么没有忽略这个输出?

为什么这种形式的输出直接发送到终端窗口而不是传递到管道中(我怀疑必须发生这种情况)并随后被 grep 忽略,而 cat 生成的相同行(比如我有权限被拒绝的消息存储在文本中)文件)会正确进入管道并被我的 grep 模式忽略?

我觉得这里有一些关于 STDIN/STDOUT 过程的东西我不明白

shell grep bash pipe find

0
推荐指数
1
解决办法
525
查看次数