环境:Windows 11 pro。
我想msys2
在 git-bash 的 vim 中调用 bash,其中两者共享相同版本的vim
和bash
(尽管这种上下文看起来很奇怪)。
我问一个起源问题set -m
在 Vi/Vim SE 中,问题似乎是在 中调用:call term_start("/d/msys64/usr/bin/bash -li -vx")
(-l
是 source .bash_profile
,等等,-i
是为了确保我们可以在 vim 中使用 bash )时没有选项vim
。它显示hivxBH
为$-
。但对于 调用的一个正常 bash 来说:call term_start("bash -li -vx")
,$-
是himvxBH
。
我尝试过使用-lim -vx
但是没有用。
以上-l
作品经审核,暂时不shopt -p login_shell
展示。/etc/profile
shopt -s login_shell
当没有-m
选项时,我们也会出现以下错误消息(我遵循这个QA。但我已经使用过选项,并且此选项默认-i
无法添加选项)在采购之前-m
/etc/profile
bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
关键术语是“作业控制”,这对于 vim 在内部运行终端非常重要(:h terminal-use
说'可以开始工作连接到终端仿真器')
由于m
选项对应于‘监视’,其中‘作业控制已启用’,如手册所述,所以它是问题的根源。
这个问题可以间接解决通过使用 msys2 vim 调用 git-bash,这样我就可以使用一个 vim 版本来调用我的机器上的所有 shell,包括 git-bash、pwsh 和 msys2 bash。
问:
在我看来,git-bash 的 vim 似乎没有调用权限/d/msys64/usr/bin/bash
(但 git-bash 可以)。有没有办法直接求解上述‘设备的 ioctl 不适当’失败导致‘此 shell 中没有作业控制’?
已编辑:
在被暗示之后这个博客, 'Inappropriate ioctl for device' 似乎是由于更具体地使用pipe
as造成的stdin
。通常,ls -al /dev/fd/* -al
在 的顶部~/.bash_profile
会输出类似/dev/fd/0 -> /dev/pty3
when 的 内容term_start
。但是当使用 param 时,/d/msys64/usr/bin/bash
它将具有/dev/fd/0 -> pipe:[0]
。
然后通过看到这个帖子,这似乎是由于没有权限。但是 msys2 可以使用 调用 git-bash /dev/fd/0 -> /dev/cons3
。
现在解决了:
问题是由于msys2封装了很多细节,无法通过vim进行操作,但是可以通过git-bash进行操作。
# git bash try to call msys2 bash
# here although the administrator has the rwx mode, using as one administrator can't solve the problem.
$ ls -al /d/msys64/dev/
total 4
drwxr-xr-x 1 foo 197609 0 Mar 28 16:59 ./
drwxr-xr-x 1 foo 197609 0 Apr 4 16:29 ../
drwxr-xr-x 1 foo 197609 0 Mar 28 16:59 mqueue/
drwxr-xr-x 1 foo 197609 0 Mar 28 16:59 shm/
# msys2 bash try to call git bash
$ ls -al /d/Git/dev/
total 8
drwxr-xr-x 1 foo foo 0 Apr 2 09:53 .
drwxr-xr-x 1 foo foo 0 Apr 2 09:53 ..
lrwxrwxrwx 1 foo foo 13 Apr 2 09:53 fd -> /proc/self/fd
drwxr-xr-x 1 foo foo 0 Apr 2 09:52 mqueue
drwxr-xr-x 1 foo foo 0 Apr 2 09:52 shm
lrwxrwxrwx 1 foo foo 15 Apr 2 09:53 stderr -> /proc/self/fd/2
lrwxrwxrwx 1 foo foo 15 Apr 2 09:53 stdin -> /proc/self/fd/0
lrwxrwxrwx 1 foo foo 15 Apr 2 09:53 stdout -> /proc/self/fd/1
因此,对于一个解决方法,我们可以使用 msys2 作为主终端,因为 git-bash 没有封装/dev
。
上面这个乱七八糟的开发环境只是我在 Windows 下临时用的一个环境(真的不推荐用),平时都是在 Archlinux 上开发,这里就给大家展示一下问题出在哪里,如果你也有类似的问题,希望可以帮到你。