考虑两个壳样本
$ 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 工具,如何编辑包含 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) 是否可以将 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) 有没有办法强制启用或禁用脚本中每个命令行的调试(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 脚本中有类似的东西吗?
使用 SSH 建立连接后,我们如何获取当前连接属性?
有没有办法知道正在使用什么密码?身份验证的属性 ? 协议版本、超时等。
仅使用 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) 如何让排序命令处理以“|”分隔的数据 (管道字符) ?
考虑这个名为“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没有任何变化。
有一个输入参数,其中包含一系列文件(带有通配符或文件夹的文件),如下所示:
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) 是否可以在 ssh 询问时自动添加这些密钥,而不是调用ssh-add将每个密钥添加到 中ssh-agent?同样由桌面环境启动的代理呢?
编辑:桌面环境启动的代理(例如分叉自gnome-keyring-daemon)与命令行启动的代理有什么区别,可以“添加”这种行为?
在 Mate 会话 (Linux Mint) 中,只要 ssh 将其第一个密钥添加到代理中,就会出现一个新进程,SSH_AUTH_SOCK 似乎指向该进程,但是在“ssh”名称之前有一个点(“.ssh”而不是“ssh”)。此进程由“gnome-keyring-daemon”启动,请在下面的屏幕截图中查看进程 PID: