我正在使用MobaXterm便携式。 我发现了一个奇怪的设置,总结在这里。
/bin
中的外部命令工作正常。 例如,有了/bin/ssh.exe
我可以ssh
好的。
内部命令是
-
"重定向"到繁忙框,如
$ which cat /bin/cat $ ll /bin/cat lrwxrwxrwx 1 USER001 UsersGrp 16 Jul 24 07:42 /bin/cat -> /bin/busybox.exe
-
同时别名为显然不存在的文件。
$ type cat cat is aliased to `/bin/cat.exe'
这些别名显然优先于 PATH 中的文件,因此命令不起作用。
$ cat myfile
bash: /bin/cat.exe: No such file or directory
如果我取消别名,cat
不会寻找/bin/cat.exe
而是寻找/bin/busybox.exe
,一切都"恢复正常"。
$ unalias cat
$ cat myfile
Hello world
...
如何获得正常行为(没有别名或存在别名目标)?我的意思是不要用.bashrc
编写我自己的取消别名,这不应该是必需的。 而且,也许我会破坏一些东西。
为什么 MobaXterm 会设置这样的东西?
PS:在初始状态下,出于同样的原因,即使ls
也不起作用。 但是ll
有效,因为
$ type ll
ll is aliased to `_bbf ls -l'
$ type _bbf
_bbf is a function
...
如何获得正常行为?
解决方法:
-
手工
unalias
,因此实际使用/bin/busybox.exe
。
下面我为此添加一个脚本。 -
从临时
root
目录中复制.exe
文件(如果可用),以便使用外部版本。
为什么 MobaXterm 会设置这样的东西?
不使用持久根 (/)目录时,将获取此目录
$ which cat
/bin/cat
$ ll /bin/cat
-rwxr-xr-x 1 RY16205 UsersGrp 49703 jul. 28 07:12 /bin/cat
$ type cat
cat is aliased to `/bin/cat.exe'
$ ll /bin/cat.exe
-rwxr-xr-x 1 USER001 UsersGrp 49703 jul. 28 07:12 /bin/cat.exe
$ cat myfile
Hello world
...
$ unalias cat
$ type cat
cat is hashed (/bin/cat)
$ cat myfile
Hello world
...
因此,两个cat
中的任何一个都可以工作(内部busybox
和外部版本;我不知道它们是否完全相同)。 这是因为/bin
指向C:Usersuser001AppDataLocalTempMxt108bin
,cat.exe
就在那里。
但是当使用持久根 (/) 目录时,/bin
指向<Persistent root (/) directorybin
,并且不会在那里创建cat.exe
。 MXT 关闭后,以前的临时root
目录将立即删除。所以这可能是 MobaXterm 的配置错误。如果是这样,唯一的选择似乎是解决方法,如上所述。
用于取消别名的脚本:
#!/bin/bash
export ROOTDIR_WIN=$(cygpath -wl /)
if [[ ${ROOTDIR_WIN##*\} == "Mxt108" ]] ; then
# Not using a Persistent root dir. Do not need to unalias.
echo "Not using a Persistent root dir. Do not need to unalias."
else
# Using a Persistent root dir. Need to unalias.
exe_linux_list="bash busybox chmod cygstart cygtermd cygwin-console-helper dircolors dwm_w32 echo grep ls MoTTY ssh ssh-pageant test twm_w32 wc xkbcomp_w32 XWin_MobaX"
for exe_linux in ${exe_linux_list} ; do
if [[ $(type -t ${exe_linux}) == "alias" ]] ; then
#type ${exe_linux}
unalias ${exe_linux}
fi
done
fi
在我的 MobaXterm 系统上,/etc/profile 源/etc/baseprofile,其中包括所有这些东西的别名,即
alias "cat"="_bbf cat"
从我的命令提示符检查得出我所期望的结果:
$ type cat
cat is aliased to `_bbf cat'
您是否以某种方式更改了系统,以便/etc/baseprofile 没有来源?或者你改变了/etc/baseprofile?
看起来你已经安装了常规的GNU Coreutils软件包,因为我没有/bin/cat.exe。
$ ll /bin/cat.exe
ls: /bin/cat.exe: No such file or directory
也许这就是您的问题开始的地方,但_bbf函数应该处理它。这再次让我相信你以某种方式改变了/etc/baseprofile。
大多数时候,它很酷。此错误可能是由cat.exe
的错误路径匹配引起的。
至于我,当我运行git log
时,会出现相同的错误消息。这是由于PATH
变量。有两个dirs
,它们都包含git.exe
。其中一个是半成品,体积小。Mobaxterm
选择它。:D
我通过运行which git
确认这一点,它将给出实际的路径。
我通过以下方式修复它
alias git='/drives/C/Program Files/Git/mingw64/bin/git.exe'
以下是我的dirs
.
├─cmd
│ git-gui.exe
│ git-lfs.exe
│ git.exe # oops
│ gitk.exe
│ start-ssh-agent.cmd
│ start-ssh-pageant.cmd
├─mingw64
│ ├─bin
│ │ git-upload-pack.exe
│ │ git.exe # the right one