小编Emm*_*uel的帖子

将数据通过管道传输到进程的标准输入,之后不会导致 EOF

我有一个可以启动用户交互式 shell 的可执行文件。我想在 shell 启动时先注入一些命令,然后允许用户进行交互式会话。我可以使用以下方法轻松做到这一点echo

echo "command 1\ncommand 2\ncommand3" | ./shell_executable
Run Code Online (Sandbox Code Playgroud)

几乎有效。问题是,一旦完成回显我的命令,为进程的标准输入提供数据的 echo 命令就会命中 EOF。这个 EOF 会导致 shell 立即终止(就像您在 shell 中按下了 Ctrl+D 一样)。

有没有办法将这些命令注入 stdin 而不会导致 EOF 之后?

pipe shell-script stdin

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

在 bash 中,在管道未设置值后读取

使用 ksh 我使用 read 作为分隔值的便捷方法:

$ echo 1 2 3 4 5 | read a b dump
$ echo $b $a 
2 1
$
Run Code Online (Sandbox Code Playgroud)

但它在 Bash 中失败了:

$ echo 1 2 3 4 5 | read a b dump
$ echo $b $a 
  
$
Run Code Online (Sandbox Code Playgroud)

我没有在手册页中找到失败的原因,知道吗?

shell bash pipe read

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

/etc/resolv.conf 中没有定义域

我看到越来越多的服务器没有在文件中定义/etc/resolv.conf。只有一个搜索条目。
在什么情况下使用此设置?
是否有不得使用的情况?

nameserver xxx.xxx.xxx.xxx
nameserver yyy.yyy.yyy.yyy
nameserver zzz.zzz.zzz.zzz

search domain1 domain2 domain3 ...
Run Code Online (Sandbox Code Playgroud)

dns etc

20
推荐指数
1
解决办法
5万
查看次数

如何安全地“组合”多个程序打印的行?

假设我想并行执行多个程序并将它们的输出合并到一个管道中:

sh -c '
    (echo qqq; echo qqq2; echo qqq3)&
    (echo www; echo www2; echo www3)& 
    (echo eee; echo eee2; echo eee3)& 
  wait; wait; wait'
Run Code Online (Sandbox Code Playgroud)

这种 shell 方法适用于这个简单的情况,但我希望如果程序以缓冲方式输出更多和更长的行,它会失败,像这样(构造):

qqq
qqwww
q2
qqq3www2

wwweee3

eee2
eee3
Run Code Online (Sandbox Code Playgroud)

我被暗示使用的解决方案之一是tail -f

tail -n +0 -q -f <(echo qqq; echo qqq2; echo qqq3) <(echo www; echo www2; echo www3) <(echo eee; echo eee2; echo eee3)
Run Code Online (Sandbox Code Playgroud)

,但这是次优选项:它输出数据缓慢,不会终止;在这种情况下,我看到的输出不是“睡眠”顺序,而是参数顺序:

tail -n +0 -q -f <(sleep 1; echo qqq; sleep 1; echo qqq2; echo qqq3) <(echo www; …
Run Code Online (Sandbox Code Playgroud)

shell io-redirection

11
推荐指数
1
解决办法
702
查看次数

rsync 最近的 x GB

我正在寻找一个命令/脚本来允许将最近修改的文件(最多)10GB 复制到另一台计算机。

因此,如果有 4 个 4 GB 的文件,则脚本只应传输其中的 2 个,如果有 12 个 1GB 的文件,则应仅传输最近的 10 个。

scripting cp rsync synchronization

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

全新安装后重新安装应用程序?

我在 Debian 上,我想重新分区我的驱动器并重新安装。是否有一种简单的方法可以在全新安装后恢复所有当前安装的软件包?

我正在考虑通过制作备份应用程序列表来做到这一点:

#generate list of installed packages
dpkg -l | awk '{ print $2 }' ORS="\n" | tail -n +6 > reinstallList.txt
Run Code Online (Sandbox Code Playgroud)

然后在进行全新安装后,我应该能够做到:

#install from backup at reinstallList.txt
sudo apt-get  install $(< reinstallList.txt)
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点?

bash backup debian dpkg apt

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

如何在linux上序列化命令执行?

我想确保系统的任何普通用户一次只能运行一个脚本。可以有多个用户登录,并且每个用户只能在其他用户的任何运行命令完成后才能运行一个命令。

很久以前在 UNIX 上,我使用batch带有正确“仅一项任务”队列定义的命令来序列化脚本执行。它解决了许多锁管理问题(它只需要在脚本中设置一个简单的超时)。

现在在 Linux 上,该batch命令的执行方式有所不同,每分钟运行一个任务,任务并行运行,直到达到 1.5 平均负载。

我制作了自己的锁管理 shell 库来序列化执行,但我想知道是否有一个标准命令可以做到这一点。

linux background-process

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

bash 4.3 "multiple dot" 命令在 Fedora 上无声地失败

我刚刚在 bash 4.3 上注意到了这一点;确切的版本号是 4.3.42(1)-release (x86-redhat-linux-gnu)。

$ ..
$ ...
$ ....
$ .....
Run Code Online (Sandbox Code Playgroud)

为什么没有提示“找不到命令”?

$ ...
$ echo $? 
$ 127
Run Code Online (Sandbox Code Playgroud)

我检查了$PATHalias什么都没有;这个人也没有帮助。
bash 在 Fedora Linux 上运行,但我认为它与操作系统无关。

编辑

我只是注意到这一点对于任何点开始命令都是一样的

.za
.zaza
..za
..zaza
Run Code Online (Sandbox Code Playgroud)

bash fedora

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

如何判断两个以太网接口是否在同一局域网上?

我必须通过设置绑定接口来保护 Linux 服务器上的接口。布线信息不准确。

有没有一种简单的方法可以知道两个接口是否连接到同一个 LAN?

有些接口没有 IP,如果可能的话,我宁愿不设置虚拟 IP。


我终于使用了它arping,它已经安装在服务器上:

ifconfig eth2 up 
ifconfig ethO up 
tcpdump -i eth2 -c 3 arp net 10.10.10.10
Run Code Online (Sandbox Code Playgroud)

并在另一个终端:

arping -D -I eth0 10.10.10.10
Run Code Online (Sandbox Code Playgroud)

tcpdump 应该显示这样的行:

16:15:43.032103 arp who-has 10.10.10.10 (Broadcast) tell 0.0.0.0
16:15:44.032277 arp who-has 10.10.10.10 (Broadcast) tell 0.0.0.0
16:15:45.032441 arp who-has 10.10.10.10 (Broadcast) tell 0.0.0.0
Run Code Online (Sandbox Code Playgroud)

*-D是可选的,但它提供了一个很好的 0.0.0.0 源地址。

linux networking ethernet

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