我正在编写一个 Makefile(在 Ubuntu 20.04 上,如果相关的话),并注意到echo
. 以这个简单的 Makefile 为例:
test.txt:
@echo -e 'hello\nworld'
@echo -e 'hello\nworld' > test.txt
Run Code Online (Sandbox Code Playgroud)
当我运行时make
,我希望在 stdout 上看到与 test.txt 中相同的内容,但事实上我没有。我在标准输出上得到这个:
hello
world
Run Code Online (Sandbox Code Playgroud)
但这在 test.txt 中:
-e hello
world
Run Code Online (Sandbox Code Playgroud)
同时,如果我-e
从 Makefile 中的两行中删除,我会在标准输出上得到:
hello\nworld
Run Code Online (Sandbox Code Playgroud)
在 test.txt 中:
hello
world
Run Code Online (Sandbox Code Playgroud)
这让我想知道是否echo
检测到重定向并表现出不同的行为,但当我在 shell 中手动运行它时却没有(如我通常期望的那样,/bin/echo -e 'hello\nworld' > test.txt
它会在单独的行上产生hello
和)。world
我什至通过添加一行来确认 Makefile 使用的是 /bin/echo 而不是内置的 shell @echo --version
。
这里发生了什么?
当两者都连接到同一网络时,Linux 如何确定使用哪个网络接口?
请注意,这不是关于路由的问题。我熟悉它的工作原理。例如,如果我的笔记本电脑通过以太网卡和无线网卡连接到无线路由器,或者如果我有两个以太网卡都连接到同一路由器。
我可以从经验中说,在我的情况下,我的笔记本电脑似乎更喜欢以太网卡(eth0)而不是无线(eth1--我知道这不是无线接口的典型名称,但这就是我所拥有的),但我是想知道,它是如何决定的?如果它只是从编号最低的接口中选择,如果这两个选择是 eth0 和 wlan0 呢?
编辑:@Nils 指出这仍然是路由问题,路由表提供了答案(请参阅他的答案)。这仍然留下我最初的问题,但形式不同。什么决定了 Linux 路由表中条目的顺序?例如,这是我连接到两个接口时的路由表:
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.4.1 0.0.0.0 UG 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
192.168.4.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.4.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
Run Code Online (Sandbox Code Playgroud)
很明显,对于本地网络中的目的地,表中 eth0 的优先级高于 eth1,但在 Linux 中,这是根据链接延迟、链接吞吐量、甚至接口名称还是什么决定的?(同样的问题可能会问为什么 eth0 是默认路由的接口。)
我正在为 Hurricane Electric 的 IPv6 隧道代理设置我的计算机(运行 Debian Buster)。他们提供了几种配置方法的说明,但这里是 iproute2 的说明,我一直将其用于测试目的:
ip tunnel add he-ipv6 mode sit remote 216.66.22.2 local <local-IP-addr> ttl 255
ip link set he-ipv6 up
ip addr add <IPv6-addr>/64 dev he-ipv6
ip route add ::/0 dev he-ipv6
ip -f inet6 addr
Run Code Online (Sandbox Code Playgroud)
当我这样做时,sit0
还会出现一个神秘的界面。显然,它与 6in4 隧道相关,但我找不到更多关于它的信息,除了它有点特殊并且每当模块加载时它就存在sit
。出于好奇,我尝试为隧道代理配置它,而不是创建新接口,但它似乎无法做到这一点。
这个装置是什么?
背景:
我有一个包提供了一个与 LXD 不兼容的 systemd 单元文件。具体来说,它使用以下两个选项,这些选项似乎在容器内失败:
[Service]
IOSchedulingClass=realtime
CPUSchedulingPolicy=rr
Run Code Online (Sandbox Code Playgroud)
因此,我尝试使用以下内容通过插入来覆盖这些systemctl edit
:
[Service]
IOSchedulingClass=
CPUSchedulingPolicy=
Run Code Online (Sandbox Code Playgroud)
但后来我收到以下消息journalctl -xe
:
Jun 17 18:40:14 nickel systemd[1]: [/etc/systemd/system/freeswitch.service.d/override.conf:2] Failed to parse IO scheduling class, ignoring:
Jun 17 18:40:14 nickel systemd[1]: [/etc/systemd/system/freeswitch.service.d/override.conf:4] Failed to parse CPU scheduling policy, ignoring:
Run Code Online (Sandbox Code Playgroud)
题:
似乎不允许取消设置这样的选项。我还尝试使用一对空引号(例如IOSchedulingClass=""
)。这样做的正确方法是什么?我知道我可以覆盖整个单元文件,但如果可能的话,我不希望从打包的单元文件中屏蔽任何以后的更新。
作为参考,手册systemd.exec(5)
页建议应该有一些方法来做到这一点:
如果将空字符串分配给此选项,则 IOSchedulingClass= 和 IOSchedulingPriority= 的所有先前分配都无效。
我的问题有点不寻常,所以我想提供一个简短的背景。我正在查看国际混淆 C 代码竞赛的老赢家,并遇到了为 PDP-11 编写的条目(条目在这里,对于那些感兴趣的人)。所以,我搜索了一个模拟器,我在http://simh.trailing-edge.com/找到了它,并用 UNIX v7(来自同一站点)启动它。同样,对于那些感兴趣的人,我在http://wandel.ca/homepage/unixdemo.html找到了有关启动它的说明。
考虑到这一背景,这是我的实际问题。当我在 ed 中输入程序时,哈希字符很有趣。他们实际上不会保存在文件中。经过大量研究,我发现它正在模拟物理电传打字机(!),并且由于您无法退格打印在纸上的字符,因此哈希表示“忽略前一个字符”。
所以我的问题是:我如何实际输入哈希字符?