我显然明白可以为内部字段分隔符变量添加值。例如:
$ IFS=blah
$ echo "$IFS"
blah
$
Run Code Online (Sandbox Code Playgroud)
我也明白这read -r line会将数据保存stdin到名为的变量line:
$ read -r line <<< blah
$ echo "$line"
blah
$
Run Code Online (Sandbox Code Playgroud)
但是,命令如何分配变量值?它是否首先存储来自stdinto 变量的数据line,然后赋予lineto 的值IFS?
我在 /etc/crontab 文件中定义了“SHELL”变量:
[martin@martin ~]$ grep SHELL /etc/crontab
SHELL=/usr/local/bin/bash
[martin@martin ~]$ file /usr/local/bin/bash
/usr/local/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 8.0 (800107), stripped
[martin@martin ~]$
Run Code Online (Sandbox Code Playgroud)
此外,我在 /etc/crontab 文件中的所有脚本都是在用户“martin”下启动的。但是/home/martin/.bash_profile(用于登录 shell)和/home/martin/.bashrc(用于非日志 shell)包含一些变量,这些变量在 cron 作业的情况下被忽略,但在我登录机器时使用SSH 或打开新的 bash 会话。为什么 cron 忽略这些变量?cron 不是简单地以用户“martin”的权限执行“/usr/local/bin/bash my-script.sh”吗?
据我了解,Linux 内核会记录到/proc/kmsg文件(主要是与硬件相关的消息)和/dev/log套接字吗?还有其他地方吗?其他应用程序是否也能够向/proc/kmsg或发送消息/dev/log?最后但并非最不重要的,我是正确的,这是系统日志守护程序(rsyslog现在,syslog-ng的),该检查的消息来自这两个地方,然后分发到那些像各种文件/var/log/messages或者/var/log/kern.log甚至是中央系统日志服务器?
我apt-cache policy sudo在安装之前和之后运行sudo:
安装前:
# apt-cache policy sudo
sudo:
Installed: (none)
Candidate: 1.8.5p2-1+nmu1
Version table:
1.8.5p2-1+nmu1 0
500 http://ftp.se.debian.org/debian/ wheezy/main i386 Packages
#
Run Code Online (Sandbox Code Playgroud)
安装后:
# apt-cache policy sudo
sudo:
Installed: 1.8.5p2-1+nmu1
Candidate: 1.8.5p2-1+nmu1
Version table:
*** 1.8.5p2-1+nmu1 0
500 http://ftp.se.debian.org/debian/ wheezy/main i386 Packages
100 /var/lib/dpkg/status
#
Run Code Online (Sandbox Code Playgroud)
如何理解数字500和100?这些是某种状态代码吗?另外,安装包版本前面的***是什么意思?
我在运行 SSH 服务器的远程机器上启用了 X 转发:
# grep -i forward /etc/ssh/sshd_config
X11Forwarding yes
#
Run Code Online (Sandbox Code Playgroud)
在本地机器上,我已经启动了带有-X标志的SSH 客户端,该标志指示在远程机器上运行的 SSH 服务器设置 X 服务器代理。此外,它还会创建$DISPLAY指向此代理的变量并调用xauth安装代理密钥,该密钥可在远程计算机上对此 X 服务器代理进行身份验证:
# echo "$DISPLAY"
localhost:11.0
# xauth list | grep 11
A58/unix:11 MIT-MAGIC-COOKIE-1 39324086672d1ae35e373476c3891a77
#
Run Code Online (Sandbox Code Playgroud)
但是,远程机器上的 X 客户端无法正常启动:
# wireshark
(wireshark:10083): Gtk-WARNING **: cannot open display: localhost:11.0
# xterm
Warning: This program is an suid-root program or is being run by the root user.
The full text of the error …Run Code Online (Sandbox Code Playgroud) 我看过包装脚本示例,简而言之如下:
#!/bin/bash
myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""
exec "$myprog" "$@"
Run Code Online (Sandbox Code Playgroud)
如上所示,它们exec几乎立即用$myprog. 一个人可以在没有exec:
#!/bin/bash
myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""
"$myprog" "$@"
Run Code Online (Sandbox Code Playgroud)
在最后一个示例中,启动了一个新的 bash 实例,然后$myprog作为 bash 实例的子进程启动。
第一种方法有什么好处?
netstat -s 打印出许多非常详细的协议统计信息,例如收到的 TCP 重置消息数或发送的 ICMP“回显请求”消息数或由于丢失路由而丢弃的数据包数。
netstat现在在 Linux 中被认为已弃用时,还有其他选择吗?
ss -s与提供的统计数据相比,由 提供的统计数据是肤浅的netstat。
在 shell 脚本中,在 shebang( #!) 行指定语言解释器。据我所知,建议使用,#!/usr/bin/env bash因为env它总是位于/usr/bin目录中,而位置bash可能因系统而异。但是,如果bash直接使用/bin/bash或通过env实用程序启动,是否有任何技术差异?另外,如果我没有为 指定任何变量env,bash则在未修改的环境中启动,我是否正确?
根据 Debian网络设置文档中的allow-hotplug <interface_name>节,/etc/network/interfaces当内核从接口检测到热插拔事件时,文件中的节会启动一个接口。这个热插拔事件是什么?
/etc/networks文件的实际用途是什么?据我了解,可以在此文件中为网络命名。例如:
root@fw-test:~# cat /etc/networks
default 0.0.0.0
loopback 127.0.0.0
link-local 169.254.0.0
google-dns 8.8.4.4
root@fw-test:~#
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试在ip实用程序中使用此网络名称,则它不起作用:
root@fw-test:~# ip route add google-dns via 104.236.63.1 dev eth0
Error: an inet prefix is expected rather than "google-dns".
root@fw-test:~# ip route add 8.8.4.4 via 104.236.64.1 dev eth0
root@fw-test:~#
Run Code Online (Sandbox Code Playgroud)
/etc/networks文件的实际用途是什么?