我已经使用 Cygwin 有一段时间了。我现在想从 bash 切换到 fish。每个人都说你应该使用chsh -s /usr/bin/fish
,但由于某种原因,chsh
它对我不起作用。尝试修改我的Cygwin.bat
文件也不起作用,更改我的/etc/passwd
文件也不起作用。
我真的不明白发生了什么事。有人可以帮我吗?
您可以编辑 /etc/nsswitch.conf,而不是创建 Cygwin建议反对1的 passwd 文件。添加或编辑以下行:
db_shell: /usr/bin/fish
这种方法的缺点是,如果您有多个用户,则此更改会影响所有用户。向上/向上的一面是它非常简单。唯一的问题是您必须重新启动 Cygwin。
如果您在此更改后使用mkpasswd
,它将为所有允许登录的用户使用新的默认 shell。
1mkpasswd
文档是这样说的:
不要使用此命令生成本地 /etc/passwd 文件,除非你真的需要一个。有关详细信息,请参阅 Cygwin 用户指南。
我真的在用户指南中找不到任何可靠的理由,除了提到如果您的用户和组发生更改,您必须重新生成/etc/passwd
and/etc/group
文件,我认为这是一个足够体面的理由。我可以说这个过程对于新手来说有点容易出错。
我偶然遇到了同样的问题,现在我为您提供我的解决方案。
0- 打开cygwin
者mintty.exe
1- 手动构建 passwd 文件 ( mkpasswd
)
$mkpasswd > /etc/passwd
2-更改密码文件中的默认外壳
$vim /etc/passwd
user:*:1976XX:1971XX:U-user\user,S-1-5-21-XXXX:/home/user:/bin/fish
3-重启mintty.exe
SuperUser上有一个更简单的答案。在 Windows 中设置 SHELL 环境变量。将其设置为您喜欢的 shell(例如/bin/tcsh
),新启动的 shell 应该使用它。
设置环境变量:
我不确定这个解决方案有多“合适”,但我只是添加/usr/bin/zsh; exit
到我的.bashrc
文件底部。您可以替换/usr/bin/zsh
您选择的 shell 的路径。到目前为止,它似乎工作得很好。
我想评论接受的答案,但没有足够的代表。
关于这个方法
$ mkpasswd > /etc/passwd
虽然这可以生成 /etc/passwd 文件,但您可能正在为自己安装 cygwin,如果您的计算机属于域,mkpasswd 可能会用完并尝试使用整个域用户列表。在这种情况下,我有一个 500MB+ /etc/passwd 文件,而 cygwin 甚至在我删除文件之前都不会启动。
我强烈建议,如果使用 mkpasswd 路由来使用-c
交换机,那么它只会为您自己添加一个条目。
$ mkpasswd -c > /etc/passwd
在具有共享 cygwin 服务的机器上(假设您有写权限)
$ mkpasswd -c >> /etc/passwd
如果您通过ConEmu运行 Cygwin,我发现最简单的方法是替换命令行来运行 fish 而不是默认 shell(Settings->Startup->Tasks):(
""c:\cygwin64\bin\fish.exe" --login -i"
请相应地更改您的 cygwin 文件夹的路径)
我试图将 cygwin 中的默认 shell 更改为 zsh,我发现这里的部分答案很有帮助,但没有一个给出完整的解决方案。我发现的最佳说明是在 Robby Russel 的 oh my zsh github repo 中的“安装 zsh”说明中,您可以在此处找到
在页面的顶部,它有安装 zsh 的一般说明,然后是许多不同平台的具体说明。您可以向下滚动到 Cygwin 部分并按照以下步骤操作:
“更改默认 shell 的最简单方法是设置您的 SHELL 用户环境变量。搜索“Edit Environment variables for your account”以打开环境变量窗口,创建一个名为“SHELL”的新变量并为其赋值“ /usr/bin/zsh/"."
(在 Windows 7 上:按 Windows 键。开始输入“环境”。当它出现时,选择“为您的帐户编辑环境变量”并按上述说明添加新变量。)
完成此操作后,我关闭并重新打开我的 Cygwin shell 窗口并测试它是否与 echo $SHELL 一起使用。预期结果:/bin/zsh 或类似。
希望这可以帮助!
转到c:\cygwin
或c:\cygwin64
(无论您的 cygwin 主目录是什么)并编辑cygwin.bat
. 代替
bash --login -i
写,例如,
rem bash --login -i
tcsh -l
一种简单的方法是在 .bashrc 文件末尾调用 tcsh
# x2=$(dirs +${cnt} 2>/dev/null)
# [[ $? -ne 0 ]] && return 0
# [[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}"
# if [[ "${x2}" == "${the_new_dir}" ]]; then
# popd -n +$cnt 2>/dev/null 1>/dev/null
# cnt=cnt-1
# fi
# done
#
# return 0
# }
#
# alias cd=cd_func
tcsh
alias g=gvim
source ~/.cshrc
source ~/.aliases