小编Luc*_*ano的帖子

'ls' 和 'echo $(ls)' 之间的区别

考虑两个壳样本

$ ls
myDoc.html
SomeDirectory
someDoc.txt
Run Code Online (Sandbox Code Playgroud)

$ echo $(ls)
myDoc.html SomeDirectory someDoc.txt
Run Code Online (Sandbox Code Playgroud)

第一个执行ls,据我所知,将当前工作目录的内容附加到stdout文件中(这是终端显示的内容)。这样对吗?

第二个获取ls命令的值(这意味着是当前工作目录的内容)并将其打印到stdout文件中。这样对吗?

为什么这两个命令给出不同的输出?

shell

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

编辑包含 '\x00' 字节的二进制流

仅使用 shell 工具,如何编辑包含 NULL(0x00 字符)的二进制流,并在输出流中保留 0x00 字符?

编辑需要将指定位置的一个字符替换为另一个字符(在以下示例中为字符“|”),例如:

dd ibs=1 skip=$offset count=$reglen status=none if=$ARQ |
        sed 's/./\|/2' |
        sed 's/./\|/5' #| more replacements....
Run Code Online (Sandbox Code Playgroud)

但是 sed 在替换之前删除了所有 '\0x00' 字符。

编辑 - 使用 @George Vasiliou 测试在我的环境中演示 sed 行为:

$ echo -e "lineA\nlineB\nlineC" | tr '\n' '\0' | od -t x1
0000000 6c 69 6e 65 41 00 6c 69 6e 65 42 00 6c 69 6e 65
0000020 43 00
0000022

$ echo -e "lineA\nlineB\nlineC" | tr '\n' '\0' | sed 's/./|/5' …
Run Code Online (Sandbox Code Playgroud)

sed binary

8
推荐指数
1
解决办法
7680
查看次数

Linux 作为网络打印机设备(原始,端口 9100)

是否可以将 Linux 计算机配置为“网络打印机设备”?我有一台 USB 打印机,打算像本地网络打印机设备一样在网络中共享。

那可能吗?如何?

注意: “自主”网络打印机通常使用“HP Jetdirect”(也称为“Raw”)协议进行通信。

我有一个带有 AIX 5 的 RS/6000,它可以找到并与任何类型的“自主”网络打印机配合使用。我想通过 Linux(最好是 Debian)在网络中公开一个 USB 打印机,就像我可以在 AIX 中访问的任何普通网络打印机(自治设备)一样。

编辑: 我需要在 AIX 中做类似的事情,其中​​“ my_printer_ip ”是 Linux IP:

$ netcat my_printer_ip 9100
$ Hello remote USB printer plugged in a Linux !
$ <Ctrl+D>
Run Code Online (Sandbox Code Playgroud)

networking aix cups printer

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

脚本中的内联调试 (xtrace)

有没有办法强制启用或禁用脚本中每个命令行的调试(xtrace)?

在 Windows Shell(“ms-dos”)中是一个“@”,它可以作为命令行的前缀,如果启用了回显(比如调试)(回显打开),则禁用该行显示。

考虑 (set -x) 上的 xtrace,但我们可以在某些行中忽略它的影响,它可以用“@”表示。像这样:

set -x
@echo Listing...
ls
set +x
Run Code Online (Sandbox Code Playgroud)

输出示例:

Listing...
+ ls
file1
file2
Run Code Online (Sandbox Code Playgroud)

shell 脚本中有类似的东西吗?

bash debugging shell-script

7
推荐指数
1
解决办法
9193
查看次数

当前 SSH 连接属性(密码、身份验证类型、超时等)

使用 SSH 建立连接后,我们如何获取当前连接属性?

有没有办法知道正在使用什么密码?身份验证的属性 ? 协议版本、超时等。

ssh openssh ssh-tunneling

7
推荐指数
1
解决办法
728
查看次数

打印与模式匹配的文本块

仅使用 shell 脚本,如何搜索文本文件并列出包含某些文本的所有整行块(简单的 grep 标准)。

文本文件的行块由"-----------------"(准确地说,每个块以"\n\n\n--------------------"... 大约 50 个字符“-”开头)分隔。

样本可以是:

-------------------------------
Abracadabra, blablablalbalba
blablablabla, banana



-------------------------------
Text, sample text, sample text, sample text
Text, sample text, sample text, sample text
Text, sample text, sample text, sample text
Text, sample text, sample text, sample text


-------------------------------  
Text, sample text, sample text, sample text
banana. Sample text, sample text, sample text, sample text
Text, sample text, sample text, sample text
Run Code Online (Sandbox Code Playgroud)

让我们考虑“香蕉”这个搜索条件。因此,列出的块将是:

-------------------------------
Abracadabra, blablablalbalba
blablablabla, banana


-------------------------------
Text, …
Run Code Online (Sandbox Code Playgroud)

aix text-processing

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

排序命令顺序错误

如何让排序命令处理以“|”分隔的数据 (管道字符) ?

考虑这个名为“x”的示例文件,它有两个字段:

axis-AXIS|OK
axis-AXISR|OK
axis-AXISD2X|OK
axis-AXISA|OK
axis-AXISD1|OK
axis-AXIS1RX|OK
axis-AXISR1M|OK
axis-AXISD2|FALSE
axis-AXISMD|FALSE
axis-AXISM|FALSE
axis-AXISE|OK
axis-AXISD|OK
Run Code Online (Sandbox Code Playgroud)

我的语言环境:

echo $LC_ALL
C
Run Code Online (Sandbox Code Playgroud)

排序时字符“|” 似乎是产生奇怪分类的关键的一部分:

sort -t"|" x

axis-AXIS1RX|OK
axis-AXISA|OK
axis-AXISD1|OK
axis-AXISD2X|OK
axis-AXISD2|FALSE
axis-AXISD|OK
axis-AXISE|OK
axis-AXISMD|FALSE
axis-AXISM|FALSE
axis-AXISR1M|OK
axis-AXISR|OK
axis-AXIS|OK
Run Code Online (Sandbox Code Playgroud)

指定字段键sort -t"|" -k1 x没有任何变化。

sort locale

3
推荐指数
1
解决办法
1784
查看次数

bash 中仅一个变量中的参数列表

有一个输入参数,其中包含一系列文件(带有通配符或文件夹的文件),如下所示:

list="file1 dir1 **.data **.source"
Run Code Online (Sandbox Code Playgroud)

现在这个列表的每个元素都必须以 为前缀--filter=+ ,将其变成命令参数列表rsync,如下所示:

args='--filter=="+ file1" --filter="+ dir1" --filter="+ **.data" --filter="+ **.source"'
Run Code Online (Sandbox Code Playgroud)

因此,当将$args传递给rsync $args它时,应该正确接收每个参数,其中“+”中的空格必须只是参数的一个字符,而不是两个参数的分隔符。

如何仅使用内置 shell 命令在 shell 脚本 (bash) 中执行此操作?请注意,该rsync命令必须正确接收每个参数。

一次不成功的尝试:

#!/bin/bash
set -f
list="file1 dir1 **.data **.source"
ct=0
arr=""
for i in $list; do
    ct=$(( ct + 1 ))
    arr[$ct]="--filter='+ $i'"
done
args=${arr[*]}

set -x
echo args:$args
rsync $args srcdir destdir
set +x
Run Code Online (Sandbox Code Playgroud)

当它运行时(假设该文件夹srcdir存在于当前目录中),它显示:

$ ./test
+ echo args: '--filter='\''+' 'file1'\''' '--filter='\''+' 'dir1'\''' …
Run Code Online (Sandbox Code Playgroud)

rsync arguments

3
推荐指数
1
解决办法
9950
查看次数

按需将 SSH 密钥添加到 ssh-agent

是否可以在 ssh 询问时自动添加这些密钥,而不是调用ssh-add将每个密钥添加到 中ssh-agent?同样由桌面环境启动的代理呢?

编辑:桌面环境启动的代理(例如分叉自gnome-keyring-daemon)与命令行启动的代理有什么区别,可以“添加”这种行为?

在 Mate 会话 (Linux Mint) 中,只要 ssh 将其第一个密钥添加到代理中,就会出现一个新进程,SSH_AUTH_SOCK 似乎指向该进程,但是在“ssh”名称之前有一个点(“.ssh”而不是“ssh”)。此进程由“gnome-keyring-daemon”启动,请在下面的屏幕截图中查看进程 PID:

在此处输入图片说明

ssh ssh-agent

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