自从选项卡完成成为 shell 的标准功能以来,我一直是它的一个非常高兴的用户。我什至喜欢 Bash 的智能补全(它只搜索 PDF 文件,如果我输入 evince foo<TAB>)——只要它猜对了。
当 Bash 使用其智能完成来拒绝完成时,它破坏了原本快乐的一天。
今天我想:
tar xvf centos5.8_x86_1.ova
Run Code Online (Sandbox Code Playgroud)
所以我输入:
tar xvf cent<TAB>
Run Code Online (Sandbox Code Playgroud)
并且 Bash 拒绝完成路径,因为 .ova-files 不是您通常与 tar 一起使用的文件。
我知道我可以卸载 bash-completion 包来删除智能完成。但是我可以吃蛋糕也吃吗?
我可以要求 bash 先使用智能完成,如果失败,然后使用非智能完成吗?
这会将输出发送到 STDERR,但不会传播Ctrl+ C(即Ctrl+C会杀死ssh但不会杀死远程sleep):
$ ssh localhost 'sleep 100;echo foo ">&2"'
Run Code Online (Sandbox Code Playgroud)
这传播Ctrl+ C(即Ctrl+C将杀死ssh和远程sleep),但将 STDERR 发送到 STDOUT:
$ ssh -tt localhost 'sleep 100;echo foo ">&2"'
Run Code Online (Sandbox Code Playgroud)
如何强制第二个将 STDERR 输出发送到 STDERR,同时仍在传播Ctrl+ C?
背景
GNU Parallel 使用 'ssh -tt' 来传播Ctrl+ C。这使得终止远程运行的作业成为可能。但是发送到 STDERR 的数据在接收端应该继续去 STDERR。
在zsh这个工作正常:
alias foo=ls
foo
Run Code Online (Sandbox Code Playgroud)
但这不会:
alias foo=ls; foo
Run Code Online (Sandbox Code Playgroud)
以交互方式运行时,按 Enter 额外时间不是问题。但是跑ssh过去的时候突然就出问题了:
% ssh zsh@server 'alias foo=ls; foo'
zsh:1: command not found: foo
Run Code Online (Sandbox Code Playgroud)
即使使用换行符,它也不起作用:
% ssh zsh@server 'alias foo=ls;
foo'
zsh:2: command not found: foo
Run Code Online (Sandbox Code Playgroud)
奇怪的是,zsh知道它是别名:
% ssh zsh@server 'alias foo=ls; alias'
foo=ls
run-help=man
which-command=whence
Run Code Online (Sandbox Code Playgroud)
如何判断zsh别名应该是活动的?
我一次又一次地遇到这个问题:我有一个 glob,它与正确的文件完全匹配,但导致Command line too long. 每次我都将它转换为find和 的某种组合时,grep这适用于特定情况,但这不是 100% 等效的。
例如:
./foo*bar/quux[A-Z]{.bak,}/pic[0-9][0-9][0-9][0-9]?.jpg
Run Code Online (Sandbox Code Playgroud)
是否有将 glob 转换为find我不知道的表达式的工具?或者是否有find匹配 glob 而不匹配子目录中相同 glob的选项(例如foo/*.jpg,不允许匹配bar/foo/*.jpg)?
我想创建 100 个虚拟服务器。它们将用于测试,因此它们应该易于创建和销毁。
ssh I.P.n.o例如ssh 10.0.0.99(IPv4 或 IPv6,私有地址空间可以,端口转发不是 - 所以这可能涉及设置桥接)给定的最快方法(挂钟时间)是什么:
我应该运行的实际命令/应该创建的文件是什么?
我有一种感觉,如果采用正确的技术,这是一项可以在几分钟内完成的 50 条生产线作业。
这几行大概可以分成几个 bash 函数:
install() {
# Install needed software once
}
setup() {
# Configure the virtual servers
}
start() {
# Start the virtual servers
# …Run Code Online (Sandbox Code Playgroud) 我最初使用一个控制器创建了一个软件 RAID,每个磁盘只能处理 2TB。磁盘为 3 TB 磁盘。它运行良好,但只使用了每个磁盘的前 2TB。
我现在已经更改了控制器以查看完整的 3TB。因此,我也想/dev/md0使用最后的 1 TB。
我试过了:
# mdadm --grow /dev/md0 --size=max
mdadm: component size of /dev/md0 has been set to 2147479552K
Run Code Online (Sandbox Code Playgroud)
但正如您所见,它只能看到 2TB。如果我尝试将其强制更高:
# mdadm --grow /dev/md0 --size=2147483648
mdadm: Cannot set device size for /dev/md0: No space left on device
Run Code Online (Sandbox Code Playgroud)
所以不知何故系统可以看到磁盘是 3TB(在/proc/partitions),但 RAID 无法将它们视为 3TB。
# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri Mar 2 15:14:46 2012
Raid Level : raid6
Array Size : …Run Code Online (Sandbox Code Playgroud) 较新的 Linux 发行版有启动进入图形模式的想法。
grub 菜单就是这样做的。
init.d 系统执行此操作。
X就是这样做的。
我可以为 X 辩解。但是 grub 和 init.d 都只是给我带来了麻烦,并没有给我带来任何乐趣。我现在安装的旧系统上没有任何花哨的图形,所以我想告诉Debian的不碰图形系统在 所有。
现在我已经让 grub 保持在文本模式:
/etc/default/grub:
GRUB_TERMINAL=console
GRUB_GFXPAYLOAD_LINUX=text
Run Code Online (Sandbox Code Playgroud)
其次是:update-grub
并且 X 因不安装 X 而被禁用。
图形系统在 init.d 期间仍然被触及。我感觉这是某种 VESA 模式正在改变。
我在哪里禁用它,使其保持文本模式?
系统信息:
Debian stable:
# uname -a
Linux grb 3.2.0-4-686-pae #1 SMP Debian 3.2.54-2 i686 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
编辑:
将其添加到 /etc/default/grub 可以删除其中的一部分(感谢 TAFKA):
GRUB_CMDLINE_LINUX_DEFAULT="vga=normal nomodeset"
Run Code Online (Sandbox Code Playgroud)
但是下面的内容似乎也清除了我的回滚缓冲区,并更改了字体:
[info] setting up console font and keymap
Run Code Online (Sandbox Code Playgroud)
将 'exit 0' 放入 '/etc/init.d/console-setup' 可以解决这个问题,但似乎不是“Debian 方式”。
所以现在的问题归结为:如何以 Debian 方式禁用“控制台设置”?
昨天我花了大半时间才发现这个 bug 存在于 Bash 中。
outer ()
{
function inner ()
{
cat <<_EOS
foo
_EOS
}
inner
}
Run Code Online (Sandbox Code Playgroud)
将显示为typeset -f outer:
outer ()
{
function inner ()
{
cat <<_EOS
}
foo
_EOS
inner
}
Run Code Online (Sandbox Code Playgroud)
这显然不一样。在 CygWin (bash 4.4.12) 中,输出以不同的方式出现错误:
outer ()
{
function inner ()
{
cat
} <<_EOS
foo
_EOS
inner
}
Run Code Online (Sandbox Code Playgroud)
该错误已在较新版本的 Bash 中修复。
我用这个来env_parallel. env_parallel取决于输出是否typeset -f正确。
这是一个极端情况的错误,所以我真的不想env_parallel发出警告,除非确实存在影响结果的风险。另一方面,如果存在真正的风险,我希望得到警告,因为我真的不希望用户像昨天一样沮丧。
如果 bug 存在于 的输出中,是否可以可靠地检测到typeset -f?不写bash解析器可以纠正它吗?
tmux 的远程控制功能给我留下了深刻的印象:
tmux new-window -t p12346 'echo foo;sleep 10'
Run Code Online (Sandbox Code Playgroud)
这会在名为 p12346 的会话中创建一个新窗口,并且不会在屏幕上打印任何内容。太棒了。但是我怎么能告诉上面的命令等到睡眠完成后再返回呢?即我希望这样做同样但需要 10 秒来执行:
time tmux new-window -t p12346 'echo foo;sleep 10'
Run Code Online (Sandbox Code Playgroud)
背景
如果这是可行的,那么它可能会成为 GNU Parallel 的一个功能:当前运行的作业可以作为每个窗口通过 访问tmux,因此您可以实时跟踪每个作业的进度。
所以tmux不会在前台运行:用户需要附加到它。
这个:
$ seq 100000 | xargs -P0 -n1 -I {} bash -c 'echo {};sleep {}'
:
5514
bash: fork: retry: No child processes
Run Code Online (Sandbox Code Playgroud)
当系统运行 11666 个进程时,开始抱怨 5500 左右。现在,11666 对我来说真的很惊讶,因为:
$ ulimit -u
313370
$ cat /proc/sys/kernel/pid_max
313370
$ grep hard.*nproc /etc/security/limits.conf
* hard nproc 313370
Run Code Online (Sandbox Code Playgroud)
为什么我只能运行11600个进程?
编辑:
在另一个用户上测试我得到 6100(即 12200 procs),因此总共 24000 procs。所以限制不是系统范围的。
$ uname -a
Linux aspire 4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ grep -i tasksmax /etc/systemd/*
/etc/systemd/logind.conf:#UserTasksMax=12288
/etc/systemd/system.conf:#DefaultTasksMax=
Run Code Online (Sandbox Code Playgroud)
所以12288可能是罪魁祸首。我将其更改为 1000 …