小编Red*_*Red的帖子

如何使用 sed -i(就地编辑)实现可移植性?

我正在为我的服务器编写 shell 脚本,这是一个运行 FreeBSD 的共享主机。我还希望能够在运行 Linux 的 PC 上本地测试它们。因此,我试图以可移植的方式编写它们,但sed我认为没有办法做到这一点。

我的网站的一部分使用生成的静态 HTML 文件,并且此 sed 行在每次重新生成后插入正确的 DOCTYPE:

sed -i '1s/^/<!DOCTYPE html> \n/' ${file_name.html}
Run Code Online (Sandbox Code Playgroud)

它适用sed于 Linux上的 GNU ,但 FreeBSDsed期望-i选项后的第一个参数是备份副本的扩展名。这是它的样子:

sed -i '' '1s/^/<!DOCTYPE html> \n/' ${file_name.html}
Run Code Online (Sandbox Code Playgroud)

但是,GNUsed反过来又希望表达式紧跟在 之后-i。(它还需要修复换行符处理,但这里已经回答了)

当然,我可以在脚本的服务器副本中包含此更改,但这会造成混乱,即我使用 VCS 进行版本控制。有没有办法以完全可移植的方式使用 sed 实现这一点?

shell freebsd sed gnu portability

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

与图形文件搜索实用程序相比,为什么 GNU 查找速度如此之快?

我正在尝试查找我的主目录和所有子目录中不存在的文件。

find ~/ -name "bogus"几秒钟后给我这些信息,但KDE 的dolphin文件管理器需要将近 3 分钟才能做到这一点。这与我之前使用GNOME 的beagle经验相符。

find当图形搜索(使用起来比命令行参数更直观)落后时,如何设法快速地做同样的事情?

performance find dolphin

49
推荐指数
1
解决办法
5193
查看次数

管道外壳程序如何平衡其输出/输入速率?

可能的重复:
Bash while 循环和从管道读取

我来自 Web 编程背景,发现自己对使用本地 shell 的一个特性很感兴趣。我知道当程序从文件中读取时,它可以以任何必要的速率读取。但是我很想知道,当一个程序通过管道接收其他程序的输入并且无法实时处理它时,它是如何工作的?

一个很好的例子是视频编码。假设我将解码器指向视频文件,然后它的输出作为编码器的输入通过管道输入。解码视频的总大小超过 ram+swap,所以我想没有办法完全缓冲它。我发现了对 stdin 和 stdout 的读写调用,但我很想知道当这个例子的编码器不能同时处理所有数据时实际发生了什么。它是否以某种方式通知解码器所需的速率?解码器程序是否需要专门为这样的信号准备并相应地修改它的处理速度?如果没有,最后如何平衡?

shell pipe system-calls stdout stdin

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

无法在 X 会话启动时导出环境变量

我的设置是:

  • Debian 测试 (stretch),最新
  • 启用自动登录的 LightDM
  • 很棒的窗口管理器
  • bash,在 ROXTerm 或 XTerm 中

我似乎无法设置自己的环境变量并在 X 会话启动时获取它。这是我尝试过的:

  • using~/.bash_profile在我以前的操作系统上工作,但我从这个答案中了解到它不是源自 Debian 中的 X 启动,而是衍生品
  • mv .bash_profile .profile按照建议做了,但它也不起作用,因为正如我后来从这里了解到的,~/.profile当显示管理器启动 X 会话时不是来源
  • 上述问题的答案建议使用~/.xsessionrc. 这也不起作用,因为正如我从这里了解到的,它仅来自/etc/X11/XsessionLightDM 不执行的源
  • Arch Linux wiki声称LightDM 源~/.xprofile文件,但这也不起作用。

尝试来自最后一个网站的建议,我~/.xinitrc是这样的:

export QT_STYLE_OVERRIDE=GTK+
[ -f ~/.xprofile ] && source ~/.xprofile
~/.screenlayout/default.sh
awesome
Run Code Online (Sandbox Code Playgroud)

而我~/.xprofile是这样的:

[[ -f ~/.bashrc ]] && . ~/.bashrc
source /etc/bash_completion.d/virtualenvwrapper

export GDK_NATIVE_WINDOWS=1 …
Run Code Online (Sandbox Code Playgroud)

bash debian environment-variables awesome lightdm

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

如何阻止 dhclient 在 Debian 上更新 resolvconf?

无论我通过 DHCP 获得什么,我都想使用某些 DNS 服务器。我正在尝试配置 dhclient 以忽略这些,但我似乎无法让它工作。

根据本文的建议,我supersede domain-name-servers 8.8.8.8, 8.8.4.4;在我的/etc/dhcp/dhclient.conf文件中添加了节。我还尝试了来自 superuser.com 的这些答案,domain-name-serversdomain-searchrequest指令中删除了值。这两者,单独应用以及一起应用,似乎都没有效果。运行sudo dhclient -r然后sudo dhclient,我仍然在以下条目中找到以下条目/etc/resolvconf/run/interfaces/enp2s0.dhclient

domain lan
nameserver 192.168.1.1
Run Code Online (Sandbox Code Playgroud)

哪个提示resolvconf放入nameserver 192.168.1.1我的/etc/resolv.conf文件。

我仔细检查了我是否没有遗漏任何分号或类似的语法元素。我怎样才能让我的配置工作?我不想删除 resolvconf,因为它在我使用企业 VPN 时管理我的名称服务器中的更改并且它做得很好。看起来 dhclient 是这里的违规方。

/etc/dhcp/dhclient.conf为了清楚起见,这是我目前删除的默认评论:

option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;

send host-name = gethostname();
request subnet-mask, broadcast-address, time-offset, routers,
        domain-name, host-name,
        dhcp6.name-servers, dhcp6.domain-search, …
Run Code Online (Sandbox Code Playgroud)

dns dhcp debian resolvconf dhclient

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

如何知道 resolv.conf 条目来自哪里?

我使用 resolvconf 进行名称服务器管理,因为我的 OpenVPN 需要它。但是,我注意到它生成的名称服务器信息并不是我想要的:

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 173.31.45.181
nameserver 192.168.1.1
nameserver 8.8.8.8
search lan 8.8.8.8
Run Code Online (Sandbox Code Playgroud)

当我没有连接到 VPN 时,这里的每个指令都是不受欢迎的,除了nameserver 8.8.8.8. 我怎么知道为什么 resolvconf 会放置一个特定的条目?有没有办法辨别,即什么程序想要nameserver 192.168.1.1在那里?我试过了,man resolvconf但它没有提供答案。

dns debian openvpn resolvconf

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