小编Ole*_*nge的帖子

如果智能完成失败,则强制 Bash 正常选项卡完成

自从选项卡完成成为 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 先使用智能完成,如果失败,然后使用非智能完成吗?

bash autocomplete

11
推荐指数
2
解决办法
3106
查看次数

ssh -t 上的标准错误

这会将输出发送到 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。

shell ssh signals file-descriptors stderr

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

定义别名并立即使用

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别名应该是活动的?

zsh alias

11
推荐指数
2
解决办法
1136
查看次数

将 glob 转换为 `find`

我一次又一次地遇到这个问题:我有一个 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)?

find wildcards

11
推荐指数
2
解决办法
2739
查看次数

如何创建 100 个虚拟服务器进行测试?

我想创建 100 个虚拟服务器。它们将用于测试,因此它们应该易于创建和销毁。

  • 它们必须可以从另一台物理机器通过 SSH 访问(我提供了公共 ssh 密钥)
  • 它们必须有自己的 IP 地址并且可以从另一个物理主机访问,ssh I.P.n.o例如ssh 10.0.0.99(IPv4 或 IPv6,私有地址空间可以,端口转发不是 - 所以这可能涉及设置桥接)
  • 他们必须安装基本的 UNIX 工具(最好是完整的发行版)
  • 他们必须有 /proc/cpuinfo、root 用户和网卡(这可能仅在机器未完全虚拟化时才相关)
  • 如果可以使它们运行可远程连接的 X 服务器(使用 VNC 或类似工具),则额外奖励

给定的最快方法(挂钟时间)是什么:

  • 主机系统运行 Ubuntu 20.04 并拥有充足的 RAM 和 CPU
  • LAN 有一个 DHCP 服务器(使用预定义的 IP 范围也可以)
  • 我不在乎使用哪种 Free 虚拟化技术(如果满足其他要求,容器化也可以)

我应该运行的实际命令/应该创建的文件是什么?

我有一种感觉,如果采用正确的技术,这是一项可以在几分钟内完成的 50 条生产线作业。

这几行大概可以分成几个 bash 函数:

install() {
  # Install needed software once
}
setup() {
  # Configure the virtual servers
}
start() {
  # Start the virtual servers
  # …
Run Code Online (Sandbox Code Playgroud)

virtual-machine

11
推荐指数
3
解决办法
1497
查看次数

升级磁盘的可见大小时增加/调整 RAID 大小

我最初使用一个控制器创建了一个软件 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 详细信息:

# 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)

software-raid mdadm

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

如何强制以文本模式启动?

较新的 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 方式禁用“控制台设置”?

boot debian graphics init.d

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

typeset -f 不输出真正的定义。可以检测/修复吗?

昨天我花了大半时间才发现这个 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解析器可以纠正它吗?

bash

10
推荐指数
1
解决办法
303
查看次数

使 tmux 阻塞直到程序完成

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不会在前台运行:用户需要附加到它。

tmux

9
推荐指数
1
解决办法
4387
查看次数

限制在哪里设置?bash: fork: 重试: 没有子进程

这个:

$ 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 …

linux bash process ulimit

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